У меня есть следующий код, который производит последующие поколения игры Конвея жизни:Конвея жизни в J
life =: 3 : '+./ (>(($ y) $ 1);y) *. > =&(+/ (>,{ ;~(1 0 _1))|. y) each 3 4'
Использование:
RR =: 5 7 $ 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
NB. First five gens of RR
life^:(i.5) RR
NB. in ASCII
' *' {~ life^:(i.5) RR
Объяснение кода:
>,{ ;~(1 0 _1)
Производит все возможные 1 поворот матрицы y.
|. y
Применяется 1 вращения к у
+/
добавляет все 1 повороты, ведущие к соседнему отсчета для каждой ячейки
=&
Создает монадическое функцию, которая принимает единственное число и сравнивает его к соседнему счету
each 3 4
Применяет функцию к 3 и 4 для поиска ячеек с 3 или 4 окружающими ячейками, включая сам.
>
Unboxes применить побитовое и
(>(($ y) $ 1);y)
Я хочу, чтобы все ячейки, которые соответствуют 3 (($ Y) $ 1) и только клетки, которые уже в настоящее время живущих в, соответствуют 4 (у).
+./
Или результат вместе, чтобы произвести следующее поколение.
Я хотел бы знать, есть ли лучший способ сделать это и сократить код. Многие вещи, которые я делал, выглядели очень хаки. Благодарю.
Спасибо за ответ. Специально для ',:'.Мне было интересно, можете ли вы более подробно объяснить/разбить '&>' и '(,: ~ 1 $ ~ $)'. Я все еще смущен этими предложениями. – Helix
'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' '' '' '' '' и будет принимать отдельные атомы, распаковывать их (все еще нет-op), применять функцию/глагол, но не будет делать ребокс. См. Страницу NuVoc для под '& .' на Jwiki – Tikkanz
' (,: ~ 1 $ ~ $) 'представляет собой комбинацию вилки и крючка. Давайте сначала рассмотрим fork '(1 $ ~ $)'. Согласно [http://code.jsoftware.com/wiki/Vocabulary/fork Jwiki] '(fgh) y <--> (fy) g (hy)' и где 'f' является существительным' (fgh) y <--> fg (hy) 'so' (1 $ ~ $) RR <--> 1 $ ~ ($ RR) ', который совпадает с' ($ RR) $ 1' – Tikkanz