Введение
После дня питья и просмотра чемпионата мира вы садитесь играть в дружескую игру ошеломления. Наступление вспыхивает, когда вас обвиняют в том, что вы тратите время на все с пустыми словами, которых нет даже на доске! Возможно, вы встречаетесь с двойным, но, конечно, вы думаете достаточно прямо, чтобы написать программу, которая проверит, что ваши слова на доске.
Твое задание
Напишите программу, сценарий или функцию, которая использует в качестве входных данных панель управления и слово и возвращает True, если слово находится на доске, и False, если это не так.
Ввод будет выполнен в виде шести \n
разделенных строк. Первые пять строк будут состоять из 5x5 и каждая из них будет состоять из пяти заглавных букв. В шестой строке будет слово, о котором идет речь, также заглавными буквами.
Пример ввода:
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
DAFTER
Выходными данными могут быть все, что однозначно означает Истина или Ложь в выбранном вами языке программирования и соответствует стандартным соглашениям, равным нулю, нулю и пустому значению Ложь.
Пример вывода для вышеуказанного ввода:
1
Руководство по вводу / выводу
- Входные данные могут быть прочитаны из стандартного ввода, а выходные данные - в стандартный вывод.
Или
- Входные данные могут быть одним строковым аргументом функции, а answer - возвращаемым значением этой функции.
Богдл Правила
- Слово «на доске», если вы можете построить слово по пути последовательных, смежных, неповторяющихся плиток на доске.
- Плитка считается смежной с восемью плитками, которые ее окружают (разрешены диагональные пути). Плитки на краю доски примыкают только к пяти плиткам. Плитка в углу соседствует только с тремя.
- Последовательные буквы в слове должны быть смежными,
i
буква th в слове должна быть смежной с буквойi-1
th иi+1
th. - Буква может появиться в слове более одного раза, но вы не можете использовать один и тот же квадрат на доске для сообщений более одного раза за слово.
- Онлайновый сайт WordPlay.net может быть полезен, если вы никогда раньше не играли в boggle, но хотите ознакомиться с этими правилами.
В отличие от обычной болтовни:
- Вам не нужно беспокоиться о том, что это слово является действительным английским словом.
- Там не будет ни
Qu
одной плитки. - Слово может быть любой длины> 0
пример
На доске
AJNES
TNFTR
LSAIL
UDNEX
EQGMM
Эти слова должны возвращать Истину: СУДЬБА, ЗНАКОМСТВА, СТЕНДЫ, ЛИФТЫ.
Эти слова должны возвращать False: SADDEN, SULTANS, EXIST, SUEDE, QUEST
Это испытание для игры в гольф, поэтому выигрывает самый короткий код!
Ответы:
GolfScript, 74 символа
Ввод должен быть дан на STDIN. Печатает количество допустимых путей на плате, то есть
0
ни для одного, и положительное число (true) в остальном.Вы можете проверить пример онлайн .
Код с некоторыми комментариями:
источник
Javascript (E6) 137
160 175 190Менее 2 * Golfscript. Моральная победа ...
Редактировать Гольф-код реорганизации. Опять и опять
Ungolfed Последняя версия, немного сложная для подражания
Ungolfed Первая версия, должно быть яснее
использование
Тест
Выход:
источник
F=a=>(b=a.split('\n'),w=b.pop(Q=(p,n)=>((R|=!w[n])||(b[p]=0)||[1,5,6,7,-1,-5,-6,-7].map(q=>b[q+=p]==w[n]&&Q(q,n+1,b[q]=w[n])))),[Q(~~p,1)for(p in b=[...b.join(R=0)])if(b[p]==w[0])],R)
w = a.pop()
(игра в гольф) илиw = b.pop()
(без игры в гольф, линия 2)? (вероятно, последнее, я думаю)a=a.pop()
вместоb=a.pop()
...Питон,
207 204203Замена
... (b[i]==w[0])*any ...
на... b[i]==w[0]and any ...
дает гораздо лучшую производительность за счет 2 символов.источник
0<=i<25and
J - 75 символов
Эх, это выглядит противно. И даже не связывая с Golfscript! Это функция, принимающая строку в качестве единственного аргумента. Вы можете использовать любой односимвольный разделитель, если он находится в конце каждой строки, включая последнюю.
Объяснение следует. Обратите внимание, что функция может быть разбита на 5 отдельных частей верхнего уровня, каждая из которых разделена
@
, поэтому мы будем рассматривать каждую из этих частей отдельно, справа налево.(<;._2)
- Это разбивает строки на символы новой строки / разделителя. Он использует символ в конце строки как символ для разделения. Мы помещаем все в box (<
), потому что если мы не получим некоторые проблемы с заполнением, когда J возвращает нам результат.(((<@#:i.)5 5)<@#~&,"2{:=/&:>}:)
- Для каждой буквы в проверяемом слове создайте список индексов на доске Boggle, где можно найти эту букву.{:
последний разделенный фрагмент (слово для проверки) и}:
все, кроме последнего (доска Boggle).&:>
открывает поля, которые мы сделали ранее, с полезным побочным продуктом превращения}:
в двумерный массив символов.=/
затем делает копию этой доски Boggle для каждой буквы в слове и превращает позиции в логические значения в зависимости от того, соответствует ли буква на доске этой букве в слове.((<@#:i.)5 5)
это короткий способ выражения массива индексов 5x5.x#:y
is преобразуетсяy
в массив базовогоx
представления. (Ну, почти. Правда сложнее, но это работает для наших целей.)<@#~&,"2
- Для полученной логической матрицы каждой буквы соберите все соответственно истинные индексы."2
заставляет все работать с правильными результатами,#~&,
делает выбор и<@
собирает каждый результат в поле для подготовки к следующему шагу.{
- Этот глагол, используемый монадически, называется Каталогом, и в качестве аргумента он принимает список полей. Он сочетает в себе каждую коробку всеми возможными способами. Так, например, каталог в некоторых полях, содержащий строки «AB» и «abc», даст результаты «Aa», «Ab», «Ac», «Ba», «Bb», «Bc».Запуск этого в нашем упакованном списке списков индексов делает каждую возможную комбинацию индексов. Это может быть большой набор, если слово длинное и много повторяющихся букв, но также пустое, если на доске нет ни одной буквы. Также отметим, что мы повторно используем тайлы в некоторых из этих путей: мы рассмотрим это позже.
([:*/"1^:2(2(=*)@-/\>@~.)S:1)
- Здесь мы проверяем каждый путь, чтобы увидеть, если он действителен.(...)S:1
применяет(...)
к каждому пути и собирает результаты в плоский список. Это очень важно, потому что в результате{
получается многомерный массив, и нам не важна структура этого массива, только его содержимое в каждом блоке.2(=*)@-/\>
дает 1, если каждая координата каждого индекса находится на расстоянии не более одной от следующей за ним, и 0 в противном случае.2
И/\
несут ответственность за выполнение этой парно.*/"1^:2
логические И это все вместе в конце.[:
Часть является структурной вещью в J, не беспокойтесь об этом.Добавление
@~.
на>
самом деле является умным способом исключить пути с повторяющимися записями.~.
берет уникальные элементы списка, поэтому список укорачивается, если он самопересекается, и более короткие списки автоматически заполняются нулями при их объединении, как способ объединения результатов по мере их появленияS:
. Это в конечном итоге короче, чем явное исключение самопересекающихся путей.+/
- Наконец, мы просто складываем все вместе в конце. Результатом является количество допустимых путей, которые составляют слово на доске, где 0 означает отсутствие путей, т.е. это слово отсутствует на доске.+./
Вместо стоимости одного символа мы можем вместо этого написать (логическое ИЛИ все), что в явном виде даст логическое значение 1 или 0.Вот несколько примеров выполнения. Вы можете получить интерпретатор J на jsoftware.com или попробовать его в Интернете по адресу tryj.tk .
источник
Пролог - 315
Я думал, что Пролог может быть хорошим языком для этого со встроенной поддержкой обратного отслеживания, но я думаю, что это более затруднительно, так как требуется переменная почти для каждого вычисленного значения.
Протестировано с GNU Prolog; должен соответствовать стандарту ISO Prolog.
Ungolfed:
источник