Правило 110 - это клеточный автомат с некоторыми интересными свойствами. Ваша цель - смоделировать правило 110, используя как можно меньше символов.
Для тех, кто не знает, правило 110 моделируется построчно в сетке. Каждый квадрат в линии сетки смотрит на квадраты выше, слева вверху и справа, чтобы определить, какой должна быть ячейка.
current pattern 111 110 101 100 011 010 001 000
new cell 0 1 1 0 1 1 1 0
Ввод: числа от 0 до 39, представляющие верхний ряд n-го квадрата ввода, в любом приемлемом формате (строка, разделенная запятыми, список, аргументы функции). Для поддержки языков с 1 индексом числа также могут быть 1 индексированы и могут варьироваться от 1 до 40.
Пример ввода:
38,39
Вывод: сетка 40 x 40, представляющая работающие автоматы, включая первый ряд. Вы должны оставить 0 пустым, а 1 - любым видимым печатным символом. Задние пробелы разрешены, при условии, что фактическая сетка может быть разумно различена. В нижней части сетки может быть новая строка, но между линиями сетки не должно быть пустых линий.
Пример вывода:
XX
XXX
XX X
XXXXX
XX X
XXX XX
XX X XXX
XXXXXXX X
XX XXX
XXX XX X
XX X XXXXX
XXXXX XX X
XX X XXX XX
XXX XXXX X XXX
и т.п.
Примечание: подобный вопрос о 1D клеточных автоматах уже задавался, но я надеюсь, что, используя только одно правило, можно написать более короткие ответы.
Ответы:
CJam - 47
Используется
!
для «1» клеток.Попробуйте это на http://cjam.aditsu.net/
Объяснение:
S40*
делает строку (массив) из 40 пробеловl',/
читает строку и разделяет запятую{…}/
выполняет блок для каждого элемента (числа в строковой форме)-
i'!t
преобразует число в целое число и устанавливает элемент в этой позиции в предыдущей строке (первоначально 40 пробелов ) к '!'На данный момент мы получили первую строку.
{…}39*
выполняет блок 39 раз-
N
добавляет новую строку-
40,
создает массив [0 1… 39]-
S3$S++
копирует предыдущую строку (позиция 3 в стеке) и дополняет ее пробелом с каждой стороны-
f{…}
выполняет блок для {каждого числа из 0 до 39} и {заполненная строка}-
>3<
берет фрагмент из 3 элементов из дополненной строки, начиная с текущего номера-
2b
конвертируется из базы 2; элементы, которые мы нарезали, не являются цифрами base-2, но символы преобразуются в их значения ASCII, а '' mod 8 равен 0 и '!' mod 8 равен 1-
137Yb
преобразует 137 в основание 2 (Y
= 2), получая [1 0 0 0 1 0 0 1], который на 110 перевернут и отрицается (на 8 битах)-
='!^
получает соответствующую цифру base-2 ( Массив оборачивается так, что индекс берется по модулю 8) и записывает xor с помощью '!' символ, в результате чего «!» для 0 и '' для 1источник
Рубин, 113 символов
Принимает вход на стандартный ввод. Чтобы использовать другое правило, просто замените
110
в последней строке любое правило, которое вы хотите попробовать.Пример:
источник
Mathematica, 122 байта
Да, вы можете рассматривать это как злоупотребление этой лазейкой , но а) эта лазейка довольно спорная, б) вопрос о Cellular Automaton требует ответа Mathematica (особенно одного о правиле 110) и в) ответ Ruby от Ventero в любом случае короче, поэтому я не согласен не думаю, что какой-либо вред причинен.
Большинство символов используются для разбора ввода и форматирования вывода. Фактический автомат моделируется с помощью
При этом используются периодические граничные условия (поэтому сетка оборачивается).
источник
Питон - 141
Запустить как например
python 110.py <<< 38,39
источник
['X',' ']
можно изменить,'X '
чтобы сохранить 5 символов.o=range()
q,
676258 байтПредполагается, что нет обтекания:
Старая версия
источник
Питон, 186
Достойный, но, вероятно, не оптимальный.
Вы не указали, как вводится, поэтому я просто сделал функцию.
Пример использования:
Выход:
источник
Mathematica, 113 символов
Другой ответ Mathematica с помощью
CellularAutomaton
.источник
" "["X"][[#]]&
работает?" "["X"][[1]]
есть"X"
." "["X"][[0]]
возвращает главу" "["X"]
, а именно" "
.С - 178
Этот код зависит от того, что каждая строка в матрице хранится в непрерывной памяти. Кроме того, он не печатает первую строку, но печатает следующие 40, поскольку в правилах указана только сетка 40x40.
Отмеченный только для удобства чтения, в число байтов входит только необходимый код.
источник
Луа - 351
Не идеальный язык для игры в гольф.
источник
do u(n,i,'x')
это намеренно, не так ли?Haskell ,
175 170 169 136 127124 байтов−9 байт благодаря @bmo
Попробуйте онлайн!
источник
Haskell ,
135 131130 байтов-1 байт благодаря Эрджану Йохансену (переупорядочение
take 40
)Совершенно другой подход к ответу FrownyFrog, но примерно такой же длины:
объяснение
r
zipWith3
(?)
(?)
Оператор является наиболее интересной частью решения: Раньше я использовал логическое правило , производимое с картой Карна, но оказывается, есть еще более краткий способ:источник
take 40$
передmap(" o"!!)<$>
.Шелуха ,
3128 байтХа, Хаск бьет Желе!
Попробуйте онлайн!
Объяснение и Унгольфед
Прежде чем добавить объяснение, позвольте мне немного раскрутить это. Давайте сначала удалим различные композиции, добавим явные скобки и распакуем
¨↑¨
строку. Также давайте заменим40
с4
для более читаемого объяснения:источник
Java, 321 символов
Например, ввод передается как аргумент из командной строки
java R 38,39
Я никогда не писал более запутанный код Java :-)
источник
Обновление: исправьте пример вывода здесь (с 40 строками, а не 50): новый вывод ниже (для краткости удален предыдущий):
Делая еще одну головоломку, я узнал кое-что интересное о вложении операторов в циклы в php, и внезапно они стали намного сложнее, чем я думал. Когда у меня появляется время, я считаю, что могу значительно превзойти этот счет. На данный момент, хотя он остается неизменным на уровне неконкурентных 408.
Моя версия php 408 символов:
Это была отличная головоломка. Я также провел целую вечность, играя с входами, поскольку это - захватывающие вещи, это должно быть сказано. В любом случае, вот моя версия PHP (которая далеко не так хороша, как некоторые из опубликованных ответов, но завершена. В 0-й позиции - только выше и выше справа, в 39-й позиции - только выше и выше слева, т.е. без переноса. Так что здесь моя версия:
Вы можете увидеть его и запустить здесь: http://codepad.org/3905T8i8
В начале вводится строка ввода: $ a = '38, 39 ';
Вывод следующий:
Надеюсь тебе понравится !!!
PS Мне пришлось добавить несколько разрывов строк в код, чтобы вы могли видеть все это, а не растягивать его по всей странице с помощью полосы прокрутки.
источник
Stax , 24 байта CP437
Запускать и отлаживать онлайн!
Использует кодовую точку 1 в CP437 для ячеек «1».
Отличный случай, чтобы показать силу этого языка.
объяснение
Для объяснения используется распакованная версия (29 байт).
источник
K (нгн / к) ,
4435 байтПопробуйте онлайн!
{
}
функция с аргументомx
!40
список целых от 0 до 39x?
найти их индексыx
, используйте0N
("целое число ноль") для не найден^
какие из них нулевые? это дает нам вход, отрицается39{
}\
применить 39 раз, собирая промежуточные результаты в списке1,x,1
окружить список 1 (отрицается 0)3'
тройки последовательных предметов2/'
двоичное декодирование каждого@
использовать в качестве индексов в ...2\145
двоичное кодирование 145 (отрицательные биты 110)"X "
наконец, используйте матрицу 40x40 в качестве индексов в строке"X "
(@
здесь подразумевается)источник
Желе , 29 байт
Попробуйте онлайн!
источник