Удалить более n последовательных гласных из входной строки


19

Я не люблю струны с более чем тремя гласными подряд. Можете ли вы написать программу, которая удаляет все гласные, которые я не хочу из слов?

Вы можете написать программу или функцию, принимая ввод через 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."

2
Вы должны включить еще несколько тестов со смешанными случаями, как aaYYAAaaaAERGH.
Згарб

Ответы:


5

Pyth, 21 байт

sfg3=Z&}rT0"aeiou"hZz

Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

Я перебираю все символы и отслеживаю, сколько гласных я пропустил, используя счетчик. Каждый раз, когда я передаю символ, который не является гласным, я сбрасываю счетчик на 0. Я возвращаю символы, когда счетчик> 4.

sfg3=Z&}rT0"aeiou"hZz   implicit: z = input string
                                  Z = 0
 f                  z   test every char T in z; keep chars, that return true:
        rT0                convert T to lower
       }   "aeiou"         test if T is a vowel
      &           hZ       logical and with Z+1, 
                           gives 0 if ^ is false, otherwise Z+1
    =Z                     update Z with this value
  g3                       test if 3 >= Z
s                       sum up all remaining chars and print

10

Не читается , 1647 байт

«" „“ „„„“““ „“ „“ „„„“ „„„“ „“ „“““ „„„“““ „“““ „“ „“ „“ „“ "» " «» «» «» «» «„“„“„“„“„„„“„“„“““„“» «» «» «» «» «„“„“„“„“» «» «» «» «» «„“„“„“„“» «» «» «» «» «„“„“„“„“» «» «» «» «» "„“»«» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» "" „“ „“ „“ „“ «" „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«» «» «» «„“„“„“„“» «» «» «» «» «„“„“„“„“» «» «» «» «» "„“„“»«» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» "" „“ „“ „“ «» «„“„“„“„“» «» «» «» «» «„“„“„“„“» «» «» «» «» "„“„“„“»«„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» "" „“ „“ „“ „“ «" „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«» «» «» «» «„“„“„“„“» «» «» «» «» «„“„“„“„“» «» «» «» «» "„“„“» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„“"»„“„“„“" «» «„“„“„“» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «»«» «" „“ „“ „“»«„“ „„„“ „“ „“ „“ „„„“ „“ „“““ „“““ „“ „“ „“ "» „“ „“ «» «» «„“„“„“„“» «» «» «» «» «„“„“„“"»„“«"„“„“„“„“» "„“„“" «" „“ „„„“ „“ „“ „“““ „“ „“ „“ „„„“ „“ „“ „“““ „“ „“ „“»" „“ „“«» «» «„“„“„“„“» «» «» «» "" „“ „„„“ „“ „“ „“ „„„“ „“ „“““ „“““ „“ «» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» "" „“ „“ „“ „“ «" „“ „“ "» „“ „„„“ „“ „“ „“ „„„“ „“ „“““ „“““ „“ „“ „“ «" „“»«» «» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» "" „“ „“ „“ „“ «" „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«» «» «" „“ „„„“ „“ „“ „“ „„„“ „“ „“““ „“““ „“ „“ „“»" „“ „“ „“ „“«" „“ „“ „“»«»«»«»«»«„“ „“ „“ "» „“ «" „“ „“ „“ „“ „„„“ „“ „“““» «„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «" „“ „“ „“»«„“ "» «» «» «» «» «„„“ „“ „““» «» «„“„“„“„“» «» «» «» «» "„“„“„“»«„„“ „“ „“ „““» «» «» «» «„„“ „“ „“ „““» «» «» «» «„“"»„“„“„“„“" «" „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«»«»«»«„“ „“ „“ „“»«»«» «» «» «„“„“„“„„„“„„„“„“„“„“““„“““„“» «» «" „“»«„“ "»«» «" „“»«„“ "» „“ «" „“»«„“ "» „“ „“ „“ „“ „„„“““ „„„“““ "" „“ „“ «» «„“» «» «„„“ „“ „“ „““» «» «» «» «„“» «» «"»«„“ „“ „“ „„„“““ "» «» «„„“ „“ „““» «„„“ „„„“““ „“ „“ „““» «„„“ „„„“ „““““» «» «»«» «„“» «» «„“„„„“„“„“““"»„“„„„“„“„“„“““„“

объяснение

Эта программа эквивалентна псевдокоду, например:

while (cp = (ch = read)) + 1 {
    (
        (cp -= 65) ?    // A
            (cp -= 4) ?     // E
                (cp -= 4) ?     // I
                    (cp -= 6) ?     // O
                        (cp -= 6) ?     // U
                            (cp -= 12) ?    // a
                                (cp -= 4) ?     // e
                                    (cp -= 4) ?     // i
                                        (cp -= 6) ?     // o
                                            (cp - 6) ?      // u
                                                0
                                            : 1
                                        : 1
                                    : 1
                                : 1
                            : 1
                        : 1
                    : 1
                : 1
            : 1
        : 1
    ) ? ((--vs)+4) ? print(ch) : (++vs) : {
        print(ch)
        vs = 0
    }
}

со следующими назначениями переменных:

0   (unused)   (13 bytes)
1   cp         ( 4 bytes; occurs 20× in the code)
2   vs         ( 7 bytes; occurs  5× in the code)
3   ch         (10 bytes; occurs  3× in the code)

Как видите, я избежал переменной slot 0, потому что 0такая длинная константа для записи.

Поэтому мы читаем каждый символ и сохраняем значение в обоих cpи ch. Мы будем вносить изменения, cpно будем держать их chтак, чтобы при необходимости их можно было распечатать. Мы последовательно вычитаем числа 65, 4, 4, 6 и т. Д., cpЧтобы проверить, является ли это каждый из 10 возможных гласных символов в ASCII (обратите внимание, что самый последний из них не должен быть назначением).

vsвсегда содержит на 3 меньше, чем количество гласных, которые еще могут быть напечатаны. Начинается с 03 гласных. Когда он достигает -3, мы перестаем печатать гласные.

Если мы сталкиваемся с не гласным (включая пробел), мы выполняем, print(ch)а затем vs = 0. Как вы, наверное, догадались, это сбрасывает счетчик гласных.

Если мы встречаемся с гласным , мы исполняем ((--vs)+4) ? print(ch) : (++vs). Давайте разберем это:

  • декремент vs;
  • если значение сейчас -4, мы зашли слишком далеко, поэтому не печатайте ничего, а увеличивайте vsобратно, -3чтобы мы по- прежнему отказывались печатать гласные;
  • в противном случае напечатайте символ.

1
Этот язык верен своему названию.
bkul

2
Мне всегда интересно на этих языках ... «Они действительно написали это от руки? Если так, то мне их жаль ...» +1
Аддисон Крамп

9

Сетчатка , 25 байт

i`([aeiou]{3})[aeiou]+
$1

Попробуйте онлайн.

Довольно простая замена регулярных выражений. Это также работает для того же количества байтов:

Ri`(?<=[aeiou]{3})[aeiou]

3
В заключение! Онлайн переводчик! Вы должны рассмотреть возможность ссылки на него на своей странице GitHub.
mbomb007

6

JavaScript (ES6), 42

Как анонимная функция

s=>s.replace(/[aeiou]+/gi,v=>v.slice(0,3))

4

Perl, 27 символов

(26 символов кода + 1 символ командной строки)

s/[aeiou]{3}\K[aeiou]+//gi

Ничего страшного, просто редкий случай, который я помню, \Kсуществует.

Образец прогона:

bash-4.3$ perl -pe 's/[aeiou]{3}\K[aeiou]+//gi' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

2
Когда я написал ответ Retina, я подумал: «Я бы хотел, чтобы .NET regex имел \K». :)
Мартин Эндер

Интересно, @ MartinBüttner. У меня было чувство, что эти регулярные выражения были поставлены на серьезную стероидную диету. Для любопытства, есть ли у них рекурсивный подшаблон? Может помочь запасным один гласный перечисления, хотя результат больше: s/([aeiou]{1,3})(?1)+/$1/gi.
manatwork

К сожалению, у них нет повторного использования шаблона. Это две вещи, которые иногда заставляют меня переключиться на Perl или PCRE. Когда я подхожу к исправлению некоторых простых вещей в стиле регулярных выражений Retina, я думаю, что я добавлю их (не настоящая рекурсия, но по крайней мере повторное использование шаблона и конечная рекурсия).
Мартин Эндер

2

Серьезно, 34 байта

,;ù0╗`Ok"aeiou"Okd-Y;╜+*;╗4>`M@░εj

Шестнадцатеричный дамп:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

Попробуйте онлайн

Он использует тот же алгоритм, что и ответ Pyth, отображая строку, отслеживая длину текущего ряда гласных в регистре, увеличивая его, когда текущий символ является гласным, и проверяя, превысила ли он допустимую длину, возвращает 0, если так, и затем фильтрует исходную строку с помощью этого сгенерированного фильтра. Это будет намного короче, как только мы сможем использовать вычитание набора для строк. ( OkМожно удалить, а Okdможно заменить просто @). Я слышал, эта функция появится в следующем обновлении ....


2

C 166 байт

Я думаю, что это не самый короткий ответ, но я думаю, что он хорош

#define V v[1][i]!=
#define P printf("%c",v[1][i]),j
j;main(i,v)char**v;{for(i=0;V 0;i++)(V 97&V 'e'&V 'i'&V 'o'&V 'u'&V 65&V 69&V 73&V 79&V 85)?P=0:j>3?j++:P++;}

прецедент:

$ a.exe "We're queueing up for the Hawaiian movie."

We're queung up for the Hawaiin movie.

$ wc -c vowels.c 

166 vowels.c

2

Mathematica, 68 байт

a=Characters@"aeiouAEIOU";StringReplace[#,b:a~Repeated~{3}~~a..:>b]&

Ответ регулярного выражения будет такой же длины, но кто использует регулярное выражение?


2

Java, 115 байт

class a{public static void main(String[] a){System.out.println(a[0].replaceAll("(?i)([aeiou]{3})[aeiou]*","$1"));}}

Ожидается ввод в качестве параметра программы.

Результаты модульного теста:

Aei
screeen
We're queung up for the Hawaiin movie.

Сохраните один байт, убрав пробел между String[]и a. String[]a
Тыкай

Сохраните 2 байта, используя printвместо println. Я не верю, что спецификация требует новой строки.
Тыкай

2

APL, 40 символов

{⍵/⍨1↓4≠⊃+/(1-⍳4)⌽¨⊂'aeiouAEIOU'∊⍨' ',⍵}

По-английски:

  • 'aeiouAEIOU'∊⍨' ',⍵: найдите гласные (и добавьте пробел при вращении);
  • (1-⍳4)⌽¨⊂: повернуть 0, 1, 2, 3 раза (с переворотом), толкая вправо логический вектор;
  • ⊃+/ sum: повороты и распаковка
  • 1↓4≠: найдите отличную от 4 и удалите первую (чтобы найти место, которое мы добавили)
  • ⍵/⍨: в аргументе оставьте только элемент, сумма которого отлична от 4.

1

Perl 6 ,  36  35 байт

{S:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/} # 36 bytes

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' # 34 + 1 = 35 bytes

использование:

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."
Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

1

C (205 байтов)

#include <stdio.h>
#define T(x)for(i=0;i<10;++i){if(v[i]==x){b=x;m=1;break;}}putchar(c);
main(b,c,i,m){char v[]="aeiouAEIOU";
while((c=getchar())!=EOF){if(!m){T(c);}else{if(b==c)continue;else{m=0;T(c);}}}}

(Для ясности добавлен один разрыв строки)


1

Scala, 107 байт

readLine.foldLeft("",0)((a,n)=>if(!"aeiou".contains(n|32))a._1+n->0 else if(a._2>2)a else(a._1+n,a._2+1))_1

1

Javascript ES6, 43 символа

s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")

Тестовое задание:

f=s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")
;`"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."`
.replace(/"/g,"").split("\n").every(s=>f((s=s.split(" => "))[0])==s[1])

1

x86-файл MS-DOS .COM , 44 байта 36 байтов

Файлы .COM широко поддерживаются от MS-DOS 1 до настоящего времени - я работаю в dosmu, используя только команды 8086.

Уменьшено с 44 до 36 байт за счет использования REPNE SCASB для проверки гласных звуков вместо использования отдельной команды для проверки каждой гласной.

Hex dump, reversible using `xxd -r -seek -256`:
0100: b3 03 43 b4 08 cd 21 88 c2 24 df b1 05 bf 1f 01   ..C...!..$......
0110: f2 ae 74 02 b3 05 4b 74 e9 b4 02 cd 21 eb e4 41   ..t...Kt....!..A
0120: 45 49 4f 55                                       EIOU

Unassembled using debug:
0100 B303    MOV BL,03     ; initialize counter to 3 (will increment by 1 to be 4)
0102 43      INC BX        ; increment counter--runs each time it hits 0 so it never goes <0
0103 B408    MOV AH,08     ; 
0105 CD21    INT 21        ; with AH=8, read 1 char without echo
0107 88C2    MOV DL,AL     ; copy input for potential output
0109 24DF    AND AL,DF     ; make input uppercase for testing
010B B105    MOV CL,05     ; count of 5 vowels to test against
010D BF1F01  MOV DI,011F   ; location of first vowel to test against
0110 F2AE    REPNE SCASB   ; test input against each vowel
0112 7402    JZ 0116       ; if input was not a vowel:
0114 B305    MOV BL,05     ;    reset counter to 5 (will decrement by 1 to be 4)
0116 4B      DEC BX        ; decrement counter regardless
0117 74E9    JZ 0102       ; if hit 0 (fourth or later vowel): goto 102
0119 B402    MOV AH,02     ; 
011B CD21    INT 21        ; with AH=2, print char
011D EBE4    JMP 0103      ; go to 103 for next character

bytes 011f-0123 contain the uppercase vowels AEIOU

1

Matlab / Octave, 54 байта

@(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

Пример:

>> @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')
ans = 
    @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

>> ans('We''re queueing up for the Hawaiian movie.')
ans =
We're queung up for the Hawaiin movie.

Попробуйте это в идеоне .


1

V , 21 байт (неконкурентный)

ñ[aeiou]ñÍãqû3}úsq*

Попробуйте онлайн!

Объяснение:

ñ[aeiou]ñ                     "Assign the string `[aeiou]` to register 'q'
         Íã                   "Search and replace on multiple lines (case insensitive):
           <C-r>q             "Register 'q'
                 û3}          "Repeated 3 times
                    ús        "Mark the following to be removed:
                      <C-r>q* "Register 'q' repeated any number of times

Это чуть короче, чем более простое решение:

Íã[aeiou]û3}ús[aeiou]*

(22 байта)


0

Рубин, 44 байта

><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')

Пример:

% ruby -e "$><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')" <<< "
Aeiou
screeeen
We're queueing up for the Hawaiian movie.
Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

Вы написали: «Ввод - это строка, содержащая только печатаемый символ ASCII (от 0x20 до 0x7E включительно)». Тогда зачем тратить дополнительные символы $<.readна то, чтобы он обрабатывал многострочный ввод (таким образом содержащий символ вне диапазона 0x0a) вместо gets?
manatwork

@ Manatwork это действительно хороший момент, спасибо! Думаю, это может сэкономить 2-3 байта :)
Джозеф Вайсман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.