1. Pascal / Говнокод #14368

    +76

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if mas[i-1,j-1]=true then begin neib[m]:=true; inc(m); end; //считаем соседей
    if mas[i-1,j]=true then begin neib[m]:=true; inc(m); end;
    if mas[i-1,j+1]=true then begin neib[m]:=true; inc(m); end;
    if mas[i,j-1]=true then begin neib[m]:=true; inc(m); end;
    if mas[i,j+1]=true then begin neib[m]:=true; inc(m); end;
    if mas[i+1,j-1]=true then begin neib[m]:=true; inc(m); end;
    if mas[i+1,j]=true then begin neib[m]:=true; inc(m); end;
    if mas[i+1,j+1]=true then begin neib[m]:=true; inc(m); end;

    Знакомый человек реализовывал «Жизнь» на делфях...

    Запостил: POPSuL, 15 Января 2014

    Комментарии (75) RSS

    • А потом стоит цикл, который считает количество true в neib[m]?
      Ответить
    • что такое м, где else почему сравнивается с тру, почему не цикл, что будет при выходе за пределы массива....
      http://www.youtube.com/watch?v=MIZbGSXeWWE
      Ответить
      • > что такое м
        Количество живых соседей.

        > где else
        Зачем оно там? По условию задачи нинужно.
        http://ru.wikipedia.org/wiki/Жизнь_(игра)

        > что будет при выходе за пределы массива
        А там поди бордюрчик в 1 пиксель вокруг рабочей области.
        Ответить
        • > А там поди бордюрчик в 1 пиксель вокруг рабочей области.

          вполне себе решение
          Ответить
          • на самом деле нет. будет считаться, что там мертвые сосседи, а там не должно быть никаких соседей

            туплю, туплю да, не бейте меня
            Ответить
            • И поэтому гораздо забавнее замкнуть границы друг на друга - даешь тороидальное поле!
              Ответить
              • для обшьности копипастить граничные значения.
                Ответить
                • Ну да, если нужен тор - просто копируем граничные клетки в бордюр перед главным циклом. Бордюр всяко производительней, чем проверки на диапазон на каждом пикселе.
                  Ответить
          • Поле должно быть замкнутым, вроде как.
            Ответить
            • Тогда перегрузить оператор []
              В Дельфи это можно, кстати
              Ответить
              • >>Тогда перегрузить оператор []
                В Дельфи это можно, кстати

                Кэп?
                Ответить
                • А сам-то умеешь?
                  Покажи, чтоб в Д7 компилировалось
                  Ответить
                  • Нет-нет, не знаю, поэтому и спросил, в целях повышения образованности. Вы то наверняка опытнее меня.
                    Ответить
                    • [facepalm.jpg]
                      Ответить
                    • Тогда причём тут Кэп?
                      Ответить
                      • Я просто просил объяснить, как нужно перегружать скобку, вот и все...
                        Ответить
                        • Когда говорят Кэп, то имеют в виду что-то типа "ты сказал то, что и так очевидно". Ты употребил мем не в тему.

                          А ерегружается она так: заводишь свойство типа массив, в геттере и сеттере пишешь что хошь, свойство помечаешь атрибутом хиъdefaultхиъ
                          Ответить
                          • Лично я, когда говорю: "Кэп?" прошу уточнить непонятный участок кода, странно, что ты понял это иначе.
                            Не сочти за наглость, а можно небольшой образчик? Я бы посмотрел )
                            Ответить
                            • {$APPTYPE CONSOLE}
                              
                              const shX=5; shY=5;
                              
                              type Ololo = class
                              private
                                fdata : array [0..1 shl shY-1, 0..1 shl shX-1] of boolean;
                                procedure SetData(y,x : integer; b : boolean);
                                function GetData(y,x : integer): boolean;
                              public
                                property data[y,x : integer]: boolean
                                  read GetData
                                  write SetData; default;
                              end;
                              
                              procedure Ololo.SetData(y,x : integer; b : boolean);
                              begin
                                fdata[y and (1 shl shY-1), x and (1 shl shX-1)] := b;
                              end;
                              
                              function Ololo.GetData (y,x : integer): boolean;
                              begin
                                result := fdata[y and (1 shl shY-1), x and (1 shl shX-1)];
                              end;
                              
                              
                              var
                                o : ololo;
                              begin
                                o := Ololo.Create;
                                o[30,30] := true;
                                writeln(o[-2,-2]);
                                o.Free;
                                readln;
                              end.
                              Ответить
      • > почему не цикл
        Анролл.
        Ответить
    • const deltas: Array[0..7] of Array[0..1] of Integer = ((-1,-1),(-1,0),(-1,1),(0,1),(0,-1),(1,-1),(1,0),(1,1));
      
      for delta := 0 to 7 do if (mas[i+deltas[delta][0],j+deltas[delta][1]]) inc(m);
      Ответить
      • Кээп?
        Ответить
        • Кэп советует два вложенных цикла с проверкой if di = 0 and dj = 0 then continue;
          Ответить
          • Да можно и без проверки. Проверки всяко будут тормозить больше, чем лишнее чтение из кеша.

            Но 2 цикла с проверкой будут все-таки попроще и понаглядней, чем твой массив.
            Ответить
            • Без проверки будет считаться соседом сама проверяемая клетка, так и задумывалось?
              Ответить
              • Будут условия чуть другие: погибает если не 3 или 4, рождается при 3. Неинтуитивно, но зато без проверки ;)

                Хотя если уж пилить на скорость - тр сумма восьми ord'ов всяко самая быстрая. Ну если не менят структуру данных.
                Ответить
              • В общем что хочу сказать - два цикла с проверкой это самая каноничная и наглядная реализация.

                Все остальное всего лишь попытки преждевременной оптимизации ;)
                Ответить
                • Таки да. Только в ФЯ каноничнее был бы вариант со списком смещений.
                  Ответить
                  • Да ну, зачем делать то, что должен делать комп? По крайней мере этот список надо составлять не руками..

                    offsets = [ (i, j) | i<-[-1..1], j<-[-1..1], i!=0 || j!=0 ]
                    Ответить
                    • Так бы я и написал, но дельфи не может.
                      Ответить
                      • да ладно, циклом инициализируешь точно так же
                        Ответить
          • для реализации жизни, кэп рекомендует ... почитать как это народ делает. натыкался на целый ресурс по реализации жизни. там оптимизаций возможных есть кучи - как по расходу памяти, так и по производительности. потому что тривиально-банальная реализация на любом интересном размере сетки будет тормозить жутко.
            Ответить
            • А на гпу там варианты были?
              Ответить
              • упоминались. я туда случайно пришел по линкам на efficient memory presentation of sparse arrays.

                к слову, "game of life gpu" гуглится. например, даже на webgl:
                http://www.patater.com/life
                Ответить
          • god is a dj
            Ответить
      • m:=ord(mas[i-1,j-1])+ord(mas[i-1,j])+ord(mas[i-1,j+1])+ord(mas[i,j-1])+ord(mas[i,j+1])+ord(mas[i+1,j-1])+ord(mas[i+1,j])+ord(mas[i+1,j+1]);
        Ответить
      • Лучше змейкой по кругу пройтись, ИМХО.
        Ответить
    • Каждый говнокодер должен за свою жизнь написать жизнь (что бы замкнуть рекурсию)

      http://hdd.tomsk.ru/file/bcdjbphm
      Ответить
      • Исправлено пара багов

        http://hdd.tomsk.ru/file/jrandefp

        Исходник

        http://hdd.tomsk.ru/file/uugekelc

        Материм, че
        Ответить
        • >Материм, че
          как скажешь )
          KegdansLife.rar
          Form1.cs

          PS. Почему многие виндузятники хранят данные на рабочем столе?
          Ладно, я понимаю, что этот хелловорд не особо жалко потерять, но ведь некоторые знакомые хранят там over9000 нужных данных
          Ответить
          • Важные данные я вообще на C не храню

            Ты бы по коду
            Ответить
            • я как бы намекаю, что не стоит выкладывать временные файлы с инфой твоего компьютера и прочих вещей, предназначенных не для посторонних глаз
              Ответить
              • да ладно, я не параноик
                Ответить
              • Фамилия его и так гуглится легко. А хранить на рабочем столе временную хрень - удобно. Когда там оказывается 10-15 значков, проводится уборка: что-то более важное идёт в нужную папку, что-то удаляется навсегда.

                Только вот какого хрена студия абсолютные пути и в релизе оставляет?..
                Ответить
                • > Когда там оказывается 10-15 значков
                  Новая папка (49), Разобрать_8, Важное!!!!!, Котики

                  У меня отношение наоборот. Вот сейчас у меня на рабочем столе кроме корзины есть только ярлык на vlc, который я не успел убить, текстовый документ с паролем, смысл которого я с 2011-го успел забыть и пустая невидимая папка для эксперимента. А всё потому, что рабочий стол я вижу только при включении компьютера раз в месяц.
                  Ответить
                  • > Новая папка (49)
                    От авторов Form5 и Button92.
                    Ответить
                  • >рабочий стол я вижу только при включении компьютера раз в месяц.

                    Нажми Win+D. Прямо сейчас.
                    Ответить
                  • Я тоже достаточно редко рабочий стол вижу. Вероятно, поэтому там сейчас обнаружил четыре ярлыка на папки с проектами парочки IDE, которые были нужны года 2 назад, папка с ещё одним проектом годичной давности и ещё десяток объектов почтенного возраста. Пора удалять большую часть этого.
                    Кстати странно, но корзина почему-то на этом компьютере есть. Обычно я её отображение отключаю и количество значков уменьшаю как только рабочий стол внезапно откроется.
                    Ответить
          • Потому, что это акая же папка, как и все остальные. Рабочим столом можно сделать что угодно, хоть корень диска.
            Ответить
          • Рабочий стол то хуйня, я думаю, у каждого был период, когда он хранил их в корзине.

            Кстати, в домене рабочий стол синхронизируется с профилем при логине/логауте. Если логинится слишком долго - вспомни, нету ли у тебя на рабочем столе пары образов дивидишек.
            Ответить
            • Это, кстати, настраивается настройками АД. Можно и оставить все юзерские папки локальными.
              Ответить
        • Где-то мне попадалась машина тьюринга на life. Запусти ее ;)
          Ответить
      • в тред призывается Кузя
        Ответить
        • Сиськи?
          Ответить
          • нет. она в свое время разрабатывала оригинальную модификацию "жизни", я еще помню огонь в ее глазах.
            Ответить
            • > огонь в ее глазах.
              А я помню урок программирования у инъязочек. Вокруг админа столпилась толпа девок, он запускает прогу на ТП и она бибикает какую-то мелодию через спикер системника, и бабы такие "урааа!" :D
              Ответить
              • я понял, ты бабам не доверяешь. но я тебе не инъязочка, мне, как мужику, поверь на слово, там все ответственно.
                Ответить
                • "Как можно доверять тому, что кровоточит по нескольку дней в месяц, но не дохнет?"
                  (с) Matt Stone & Trey Parker
                  Ответить
                  • я доверяю своим глазам. и код, что я видел, хорош. как и в работе.
                    Ответить
                    • а что за модификация? таки 2 дня есть, может покапаюсь
                      Ответить
                      • у нее там продвинутая версия на флеше. но это надо спрашивать у нее самой.
                        Ответить
                        • Так если ты не знаешь что за изменения она делает, то может их и нет?) ну кроме флеша
                          Ответить
                          • я видел работающую версию год назад, но исходников у меня нет
                            Ответить
                            • ты плохой индиспай, опиши что видел
                              Ответить
                              • модифицированная версия конвеевской жизни, с изменяемыми правилами, и тремя стадиями клеток (видно, как рождаются и умирают)

                                я даже попросил написать версию virus (где 2 формы жизни с разными характеристиками натравливаются друг на друга, см. virus-II.trd) но был послан.
                                Ответить
                                • ты поэтом стал?)

                                  Никакой конкретики.

                                  забей, ок
                                  Ответить
                • По-моему, ты по ее пизде еще не настрадался. Может, попросишься обратно?
                  Ответить
    • ПГ/AM; минуснул.
      Ответить

    Добавить комментарий