Zadanie
Biorąc pod uwagę ciąg angielskich nazw cyfr „zwiniętych” razem, podobnie jak to:
zeronineoneoneeighttwoseventhreesixfourtwofive
Podziel ciąg z powrotem na cyfry:
zero nine one one eight two seven three six four two five
Zasady
Dane wejściowe są zawsze ciągiem. Zawsze składa się z jednej lub więcej małych liter alfabetu angielskiego, zwiniętych razem i nic więcej.
- Angielskie nazwy cyfr to
zero one two three four five six seven eight nine
.
- Angielskie nazwy cyfr to
Wyjściem może być lista ciągów lub nowy ciąg, w którym cyfry są rozdzielane nie alfabetycznymi, niepustymi łańcuchami. (Twój wynik może opcjonalnie zawierać takie ciągi na początku lub na końcu, a separatory nie muszą być spójne. Więc nawet coś takiego
{{ zero0one$$two );
jest poprawną (jeśli absurdalną) odpowiedziązeroonetwo
).Najkrótsza odpowiedź w bajtach wygrywa.
Przypadki testowe
three -> three
eightsix -> eight six
fivefourseven -> five four seven
ninethreesixthree -> nine three six three
foursixeighttwofive -> four six eight two five
fivethreefivesixthreenineonesevenoneeight -> five three five six three nine one seven one eight
threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight -> three seven seven six nine nine nine five eight two five eight six three eight
zeroonetwothreefourfivesixseveneightnine -> zero one two three four five six seven eight nine
Odpowiedzi:
Siatkówka , 20 bajtów
Wypróbuj online!
źródło
C (gcc) ,
89 80 76 75 72 71 7069 bajtówWypróbuj online!
(89) Kredyt dla gastropnera dla skrótu XOR.
(76) Podziękowania dla Toby Speighta za pomysł użycia 1. i 3. miejsca.
(75) Podziękowania dla Michaela Dorgana za
'0'
→48
.(72) Podziękowania dla Michaela Dorgana i Lynna za literały z postaciami kontrolnymi.
(69) Kredyt dla Lynn za
x?y:0
→x&&y
źródło
Python 2 , 50 bajtów
Wypróbuj online!
-3 dzięki Lynn .
-4 dzięki Uriel 's odpowiedzi regex' s.
źródło
import re;re.compile('…').findall
powinien zaoszczędzić kilka bajtów. Spodziewałem się, że to zmieni się w regex golf :)Befunge,
87858176 bajtówWypróbuj online!
Befunge nie ma żadnych instrukcji dotyczących manipulacji ciągami, więc tworzymy rodzaj skrótu trzech ostatnich napotkanych znaków podczas ich przetwarzania.
Ten skrót jest zasadniczo trzycyfrową liczbą base-104. Za każdym razem, gdy czytana jest nowa postać, modyfikujemy skrót za pomocą 104 2, aby pozbyć się najstarszej postaci, mnożymy ją przez 104, aby zrobić miejsce dla nowej postaci, a następnie dodajemy wartość ASCII nowego znaku mod 27 (aby upewnić się nie przepełnia się).
Dla celów porównawczych bierzemy tę wartość mod 3817, zapisujemy ją w pamięci (w ten sposób skracamy do 8 bitów), co skutkuje mniejszymi liczbami, które są łatwiejsze w obsłudze dla Befunge. Skróty, z którymi musimy porównać, to 0, 38, 59, 64, 88, 92, 114, 117 i 123. Jeśli pasuje do któregokolwiek z nich, wiemy, że napotkaliśmy sekwencję znaków, która oznacza koniec liczba, więc wypisujemy dodatkową spację i resetujemy skrót do zera.
Jeśli zastanawiasz się, dlaczego podstawa 104 lub dlaczego mod 3817, te wartości zostały starannie wybrane, aby lista skrótów, którą musieliśmy porównać, mogła być reprezentowana w jak najmniejszej liczbie bajtów.
źródło
Java (OpenJDK 8) ,
554643 bajtówOszczędność 9 bajtów dzięki Forty3 / FrownyFrog
Oszczędność 3 bajtów dzięki Titusowi
Wypróbuj online!
edytuj: Dziękujemy za powitanie i wyjaśnienie lambdas!
źródło
g
sufiks wyrażenia regularnego zamiastAll
).f=(s)=>
zamiasts->
, czyli o 4 bajty krócej.C (gcc) ,
179159146139137116107103102 102 bajtówEdycja 1: (Dodano sugestie pana Xcodera - dziękuję! - Moja wersja makr była tego samego rozmiaru co twoja, ale bardziej lubię twoją.)
Edycja 2: Zmieniono charakterystykę osobowości w porównaniu do połączeń z
strchr()
Edycja 3: Deklaracje var K&R (Eww!)
Edycja 4: Gdy 1 makro nie wystarczy ...
Edycja 5: Wykonaj ponownie z nowym algorytmem zasugerowanym powyżej. Dzięki Jamesowi Holdernessowi za ten świetny pomysł!
Edycja 6: Usunięto 0 zestawów, ponieważ wydaje się, że automatycznie tam trafia - Użyto technik golfowych z kodem mistrzowskim (przecinki, sztuczka printf itp.) - dzięki gastropner !
Edycja 7: Użyj memchr i naprawiono błąd wskazany przez Jamesa Holderness'a .
Edycja 7: Użyj
&&
do sprawdzenia końcowego, aby zastąpić?
- dzięki jxh .Wypróbuj online!
Nie grał w golfa (co wciąż jest bardzo golfowe ...)
Stare, proste rozwiązanie grep-esqe:
Stara, czystsza wersja.
Wypróbuj online!
źródło
#define
niaputchar
i usuwania zbędnych parę wsporników.#define p putchar(
(zwróć uwagę na otwarty nawias).c,h=0;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,c=h%3817,printf(" "+!(c&&strchr("&;@X\\ru{",c)));}
JavaScript,
6657524441 bajtóws=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")
Dość naiwny, ale działa.
Fajny chwyt FrownyFrog, aby użyć 2 znaków .. oprócz „jednego”, który czysty 2 znak może zepsuć zero. Edycja: singiel
f
is
dobre wyniki FrownyFrog, które przeoczyłem podczas pierwszych dwóch golfów.Dzięki, Neil, za sugestię nienazwanej lambdy i możliwości użycia pojedynczego znaku dla,
z
spada do 52.Titus proponuje mniejszy RegEx. Czuję, że w końcu zmierzamy w kierunku wyrażenia regularnego Uriela.
źródło
z|tw|th|f|s|ei|ni|on
on|t[wh]|.i|[fsz]
(-4 bajty)on|
będzie zgodnezeronine
zer onine
Siatkówka ,
2423 bajtyWypróbuj online! Edycja: Zapisano 1 bajt dzięki @FrownyFrog.
źródło
.....
->.{5}
zadziała?C,
10399 bajtówDziała to w przypadku dowolnego kodowania znaków (w tym niezręcznych, takich jak EBCDIC), ponieważ nie używa wartości liczbowej znaków wejściowych. Zamiast tego lokalizuje pierwszą i trzecią literę w magicznym ciągu. Odległość między nimi wskazuje liczbę liter, które należy przesunąć przy każdym wydruku.
Program testowy
źródło
J ,
3735 bajtówWypróbuj online!
źródło
f=:[:>'..[eox]|[tse]?....'&rxall
i działało to w interpeter, ale nie działa w TIO.C (gcc) ,
106 bajtów104 bajty-2 bajty dzięki @jxh
Wypróbuj online!
XOR jest naprawdę naszym największym sojusznikiem.
źródło
s[1]
będzie krótszy.Siatkówka , 28 bajtów
Wypróbuj online!
źródło
Pyth ,
35 2723 bajtówZaoszczędził wiele bajtów, przenosząc podejście Uriela .
Wypróbuj tutaj! Wstępne podejście.
źródło
Pypeć , 27 bajtów
Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!
Prosta zamiana wyrażeń regularnych, wstawia spację przed każdym dopasowaniem
[zfs]|one|[ent][iwh]
.Przeskakiwanie po modzie
kradzieżypożyczonego wyrażenia Uriela daje 23 bajty (z-s
flagą):źródło
Galaretka ,
2321 bajtówPełny program drukujący oddzielne wyjście liniowe. Uwaga: gdy to zrobi, wielokrotnie drukuje puste linie „na zawsze” (aż do ogromnego limitu rekurencji lub błędu seg)
Wypróbuj online!(Dane wyjściowe TIO są kumulowane, lokalna implementacja drukuje wiersz po wierszu)
W jaki sposób?
Począwszy od listy znaków, program wielokrotnie:
Długość pierwszego słowa jest ustalana przez sprawdzenie pierwszych trzech znaków z bieżącej listy znaków (koniecznie część pierwszego słowa). Program konwertuje je na liczby porządkowe, mnoży je razem, modulos wynik przez 953, modulos który przez siedem, modulos ten przez trzy i dodaje trzy:
źródło
do
168,145,144, 141 bajtówEDYCJA: Próbowałem init 'i' do 1 lubię to
Aby pozbyć się wiodących białych znaków,
ale psuje się na wejściu zaczynając od trzech, siedmiu lub ośmiu
141
Wypróbuj online
144
Wypróbuj online
168
Wypróbuj online!
Nie golfił
stałe int stają się niepotrzebne duże, przesuwając << 8,
ale w przypadku, gdy można porównać do ciągów znaków, powinno to być jak najbardziej naturalne
146 Używanie porównania ciągów
Korzystanie z porównania ciągów
Zaciemnione
źródło
Galaretka , 44 bajty
Wypróbuj online!
źródło
Dość długi. Możesz zagrać w golfa w dół.
R , 109 bajtów
Wypróbuj online!
źródło
intToUtf8
! 90 bajtów byłoby możliwe przy użyciu innego podejścia przy użyciu wyrażenia regularnego:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Haskell , 81 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Python 3 (bez wyrażenia regularnego) , 85 bajtów
Wypróbuj online!
źródło
while s[i:]
a następnie możesz zmniejszyć to do 93 bajtów , przesyłając rekurencjęlambda
(funkcje muszą jedynie zwracać dane wyjściowe, a nie drukować je same).Excel, 181 bajtów
Umieszcza spację przed:
z
,on
,tw
,th
,f
,s
,ei
,ni
źródło
Zespół Z80,
4645 bajtów(Fajnie było przystosować fajne wyrażenie regularne Uriela do nieprzyjaznego wyrażenia regularnego środowiska).
źródło
Galaretka ,
4039 bajtówWypróbuj online!
Jak to działa
źródło
QuadS ,
2120 bajtówWypróbuj online!
To jest port mojej odpowiedzi siatkówki .
źródło
APL (Dyalog Unicode) , 25 bajtów
Wypróbuj online!
źródło
Python 3 , bez wyrażenia regularnego,
83 68 6563 bajtów-15 dzięki Lynn (przekształcenie w pojedynczą funkcję)
-3 więcej dzięki Lynn (unikanie indeksowania do listy z większą arytmetyką)
... co prowadzi do kolejnego zapisu 2 bajtów (unikanie nawiasów z ujemnymi modułami) :)
Funkcja, która drukuje słowa oddzielone znakami nowej linii, a następnie podnosi
IndexError
.Wypróbuj online! (pomija wyjątki, aby umożliwić wiele uruchomień w zestawie testów)
źródło
def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
h(s)
ah(s)
jak nie zauważyłem ?! Dzięki Lynn!h=(ord(s[0])*ord(s[1])%83%7+1)%3+3
65 bajtów! :)Galareta , 36 bajtów
Wypróbuj online!
Algorytm:
Założę się, że możemy zrobić jeszcze lepiej.
źródło
Mathematica, 125 bajtów
Wypróbuj online!
TIO wyświetla komunikat o błędzie dotyczący „CountryData” (???)
Nie wiem, dlaczego tak się dzieje, ale wszystko działa dobrze na Mathematica
źródło
Perl 6 ,
4230 bajtówSprawdź to
Przetestuj
(Przetłumaczone z innych odpowiedzi)
źródło
q / kdb +,
5951 bajtówRozwiązanie:
Przykład:
Wyjaśnienie:
Szybkie rozwiązanie, prawdopodobnie lepsze i bardziej golfowe podejście.
Uwagi:
46 bajtów z kilkoma prostymi golfami, zastępując q wywołań k-ami, ale nadal jest to spore rozwiązanie.
asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:
źródło