To wyzwanie jest hołdem dla zwycięzcy Najlepszego Obrazu na Oscars 2017 La La Land Moonlight !
Napisz funkcję / program, który pobiera ciąg zawierający tylko litery [A-Za-z]
, cztery symbole, które są wspólne w codziennych zdaniach .,'?
i spacjach, i wyprowadza ciąg w stylu La La Land.
Aby być bardziej szczegółowym, weź litery do pierwszej grupy samogłosek i włącznie, i wydrukuj / wydrukuj ją dwukrotnie, dodając spację za każdym razem, a następnie wydrukuj / wydrukuj cały ciąg. y jest samogłoską w tym wyzwaniu. Należy zachować interpunkcję i wielkie litery.
Możesz założyć, że wszystkie ciągi zawierają co najmniej jedną samogłoskę i że wszystkie ciągi zaczynają się na literę.
Przypadki testowe:
Land
La La Land
Moonlight
Moo Moo Moonlight
quEueIng
quEueI quEueI quEueIng
This isn't a single word.
Thi Thi This isn't a single word.
It's fun to play golf
I I It's fun to play golf
Ooo
Ooo Ooo Ooo
I'm okay
I I I'm okay
Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.
Why is y a vowel?
Why Why Why is y a vowel?
To jest golf golfowy, więc wygrywa najkrótszy kod w każdym języku. Zalecane są objaśnienia , także w językach głównego nurtu.
MOONLIGHT
. I dla zabawy:Why did the chicken cross the road?
Odpowiedzi:
Sed 30 bajtów
źródło
*
zamiast\+
?05AB1E ,
231918 bajtówZapisano 1 bajt dzięki Okx .
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Galaretka ,
24 22 20 1914 bajtów-5 bajtów, wykorzystując lewę z genialnej odpowiedzi Emigny (poszukaj 10 na liście isVowel)
Wypróbuj online! (nie jestem pewien, jak zrobić pakiet testowy dla tego pełnego programu)
15 bajtów alternatywnych:
Oto pełny pakiet testowy.
W jaki sposób?
źródło
Python, 61 bajtów
Oto pierwszy język nie oparty na wyrażeniach regularnych (wykorzystujący wyrażenie regularne).
Zapisano 1 bajt dzięki Neilowi .
źródło
JavaScript (ES6), 40
46Edytuj 5 + 1 bajtów zapisanych dzięki @ Arnauld
Zbyt długi w porównaniu do innych używających tej samej sztuczki (jak zwykle)
źródło
'$& $& $&'
- zawsze zapominam o specjalnych znakach dolara. Dziękuję Ci. Niestety teraz jest to naprawdę część odpowiedzi siatkówki Martina.^
to wymagane w Retina, która - myślę - domyślnie szuka wszystkich dopasowań. Ale czy naprawdę tego potrzebujemy?x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
Siatkówka , 24 bajty
Wypróbuj online!
źródło
Partia, 180 bajtów
Implementuje maszynę stanu.
g
śledzi, czy kiedykolwiek widzieliśmy samogłoskę, więc jeśli bieżąca litera nie jest samogłoską, wiemy, czy wydrukować, czy kontynuować z następną literą.źródło
PowerShell ,
4647413938 bajtówWypróbuj online!
Dzięki Maarten Bamelis za poprawkę
Zaoszczędź 6 bajtów dzięki Rynant
Zaoszczędzono
23 bajty dzięki Joeyźródło
Rubin,
313230 bajtówDwa bajty zapisane dzięki GB i Cyoce.
źródło
PHP,
5554 bajtówUwaga: wersja zakodowana wykorzystuje kodowanie IBM-850.
Uruchom tak:
Wyjaśnienie
Po prostu regex zamień na niecierpliwy pasujący dowolny znak na początku łańcucha, a następnie dowolną liczbę samogłosek (użyj
i
opcji dla niewrażliwości na wielkość liter). Ta grupa przechwytywania jest następnie drukowana dwukrotnie, a następnie cały ciąg.Poprawki
-R
aby$argn
udostępnić (Thx Titus)źródło
JavaScript (ES6), 38 bajtów
źródło
Perl, 25 + 1 (
-p
flaga)źródło
Perl 6 , 30 bajtów
Wypróbuj online!
źródło
{S:i/.*?<[aeiouy]>+/$/ $/ $//}
C,
202196195193190180i,j,k,m,n;f(char*a){if((a[i/12]-"AEIOUY"[i++%6])%32==0)k=n=24-(i%12);else if(k&&!n--){m=j=(i-13)/12;for(i=0;i<j*2;)printf("%c%c",a[i%j],(i==j-1)*32),i++;printf(" %s", a);}m?:f(a);}
Wypróbuj online!
Rzecz pozostała do golfa:
• Zwiń dwa printf w jeden.
• Drukowanie mojego znaku spacji można zmienić na
%*c
logikę, jestem pewien.• Używam warunkowych, które można jakoś usunąć
•
j=(i-13)/12
prawdopodobnie może zostać skrócony.• [AY] sprawdza warunkowe, jeśli
==0
to zwykle nie jest konieczne, chociaż obecnie utknąłem na tym (próbowałem zmienić if-else i==0
porzucić całkowicie, ale to wymaga dodania większej liczby {nawiasów} i zwiększenia rozmiaru bajtów)Sztuczki, których użyłem do gry w golfa:
• Połączono wyszukiwanie podwójnych ciągów pętli za pomocą modulo dla osi x i dzielenia liczb całkowitych dla osi y (ciąg wejściowy vs ciąg samogłoski). (Oś X jest zapętlona dwa razy przed iteracją raz na osi y; pierwszy raz z [AZ] i drugi raz z [az] przy użyciu różnicy wartości znaku 32.
• Ominięto konieczność używania „[AY] i [ay]”, po prostu biorąc odległość między zestawami znaków a modułem 32. W ten sposób, jeśli odległość wynosi 0 (AA) lub jeśli odległość wynosi 32 (aA)
• Ponowne użycie zmiennych całkowitych, które nie są już używane jako zmienne boolowskie.
• Rekurencyjne wywoływanie funkcji z tym samym łańcuchem w celu przetworzenia go i uniknięcia drugiej pętli for.
• Ustaw wartości BOOL na logikę ustawiania innej zmiennej. (np. bool = i = 5;) wybić oba jednym kamieniem.
• Ternary puste - prawdziwe nadużycie exploitów. (GCC)
Czytelny format:
Powalono 10 bajtów dzięki Keyu Ganowi (w komentarzach)
źródło
j=(i-13)/12
może zostać skrócona.i=j=k=m=n=0;
?i,j,k,m,n;
do inicjalizacji.MATL, 33 bajty
Wypróbuj w MATL Online
Wyjaśnienie
źródło
'(^.*?[yY%s]+)'13Y2YD'$1 '8:)YX
zapisuje 2 bajty'(^.*?[%s]+)'19Y2YD'$1 '8:)YX
ratuje kolejne 219Y2
nie istniał, gdy odpowiedź została przesłana niestetyV ,
21, 20 bajtówWypróbuj online!
Wyjaśnienie:
Hexdump:
Alternatywna wersja (21 bajtów):
Wypróbuj online!
Wykorzystuje to śmieszną kompresję wyrażeń regularnych i wciąż udaje mu się wyrzucić tyłek z innych języków golfowych. Dla porównania jest to około dwóch trzecich długości zwykłej wersji „nieskompresowanej”, a mianowicie:
Wyjaśnienie:
Oto zrzut heksowy:
źródło
Python 3 ,
7568 bajtówWypróbuj online!
Wyjaśnienie:
Działa, generując wartość logiczną dla każdego znaku w ciągu wejściowym na podstawie tego, czy jest to samogłoska, i znajdując najniższy indeks
0
pierwszej nie-samogłoski (z wyłączeniem pierwszego znaku). Zwraca podciąg do tego indeksu dwa razy, oddzielone spacjami i ciągiem oryginalnym.źródło
Clojure,
192188181 bajtów-4 bajty przez wstawianie
first-sp-pred
(ups).-7 bajtów poprzez usunięcie niektórych brakujących spacji
To było o wiele trudniejsze, niż się spodziewałem! Ręcznie parsuję ciąg ... ponieważ wciąż nie udało mi się nauczyć regex: /
Informacje na temat awarii znajdują się w kodzie golfowym:
źródło
Python 3 ,
10196 bajtówWypróbuj online!
rozwiązanie niebędące wyrażeniem regularnym
Skomentowano:
źródło
w=c in a
zw=c in'aAeEiIoOuUyY'
Ohm , 19 bajtów (CP437), niekonkurujące
Nowy język i jako taki musiałem dodać kilka nowych funkcji, aby ten działał, co niestety sprawia, że jest on niekonkurencyjny (ponieważ luki).
Wyjaśnienie:
źródło
Q
), wyszukiwanie w podtablicy ( ),u
cięcie łańcuchowe / tablicowe (├
) oraz stałe samogłoskowe (αv
iαy
).PHP,
69 6553 bajtówwymaga PHP 5.3 lub nowszego. Uruchom jako potok z
-F
lub wypróbuj niektóre wersje online .Zapisano 4 bajty (i naprawiono kod) z wyrażeniem regularnym skradzionym z @aross;
10 więcej z
preg_filter
zamiastpreg_match
i-F
a dwie z ulepszonym regex.
7581 bajtów dla wersji innej niż wyrażenia regularne:wymaga PHP 5 lub nowszego; wymienić
?:
ze?1:
dla starszych PHP. Biegnij z-nR
Awaria
źródło
This isn't a single word
:T T This isn't a single word.
i
modyfikatora, który powoduje, że wielkość wyrażeń regularnych nie jest rozróżniana. Druga wersja sprawdzała tylko małe litery. Naprawiony.R, 49 bajtów
sub("(.*?[aeiouy]+)","\\1 \\1 \\1",scan(,""),T,T)
Zastąpienie oparte na regeksie, dopasuj wszystko, aż nie będzie samogłoski, przechwyć i zamień je 3 razy.
scan
poczekaj nadouble
dane wejściowe typu, aby powiedziećcharacter
typowi, że musimy podać dwa argumenty, pierwszy to domyślny, pusty ciąg dla stdin, a dla drugiego ocena R pozwala na użycie tylko,c
ponieważ nie jest dwuznacznacharacter
w tym kontekście.T
oznaczaTRUE
i zapisuje trochę znaków jako 4 i 5 parametr, aby podpowiedzieć, aby zignorował wielkość liter i użył PCRE (chciwość nie jest taka sama ze składnią regex R)4 bajty zapisane dzięki uprzejmości Sumner18 wraz z linkiem Tio do uruchomionego kodu
źródło
Java 8,
147140 bajtówGra w golfa:
Nie golfowany:
Uwaga: literał
2
w kodzie to wartośćjava.util.regex.Pattern.CASE_INSENSITIVE
.źródło
import java.util.regex.*;
aby zapisać niektóre bajty.C, 123 bajty
Zadzwoń jako:
źródło
Pyke , 22 bajty
Wypróbuj online!
Jest to 4 bajty dłuższe niż powinno być, gdybym wdrożył krótszy sposób uzyskiwania samogłosek, w tym
y
.źródło
Siatkówka, 24 bajty
Wypróbuj online
źródło
Python 3 ,
130102 bajtówWypróbuj online!
Nie używa żadnej funkcji i żadnych bibliotek zewnętrznych! (Chyba że drukowanie i dane wejściowe są liczone jako funkcje, które pełnią).
Działa, sprawdzając, czy wydostaje się ze spółgłosek na początku tytułu do „strefy samogłoskowej”. Jeśli znajduje się w „strefie samogłosek” i wykrywa spółgłoskę, drukuje tytuł.
Zaoszczędź 28 bajtów dzięki @LliwTelracs
źródło
MATLAB / Octave,
5851 bajtów7 bajtów zapisanych dzięki @HughNolan
Tworzy anonimową funkcję o nazwie,
ans
którą można wywołać przekazując do niej ciąg znaków:ans('Land')
Demo online
W celu zapewnienia zgodności z MATLAB-em
$0
należy zastosować zamiast$1
powyższej funkcji.źródło
@(x)regexprep(x,'^.*?[aeiouyAEIOUY]+','$0 $0 $0 ');
- również Matlab wydaje się dziwnie używać 0 USD zamiast 1 USDC (gcc) ,
111110 bajtówWypróbuj online!
To właśnie wykorzystuje funkcje biblioteczne
strspn()
istrcspn()
i wykorzystuje kolejność gcc ocenia parametry funkcyjne. Nieco mniej golfaDzięki @gastropner za -1.
źródło
Pyth - 24 bajty
Pakiet testowy .
źródło
y
?