Flower Field - це милосердне переосмислення популярної гри «Сапер». Мета гри - знайти всі квіти в саду, скориставшись числовими підказками, які вказують, скільки квітів безпосередньо прилягає (по горизонталі, вертикалі, діагоналі) до клітинки. «Flower Field» виходила в регіональних версіях Microsoft Windows в Італії, у Німеччині, у Південній Кореї, в Японії та на Тайвані.
Ваше завдання - додати кількість квіток до порожніх клітинок завершеного саду «Квіткове поле».
Сам сад - це прямокутна дошка, складена з клітинок, кожна з яких або порожня (' '), або містить квітку ('*').
Для кожної порожньої клітинки порахуйте кількість квіток, суміжних із нею (по горизонталі, по вертикалі, по діагоналі). Якщо порожня клітинка не має суміжних квіток, залиште її порожньою. Інакше замініть її на кількість суміжних квіток.
Наприклад, ми можемо отримати дошку 5 x 4, що має такий вигляд (порожні місця тут позначено символом '·' для показу на екрані):
·*·*·
··*··
··*··
·····
Який наш код має перетворити на такий:
1*3*1
13*31
·2*2·
·111·
Усі вхідні та вихідні дані подано в ASCII.
String і &str у Rust мають кодування utf8, тож хоча можна було б очікувати, що "Hello".chars() буде простим, насправді йому доводиться перевіряти кожен символ, щоб зʼясувати, чи він завдовжки 1, 2, 3 чи 4 u8.
Якщо ми знаємо, що &str є ASCII, то можемо викликати .as_bytes() і звертатися до даних під ним як до &[u8] (зрізу байтів).
Перебирати зріз ASCII-байтів значно швидше, адже тут не задіяні кодові точки: кожен ASCII-байт завдовжки один u8.
Чи вдасться розвʼязати це завдання, не клонуючи вхідні дані?
Зареєструйтеся на Exercism, щоб вивчати й опановувати Rust, а також 99 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми розглянемо вкладені цикли `for`, вдале застосування min/max для спрощення перевірки меж, функціональні конвеєри та роботу з двовимірними матрицями.