Описание задания
Иногда вам действительно нужно разместить что-то, что вы пишете, на небольшом пространстве. Может быть заманчиво отбросить гласные и без них - и если это не удастся, кому действительно нужны пробелы? Thssprfctlrdbl! †
Напишите функцию или программу, которая удаляет строчные гласные aeiou
, а затем пробелы и любые символы из входной строки . Кроме того, каждый раз, когда вы удаляете персонажа, это должен быть самый правый персонаж, имеющий право на удаление. Он должен повторять этот процесс, пока строка не станет длиннее заданной длины ввода .
† «Это отлично читаемо!» Но если вы читаете эту сноску, то, скорее всего, нет… :)
Примеры
Здесь вы можете увидеть этот процесс, применяемый для последовательно меньших входных размеров:
23: Hello, Code Golf World!
22: Hello, Code Golf Wrld!
21: Hello, Code Glf Wrld!
20: Hello, Cod Glf Wrld!
19: Hello, Cd Glf Wrld!
18: Hell, Cd Glf Wrld!
17: Hll, Cd Glf Wrld!
16: Hll, Cd GlfWrld!
15: Hll, CdGlfWrld!
14: Hll,CdGlfWrld!
13: Hll,CdGlfWrld
12: Hll,CdGlfWrl
11: Hll,CdGlfWr
(etc.)
После сжатия строки до 17 символов у нас заканчиваются гласные для удаления, поэтому следующий удаляемый символ - самый правый пробел; когда мы нажимаем 14 символов, мы удаляем все гласные и пробелы, поэтому мы просто начинаем жевать строку справа налево.
Вот код Python с псевдокодом, который решает эту проблему:
def crunch_string(string, to_length):
while len(string) > to_length:
# Store the best candidate index for deletion here.
best = None
# First, find the rightmost vowel's index.
for i in range(len(string)):
if string[i] in 'aeiou':
best = i
# If there were no vowels, find the rightmost space's index.
if best is None:
for i in range(len(string)):
if string[i] == ' ':
best = i
# If there were no spaces either, use the final index.
if best is None:
best = len(string) - 1
# Remove the selected character from the string.
string = string[:best] + string[best + 1:]
# Return the string once `len(string) <= to_length`.
return string
правила
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Входная строка будет состоять из печатных символов ASCII от пробела (
, десятичное 32) до тильды (
~
, десятичное 126) включительно . Там не будет гласныхAEIOU
в верхнем регистре в строке. В частности, не будут задействованы Unicode, вкладки или переводы строк.Вызовите входную строку s и целевую длину ввода t . Тогда 0 <t ≤ length ( s ) ≤ 10000 гарантировано. (В частности, входная строка никогда не будет пустой. Если t = length ( s ), вы должны просто вернуть строку без изменений.)
Контрольные примеры
Input: 50, Duis commodo scelerisque ex, ac consectetur metus rhoncus.
Output: Duis commodo scelerisque ex, ac cnscttr mts rhncs.
Input: 20, Maecenas tincidunt dictum nunc id facilisis.
Output: Mcnstncdntdctmnncdfc
Input: 150, golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf golf
Output: glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glf glfglfglfglfglfglfglfglfglfglf
y
гласный?aeiou
гласные, иAEIOU
не будет происходить, для простоты. (Вся заглавная / строчная вещь - это не то, на чем я хочу сосредоточиться.) Я добавил пояснения.w
(например, в слове со ш ,w
гласный!) Конечно, это улажено для этого, но там , где это не указано , что множество гласныхaeiou
, вы должны иногда включатьy
иw
. : -Ofor index, char in enumerate(string)
вместоrange(len(str))
конструкцииОтветы:
MATL , 20 байтов
Попробуйте онлайн!
источник
Perl,
484543 байтаВключает +4 для
-Xlpi
(-X может быть опущен, но оставляет STDERR уродливые предупреждения)Запустите с номером после
-i
опции и вводом на STDIN (также поддерживает несколько строк). напримерperl -Xlpi50 crunch.pl <<< "Duis commodo scelerisque ex, ac consectetur metus rhoncus."
crunch.pl
:источник
/$+/
иwhile
JavaScript (ES6),
6661 байтСохранено 5 байтов благодаря @Neil
Я не думаю, что регулярное выражение пригодно для игры в гольф дальше. Удивительно, но самое короткое, что я могу придумать для удаления спереди назад, - это байт длиннее:
Более интересная попытка (ES7), 134 байта
Это использует подход, аналогичный ответу MATL.
источник
|.$/,"$1$2"
для сохранения 5 байтов.ш + гну сед,
7861Введите строку
STDIN
, длина в качестве первого аргумента.источник
Луа, 120 байт
Принимает ввод как аргументы командной строки, в формате
lua crunch.lua 10 "This is a string"
, с выводомThs sstrng
.Объяснение:
источник
Perl, 68
Удаление справа добавляет массу символов, возможно, есть лучший способ сделать это.
Используйте
-i
для ввода номера. Это 65 символов плюс 3 дляi
,p
иl
в командной строке.Бежать с:
источник
y///c
вместоlength
и вы можете переместить цикл while до конца:s///||s///||s///while$^I<y///c
Java 8, 303 байта
Это слишком долго. Я постараюсь сократить его в ближайшее время. Было бы намного короче, если бы у java был метод обращения строк и обратных замен.
Тест со следующим:
источник
s->j->{...}
). Я думаю, что либо Java не очень хорошо его поддерживает, либо я неправильно его настраиваю.C #, 180 байт
Tester:
источник
Скала, 160 байт
Tester:
источник
Дьялог АПЛ,
774542 байтаt[
...]
буквы t с индексами ...t←⌽⍞
t получает обратный ввод текста,i←⍳⍴t
я получаю индексы длины t/¨⊂i
множественные (3) логические выборки элементов i :1.
(t∊'aeiou')
логическое значение, где гласный2.
(' '=t)
логическое значение, где пробел3.
1
все∪∊
уникальное число в списке ( сглажено) 3 выбора⌽⎕↓⌽
отбрасывают последние введенные символы (так же, как(-⎕)↓
)⌽i~
обратные оставшиеся индексы после удаления некоторыхОригинальный ответ:
Эмм, да, это немного трудно читать. В основном прямой перевод OP на APL:
источник
Mathematica, 201 байт
Там должно быть лучше, чем этот ..
источник
R
169143 байта* редактировать сохраненные 36 байтов через переписать с
utf8ToInt
->intToUtf8
преобразования неstrstplit
иpaste0(...,collapse)
безрассудный с объяснением
источник