Панграмма - это предложение или выдержка, которая содержит все двадцать шесть букв алфавита, как показано в этом кодовом соревновании по гольфу . Однако панграмматическое окно - это панграмма в виде некоторого сегмента текста, который может заканчиваться или начинаться в середине слова, найденного где-то в более крупной работе. Они естественным образом встречаются повсюду, являясь правильными подмножествами истинных панграмм, поэтому просто проверять, содержит ли что-то панграмматическое окно, было бы скучно, а также это было сделано ранее.
Итак, мы заинтересованы в поиске наименьшего фрагмента текста на основе длины буквы! В кратчайшем возможном коде в байтах, конечно, подойдет тема.
Правила и руководства
- Получите строку в качестве входных данных и верните строку самого маленького панграмматического окна на входе, если оно есть. Если нет, верните либо Boolean False, либо пустую строку.
- Является ли строка панограмматическим окном или нет, учитывает регистр и зависит только от 26 букв, а не от любых знаков препинания или цифр или других нечетных символов.
- Точно так же длина буквы окна панграмматики - это общее количество появлений букв в нем, а не просто число каждого символа. Возвращаемое значение должно быть наименьшим на основе этого количества. В конце концов, мы лингвисты, а не программисты.
- Вывод панграмматического окна должен, однако, быть точной подстрокой ввода, содержащей те же заглавные буквы и знаки препинания и т. Д.
- Если имеется несколько кратчайших панграмматических окон одинаковой длины буквы, верните любое из них.
Тестовые случаи
'This isn't a pangram.'
==> False
'Everyone knows about that infamous Quick-Brown-Fox (the one who jumped over some lazy ignoramus of a dog so many years ago).'
==> 'Quick-Brown-Fox (the one who jumped over some lazy ig'
'"The five boxing wizards jump quickly." stated Johnny, before beginning to recite the alphabet with a bunch of semicolons in the middle. "ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ!" he shouted to the heavens.'
==> 'ABCDEFGHI;;;;;;;;;;;;;;;JKLMNOPQRSTUVWXYZ'
The five boxing wizards jump quickly
возвращается?Q
? Это не добавляет к количеству букв.Ответы:
Pyth,
201614 байтовОбъяснение:
Попробуй это здесь!
Когда нет правильного решения, программа завершает работу с ошибкой без вывода на стандартный вывод.
источник
!-GrT0
короче для состояния фильтра, я считаю. Я также думаю, что вам нужно,l
чтобы сортировка работала правильно.l
, а без нее вы получите разные результаты . Я считаю, что проблема в повторяющихся письмах, но я не уверен на 100%.Pyth - 22 байта
\ o / FGITW!
Тестовый пакет .
источник
Рубин, 100 байт
Возвращает ноль, если окно не найдено.
источник
JavaScript (ES6),
139138136 байтСохранено 2 байта благодаря @Neil!
изрезанный
источник
[r=l="",...s].map((_,b,a)=>
?map
функции.PowerShell v2 +, 218 байт
Да, так что манипулирование подстрокой (никаких встроенных модулей не существует) не является сильной стороной PowerShell ...
Мы берем ввод
param($a)
и устанавливаем новую пустую хеш-таблицу$z
. Это будет наше хранилище потенциальных панграмматических подстрок.Используя небольшую модификацию моего кода из Exploded Substrings , мы создаем все подстроки ввода. Да, даже односимвольные знаки препинания. Это код-гольф , а не самый быстрый код . ;-)
Все эти подстроки заключены в скобки и переданы в другой цикл с помощью
|%{...}
. Мы временно установили$y
текущую подстроку, установили вспомогательный счетчик$j
и запустили еще один цикл65..90|%{...}
, удобно над кодировками ASCII для заглавных букв. Каждый внутренний цикл мы берем$y
делаем его заглавными и вытаскиваем.IndexOf
этот конкретный символ. Так как он вернется,-1
если не найден, мы+1
перед умножением получим результат$j
. Это гарантирует, что если какой-либо один символ не найден,$j
будет равен нулю.Что именно то, что
if
все. Если$j
не ноль, это означает, что каждая буква была найдена хотя бы один раз в подстроке$y
, поэтому нам нужно добавить ее в наш пул кандидатов. Мы делаем это, беря$y
и забирая-replace
все не-буквы ни с чем, что дает нам длину буквы этой подстроки. Мы используем это как индекс в хеш-таблице$z
и храним$y
в этом индексе. Это имеет причуду перезаписи подстрок одинаковой длины буквы с той, которая встречается «дальше всего» в исходной строке, но это допускается правилами, поскольку нас интересует только длина буквы.Наконец, нам нужно разобраться
$z
и вытащить наименьшее. Мы должны использовать.GetEnumerator
вызов, чтобы отсортировать объекты внутри$z
, затемsort
те , которые включеныName
(т. Е. Индекс длины сверху), выбрать[0]
th (т. Е. Самый короткий) и вывести его.Value
(т. Е. Подстроку). Если подобная подстрока не подходит, это вызовет ошибку (Cannot index into a null array
), когда она попытается проиндексировать$z
, и ничего не выведет, что неверно в PowerShell. (третий тестовый пример ниже имеет явное приведение,[bool]
чтобы показать это)Тестовые случаи
источник
Haskell, 180 байт
Это было сложно, но очень весело без импорта.
Гораздо меньше в гольфе:
Сюрприз, сюрприз: это действительно медленно.
источник
Oracle SQL 11.2, 461 байт
Un-golfed
Представление
s
разделяет ввод в символах, а также возвращает позицию каждого символа.Рекурсивное представление
v
возвращает каждую подстроку входных данныхs - это подстрока
f, позиция первого символа подстроки
l позиция последнего символа, добавленного к текущей подстроке
Представление
c
возвращает алфавит, одну букву за разПредставление
a
возвращает алфавит, объединенный в одну строкуSELECT s,f,SUM(SIGN(INSTR(LOWER(s),c))
Возвращает для каждой подстроки число различных присутствующих в ней букв,
INSTR
возвращает pos буквы в подстроке, 0, если ее нет,SIGN
возвращает 1, если pos> 0, 0, если pos = 0WHERE x=26
Фильтрует подстроку, содержащую весь алфавит
TRANSLATE(LOWER(s),' '||a,' ')
Удаляет каждое письмо из подстроки
LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')
Длина в буквах это длина подстроки минус длина подстроки без букв
SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s)-NVL(LENGTH(TRANSLATE(LOWER(s),' '||a,' ')),0))
Сохраняет только подстроку с меньшим количеством букв.
Если их больше одного, первый, отсортированный по возрастанию, сохраняется
источник
Python 3,
171, 167, 163, 157, 149 байтов.Сохранено 4 байта благодаря DSM.
Сохранено 8 байт благодаря RootTwo.
Необходимость сортировки по количеству писем убивает меня.
Тестовые случаи:
источник
.upper()
это необходимо в ключевой функции.PowerShell (v4),
198156 байтТестовые случаи
Безголосое объяснение оригинала
Это вложенная петля грубой силы, которая делает раздвижные окна любых размеров:
Для каждого окна оно фильтрует только буквы (регистр не учитывает регистр без учета регистра), пропускает оставшиеся символы через уникальный фильтр, проверяет наличие 26 уникальных символов в качестве теста панграммы.
Все окна с панграммами превращаются в триплеты (количество букв, включая дубликаты, начальный индекс, длину окна, включая пунктуацию) , которые сортируются, чтобы найти самое короткое по общему количеству символов, выбирается первое и из этого строится выходная строка. ,
За пределами строки много индексирования, для которого PowerShell с пользой возвращает $ null, а не генерирует исключения.
NB. новый 156-байтовый один - тот же самый подход, но переписан, чтобы использовать конвейер намного больше.
NB. не уверен, что версия без гольфа работает, потому что я не написал это, тогда игра в гольф, это только для экспозиции.
источник
Haskell, 123 байта
Определяет функцию
h
, которая возвращает пустой список, если нет панграмматического окна или списка из одного элемента с минимальным окном. Пример использования:Как это устроено:
источник