Учитывая прямоугольный текст как загадку поиска слова и строку поиска, определите, содержит ли текст строку поиска. Поисковая строка может появиться:
- горизонтально, вертикально или по диагонали
- вперед или назад
Вы можете написать функцию или программу и взять две строки в качестве входных данных через аргумент функции, ARGV или STDIN. Вывод должен быть верным или ложным результатом, который можно либо вернуть из функции, либо записать в STDOUT.
Предположим, что текст будет содержать произвольные печатаемые символы ASCII (шестнадцатеричные коды от 20 до 7E) и символы разрыва строки. Буквы чувствительны к регистру. Вы можете предположить, что входной текст является прямоугольным, то есть все строки имеют одинаковую длину. Вы можете указать, заканчивается ли ввод завершающим переводом строки (если это важно для вашего представления).
Это код гольф, самый короткий ответ (в байтах) выигрывает.
Примеры
Используя эту сетку из статьи Википедии о поиске слов в качестве первого ввода:
WVERTICALL
ROOAFFLSAB
ACRILIATOA
NDODKONWDC
DRKESOODDK
OEEPZEGLIW
MSIIHOAERA
ALRKRRIRER
KODIDEDRCD
HELWSLEUTH
Следующие строки поиска должны давать правдивые или ложные результаты соответственно:
Truthy: RANDOM, VERTICAL, HORIZONTAL, WORDSEARCH, WIKIPEDIA, TAIL
Falsy: WordSearch, CODEGOLF, UNICORN
В качестве альтернативы, используя этот входной текст
Lorem ipsum dolor sit amet consectetu
r adipisicing elit sed do eiusmod tem
por incididunt ut labore et dolore ma
gna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco lab
oris nisi ut aliquip ex ea commodo co
nsequat. Duis aute irure dolor in rep
rehenderit in voluptate velit esse ci
llum dolore eu fugiat nulla pariatur.
Мы получаем следующие результаты поиска (используя кавычки, потому что в некоторых строках поиска есть пробелы):
Truthy: "Lorem", "mine", "uma bop", "tuetdod", "snol,a", "texas", "pii.d v", "vexta"
Falsy: "lorem", "wordsearch", "pii.d v", "mute"
источник
Ответы:
CJam,
4637 байтЧитает сетку из STDIN и слово в качестве аргумента командной строки. Печатает положительные целые числа для совпадений и 0 для несоответствий.
За счет двух дополнительных байтов обе строки (слово, перевод строки, сетка) могут быть прочитаны из STDIN:
Вы можете попробовать эту версию онлайн с переводчиком CJam .
Пример запуска
Задний план
Предположим, что вход был следующей сеткой:
Разбивая строки, мы получаем следующий массив:
Это охватывает восточные слова (слова, идущие слева направо).
Теперь мы объединяем элементы
A
использования строкиlen(A)
перевода строки в качестве разделителя:Затем мы нарезаем полученную строку на куски длины
len(A) + len(A[0]) + 1
:Если мы «заархивируем» массив (транспонируем строки и столбцы), получим:
Это охватывает юго-восточные слова.
Если мы застегнем A и изменим порядок строк результата, мы получим:
Это охватывает юг и - после повторения процесса для диагоналей - юго-западные слова.
Застегнув молнию и задний ход, мы получаем:
Это охватывает Запад и - после повторения процесса для диагоналей - северо-западные слова.
Застегивая и переворачивая еще раз, мы получаем:
Это охватывает Север и - после повторения процесса для диагоналей - северо-восточные слова.
Как это работает
Код выполняет действия, описанные в предыдущем разделе, с двумя небольшими отличиями:
len(A) + len(A[0])
какlen(A + zip(A))
.Наконец, он объединяет все строки всех сгенерированных массивов, используя перевод строки в качестве разделителей, и ищет слово в результирующей строке.
источник
Ява: 183
211321Основная грубая сила. Думаю, больше нечего сказать. Ввод - игла первая и стог сена вторая. Предполагается, что сетка завершена новой строкой .
Немного более читаемая версия с показанным тестовым примером:
источник
if(e<1)return 1>0;
может бытьreturn e<1;
не так ли?i=a*9,
и ,for(;i-->0;)
а затемz=i/9;
иi%a!=4&
и так далее?JavaScript (E6) 111
116Грубая сила ищет каждого персонажа во всех направлениях - как можно лучше в гольфе
Тест In FireFox / Консоль Firebug
Выход
источник
Питон, 175
Не очень вдохновляет, но здесь идет:
Первый аргумент - стог сена, второй - иголка.
источник
h,n=input()
иprint
. Кроме того, это работает с неквадратными входами? (m = len (n)? Я признаю, что не совсем понимаю, что вы делаете, поэтому я могу быть совершенно неправ!)while i>0
доwhile i:
(так какi
никогда не может стать отрицательным),if m<1:i=-1
чтобыi-=m<1
.if m<1:i=-1
посколькуif m<1:i-=1
ни один из них не сработает, потому что он настроенi
отрицательно.Bash + coreutils,
214169 байтИспользует 3 функции преобразования
r
,t
иd
для реверса, транспонирования и диагонального сдвига во всех необходимых комбинациях.Обновление -
r
теперь функция производит обратный и не обратный вывод для дополнительной игры в гольфВвод с помощью аргументов командной строки - строка поиска, за которой следует (разделенный новой строкой) прямоугольный блок поиска слов.
Выход - идиоматически правильный код состояния выхода оболочки - 0 означает ИСТИНА и 1 означает ЛОЖЬ.
Выход:
источник
T()(tee >(r) $@)
, но это даже лучше. 2. Я не думаю, что когда-либо видел синтаксис этой функции раньше. 3. Рассматривая непустые строки верно и пустые строки, я думаю, вы можете опустить-q
.r()(tee >(rev) $@)
,r<<<"$2"|r >(d) >(r|t) >(r|d)|r|grep "$1"
должно работать так же.-q
чтобы остаться.С, 163
Никакой перестановки сетки, я просто пробую каждую начальную букву в каждом направлении и иду вперед, пока не убегу из сетки или не найду несоответствие.
Я использую тот факт, что строка C заканчивается нулевым байтом. Поскольку в сетке нет нулевых байтов, ВСЕГДА будет несоответствие. Но если несоответствие происходит в нулевом байте, мы знаем, что нашли конец строки для поиска, и запишите это как совпадение.
Разгружен в тестовой программе
Выход
Обратите внимание, что функция вернет общее количество совпадений искомой строки в сетке. Таким образом, для
OD
него возвращается 6. Если никакие инциденты не найдены, он возвращает 0, что является единственным ложным значением в C. Изменениеy|=d*!n[j]
приведет к сохранению одного символа, но утратит эту функциональность.источник
C # -
218197186 байтовФункция C #, которая принимает 2 строки: первое слово для поиска, затем сетка с переводами строк (
\n
) между строками. Теперь все становится отчаянным ... настолько отчаянным , что мое предыдущее редактирование не сработало!Гольф-код:
Меньше гольфа с тестовым кодом:
источник
Хаскелл - 173
Вместо того, чтобы искать прямо в сетке, я трансформирую сетку по-разному и сопоставляю слово с каждой строкой новой сетки.
Например,
Найдите слово в каждом ряду G1, G2, G4 и G5, и все готово. Обратите внимание, что G3 не используется, я выкладываю его здесь только для иллюстрации.
Аналогичная идея применяется для поиска вперед и назад: просто искать оригинальное слово и обратное слово.
Итак, теперь мы искали 8 направлений. Вот код, правильность которого проверена другим скриптом .
Функция
f
- это то, что мы хотим, и ее аргументr
- это прямоугольная строка,w
это слово для поиска.источник
Python 2 - 246
259275308298297294313322Спасибо Уиллу за помощь в работе с печатью и определение соединения.
Спасибо подземной железной дороге за то, что напомнил мне о местах для гольфа должным образом; p
Исправлено для плохих совпадений благодаря использованию «,» в качестве разделителя.
Видимо, лучший способ игры в гольф - добавить тонны горизонтальной прокрутки.
Вводите в виде
пробелов,разделяястроки, разделенные новой строкой, в кавычках: "WVERTICALL \ nROOAFFLSAB \ nACRILIATOA \ nNDODKONWDC \ nDRKESOODDK \ nOEEPZEGLIW \ nMSIIHOAERA \ nALRKRRIRER \ nKODIDEDRLE \ nHEL"источник
L=len;J=''.join
и т.д. , иprint any(s in(v,d,w,r...))
? Я шел по тому же принципу, когда увидел, что вы отправили сообщение :))
или с]
последующим пробелом, вы можете взять пространство.APL (Дьялог Классик) , 44 байта
Попробуйте онлайн!
источник
\n
разделен (то есть иметь⎕TC[2]
разделитель).J ,
6053 байтаПопробуйте онлайн!
Требует, чтобы первый ввод не содержал новых строк.
Объяснение:
Попробуйте онлайн!
Крючки полезны.
источник
Желе , 16 байт
Решил связанную (возможно, дублирующуюся) задачу с 15 из этих 16 байтов в качестве ядра кода ...
Диадическая ссылка, принимающая список символов слева и список символов справа, который возвращает 1, если найден, и 0, если нет.
Попробуйте онлайн!
Как?
источник