Рассмотрим следующую стандартную сетку кроссвордов 15 × 15 .
Мы можем представить это в искусстве ASCII, используя #
для блоков и (пробел) для белых квадратов.
# #
# #
#
# #
### ## ##
## #
# #
# ##
## ## ###
# #
#
# #
# #
Учитывая приведенную выше сетку кроссвордов в художественном формате ASCII, определите, сколько слов в ней содержится. (Вышеуказанная сетка состоит из 78 слов. Это, пожалуй, загадка « Нью-Йорк Таймс» в прошлый понедельник .)
Слово - это группа из двух или более последовательных пробелов, проходящих вертикально или горизонтально. Слово начинается и заканчивается либо блоком, либо краем сетки и всегда проходит сверху вниз или слева направо, а не по диагонали или назад. Обратите внимание, что слова могут охватывать всю ширину головоломки, как в шестом ряду головоломки выше. Слово не обязательно должно быть связано с другим словом.
подробности
- На входе всегда будет прямоугольник, содержащий символы
#
или(пробел) со строками, разделенными символом новой строки (
\n
). Вы можете предположить, что сетка состоит из любых 2 различных печатаемых символов ASCII вместо#
и.
- Вы можете предположить, что есть дополнительный завершающий перевод строки. Символы в конце пробела имеют значение, так как они влияют на количество слов.
- Сетка не всегда будет симметричной, и это могут быть все пробелы или все блоки.
- Ваша программа теоретически должна работать на сетке любого размера, но для этой задачи она никогда не будет больше 21 × 21.
- Вы можете взять саму сетку в качестве ввода или имя файла, содержащего сетку.
- Возьмите входные данные из аргументов stdin или командной строки и выведите их в stdout.
- Если вы предпочитаете, вы можете использовать именованную функцию вместо программы, принимая сетку в качестве строкового аргумента и выводя целое число или строку через стандартный вывод или возврат функции.
Контрольные примеры
Входные данные:
# # #
Вывод:
7
(перед каждым есть четыре пробела#
. Результат будет одинаковым, если убрать каждый числовой знак, но Markdown удаляет пробелы из пустых строк.)Входные данные:
## # ##
Вывод:
0
(Однобуквенные слова не учитываются.)Входные данные:
###### # # #### # ## # # ## # #### #
Вывод:
4
Вход: (10 мая, воскресенье, Нью-Йорк Таймс )
# ## # # # # # # # ### ## # # ## # # # ## # ## # ## # # ### ## # ## ## # ## ### # # ## # ## # ## # # # ## # # ## ### # # # # # # # ## #
Вывод:
140
счет
Самый короткий код в байтах побеждает. Tiebreaker - самый старый пост.
py -3 slip.py regex.txt input.txt
иpy -3 slip.py regex.txt input.txt no
, что составляет три байта (включая пространство передn
)Haskell, 81 байт
Использует пробелы
качестве блочных символов и любые другие (не пробельные) символы в качестве пустой ячейки.
Как это работает: разбить ввод на список слов в пробелах. Возьмите
1
для каждого слова с как минимум 2 символа и суммируйте эти1
s. Примените ту же процедуру к транспозиции (разбить на\n
) входных данных. Добавьте оба результата.источник
JavaScript ( ES6 ) 87
121 147Создайте транспонирование входной строки и добавьте ее к вводу, затем посчитайте строки из 2 или более пробелов.
Запустите фрагмент в Firefox для проверки.
Кредиты @IsmaelMiguel, решение для ES5 (122 байта):
источник
F=z=>{for(r=z.split(/\n/),i=0;i<r[j=0][L='length'];i++)for(z+='#';j<r[L];)z+=r[j++][i];return~-z.split(/ +/)[L]}
? Это 113 байтов в длину. Ваше регулярное выражение было заменено на/ +/
(2 пробела),j=0
было добавлено вfor
цикл 'parent', и вместо использования синтаксисаobj.length
я изменил его на использованиеL='length'; ... obj[L]
, которое повторяется 3 раза.F=z=>
мне пришлось использоватьvar F=(z,i,L,j,r)=>
). Я проверил его на IE11, и он работает!/\n/
строку шаблона реальным переводом строки между. Это экономит 1 байт, так как вам не нужно писать escape-последовательность.Pyth,
151413 байтЯ использую
как разделитель и
#
как заполнение символов вместо их противоположного значения от OP. Попробуйте онлайн: демонстрацияВместо
#
символа заполнения он принимает также буквы. Таким образом, вы можете взять разгаданную кроссворд и напечатать количество слов. И если вы удалитеl
команду, она даже печатает все слова. Проверьте это здесь: головоломка Sunday Times от 10 маяобъяснение
источник