Игра жизни Конвея - классический пример клеточной автоматизации. Ячейки образуют квадратную сетку, и у каждого есть два состояния: живое или мертвое. На каждом ходу каждая ячейка одновременно обновляется в соответствии со своим состоянием и состоянием своих восьми соседей:
- Живая клетка остается живой, если у нее ровно два или три живых соседа
- Мертвая клетка становится живой, если у нее ровно три живых соседа
Ваша миссия, если вы решите принять ее, - написать самую короткую реализацию Game of Life на вашем любимом языке.
Правила:
- Сетка должна быть не менее 20х20
- Сетка должна обернуться вокруг (чтобы сетка была похожа на поверхность Тора)
- Ваша реализация должна позволять пользователю вводить свои собственные стартовые шаблоны
- GoL немного бессмысленно, если вы не видите, что происходит, поэтому должен быть визуальный вывод работающего автомата, причем результат каждого хода показывается достаточно долго, чтобы его можно было увидеть!
;
до}
с. Такжеvar
s может быть исключен время от времени (если это не нарушает ваш код). А для однострочныхfor
с,if
s и т.д., вы можете устранить{ }
полностью:for(...) for(...) dosomething()
.Ответы:
HTML5 Canvas с JavaScript,
940639586519 символовЯ всегда хотел что-то сделать с помощью canvas, поэтому вот моя попытка (оригинальная версия онлайн ). Вы можете переключать ячейки, нажимая (также возможно в рабочем режиме).
Теперь вы также можете попробовать новую версию здесь .
К сожалению, есть проблема, с которой я еще не мог обойтись. Онлайн-версия на 11 символов длиннее, потому что jsFiddle помещает текстовый узел непосредственно перед холстом (почему?) И, таким образом, холст больше не является первым дочерним элементом.
Редактировать 1: много оптимизаций и реструктуризации.
Редактировать 2: Несколько небольших изменений.
Редактировать 3: встроенный полный блок скрипта плюс незначительные изменения.
источник
1
она была такой же быстрой, как моя, а не медленным шагом. Также, если вы хотите реализовать рисование (вместо того, чтобы нажимать на каждый квадрат), вы можете округлить положение мыши до ближайшего размера блока и заполнить прямоугольник в этой точке. Больше персонажей, но больше очков.new Array('#FFF','#800')
на['#FFF','#800']
.s
массиве,tan
иred
так как они являются двумя цветами с кратчайшими представлениями - экономит два символа. Также, если возможно, поместите буквенную версиюj
в интервал. Я уверен, что есть еще много, чтобы выжать тоже.Питон, 219 символов
Я пошел на максимальный гольф, с достаточно интерфейсом, чтобы удовлетворить вопрос.
Вы запускаете это так:
Числа в списке представляют координаты начальных ячеек. Первый ряд 0-19, второй ряд 20-39 и т. Д.
Запустите его в терминале с 21 строкой, и это выглядит довольно привлекательно.
источник
2-(p in P)
==2-({p}<P)
. Но тогда вам придется изменить свой ввод на{8,29,47,48,49}
:)TI-BASIC, 96 байт (87 для неконкурентной записи)
Для вашего графического калькулятора серии TI-84 (!). Это было довольно сложной задачей, так как не существует простой способ , чтобы написать буферную графическую рутину (определенно ничего не встроенное), и на экране графика имеет только четыре соответствующих графические команды:
Pxl-On()
,Pxl-Off()
,Pxl-Change()
, иpxl-Test()
.Использует каждый доступный пиксель на экране и корректно переносится. Каждая ячейка составляет один пиксель, и программа обновляет построчно по горизонтали вправо по экрану. Поскольку в калькуляторах используется только процессор Z80 с частотой 15 МГц, а BASIC - это медленный интерпретируемый язык, код получает только один кадр каждые пять минут.
Пользовательский ввод очень прост: перед запуском программы используйте инструмент «Перо», чтобы нарисовать фигуру на экране графика.
Адаптировано из моей заявки на участие в соревновании по коду в гольф на форуме калькулятора Omnimaga .
Версия Omnimaga (87 байт)
Этот код имеет дополнительную функцию: он определяет, запускается ли он в первый раз, и случайным образом ли отображает состояние экрана. При последующих запусках он автоматически продолжает симуляцию, если остановлен после завершения кадра. Тем не менее, это не конкурирующая запись, потому что она не переносит экран; ячейки на внешней границе всегда будут считаться мертвыми, если предварительно очистить экран графика.
Эта версия, пожалуй, самый удачный код из всех, что я когда-либо писал, и содержит некоторые по-настоящему противные и запутанные оптимизации:
Я использую состояние часов в качестве флага. При запуске программы часы даты / времени включены, и я использую значение глобального флага isClockOn, чтобы определить, является ли это первой итерацией. После того, как первый кадр нарисован, я выключаю часы. Сохраняет один байт по кратчайшему другому методу и около четырех по очевидному методу.
Я сохраняю состояния трех столбцов рядом с обновляемым в массиве из 63 элементов, состоящем из 7 цифр. 49-е место содержит столбец справа, 7-е место - средний столбец, а единица измерения - левый столбец - 1 для живой ячейки и 0 для мертвой ячейки. Затем я беру оставшийся мод 6 от суммы трех чисел вокруг модифицируемой ячейки, чтобы найти общее количество живых соседних ячеек (это как деление на 9 трюков - в базе 7, оставшийся мод 6 равен сумме цифры). Сохраняет около 10 байтов отдельно и дает возможность использовать следующие две оптимизации. Пример диаграммы (скажем, есть планер с центром в некотором столбце при Y = 45:
Центральная клетка останется мертвой, потому что она окружена ровно пятью живыми клетками.
После завершения каждой строки числа в массиве обновляются путем деления существующих чисел на 7, отбрасывания десятичной части и добавления 49-кратного значения ячеек в новом столбце. Хранение всех трех столбцов каждый раз будет гораздо медленнее и менее изящным, займет не менее 20 байтов и будет использовать три списка, а не один, потому что значения ячеек в каждой строке должны храниться до обновления ячеек. На сегодняшний день это самый маленький способ хранения позиций в ячейках.
Фрагмент
int(3fPart(3cosh(
дает,1
когда входное значение равно 3/6,2
когда оно равно 4/6 и0
когда оно равно 0, 1/6, 2/6 или 5/6. Сохраняет около 6 байтов.источник
Mathematica - 333
Функции:
Интерактивный интерфейс: нажмите на ячейки, чтобы сделать ваши шаблоны
Хорошая сетка
Кнопки: RUN, PAUSE, CLEAR
Код ниже.
Если вы хотите почувствовать, как это работает, 2-й пример в этом блоге - это просто более сложная версия (живой анализ Фурье, лучший интерфейс) приведенного выше кода. Пример должен запускаться прямо в вашем браузере после загрузки бесплатного плагина.
источник
C 1063 символов
В качестве проблемы я сделал это в C, используя недружественный к гольфу Windows API для ввода-вывода в реальном времени. Если capslock включен, симуляция будет запущена. Он останется на месте, если выключен колпачок. Рисовать узоры с помощью мыши; щелчок левой кнопкой мыши оживляет ячейки, а щелчок правой кнопкой мыши убивает ячейки.
Скомпилированный EXE можно найти здесь
Изменить: я прокомментировал источник. Это доступно здесь
источник
J (39 символов)
На основе этой версии APL (тот же алгоритм, тороидальная свертка).
Пример использования:
источник
Mathematica, 123 символа
Очень элементарная реализация, в которой не используется встроенная в Mathematica функция CellularAutomaton.
источник
Ruby 1.9 + SDL (
380325314)РЕДАКТИРОВАТЬ : 314 символов, и исправлена ошибка с появлением дополнительных клеток в первой итерации. Увеличен размер сетки до 56, поскольку подпрограмма цвета смотрит только на младшие 8 бит.
РЕДАКТИРОВАТЬ : Гольф до 325 символов. Ширина / высота сетки теперь составляет 28, поскольку 28 * 9 - это наибольшее значение, которое вы можете иметь, но при этом значение используется в качестве цвета фона. Он также обрабатывает только одно событие SDL за каждую итерацию, что полностью устраняет внутренний цикл. Я думаю, довольно туго!
Симуляция начинается с паузы, все клетки погибают. Вы можете нажать любую клавишу, чтобы переключить паузу / паузу, и щелкнуть любую ячейку, чтобы переключить ее между живой и мертвой. Выполняет итерацию каждую десятую секунды.
Упаковка немного шаткая.
Выглядит так:
Веселый вызов! Я приветствую любые улучшения, которые кто-либо может увидеть.
источник
Scala,
118111581128106310181003999992987 знаковUngolfed:
Большая часть кода здесь - это Swing GUI. Сама игра заключается в
actionPerformed
методе, который вызываетсяTimer
вспомогательной функцией иn
подсчетом соседей.Использование:
Скомпилируйте его,
scalac filename
а затем запуститеscala L
.Щелчок по квадрату переворачивает его с живого на мертвый, и пункт меню запускает и останавливает игру. Если вы хотите изменить размер сетки, измените первые три значения в строке:
var(w,h,c,d,r)=(20,20,20,0,false)
это ширина, высота и размер ячейки (в пикселях) соответственно.источник
import java.awt.event._
иcontents+=m("Go",true)+=m("Stop",false)}}
, что приводит к 1093 символов.Чистый Баш, 244 байта
Работает в тороидальной оболочке 36x24:
Поскольку это сценарий оболочки, метод ввода совпадает с другими командами оболочки, то есть из stdin:
... и т.д
Мы можем перенаправить ввод из любого текстового источника, пропущенного через
tr
фильтр, чтобы получить интересные начальные поколения, напримеристочник
JavaScript, 130
Не полностью отвечая на вызов, но для записи, вот движок Game of Life в 130 байтов, сделанный Subzey и мной в 2013 году.
http://xem.github.io/miniGameOfLife/
источник
@@\n@@
(2 на 2 квадрата в верхнем левом углу) или.@\n.@\n.@
. (1 на 3 столбца)C # - 675 символов
Я всегда хотел написать версию этой программы. Никогда не знал, что это займет всего полчаса для быстрой и грязной версии. (Гольф, конечно, занимает гораздо больше времени.)
использование
Гольф компромиссы
источник
GW-BASIC,
10861035 байт (токенизирован)В токенизированной форме это 1035 байтов. (Форма ASCII, конечно, немного длиннее.) Вы получаете токенизированную форму, используя
SAVE"life
команду без добавления",a
в интерпретатор.Это максимальная версия для игры в гольф, но она по-прежнему интересна: при запуске вы получаете редактор, в котором вы можете перемещаться с помощью клавиш курсора; пробел включает / выключает бактерии на текущем поле,
c
очищает экран, Return запускает режим игры.Ниже следует менее запутанная версия, которая также устанавливает начальную игровую доску с двумя структурами (вращающаяся по кругу вещь и планер):
Я написал это за 15 минут, скучая и ожидая друга, который одновременно занимался игрой в гольф со своим «учеником» для «Игры жизни» Конвея.
Он работает следующим образом: он сразу использует экранный буфер текстового режима 80x25 (измените исходное значение,
DEF SEG
чтобы использовать его,&hB000
если вы используете видеокарту Hercules; эти настройки работают с Qemu и (более медленным) dosbox). Звездочка*
- это бактерия.Он работает в два прохода: во-первых, места рождения помечены,
+
а смерть помечает цели.
. Во втором проходе+
и.
заменяются на*
исоответственно.
Дело в
TIMER
том, чтобы заставить его ждать полсекунды после каждого раунда, если ваш хост Qemu работает очень быстро veryЯ рассчитываю не на цену с кратчайшим выигрышем, а на крутую, особенно учитывая начальную настройку платы. У меня также есть версия, в которой игровой движок был заменен ассемблерным кодом, если вам интересно ...
источник
1
,2
,3
и т.д.) Или номера строк не рассчитывать?Mathematica, 115 байт
Вот легкая справка с этим:
источник
Java (OpenJDK 8) -
400 388367 байтВторое и (вероятно) заключительное редактирование: удалось найти в игре дополнительные 21 байт после обнаружения этих (imo) золотых приисков - определенно рекомендую новым людям прочитать их (особенно, если вы собираетесь попробовать некоторые из этих испытаний с использованием Java).
Результирующий код (вероятно, в конечном итоге закончится игрой в гольф, если я узнаю, как сократить эти двойные гнезда для петель ...):
Попробуйте онлайн!
(Оригинальный пост начинается здесь.)
На самом деле я на мгновение подумал, что смогу по крайней мере оспорить лучший ответ Python с моим (возможно, ограниченным) знанием Java LOL ... Это была проблема, в которой я, тем не менее, принимал участие (несмотря на то, что вступил в партию, возможно, просто немного опоздал ...)
На самом деле в этом нет ничего особенного - базовое объяснение следующее (без присмотра):
(больше информации о лямбда-выражениях в Java 8 здесь )
Да, с моим подходом есть загвоздка.
Как многие из вас, вероятно, заметили, мой гольф-код в его нынешнем виде будет работать вечно. Чтобы предотвратить это, счетчик можно ввести сверху и использовать в цикле while, чтобы отображать
n
(в данном случае 5) итераций следующим образом (обратите внимание наb
добавленную новую переменную):Дополнительно стоит отметить несколько моментов. Эта программа не проверяет правильность ввода и, следовательно, потерпит неудачу с (скорее всего) an
ArrayOutOfBoundsException
; поэтому убедитесь, что входные данные действительны, полностью заполнив часть массива (асимметричные массивы вызовут исключение, упомянутое выше). Кроме того, плата в ее нынешнем виде выглядит «текучей», то есть нет разделения между одним поколением и следующим. Если вы хотите добавить это, чтобы еще раз проверить, действительно ли производимые поколения действительно действительны,System.out.println();
нужно добавить еще один элементfor(int[]t:u)Arrays.fill(t,0);
(см. Этот раздел «Попробуйте онлайн!» Для ясности). И наконец, что не менее важно, учитывая, что это мой первый кодовый гольф, любая обратная связь очень ценится :)Старый код из предыдущего 388-байтового ответа:
И из первоначального 400-байтового ответа:
источник
Трафарет , 6 байтов
Не мой любимый язык, но это короткий ...
4 байта кода плюс флаги
∊
nlist иT
orus.Попробуйте онлайн!
Является ли ...
3
3∊
членомm
в м oore-окрестностях отсчета с себя илиe
остромордыми й -окрестностями отсчетом без себя...?
источник
Скала - 799 символов
Запустить как скрипт. Щелчок мыши по квадрату включает или выключает его, и любая клавиша запускает или останавливает генерацию.
источник
J, 45
Я думал, что попробую J. Пока еще не очень хорошо, но я попробую еще раз.
Пример:
источник
Обработка
536532Я считаю, что это удовлетворяет всем требованиям.
Ungolfed:
источник
Матлаб (152)
У меня сейчас не установлен Matlab, чтобы протестировать его, я просто использовал код, который написал несколько лет назад.
Ungolfed:
источник
Perl,
218216211202 байта(В конце этого кода нет новой строки.)
Считывает начальный шаблон из стандартного ввода в виде текстового файла, где живые ячейки представлены в виде
1
, мертвые ячейки представлены в виде пробела, строки разделяются новой строкой. На входе не должно быть символов, отличных от этих. Линии могут иметь переменную длину и будут дополнены или усечены до ширины ровно 79. Пример ввода - планерная пушка:Когда программа запускает Game of Life, каждое состояние выводится на стандартный вывод в формате, аналогичном вводу, затем задерживается на 0,1 секунды. Задержку можно настроить, изменив четвертый аргумент вызова select.
Доска для игр жестко запрограммирована на размер 79х23. Он завернут в тор: если вы оставите доску внизу, вы окажетесь наверху; если вы уйдете с правой стороны, вы окажетесь на левой стороне, но сместитесь на один ряд вниз.
Вот альтернативная версия, которая не читает никаких входных данных и начинается со случайной доски:
Этот код получен из запутанной игры на жизнь, написанной на Perl, которую я написал несколько лет назад . Я сильно изменил его, чтобы сделать доску тороидальной и сыграть в гольф.
Вероятно, это не самый короткий способ реализации Game of Life на Perl, но это один из менее понятных способов.
источник
Python, 589 байт
Кнопки мыши: слева - поставить ячейку, справа - удалить ячейку, посередине - начать / остановить.
И вот версия, где вы можете перетащить мышь, чтобы нарисовать. Графика немного приятнее.
источник
if 1<n<4:
должен иметь отступ на том же уровне, что иfor j in z(-1,2):
Python 2, 456 байт
Хотя я знаю, что это старый пост, я не мог удержаться от него. Исходная доска может быть любого размера, если вы нарисуете вокруг нее границу и в последней строке будет дополнительное место.
Golf.py
Input.txt (обратите внимание на дополнительный пробел в последней строке)
Как запустить
источник
time.sleep(0.1)==None
=>not time.sleep(.1)
,(f=='@'and(x==3 or x==2
)) или (f == '' и x == 3) =>x==3or f=='@'and x==2
1 if
=>1if
.обработка
270261249 байтСетка - это экран размером 100 * 100 пикселей, ввод осуществляется в виде картинки в формате png.
Ungolfed
источник
Lua + LÖVE / Love2D , 653 байта
или разнесены:
Нажмите на поле, чтобы добавить живые клетки. Нажмите за пределами поля, чтобы запустить его.
Попробуйте онлайн!
источник
постскриптум
529515Начал с примера из Rosetta Code . Вызвать аргумент имени файла (
gs -- gol.ps pulsar
), файл, содержащий 20 * 20 двоичных чисел (разделенных пробелом). Бесконечный цикл: нарисуйте доску, дождитесь ввода, рассчитайте следующее поколение.Разнесенный, с несколькими комментариями стека (только те, которые мне нужны).
файл данных пульсара:
источник
JavaScript 676
Извините, Гриффин, я просто не мог посмотреть на ваш код и не переписать его немного ... пришлось сбрить два символа, но это того стоило!
b=[];r=c=s=20;U=document;onload=function(){for(z=E=0;z<c;++z)for(b.push(t=[]),j=0;j<r;j++)with(U.body.appendChild(U.createElement("button")))t.push(0),id=z+"_"+j,style.position="absolute",style.left=s*j+"px",style.top=s*z+"px",onclick=a}; ondblclick=function(){A=E=E?clearInterval(A):setInterval(function(){Q=[];for(z=0;z<c;++z){R=[];for(j=0;j<r;)W=(c+z-1)%c,X=(c+z+1)%c,Y=(r+j-1)%r,Z=(r+j+1)%r,n=b[W][Y]+b[z][Y]+b[X][Y]+b[W][j]+b[X][j]+b[W][Z]+b[z][Z]+b[X][Z],R.push(b[z][j++]?4>n&&1<n:3==n);Q.push(R)}b=Q.slice();d()})};function a(e){E?0:P=e.target.id.split("_");b[P[0]][P[1]]^=1;d()}function d(){for(z=0;z<c;++z)for(j=0;j<r;)U.getElementById(z+"_"+j).innerHTML=b[z][j++]-0}
Но, как говорится, проще просить прощения, чем разрешения ...;)
источник
Октава (153)
так же, как Matlab от DenDenDo в Shortest Game of Life , но пришлось изменить imshow на imagesc:
источник
Python 2: 334 байта
Только 6 лет с опозданием.
Вы можете запустить его как:
Там, где 0 и 1 представляют мертвые и живые клетки, в конце начинается дополнительная новая строка в конце.
Сетки должны быть квадратными.
Его легче запустить, чем самый короткий питон, он поддерживает сетки любого размера и выглядит красиво при запуске.
Это также на 100 байт больше, так что это так.
источник
PHP, 201 байт (не проверено)
Беги с
-nr
.сломать
источник