Сапер - популярна гра, у якій гравець має знайти міни за числовими підказками, що показують, скільки мін безпосередньо межує з клітинкою (по горизонталі, вертикалі або діагоналі).
У цій вправі ми додаємо кількість мін до порожніх клітинок готового ігрового поля «Сапер». Саме поле має форму прямокутника, що складається з клітинок, і кожна з них або порожня (' '), або містить міну ('*').
Для кожної порожньої клітинки порахуймо кількість сусідніх мін (по горизонталі, по вертикалі, по діагоналі). Якщо в порожньої клітинки немає сусідніх мін, залишмо її порожньою. Інакше замінімо її на кількість сусідніх мін.
Наприклад, ми можемо отримати поле 5 x 4 такого вигляду (тут порожні клітинки позначено символом '·' для показу на екрані):
·*·*·
··*··
··*··
·····
І ось на що його має перетворити наш код:
1*3*1
13*31
·2*2·
·111·
Мінне поле подано як рядок тексту (англ. string), у якому кожен рядок завершується символом нового рядка.
Наприклад: " \n * \n \n"
Буфер для вхідного рядка тексту займає байти 64-319 лінійної памʼяті.
За потреби вхідний рядок тексту можна змінити на місці.
Зареєструйтеся на Exercism, щоб вивчати й опановувати WebAssembly, а також 87 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми розглянемо вкладені цикли `for`, вдале застосування min/max для спрощення перевірки меж, функціональні конвеєри та роботу з двовимірними матрицями.