Введение
Согласно сообщению Рэнда Аль'Тора в «Загадочной SE», под словом «сплоченный» подразумевается любое слово, которое содержит три буквы в алфавитном порядке (в любом порядке).
Такие слова, как образование , фогхорн и кабаре , считаются сплоченными словами, тогда как такие слова, как обучение , клаксон и исполнение , не являются сплоченными словами.
Вызов
Задача состоит в том, чтобы написать код-программу, способную принимать одно слово в качестве входных данных (предполагаемый нижний регистр, для всех намерений и целей) и возвращать вывод, который (если имеется) перечисляет все последовательные наборы букв (также в нижнем регистре), если он является сплоченным словом и пустым выводом, если это не сплоченное слово.
Примеры
Input: education
Output: cde
Input: foghorn
Output: fgh
Input: cabaret
Output: abc
Input: hijacking
Output: ghi, hij, ijk
Input: pneumonia
Output: mno, nop
Input: klaxon
Output: <<no output>>
Input: perform
Output: <<no output>>
Input: learning
Output: <<no output>>
правила
- Принимая во внимание, что ввод должен считаться одним словом в нижнем регистре, а вывод должен быть в нижнем регистре, характер вывода будет варьироваться в зависимости от выбора языка кодирования. Пожалуйста, выберите форму вывода, которая наилучшим образом соответствует характеру задачи, будь то STDOUT, вывод файла, массив и т. Д.
- Поскольку это код-гольф, это будет случай, когда наименьшее количество байтов будет явным победителем.
- Никаких глупых лазеек .
- Я не приму ответы с последовательными буквами в не алфавитном порядке ... Так
cab
что, например, не будет считаться подходящим выводомcabaret
. - Особое примечание: хотя «триплеты» не обязательно должны быть в алфавитном порядке, но символы в триплетах должны быть ... так что в случае слова «производительность», например, выходные данные
mno,nop
будут приняты, как будетnop,mno
. В случае слова «угон», есть шесть способов , что тройкиghi
,hij
иijk
могут быть организованы в виде списка, а все шесть перестановок являются приемлемыми в качестве выходного сигнала.
Кроме этого, по твоим оценкам, садись, гольф!
!
И с другим словом, так как текущий дает тот же результат :-)pneumonia
может быть[('m','n','o'),('n','o','p')])
?Ответы:
05AB1E ,
765 байтКод:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Python 3.5, 68 байт
Печатает выходные строки и завершается с ошибкой, когда значение символа становится слишком большим.
Создает все строки из трех последовательных строк и печатает те, которые являются подмножеством входного слова.
источник
Pyth -
111087 байтМетод супер грубой силы.
Тестовый пакет .
источник
Желе , 7 байт
Это монадическая ссылка. Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
9590 байтПропущенные значения объединяются как
undefined
, поэтому результирующая строка содержит более 3 символов. Я позаимствовал!c[3]
уловку из @ETHproductions, чтобы сохранить 5 байтов.источник
undefined
близкое слово;)parseInt(c,36)
вместоc.charCodeAt()
?parseInt
в коде гольф.Python 3.5, 78 байт
источник
PHP, 100 байт
принимает входные данные в качестве аргумента командной строки; печатает запятую беги с
-r
.источник
for($s=join(range(Z,z));$a=substr($s,++$i,3);)
это более короткий способ создания $ a. Он по общему признанию проверяет кучу знаков препинания, а также некоторые 2-символьные серии, но так как ввод состоит только из строчных букв, и он требует, чтобы он нашел 3 символа, что нормально.for($a="
AB», $ я = 98; $ я <123;!) strstr (count_chars ($ ARGV [1], 3), а = $ зиЬзЬг ($ а, 1) .chr (++ $ I)) ?: печать "$ a"; `сохраняет 2 байта. Очень хороший способ, я пробовал другие способы в PHP, но не могу добраться до байтов вашего кода. Я не уверен, если вам нужен пробел после запятойC
175174 байтаотступ:
Выполняя сортировку, она заменяет дублирующиеся значения на 0, эти 0 сортируются в начало слова. Поиск последовательных значений тогда тривиален.
источник
MATL , 13 байт
Попробуйте онлайн!
источник
Haskell, 48 байтов
Генерирует все тройки из трех последовательных символов, принимает те, которые используют только буквы на входе.
53 байта:
Список
['c'..]
содержит все символы'c'
Юникода начиная с. Понимание списка[[pred$pred c..c]|c<-['c'..]]
превращает их во все строки из 3-х последовательных символов и"abc"
далее. Мы делаем шаг назад,[pred$pred c..c]
а не вперед,[c..succ$succ c]
чтобы избежать ошибки при приеме преемника самого высокого символа юникода.Эти тройки фильтруются для тех, которые используют только буквы на входе.
источник
Perl, 36 байт
Включает +1 для
-n
Внесите свой вклад в STDIN:
Просто код:
источник
T-SQL, 153 байта
Пришлось отреагировать на комментарий от WallyWest, так как это было давно с момента последнего ответа TSQL. Ответ был частично вдохновлен ответом Брайана Дж.
Golfed:
скрипка
Ungolfed:
источник
Haskell,
636052 байтаПример использования:
f "hijacking"
->["ghi","hij","ijk"]
.scanr(:)"_"['a'..]
строит список с хвостами список всех Юникода символов , начиная с'a'
и позволяет ему закончить с'_'
, то есть["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"]
. Затем мы берем до трех символов каждой строки и привязываем ее кx
. Храните все,x
где каждая буква находится во входном параметреw
.Редактировать: @xnor сохранил
37 байтов. Благодарность!источник
a:b:c:_
с помощью @ -pattern?'z'
верхнюю границу и просто позволить ей попробовать все символы.take
и удалить пустую строку:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
scanr
с "." вместо""
и опуститьinit$
.T-SQL (SQL Server 2014), 217 байт
Golfed
использование
Сначала объявите переменную @a в виде какого-либо символа и назначьте входные данные примерно так:
Я не считал объявление как часть моего кода, но я не нашел стандарт SQL для ввода, поэтому я готов изменить свой счет
Выходными данными будет либо одна строка для каждой тройки, либо не будет строк, если слово не близко сплетено
Ungolfed
источник
R 220 байт
Мое решение довольно простое. Он просматривает возможные комбинации из трех букв, просматривает и проверяет символы введенной строки по трем последовательным буквам и добавляет их в строку. Строка печатается только тогда, когда найдено три буквы (c == 4).
ввод, вывод
источник
Python 3.5,
114111888079 байтов:Анонимная лямбда-функция. Принимает ввод в виде строки в верхнем регистре и выводит массив кортежей, причем те, которые заполнены тремя заглавными буквами, представляют все наборы
3
последовательных букв, которые появляются во вводе. Например,будет выход для ввода
HIJACKING
. Этот формат вывода подтвержден OP. Таким образом, имеет единственный входной формат в верхнем регистре. Тем не менее, если вы хотите ввести в только в нижнем регистре, просто заменитьrange(65,91)
сrange(97,123)
, добавив еще один байт.Repl.it со всеми тестовыми примерами!
Объяснение:
В основном, что здесь происходит:
Список,
W
создается с использованиемW=[*map(chr,range(65,91))]
, который содержит все заглавные буквы в английском алфавите. Из-за этого всегда требуется ввод заглавных букв .Для каждого кортежа,
i
в списке, который мы будем называтьU
, содержащем все три последовательных кортежа букв, то есть:создано
zip(W,W[1:],W[2:])
, каждыйi
полностью добавляются в список вывода, пока все элементы в наборе версииi
({*i}
) в заданной версии вводаX
({*X}
), то есть{*X}>={*i}
, то естьX
является надстройкой изi
. В противном случае пустая версияi
(()
) будет добавлена в список.Как только все кортежи пройдены с полностью добавленными совпадениями, список возвращается в качестве окончательного результата.
источник
Скала, 59 байт
Ungolfed:
Объяснение:
источник
На самом деле, 13 байтов
Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Java 7, 230 байт
Скорее всего, это возможно, но задача оказалась намного сложнее, чем я думал в Java.
Ungolfed и тестовые случаи:
Попробуй это здесь.
Выход:
источник
PowerShell v2 +, 93 байта
Чувствуется намного дольше, чем требуется, но я не могу играть в гольф дальше.
Принимает участие
$n
. Петли от97
до120
, построения смежных трехбуквенный строк - то есть, до|?
, мы будем иметьabc
,bcd
,cde
и т.д. на трубопроводе. Затем это подается черезWhere-Object
(|?
), чтобы вытащить только те элементы, где условие истинно. Здесь, это предложение: 1) входная строка$n
, приведенная какchar
-array,sort
ed иselect -u
nique'd, затем отредактированная-join
обратно в строку, 2)-match
ed против трехбуквенных строк (т. Е. Сопоставление с регулярным выражением). Если это совпадение, то в слове есть трехбуквенная строка, и поэтому она фильтрует через|?
. Результаты остаются на конвейере, а вывод неявным.Примеры
(Обратите внимание, что здесь выходные данные разделены пробелами, так как мы структурируем выходные данные конкатенацией.)
источник
Retina,
10656 байтДублировать, Сортировать. Добавить
abc
. Найдите, найдена ли подстрока, и добавьте, если так. Перевести на следующую подстроку. Повторение. Затем удалите первые две строки.Попробуйте онлайн
Наивное решение:
Дедуплицируйте, сортируйте, затем выводите совпадающие совпадения из 3 последовательных букв.
Попробуйте онлайн
источник
JavaScript (Firefox 48), 93 байта
Это подходит для 96-байтовой версии ES6 :
Как это работает
Первый основной кусок функции это:
new Set(string)
создает объект Set, который содержит один из каждого уникального символа в строке. Например,new Set("foghorn")
вернетсяSet ["f", "o", "g", "h", "r", "n"]
. Мы можем преобразовать это в массив с[... ]
, а затем отсортировать его с помощью встроенного.sort()
. Это превращается"foghorn"
в["f", "g", "h", "n", "o", "r"]
.Следующий шаг - это:
Это сопоставляет каждого
c
персонажа вa
ряду с персонажем, соединенным с двумя предметами после него. Например,["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]
. (undefined
S появляется, когда вы пытаетесь получить доступ к несуществующему члену массива.Последний шаг - фильтрация:
Во-первых,
!c[3]&
это исключить любые строки, которые содержатundefined
. Это необходимо, потому что ошибка приводит к тому, что следующий алгоритм считается, например,gmundefined
как последовательный триплет.Все строки с тремя последовательными символами, если их интерпретировать как числа с основанием 36, равны 38 по модулю 1333. Я понял это с помощью следующего вычисления:
Следовательно, если строка из трех символов содержит 38 mod 1333 в base-36, эти три символа являются последовательными в алфавите.
Тестовый фрагмент
Показать фрагмент кода
источник
gem
иmage
.!c[3]
трюк, который снизил мой ответ ES6 до длины вашего предыдущего ответа ES6, так что теперь я даже превзошел ваш ответ Firefox 30+. Прости за это.Ракетка 237 байт
Тестирование:
Выход:
Подробная версия:
источник
Рубин , 50 байтов
each_cons(3)
получает все последовательные подсписки длины 3 из алфавита?a..?z
, а затем используетe&s.chars==e
для выбора только те из них, у которых есть все символы в целевой строке, используя пересечение по ступеням. Возвращает список списков.Попробуйте онлайн!
источник
[R], 110 байт
Я уверен, что он все еще пригоден для игры в гольф
источник
Japt ,
109 байтПопробуйте или запустите все тесты
источник