Для целей этой задачи, полифонт определяется как непрерывный фрагмент строки, который содержит только гласные и имеет длину не менее 2. Учитывая непустую строку в качестве входных данных, ваша задача состоит в том, чтобы вывести все содержащиеся в нем полифтонги ,
Например, "abeoic"
имеет следующие смежные срезы (разделенные пробелом):
a b e o i c ab be eo oi ic abe beo eoi oic abeo beoi eoic abeoi beoic abeoic
Удаляя те, которые содержат что-либо, кроме гласных, или имеют длину меньше 2, мы получаем желаемые полифонты:
eo oi eoi
Ваши материалы должны соответствовать следующим правилам:
Вы можете выбрать строчные или прописные буквы для ввода / вывода, но регистр вывода должен соответствовать регистру ввода.
Гласные
aeiou
(для строчныхAEIOU
букв) и (для прописных).y
/Y
не считается гласным.Ввод будет содержать только печатный ASCII.
Если полифонт появляется несколько раз, вы можете выбрать его вывод только один раз или выводить все его вхождения.
Разрешен любой разумный формат и метод ввода / вывода (списки символов также хороши как для ввода, так и для вывода).
Тестовые случаи
Ввод -> Выход (в нижнем регистре) r67 ^^ () * 6536782! 87 -> [] программирование головоломок и кода игры в гольф -> [] ааа ... я победил! -> ['аа', 'аа', 'ааа'] abeoic -> ['eo', 'oi', 'eoi'] yah eioo ala -> ['ei', 'io', 'oo', 'eio', 'ioo', 'eioo'] @yabeeeayio__e -> ['ee', 'ee', 'ea', 'io', 'eee', 'eea', 'eeea'] 0ioen0aaiosnjksd -> ['io', 'oe', 'aa', 'ai', 'io', 'ioe', 'aai', 'aio', 'aaio']
Обратите внимание, что для тестовых случаев 3 и 6 вы можете вывести 'aa'
и, 'ee'
соответственно, только один раз (см. Четвертое правило).
Это код-гольф , выигрывает самая короткая подача в байтах на каждом языке!
'aa'
появляется дважды. Нужно ли выводить одну и ту же строку несколько раз, если она появляется в разных местах, или можно выводить только уникальные полифонты?Ответы:
Python 2 ,
10297 байтспасибо @JonathanFrech за -5 байтов
Попробуйте онлайн!
ввод / вывод в нижнем регистре
источник
...AEIOU'
, так как вы можете принимать только строчные буквы в качестве входных данных.print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])
работает на 93.JavaScript (ES6),
7775 байтОжидается ввод в нижнем регистре. Выводит уникальные полифонты без повторения.
Контрольные примеры
Показать фрагмент кода
Как?
Мы рекурсивно строим дерево всех возможных полифонтов, обрезая ветви, как только текущий узел больше не содержится во входных данных, и сохраняя все совпадающие узлы не менее чем из 2 символов.
источник
Сетчатка ,
2320 байтПопробуйте онлайн!
Это печатает все вхождения полифтонга.
объяснение
У Retina есть способ получить все совпадающие совпадения, но на самом деле это означает, что он будет искать по одному совпадению с каждой позиции. Таким образом, если есть несколько совпадений из одной и той же позиции, это вернет только один из них. Единственный способ действительно получить все перекрывающиеся совпадения - это использовать эту функцию дважды, один раз сопоставляя слева направо и один раз справа налево (чтобы сначала мы получили максимально возможное совпадение из каждой возможной начальной позиции, а затем мы также получили все совпадения для возможные конечные позиции).
Итак, актуальная программа:
Получить все перекрывающиеся серии гласных. Что это действительно означает, так это получить все суффиксы всех гласных серий.
Теперь получите все префиксы длиной не менее 2, сопоставляя их справа налево. Здесь
M
подразумевается, потому что это последняя строка программы.источник
!&`[aeiou]{2,}
это так близко к правильному , есть ли способ сделать его более жадным, чтобы он соответствовалio
?&
можно сделать, это попытаться найти совпадение с каждой позиции, чтобы вы не могли иметь несколько совпадений разной длины из одной и той же позиции. Вот почему мне нужен второй этап.QuadS , 20 + 1 = 21 байт
с
o
флагомПопробуйте онлайн!
В порядке происходящего:
[aeiou]+
на каждом матче этого PCRE,\⍵M
префиксы матча1↓
опустить первый (в котором есть один гласный),/⍵
объединить все списки префиксов⊃
раскрыть (потому что сокращения/
включают)Это эквивалентно неявной функции Dyalog APL:
Попробуйте онлайн!
источник
Mathematica, 92 байта
Попробуйте онлайн!
источник
Java (OpenJDK 8) ,
138135134 байтовПопробуйте онлайн!
источник
i<y-1
Может бытьi<=y
иString#matches
неявные проверки всей строки, поэтому вам не нужны^
и$
. +1 за то, что избил меня до этого. Собирался опубликовать свой собственный 138-байтовый ответ (но с этими изменениями я предложил твой короче). :)J ,
3429 байтПопробуйте онлайн!
источник
Желе , 9 байт
Попробуйте онлайн!
объяснение
-4 байта благодаря мистеру Xcoder
источник
L>1$$
наL’$
.L’$
сḊ
на 9 байт . Эквивалент будетẆṫLḊḟÐḟØc
.C (gcc) , 104 байта (99 байтов только со строчными или только заглавными буквами)
Да, это утечки - и что?
Попробуйте онлайн!
источник
#include
, и вам нужно обрабатывать только один регистр букв, так что вы можете сократить его до 80 байтов.R , 137 байт
переиграл Марка !
Попробуйте онлайн!
источник
unique
.Perl 5, 53 +1 (-p)
Попробуйте онлайн
источник
PowerShell ,
9388 байтПопробуйте онлайн!
Использует ввод / вывод в нижнем или верхнем регистре (или сочетание!).
Заимствует код из моего ответа на покомпонентных подстроках , чтобы получить все подстроки, а затем вытаскивает то , что регулярное выражение
-match
против^[aeiou]{2,}$
- то есть те, которые по крайней мере , две гласные в длине и только гласные. Эти строки остаются в конвейере и вывод неявный.источник
Haskell ,
148137130123118 байтСпасибо @Laikoni за -11 байтов, еще -7 байтов, указав мне на подсказки для игры в гольф, еще -7 байтов и еще -5 байтов, в общей сложности колоссальные -30 байтов.
Это выглядело как хорошая подгонка для Хаскелла, но результат, похоже, не совпадает.Я полагаю, что Хаскелл был хорошим выбором в конце концов. Я все еще раздражен тем, какsubsequences
работает, хотя.Попробуйте онлайн!
источник
;
, но повышает читаемость кода. Вы всегда используетеe
вместе сv
, так что вы можете напрямую объявитьe=(
Elem"aeiou")
.y!!0
корочеhead y
. ЕстьconcatMap
вместоconcat.map
, но еще короче -(=<<)
из списка монада, которая имеет тот же эффект.Data.Lists
вместоData.List
. У первого есть все функции последнего, но также есть дополнительные вещи, такие какpowerslice
, который дает список всех непрерывных подпоследовательностей.y@(h:_:_)
чтобы сброситьlength y>1
и сократитьv(y!!0)
доv h
.(\x y->v x&&v y)
можно сократить, преобразовав в без очков, либо вручную, используя этот совет, либо с помощью pointfree.io . (2) Монаду со списком также можно использовать сdo
обозначениями, то есть такdo x<-l;[...]
же, какl>>=(\x->[...])
. Кстати, в TIO вы можете поместить свойmain
заголовок или поле нижнего колонтитула, чтобы количество байтов совпадало с фактической отправкой.Perl, 45 байт
источник
R ,
120 байт110 байтПопробуйте онлайн!
Как это устроено
источник
C 119 байтов
Попробуйте онлайн!
источник
JavaScript (ES6), 105 байт
Вероятно, есть еще много игры в гольф.
источник
Perl 5 , 44 + 1 (
-n
) = 45 байтПопробуйте онлайн!
источник
05AB1E , 10 байтов
Попробуйте онлайн!
Пояснения:
источник
ŒʒžMм_}ʒg≠
ŒD1ùKʒžMм_
по 10 байт. Я пытаюсь найти способC
10575 байтФункция, принимающая указатель на ввод нижнего регистра и создающая разделенные пробелами строки в стандартном выводе:
Тестовая программа
демонстрация
объяснение
Используя GCC в Debian Linux, я, кажется, сходит с рук несовместимыми неявными объявлениями
strchr()
иprintf()
. Другие платформы могут требовать<stdio.h>
и<string.h>
быть включены.Попробуйте онлайн (требуется Javascript).
источник
f(p)char*p;
может бытьf(char*p)
?f(s,d)char*s,*d
.APL (Дьялог) , 53 байта
Это
Dfn
( д Прям ая е unctio п ). Использование естьp '<argument>'
. Справедливое предупреждение: это не очень эффективно и время ожидания дляinput > 8 characters
TIO, но работает нормально, когда достаточно времени.Попробуйте онлайн!
Спасибо @ Adám за 16 байтов!
Как это устроено:
Это легче понять, если мы разбиваем код на более мелкие части:
G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵
: эта часть функции принимает длину (правого) аргумента и смешивает векторaeiou
с самим собой много раз, получая все возможные комбинации[2, length(right arg)]
гласных.(G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/
: эта часть проверяет, какие элементы из G являются членами подстрок ввода. Это возвращает логический вектор, с1
's' на индексах комбинаций гласных, которые присутствуют во входных данных, и0
там, где их нет. Полученный вектор затем отображается (/
)G
, возвращая элементы, соответствующие истинным значениям.Все это затем назначается
p
.p←
не включается в число байтов, потому что это не обязательно , просто облегчает использование функции.источник
⊆
для фильтрации. Использование/
.Haskell , 74 байта
Попробуйте онлайн!
источник
Рубин 2.4, 100 байт
Это моя первая попытка игры в гольф, и я уверен, что есть много способов сократить этот код.
источник
Рубин , 80 байт
Попробуйте онлайн!
источник
.compact
можно-[nil]
Pyth , 15 байт
Попробуйте онлайн!
Определенно пригодный для игры в гольф, я хочу получить это лучше прежде, чем написать объяснение.
источник
T-SQL (SQL Server 2014), 281 байт
Ввод дает
Использует общее табличное выражение
s
для разделения ввода на упорядоченные отдельные буквы, а затем второе общее табличное выражениеc
для генерации всех упорядоченных комбинаций, выбрасывая не гласные.SQL Fiddle
источник
PHP, 139 байт
Онлайн демо
Как это устроено
Выберите подстроки (начиная с длины 2), состоящие из соседних символов, и двигайтесь вдоль строки. Соберите все подстроки, которые содержат только гласные. Повторите с более длинными подстроками.
Для строки 'abcdef' это сгенерированные и проверенные подстроки:
источник