Flower Field - це милосердне переосмислення популярної гри «Сапер». Мета гри - знайти всі квіти в саду, скориставшись числовими підказками, які вказують, скільки квітів безпосередньо прилягає (по горизонталі, вертикалі, діагоналі) до клітинки. «Flower Field» виходила в регіональних версіях Microsoft Windows в Італії, у Німеччині, у Південній Кореї, в Японії та на Тайвані.
Ваше завдання - додати кількість квіток до порожніх клітинок завершеного саду «Квіткове поле».
Сам сад - це прямокутна дошка, складена з клітинок, кожна з яких або порожня (' '), або містить квітку ('*').
Для кожної порожньої клітинки порахуйте кількість квіток, суміжних із нею (по горизонталі, по вертикалі, по діагоналі). Якщо порожня клітинка не має суміжних квіток, залиште її порожньою. Інакше замініть її на кількість суміжних квіток.
Наприклад, ми можемо отримати дошку 5 x 4, що має такий вигляд (порожні місця тут позначено символом '·' для показу на екрані):
·*·*·
··*··
··*··
·····
Який наш код має перетворити на такий:
1*3*1
13*31
·2*2·
·111·
У тестах ми помітимо додаткові параметри для jq.
run jq -s -R -c -f flower-field.jq << 'END_INPUT'
Що це за параметри?
-s
Це режим «slurp». Замість того щоб обробляти вхідні дані як потік JSON-обʼєктів, усі вхідні дані буде зібрано в один масив.
$ seq 5 | jq -c '.'
1
2
3
4
5
$ seq 5 | jq -s -c '.'
[1,2,3,4,5]
-R
Можливо, ми вже бачили -r, який виводить «сирі» рядки тексту (англ. string), тобто без лапок.
Цей параметр робить навпаки.
Кожен рядок вхідних даних вважається рядком тексту.
Два приклади:
$ seq 5 | jq -R -c .
"1"
"2"
"3"
"4"
"5"
$ echo 42 | jq '. * 2' # input is a JSON number
84
$ echo 42 | jq -R '. * 2' # input is a JSON string
"4242"
Коли ми поєднуємо ці два параметри, ми не отримаємо масив рядків тексту: ми отримаємо всі вхідні дані як один рядок тексту, разом із символами нового рядка в кінці кожного рядка.
$ seq 5 | jq -s -R -c .
"1\n2\n3\n4\n5\n"
Впоратися з цим - частина складності цієї вправи.
Зареєструйтеся на Exercism, щоб вивчати й опановувати jq, а також 12 концепцій75 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми розглянемо вкладені цикли `for`, вдале застосування min/max для спрощення перевірки меж, функціональні конвеєри та роботу з двовимірними матрицями.