Я не люблю струны с более чем тремя гласными подряд. Можете ли вы написать программу, которая удаляет все гласные, которые я не хочу из слов?
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Ввод - это строка, содержащая только печатаемый символ ASCII (от 0x20 до 0x7E включительно).
Выходные данные - это строка, содержащая не более 3 последовательных гласных. Если во входной строке содержится более 3 последовательных гласных, ваша программа должна создать выходную строку, включающую первые три гласные, встречающиеся в этом цикле, отбрасывая любые последующие последовательные гласные.
Y не является гласным для целей этого вызова.
Это код гольф, поэтому выигрывает самый короткий код (в байтах).
Тестовые случаи
"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."
aaYYAAaaaAERGH
.Ответы:
Pyth, 21 байт
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
Я перебираю все символы и отслеживаю, сколько гласных я пропустил, используя счетчик. Каждый раз, когда я передаю символ, который не является гласным, я сбрасываю счетчик на 0. Я возвращаю символы, когда счетчик> 4.
источник
Не читается , 1647 байт
объяснение
Эта программа эквивалентна псевдокоду, например:
со следующими назначениями переменных:
Как видите, я избежал переменной slot 0, потому что
0
такая длинная константа для записи.Поэтому мы читаем каждый символ и сохраняем значение в обоих
cp
иch
. Мы будем вносить изменения,cp
но будем держать ихch
так, чтобы при необходимости их можно было распечатать. Мы последовательно вычитаем числа 65, 4, 4, 6 и т. Д.,cp
Чтобы проверить, является ли это каждый из 10 возможных гласных символов в ASCII (обратите внимание, что самый последний из них не должен быть назначением).vs
всегда содержит на 3 меньше, чем количество гласных, которые еще могут быть напечатаны. Начинается с0
3 гласных. Когда он достигает-3
, мы перестаем печатать гласные.Если мы сталкиваемся с не гласным (включая пробел), мы выполняем,
print(ch)
а затемvs = 0
. Как вы, наверное, догадались, это сбрасывает счетчик гласных.Если мы встречаемся с гласным , мы исполняем
((--vs)+4) ? print(ch) : (++vs)
. Давайте разберем это:vs
;-4
, мы зашли слишком далеко, поэтому не печатайте ничего, а увеличивайтеvs
обратно,-3
чтобы мы по- прежнему отказывались печатать гласные;источник
Сетчатка , 25 байт
Попробуйте онлайн.
Довольно простая замена регулярных выражений. Это также работает для того же количества байтов:
источник
JavaScript (ES6), 42
Как анонимная функция
источник
Perl, 27 символов
(26 символов кода + 1 символ командной строки)
Ничего страшного, просто редкий случай, который я помню,
\K
существует.Образец прогона:
источник
\K
». :)s/([aeiou]{1,3})(?1)+/$1/gi
.Серьезно, 34 байта
Шестнадцатеричный дамп:
Попробуйте онлайн
Он использует тот же алгоритм, что и ответ Pyth, отображая строку, отслеживая длину текущего ряда гласных в регистре, увеличивая его, когда текущий символ является гласным, и проверяя, превысила ли он допустимую длину, возвращает 0, если так, и затем фильтрует исходную строку с помощью этого сгенерированного фильтра. Это будет намного короче, как только мы сможем использовать вычитание набора для строк. (
Ok
Можно удалить, аOkd
можно заменить просто@
). Я слышал, эта функция появится в следующем обновлении ....источник
C 166 байт
Я думаю, что это не самый короткий ответ, но я думаю, что он хорош
прецедент:
источник
Mathematica, 68 байт
Ответ регулярного выражения будет такой же длины, но кто использует регулярное выражение?
источник
Java, 115 байт
Ожидается ввод в качестве параметра программы.
Результаты модульного теста:
источник
String[]
иa
.String[]a
print
вместоprintln
. Я не верю, что спецификация требует новой строки.APL, 40 символов
По-английски:
'aeiouAEIOU'∊⍨' ',⍵
: найдите гласные (и добавьте пробел при вращении);(1-⍳4)⌽¨⊂
: повернуть 0, 1, 2, 3 раза (с переворотом), толкая вправо логический вектор;⊃+/ sum
: повороты и распаковка1↓4≠
: найдите отличную от 4 и удалите первую (чтобы найти место, которое мы добавили)⍵/⍨
: в аргументе оставьте только элемент, сумма которого отлична от 4.источник
Perl 6 ,
3635 байтиспользование:
источник
C (205 байтов)
(Для ясности добавлен один разрыв строки)
источник
Scala, 107 байт
источник
Javascript ES6, 43 символа
Тестовое задание:
источник
x86-файл MS-DOS .COM ,
44 байта36 байтовФайлы .COM широко поддерживаются от MS-DOS 1 до настоящего времени - я работаю в dosmu, используя только команды 8086.
Уменьшено с 44 до 36 байт за счет использования REPNE SCASB для проверки гласных звуков вместо использования отдельной команды для проверки каждой гласной.
источник
Matlab / Octave, 54 байта
Пример:
Попробуйте это в идеоне .
источник
V , 21 байт (неконкурентный)
Попробуйте онлайн!
Объяснение:
Это чуть короче, чем более простое решение:
(22 байта)
источник
Рубин, 44 байта
Пример:
источник
$<.read
на то, чтобы он обрабатывал многострочный ввод (таким образом содержащий символ вне диапазона 0x0a) вместоgets
?