Nie lubię strun z więcej niż trzema samogłoskami z rzędu. Czy potrafisz napisać program, który usuwa wszystkie samogłoski, których nie chcę ze słów?
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wejściowe to ciąg zawierający tylko drukowalny znak ASCII (od 0x20 do 0x7E włącznie).
Wyjście jest ciągiem zawierającym tylko najwyżej 3 kolejne samogłoski. Jeśli ciąg wejściowy zawiera więcej niż 3 kolejne samogłoski, program powinien wygenerować ciąg wyjściowy, w tym pierwsze trzy samogłoski napotkane w tym przebiegu, odrzucając kolejne kolejne samogłoski.
Y nie jest samogłoską dla celów tego wyzwania.
To jest kod golfowy, więc wygrywa najkrótszy kod (w bajtach).
Przypadki testowe
"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
.Odpowiedzi:
Pyth, 21 bajtów
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie:
Iteruję wszystkie znaki i śledzę, ile samogłosek przeszedłem za pomocą licznika. Za każdym razem, gdy przekazuję znak, który nie jest samogłoską, resetuję licznik na 0. Ponownie wyświetlam znaki, gdy licznik ma> 4.
źródło
Nieczytelny , 1647 bajtów
Wyjaśnienie
Ten program jest równoważny pseudokodowi tak:
z następującymi przypisaniami zmiennych:
Jak widać, uniknąłem zmiennej szczeliny 0, ponieważ
0
jest to tak długa stała do napisania.Czytamy więc każdy znak i przechowujemy wartość zarówno w, jak
cp
ich
. Zmodyfikujemy,cp
ale pozostaniemy wch
pobliżu, aby w razie potrzeby móc go wydrukować. Sukcesywnie odejmujemy liczby 65, 4, 4, 6 itd.,cp
Aby sprawdzić, czy jest to każdy z 10 możliwych znaków samogłosek w ASCII (zwróć uwagę, że ostatni nie musi być przypisaniem).vs
zawsze zawiera o 3 mniej niż liczba samogłosek, które można jeszcze wydrukować. Zaczyna się od0
, więc można wydrukować 3 samogłoski. Kiedy to osiągnie-3
, przestajemy drukować samogłoski.Jeśli napotkamy nie-samogłoskę (w tym spację), wykonujemy
print(ch)
po niejvs = 0
. Jak zapewne się domyślacie, resetuje licznik samogłosek.Jeśli napotkamy samogłoskę , wykonujemy ją
((--vs)+4) ? print(ch) : (++vs)
. Rozbijmy to:vs
;-4
, posunęliśmy się zbyt daleko, więc nic nie drukuje, ale przyrostvs
powrotem do-3
tak będziemy kontynuować do odmowy wydrukowania samogłosek;źródło
Siatkówka , 25 bajtów
Wypróbuj online.
Dość prosta podstawienie wyrażenia regularnego. Działa to również dla tej samej liczby bajtów:
źródło
JavaScript (ES6), 42
Jako funkcja anonimowa
źródło
Perl, 27 znaków
(Kod 26 znaków + opcja wiersza poleceń 1 znak)
Nic wielkiego, tylko rzadka okazja, którą pamiętam
\K
.Przykładowy przebieg:
źródło
\K
”. :)s/([aeiou]{1,3})(?1)+/$1/gi
.Poważnie, 34 bajty
Hex Dump:
Wypróbuj online
Wykorzystuje ten sam algorytm, co odpowiedź Pyth, mapując ciąg, śledząc długość bieżącego przebiegu samogłosek w rejestrze, zwiększając go za każdym razem, gdy obecny znak jest samogłoską i sprawdzając, czy przekroczył dozwoloną długość, zwracając 0, jeśli tak, a następnie filtrując oryginalny ciąg za pomocą tego wygenerowanego filtra. Będzie o wiele krótszy, gdy będziemy mogli użyć odejmowania ustawionego dla ciągów. (
Ok
Można usunąć iOkd
zastąpić je tylko@
). Słyszałem, że ta funkcja pojawi się w następnej aktualizacji ....źródło
C, 166 bajtów
jak dotąd nie najkrótsza odpowiedź, ale myślę, że ładnie grał w golfa
walizka testowa:
źródło
Mathematica, 68 bajtów
Odpowiedź wyrażenia regularnego byłaby taka sama, ale kto używa wyrażenia regularnego?
źródło
Java, 115 bajtów
Oczekuje wprowadzenia jako parametru programu.
Wyjście testu jednostkowego:
źródło
String[]
ia
.String[]a
print
zamiastprintln
. Nie wierzę, że specyfikacja wymaga końca nowej linii.APL, 40 znaków
Po angielsku:
'aeiouAEIOU'∊⍨' ',⍵
: znajdź samogłoski (i wstaw spację, aby przerwać po obrocie);(1-⍳4)⌽¨⊂
: obróć 0, 1, 2, 3 razy (z zawijaniem) popychając w prawo wektor boolowski;⊃+/ sum
: obroty i rozpakuj1↓4≠
: znajdź inną niż 4 i usuń pierwszą (aby przygotować miejsce, które wcześniej zajęliśmy)⍵/⍨
: w argumencie zachowaj tylko element, w którym suma była inna niż 4.źródło
Perl 6 ,
3635 bajtówstosowanie:
źródło
C (205 bajtów)
(Dodano jeden podział linii dla zachowania przejrzystości)
źródło
Scala, 107 bajtów
źródło
JavaScript ES6, 43 znaki
Test:
źródło
x .86 MS-DOS .COM ,
44 bajty36 bajtówPliki .COM są szeroko obsługiwane od MS-DOS 1 do chwili obecnej --- działam w dosemu, używając tylko poleceń 8086.
Zmniejszono z 44 do 36 bajtów, używając REPNE SCASB do testowania samogłosek, zamiast osobnego polecenia do testowania każdej samogłoski.
źródło
Matlab / Octave, 54 bajty
Przykład:
Wypróbuj w ideone .
źródło
V , 21 bajtów (niekonkurencyjny)
Wypróbuj online!
Wyjaśnienie:
Jest to tylko nieco krótsze niż najprostsze rozwiązanie:
(22 bajty)
źródło
Rubinowy, 44 bajty
Przykład:
źródło
$<.read
aby obsłużyć wprowadzanie wielowierszowe (a więc zawiera znak spoza zakresu 0x0a) zamiastgets
?