Видаліть більше 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)

Як бачите, я уникав змінного слота 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ми продовжували відмовлятися від друку голосних звуків;
  • в іншому випадку надрукуйте символ.

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, я подумав, що "бажаю \K. :)
Мартін Ендер

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

На жаль, вони також не мають повторного використання шаблону. Це дві речі, які час від часу змушують мене перейти на 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

Математика, 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: обертання та unbox
  • 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

Скала, 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 по теперішній час - я працюю в дозіму, використовуючи лише команди 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

Матлаб / Октава, 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.

Спробуйте це у ideone .


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, це справді хороший момент, дякую! Подумайте, це може зекономити 2-3 байти :)
Джозеф Вайсман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.