Отказ от ответственности: история, рассказанная в этом вопросе, является полностью вымышленной, и придумана исключительно с целью ознакомления.
Я злой фермер, и чтобы повысить цены на пшеницу в своем районе, я решил сжечь поля всех фермеров вокруг меня. Мне бы очень хотелось, чтобы поля вспыхнули пламенем (чтобы я мог использовать свой злой смех и потереть руки вместе с радостью), но я также не хочу, чтобы меня поймали, наблюдая, поэтому мне нужно, чтобы вы смоделировали поле сожгли для меня.
Твое задание:
Напишите программу или функцию, которая принимает в качестве входных данных поле и возвращает этапы его записи до тех пор, пока все поле не станет пеплом. Определенный участок поля, который находится в огне, представлен целым числом, представляющим интенсивность пламени. Пожар начинается с «1» и переходит на «2», затем «3» и так далее. Как только огонь достигает "4", он ловит любые непосредственно (не по диагонали) смежные области, которые являются легковоспламеняющимися в огне. Как только он достигает «8», он выгорает на следующей итерации и превращается в пепел, представленный буквой «А». Когда область еще не была затронута огнем, она обозначается «0». Например, если поле выглядит так:
100
000
Ваша программа должна вывести это:
100
000
200
000
300
000
410
100
520
200
630
300
741
410
852
520
A63
630
A74
741
A85
852
AA6
A63
AA7
A74
AA8
A85
AAA
AA6
AAA
AA7
AAA
AA8
AAA
AAA
При желании вы можете заменить вышеуказанные символы любым набором символов, который вы выберете, при условии, что они непротиворечивы и отличаются друг от друга.
Входные данные:
Начальная позиция поля в любой стандартной форме, например, строка с новой строкой, как указано выше.
Выход:
Поле в каждой итерации при записи, либо в виде массива, либо в виде строки, разделенной каким-либо символом.
Тестовые случаи:
0301
000A
555
|
v
0301
000A
555
1412
010A
666
2523
020A
777
3634
030A
888
4745
141A
AAA
5856
252A
AAA
6A67
363A
AAA
7A78
474A
AAA
8A8A
585A
AAA
AAAA
6A6A
AAA
AAAA
7A7A
AAA
AAAA
8A8A
AAA
AAAA
AAAA
AAA
Подсчет очков:
Это код-гольф , выигрывает самая низкая оценка в байтах!
источник
Ответы:
APL (Dyalog) , 52 байта *
Предполагается,
⎕IO←0
что по умолчанию на многих системах. Занимает поле, используя 0 для пустых слотов, 1 для негорящего поля, 2 для нового огня, 5 для распространения огня и 10 для пепла. Ввод должен быть не менее 3 × 3, что не является проблемой, так как дополнительные строки и столбцы могут быть дополнены нулями (пробелы в формате OP).Попробуйте онлайн!
Мой формат затрудняет проверку на правильность, поэтому вот версия с добавленной предварительной и последующей обработкой для перевода из и в формат OP.
⍣{
...}
повторять до:⍺
новое поколение≡
идентично⎕←⍵
текущее поколение, выведено{
…}⌺3 3
Замените каждую ячейку результатом этой функции, примененной к ее окрестности Мура:,⍵
расправиться с аргументом; дает список из девяти элементовr←
назначить на г4⊃
выбрать четвертый элемент; центр, т.е. исходное значение ячейкиc←
назначить с1=
один равен этому?:
если так, то:⍳2
сначала ɩ ntegers; 0 19⍴
г eshape к длине девять; 0 1 0 1 0 1 0 1 0r/⍨
используйте это, чтобы отфильтровать r (это получает только ортогональных соседей)4∊
четыре члена этого? (т.е. будет ли пятерка в следующем поколении?)1+
добавить один; 1, если не загорелся, или 2, если загорелся⋄
иначе (т.е. текущее значение 0 или ≥ 2)×c
знак cc+
с плюс это (то есть увеличение на единицу, если в огне)10⌊
минимум десять и то (так как пепел не горит)* В Dyalog Classic, используя
⎕U233A
вместо⌺
.источник
fire '0A000\n0A0A0\n0A0A0\n000A1'
отлично работает на отформатированном, но я не могу получить эквивалент для работы с первой ссылкой. Я, вероятно, делаю что-то не так. Это не работает для меня:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 байта
Попробуйте онлайн!
-3 байта благодаря officialaimm путем слияния другой лямбды в
f
(выглядит грязно, но сохраняет байты, и это все, что нас волнует)-8 байтов благодаря Mr. Xoder
-26 байтов благодаря ovs
-6 байтов благодаря ppperry
источник
JavaScript (ES6),
217210207204193192190 байтовСохранено 2 байта благодаря предложению @ Shaggy использовать
9
asA
.Использует
9
вместоA
. Ввод в виде двумерного массива целых чисел. Вывод в виде массива таких массивов.источник
9
вместоA
?Симулирование мира (в эмодзи) , 1407 байт?
Разве вы не любите использовать объяснимое объяснение в качестве языка программирования? Недостатком этого является то, что обычно там не очень четко определенная программа, поэтому в этом случае я использую JSON, который она экспортирует. (если у вас есть идеи получше, дайте мне знать)
Попробуйте это здесь или здесь:
источник
Сетчатка ,
1039688 байтПопробуйте онлайн! Использует
9
для золы; это можно изменить, используя 4 байтаT`1-8`2-8A
. Изменить: Сохранено 6 байтов благодаря @MartinEnder. Объяснение:Добавьте разделитель, чтобы выходы не сталкивались друг с другом. (Также помогает при сопоставлении ниже.)
Не печатайте конечное состояние (которое совпадает с предыдущим состоянием, которое уже было напечатано). Повторяйте до тех пор, пока проход не изменит состояние. Напечатайте текущее состояние перед каждым проходом.
Продвиньте интенсивность всего огня.
Осветите неосвещенные поля в зависимости от ситуации. Суб-объяснение:
Измерьте номер столбца этого неосвещенного поля.
Подходим неосвещенное поле.
Ищите подходящее поле справа.
Найдите подходящее поле в том же столбце (используя группу балансировки) в строке ниже. Обратите внимание, что если входные данные могут быть гарантированно прямоугольными, то это можно упростить до
|.*¶(?>(?<-1>.)*)4
экономии 3 байтов.Ищите подходящее поле слева. (Поскольку мы смотрим с правой стороны поля, мы также видим неосвещенное поле.)
Найдите подходящее поле в том же столбце в строке выше. Поскольку это просмотр сзади и, следовательно, сопоставление справа налево, условие балансировочной группы должно появляться перед столбцами, которые были сопоставлены балансировочной группой.
источник
Perl 5 , 365 байт
Попробуйте онлайн!
Использует «9» вместо «A» для обозначения сгоревшего места.
Разъяснения
источник
Haskell , 162 байта
Попробуйте онлайн! Использование:
h
принимает поле в виде списка строк и возвращает список полей. Несгоревшего поле обозначено@
и зола от9
, различные пожары цифры1
к8
.f
управляет распространением огня слева направо, заменяя все несгоревшие@
поля, которые находятся справа от горящего3
поля,0
.i
увеличивает каждую цифру до тех пор, пока она меньше9
.g
применяетсяf
к каждой строке, затем переворачивает строку,f
снова применяется и переворачивает обратно. Затем список строк транспонируется и снова на каждую строку иf
применяется ее обратное .h
применяетсяg
к вводу до тех пор, пока он больше не изменяется, и собирает результаты.источник
_
. Если это неприемлемо, то я боюсь, что мне придется удалить ответ, потому что он сосредоточен вокруг использования,transpose
и я не вижу способа легко это исправить, не вводя тонны байтов.C (gcc) ,
308305299297295291 байтЭта программа определяет функцию, которая принимает два входа - указатель на массив строк, которому предшествует его длина, как это разрешено этим вводом-выводом по умолчанию. Выходы в STDOUT с завершающим переводом строки.
Попробуйте онлайн!
источник
80
.A
s, но, видимо, я ошибся. В любом случае, спасибо за информацию. Это исправлено сейчас.Октав,
7269 байтВвод принимается как двумерный массив чисел, а пустые места отмечены
Inf
.'A'
был заменен на9
. Промежуточные результаты (в виде массива чисел) неявно печатаются.Попробуйте онлайн!
Объяснение:
В цикле функция
imdilate
(морфологическое расширение изображения) из пакета изображений используется для имитации распространения огня.источник
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
Python 2 , 325 байт
f
принимает входные данные как двумерный массив целых чисел, а пустые места отмечены значком''
.'A'
был заменен на9
. Функция выводит генератор всех полей во времени в одном и том же формате.Попробуйте онлайн!
источник
Октава , 212 байт
Для запуска укажите массив символов, например:
... тогда сделай:
Объяснение кода, чтобы следовать ...
Попробуйте онлайн!
Примечание: я пытался запустить этот код с tio.run , но я не получил никакого вывода. Я должен был использовать другой сервис.
источник
PHP,
226 212 210 209 185177 байтпринимает ввод с завершающей новой строкой из файла с именем
m
;9
для пепла.Запустите
-nr
или попробуйте онлайн .Первый подход: PHP 7.0, 209 байт
получает ввод с завершающей новой строкой из файла с именем
m
.Запустите
-nr
или попробуйте онлайн .Примечания к версии PHP к (для старого подхода)
$c-4|
на$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
на$a%2*~-($a&2)
a&$c
на""<$c
,+$c
с0<$c
и$c-4
на$c!=4
источник
Октава,
419312 байтПопробуйте онлайн!
Это моя версия, она работает, так что теперь мне все еще нужно играть в гольф. Я думаю, что это может быть намного короче, если я найду способ найти индексы 4 в матрице, но я не знаю как.
PS: А это 9 в моем коде.
источник
endif
endfor
иendwhile
можно написатьend
Трафарет (
∊
-режим) , 22 байтаПопробуйте онлайн!
Как и в тестовом вводе, используйте целые числа, разделенные пробелами для
0
-8
,' '
для пробела и'A'
дляA
. Не забудьте добавить конечные пробелы тоже.источник