2016-04-04 9 views
1

У меня есть следующий код, который производит последующие поколения игры Конвея жизни:Конвея жизни в 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 (у).

+./ 

Или результат вместе, чтобы произвести следующее поколение.

Я хотел бы знать, есть ли лучший способ сделать это и сократить код. Многие вещи, которые я делал, выглядели очень хаки. Благодарю.

ответ

2

Существует ряд возможностей для упрощения/сокращения кода путем удаления необходимости удаления компонентов, не вставляя их в первую очередь. Например:

(>(($ y) $ 1);y) 

становится

((($ y) $ 1),:y) 

и

> =&(+/ (>,{ ;~(1 0 _1))|. y) each 3 4 

становится

=&(+/ (>,{ ;~(1 0 _1))|. y) &> 3 4 

Использования молчаливой формы часто тоже могут помочь. Нет необходимости ссылаться на аргументы в явном виде и вилки и крючки помогут упростить выражение:

((($ y) $ 1),:y) becomes (,:~ 1 $~ $) y 

Принимая вышеуказанные методы и их применение к вашим идеям, вот одна альтернативы:

life =: +./@((,: 1 $~ $) *. (4 3 =/ [: +/ (>,{;~1 0 _1)&|.)) 
    life RR 
0 0 0 1 0 0 0 
0 0 1 1 0 0 0 
0 1 0 0 1 0 0 
0 0 1 1 0 0 0 
0 0 0 0 0 0 0 
+0

Спасибо за ответ. Специально для ',:'.Мне было интересно, можете ли вы более подробно объяснить/разбить '&>' и '(,: ~ 1 $ ~ $)'. Я все еще смущен этими предложениями. – Helix

+0

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '' '' '' '' '' и будет принимать отдельные атомы, распаковывать их (все еще нет-op), применять функцию/глагол, но не будет делать ребокс. См. Страницу NuVoc для под '& .' на Jwiki – Tikkanz

+0

' (,: ~ 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