Покажите мне несколько фейерверков!

16

Учитывая, любым способом и в порядке,

  • размеры (в любом порядке)

  • вероятность (в любом формате, который вы хотите)

  • количество итераций (вы можете выбрать, считать ли начальное состояние или нет)

выполните одно из следующих действий:

  • одушевленный или

  • выводить каждый шаг или

  • вернуть список состояний

заполненное пространствами небо этих измерений.

Для каждой итерации:

  • у каждого персонажа неба есть определенная вероятность стать *

  • восемь персонажей, которые окружают любого, *становятся
    \ | /
    -      -
    / | \, если они не становятся звездами, однако,

  • если персонаж находится в диапазоне двух *с, сделайте егоX

пример

Небо 7 × 22 (кадр только для ясности - не выводить кадр)

┌──────────────────────┐
│                      │
│                      │
│                      │
│                      │
│                      │
│                      │
│                      │
└──────────────────────┘

может с 1% вероятностью стать

┌──────────────────────┐
│  *                   │
│                      │
│                      │
│                      │
│                      │
│           *          │
│                      │
└──────────────────────┘

и следующий шаг

┌──────────────────────┐
│ - - *                │
│ /|\                  │
│          *           │
│                      │
│          \|/         │
│          - -         │
│          /|\         │
└──────────────────────┘

а потом

┌──────────────────────┐
│    - -               │
│    /|\  \|/          │
│         - -          │
│         /|\          │
│                      │
│      * *             │
│                      │
└──────────────────────┘

и

┌──────────────────────┐
│                      │
│                      │
│                      │
│                      │
│     \|X|/            │
│     - X -            │
│     /|X|\          * │
└──────────────────────┘

и так далее

┌──────────────────────┐
│                      │
│                      │
│                      │
│                   *  │
│                      │
│                   \|/│
│                   - -│
└──────────────────────┘
Адам
источник
5
Если кто-то просматривает это, он совсем не знаком с культурой США, он может быть смущен тем, почему вы запускаете фейерверк 4 июля.
Okx
@Okx, чтобы уничтожить всех, кто против, конечно!
Волшебная Осьминог Урна
1
Обязательный xkcd
caird coinheringaahing

Ответы:

5

ES6, 520 496 байт

Отсечение и все остальное должно работать сейчас.

(w,h,p,i,r=0,s=($=>{while(++r<i)for(j=0,_=$[r]=[],z=$[r-1]||[];j<w*h;){k=j+1,l='*',c=0
n=(j%w&&z[j-1]==l&&++c)|(k%w&&z[k]==l&&++c)?'-':' '
n=(z[j-w]==l&&++c)|(z[j+w]==l&&++c)?'|':n
n=(j%w&&z[j-w-1]==l&&++c)|(k%w&&z[k+w]==l&&++c)?'\\':n
n=(k%w&&z[k-w]==l&&++c)|(j%w&&z[j+w-1]==l&&++c)?'/':n
_[j++]=Math.random()<p?l:c>1?'X':n}})(x=[])||x)=>{c=document.body.children[0],r=0;while(++r<i)setTimeout((k=0)=>{for(r++,c.innerHTML='';k<h;)c.innerHTML+=s[r].slice(k*w,++k*w).join('')+'\n'},90*r);r=0}

Посмотреть анимацию!

Сохранено 24 байта благодаря подсказке Захари.

Старое решение, 478 байт (с ошибкой отсечения)

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

(w,h,p,i,r=0,s=($=>{while(++r<i)for(j=0,_=$[r]=[],z=$[r-1]||[];j<w*h;){c=0
n=(z[j-1]=='*'&&++c)|(z[j+1]=='*'&&++c)?'-':' '
n=(z[j-w]=='*'&&++c)|(z[j+w]=='*'&&++c)?'|':n
n=(z[j-w-1]=='*'&&++c)|(z[j+w+1]=='*'&&++c)?'\\':n
n=(z[j-w+1]=='*'&&++c)|(z[j+w-1]=='*'&&++c)?'/':n
_[j++]=Math.random()<p?'*':c>1?'X':n}})(x=[])||x)=>{c=document.body.children[0],r=0;while(++r<i)setTimeout((k=0)=>{for(r++,c.innerHTML='';k<h;)c.innerHTML+=s[r].slice(k*w,++k*w).join('')+'\n'},90*r);r=0}

Просмотр старого.

2ndAttmt
источник
Красиво сделано. Разве вы не можете исправить вырезку, добавив пустые столбцы по бокам, анимировать, а затем нарезать?
Адам
Не могли бы вы определить переменную, '*'так как вы используете ее так часто?
Захари
@ Zacharý Хороший совет, я буду определять переменные '*'и другие часто используемые вещи.
2ndAttmt
Если бы только у JS были макросы.
Захари
2

APL (Дьялог) , 65 символов или 71 байт *

Запрашивает измерения (строки, столбцы), затем итерации (не считая начальное состояние), затем вероятность (как n в ¹⁄ ).

⎕{1=?⍺⍺:'*'2≤+/b←'*'=1↓4⌽,⍵:'X'⋄⊃b/'-/|\\|/-'}⌺3 3{⍺⍺⎕←⍵}⍣⎕⊢⎕⍴''

Попробуйте онлайн!

⎕⍴'' приглашение для ввода и использования , что г eshape пустой строки, дополняя с пробелами в случае необходимости

 дать что

Запросить⍣⎕  ввод и применить следующую функцию к описанному выше ( ) много раз:

 ... {... } получить функцию , используя приведенную ниже функцию в качестве операнда ( ⍺⍺ ), следующим образом :

  ⎕←⍵ распечатать аргумент

  ⍺⍺ примените следующую функцию:

   … ⌺3 3 Примените следующую функцию к каждому элементу 3 × 3 Мура:

    ⎕{} Получить ввод и использовать его как операнд ( ⍺⍺ ) для получения новой функции

     ?⍺⍺ случайное целое число среди первых ⍺⍺ целых

     1= Логический, если равен единице

     : если правда:

      '*' вернуть звезду

      еще:

      ,⍵ Равель (сплющить) аргумент (окрестности Мура)

      4⌽ поверните его циклически на четыре шага влево

      1↓ отбросить один элемент (оригинальный центр)

      '*'= Булевый список, где равно звезде

      b← сохранить это как б

      +/ сумма, что

      2≤ Логическое значение, если два или выше

      : если правда:

       'X' вернуть X

       еще:

       b/'-/|\\|/-' используйте b для фильтрации строки

        выберите первый, если его нет, выберите прототип (пробел)


* Чтобы запустить в Dyalog Classic, просто замените на⎕U233A .

Адам
источник