Uncollapse digits


72

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.
  • 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

28
To doskonałe wyzwanie! Zadanie jest niezwykle łatwe do zrozumienia i weryfikacji, ale właściwe podejście do użycia nie jest zbyt oczywiste. A wybór właściwego podejścia może mieć ogromną różnicę w wynikach. +1 :)
DJMcMayhem

1
Po przemyśleniu tego przypomniałem sobie podobne, ale bardziej uproszczone wyzwanie w anarchii golfa: tak ! To wywołało niesamowite odpowiedzi w C. Mam nadzieję, że wkrótce zobaczę jedną z nich :)
Lynn,

Nie sądzę, że moja odpowiedź C kwalifikuje się jako taka, ale mam nadzieję, że jest to punkt wyjścia dla innych z bardziej pokręconym poczuciem humoru niż ja.
Michael Dorgan,

Jestem prawie pewien, że widziałem to samo wyzwanie, ale tam, gdzie masz wydrukować rzeczywistą liczbę. Jestem prawie pewien, że została również opublikowana przez ciebie, Lynn; ale zgubiłem link, podłączysz mnie?
Magic Octopus Urn

3
@MichaelDorgan (lub dowolny inny koder C), możesz rzucić okiem na algorytm użyty w mojej odpowiedzi Befunge. Prosta konwersja tego do C dała mi rozwiązanie 104-bajtowe, które, jak sądzę, przewyższa wszystkie istniejące odpowiedzi C. Jestem gotów się założyć, że ktoś może poprawić umiejętności gry w golfa C.
James Holderness

Odpowiedzi:



17

C (gcc) , 89 80 76 75 72 71 70 69 bajtów

f(char*s){*s&&f(s+printf(" %.*s",""[(*s^s[2])%12],s)-1);}

Wypró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:0x&&y

f (char *s) {        /* K&R style implicit return type. s is the input. */
    *s&&f(           /* Recurse while there is input. */
        s+printf(    /* printf returns the number of characters emitted. */
            " %.*s", /* Prefix each digit string with a space. Limit
                      * how many bytes from the string to print out. */
            ""
                     /* Magic hash table, where the value represents
                      * the length of the digit string. The string
                      * is logically equivalent to
                      * "\04\01\05\03\04\05\05\04\04\01\03\03" */
            [(*s^s[2])%12],
                     /* The XOR hash (mod 12) */
            s)       /* The current digit. */
            -1);}    /* Subtract 1 for the space. */

11

Python 2 , 50 bajtów

import re
re.compile('..[eox]|[tse]?....').findall

Wypróbuj online!

-3 dzięki Lynn .
-4 dzięki Uriel 's odpowiedzi regex' s.


3
Miły! import re;re.compile('…').findallpowinien zaoszczędzić kilka bajtów. Spodziewałem się, że to zmieni się w regex golf :)
Lynn,

@ Lynn Poczekaj, poczekaj, aż skończę! :-P EDYCJA: Właściwie to 3 bajty.
Erik the Outgolfer,

@ Lynn Ponadto powinieneś zmienić to na wyrażenie regularne w golfa kodowego . ;)
Erik the Outgolfer

Czekam na odpowiedź C, która będzie bardzo interesująca!
Lynn,

9

Befunge, 87 85 81 76 bajtów

<*"h"%*:"h"$_02g-v1$,*<v%*93,:_@#`0:~
"@{&ruX;\"00^ !: _>_48^>+:"yp!"*+%02p0

Wypró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.


Szczerze mówiąc, dla mnie wygląda to jak bakemoji (ば け も じ). Łał. Opis algorytmu jest jednak miły i będę go rozważał.
Michael Dorgan

^, Pamiętam, że widziałem ten termin jako mojibake (も じ ば け). Jak znalazłeś te liczby (baza 104, mod 3187), @JamesHolderness?
Zacharý

@ Zacharý Napisałem mały skrypt Pythona, który testował różne kombinacje podstaw i modów, aby znaleźć te, które przyniosą poprawne wyniki, gdy zostaną uruchomione przy wszystkich oczekiwanych danych wejściowych. Kiedy już wiedziałem, które kombinacje działają, uruchomiłem powstałe wyniki mieszania za pomocą generatora liczb Befunge, aby dowiedzieć się, który wygenerował najkrótszy kod.
James Holderness

6

Java (OpenJDK 8) , 55 46 43 bajtów

Oszczędność 9 bajtów dzięki Forty3 / FrownyFrog

Oszczędność 3 bajtów dzięki Titusowi

s->s.replaceAll("one|tw|th|f|z|s|.i"," $0")

Wypróbuj online!

edytuj: Dziękujemy za powitanie i wyjaśnienie lambdas!


3
Cześć, witamy w PPCG! Świetna pierwsza odpowiedź i naprawdę działa. Oto link do niego TIO. Lambdas można tworzyć na wiele sposobów. Oto kolejne TIO z kilkoma lambdami z dodanymi komentarzami, dzięki czemu możesz zobaczyć, jak je samodzielnie stworzyć. (Sugeruję skopiowanie go do środowiska Eclipse, aby można było zobaczyć wyróżnienie kodu). Porady dotyczące gry w Javę i Porady dotyczące gry we wszystkie języki mogą być interesujące do przeczytania. Miłego pobytu! :)
Kevin Cruijssen

@KevinCruijssen dziękuję! Jestem szczerze zaskoczony, że Java jest krótsza niż JavaScript. Zwykle, kiedy czytam wyzwania, JS jest znacznie krótszy.
Luca H

JavaScript powinien być o 2 bajty krótszy ( gsufiks wyrażenia regularnego zamiast All).
Neil

@Neil jest tu dłużej, ponieważ używa f=(s)=>zamiast s->, czyli o 4 bajty krócej.
Luca H

1
@LucaH - zgodnie z sugestią FrownyFrog, możesz zredukować kilka dwuliterowych ciągów znaków do pojedynczych znaków: z | f | s zamiast ze | fo | fi | si | se /
Forty3

6

C (gcc) , 179 159 146 139 137 116 107 103 102 102 bajtów

Edycja 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ń zstrchr()

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 .

c,h;f(char*s){while(c=*s++)putchar(c),h=h%10816*104+c%27,memchr("&;@X\\ru{",h%3817,9)&&putchar(h=32);}

Wypróbuj online!

Nie grał w golfa (co wciąż jest bardzo golfowe ...)


int c;
int h;
void f(char*s)
{
    while(c=*s++)
        putchar(c),
        h=h%10816*104+c%27,
        memchr("&;@X\\ru{",h%3817,9)?putchar(h=32):1;
}

Stare, proste rozwiązanie grep-esqe:

#define p putchar
#define q c=*s++
c,x;f(char*s){while(q){p(c);x=strchr("tse",c);p(q);p(q);if(!strchr("eox",c)){p(q);if(x)p(q);}p(' ');}}

Stara, czystsza wersja.

// Above code makes a macro of putchar() call.

void f(char *s)
{
    char c;
    while(c = *s++)
    {
        putchar(c);
        int x = strchr("tse", c);

        putchar(*s++);
        putchar(c=*s++);

        if(!strchr("eox", c))
        {
            putchar(*s++);
            if(x)
            {
                putchar(*s++);
            }
        }       
        putchar(' ');
    }
}

Wypróbuj online!


Możemy wykonać makro putchara i tym podobne dla kilku bajtów, ale ogólnie nadal myślimy o lepszym algorytmie, jeśli to możliwe.
Michael Dorgan,

159 bajtów przez #definenia putchari usuwania zbędnych parę wsporników.
Pan Xcoder,

2
Trochę brzydkie, ale zamiast tego używa się 136 bajtów#define p putchar( (zwróć uwagę na otwarty nawias).
Tom Carpenter

1
109 bajtówc,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)));}
gastropner

Ach, sztuczka printf, którą zobaczyłem poniżej, oraz usunięcie kilku nawiasów i nawiasów klamrowych. Kod mistrzowski golf włączony :)
Michael Dorgan

5

JavaScript, 66 57 52 44 41 bajtów

s=>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 fi sdobre 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, zspada do 52.

Titus proponuje mniejszy RegEx. Czuję, że w końcu zmierzamy w kierunku wyrażenia regularnego Uriela.


Czy to się psuje, jeśli używasz dwóch znaków i naciskasz „do” do końca?
FrownyFrog,

Myślęz|tw|th|f|s|ei|ni|on
FrownyFrog

1
@FrownyFrog o jest na pierwszym miejscu, więc jest rozpoznawany jako pierwszy.
Uriel

1
on|t[wh]|.i|[fsz](-4 bajty)
Tytus

2
@Titus - Niestety renderowanie on|będzie zgodnezeroninezer onine
Forty3


5

C, 103 99 bajtów

char*r="f.tzuonresn.xgv";f(char*s){*s&&f(s+printf("%.*s ",(strrchr(r,s[2])-strchr(r,*s))%10,s)-1);}

Dział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

#include <stdio.h>
int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        f(argv[i]);
        puts("");
    }
}

1
Niektóre bajty można zapisać za pomocą rekurencji: tio.run/##XY/…
jxh

4

J , 37 35 bajtów

rplc'twthsiseeinionzef'(;LF&,)\~_2:

Wypróbuj online!


2
Fajne alternatywne rozwiązanie! Próbowałem f=:[:>'..[eox]|[tse]?....'&rxalli działało to w interpeter, ale nie działa w TIO.
Galen Iwanow

to jest naprawdę sprytne, dobrze zrobione
Jonasz

@GalenIvanov TIO ma najnowszą wersję, może to być regresja w J.
FrownyFrog





3

Galaretka ,  23  21 bajtów

ḣ3OP%953%7%3+3ɓḣṄȧṫḊÇ

Peł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:

  1. znajduje długość pierwszego słowa listy znaków przy użyciu matematyki porządkowej;
  2. wypisuje słowo plus kreskę; i
  3. usuwa słowo z nagłówka listy znaków

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:

word   head3  ordinals       product  %953  %7  %3  +3 (=len(word))
zero   zer    [122,101,114]  1404708   939   1   1   4
two    two    [111,110,101]  1233210    28   0   0   3
one    one    [116,119,111]  1532244   773   3   0   3
three  thr    [116,104,114]  1375296   117   5   2   5
four   fou    [102,111,117]  1324674     4   4   1   4
five   fiv    [102,105,118]  1263780   102   4   1   4
six    six    [115,105,120]  1449000   440   6   0   3
seven  sev    [115,101,118]  1370570   156   2   2   5
eight  eig    [101,105,103]  1092315   177   2   2   5
nine   nin    [110,105,110]  1270500   151   4   1   4

ḣ3OP%953%7%3+3ɓḣṄȧṫḊÇ - Main link, list of characters           e.g. "fiveeight..."
ḣ3              - head to index three                                "fiv"
  O             - ordinals                                           [102,105,118]
   P            - product                                            1263780
    %953        - modulo by 953                                      102
        %7      - modulo by seven                                    4
          %3    - modulo by three                                    1
            +3  - add three                                          4

              ɓ - dyadic chain separation swapping arguments...
... ḣṄȧṫḊÇ ...
    ḣ         - head to index                                        "five"
     Ṅ        - print the result plus a line-feed and yield the result
       ṫ      - tail from index                                      "eeight..."
      ȧ       - and (non-vectorising)                                "eeight..."
        Ḋ     - dequeue                                               "eight..."
         Ç    - call the last link (Main*) as a monad with this as input
              -       * since it's the only link and link indexing is modular.

1
Nie jestem pewien, czy jest to dozwolone . (Poważnie, co robisz, gdy dwie bardzo uprzywilejowane meta-odpowiedzi mówią coś przeciwnego?)
Ørjan Johansen

OP jednoznacznie stwierdza: „Twoje dane wyjściowe mogą również opcjonalnie mieć takie ciągi na początku lub na końcu”, a ten program faktycznie drukuje w miarę upływu czasu, więc dane wyjściowe są wytwarzane przed jakimkolwiek wymuszonym zakończeniem.
Jonathan Allan,

Jasne, ale nie sądzę, by OP uważał ciąg nieskończony. A meta-pytanie wyraźnie dotyczy przypadku, w którym wydruk jest najpierw drukowany.
Ørjan Johansen

Myślę, że spełnia ducha wymogu (jeśli na przykład wydrukuje nieskończone puste ciągi, a następnie słowa, które mógłbym argumentować, że nie)
Jonathan Allan,

Myślę, że to umieszcza mnie w obozie Martina „jeśli to program i może uzasadnić ...” :)
Jonathan Allan,

3

do 168 ,145,144, 141 bajtów

EDYCJA: Próbowałem init 'i' do 1 lubię to

a, b; main (i)

Aby pozbyć się wiodących białych znaków,
ale psuje się na wejściu zaczynając od trzech, siedmiu lub ośmiu

141

#define s|a%1000==
a,i;main(b){for(;~scanf("%c",&b);printf(" %c"+!!i,b),a|=b%32<<5*i++)if(i>4|a%100==83 s 138 s 116 s 814 s 662 s 478)a=i=0;}

Wypróbuj online

144

a,i;main(b){for(;~(b=getchar());printf(" %c"+!!i,b),a=a*21+b-100,++i)if(i>4|a==204488|a==5062|a==7466|a==23744|a==21106|a==6740|a==95026)a=i=0;}

Wypróbuj online

168

i,a;main(b){for(;~scanf("%c",&b);printf(" %c"+!!i,b),a|=b<<8*i++)if(i>4|a==1869768058|a==6647407|a==7305076|a==1920298854|a==1702259046|a==7891315|a==1701734766)a=i=0;}

Wypróbuj online!

Nie golfił

i,a;main(b){
for(;~scanf("%c",&b); // for every char of input
printf(" %c"+!!i,b), // print whitespace if i==0 , + char
a|=b<<8*i++ // add char to a for test
)
if(
i>4| // three seven eight
a==1869768058|      // zero
a==6647407|        // one
a==7305076|       // two
a==1920298854|   //four
a==1702259046|  //five
a==7891315|    //six
a==1701734766 //nine
) a=i=0; //reset i and a
}

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

#define s|a==*(int*)
a,b;main(i){for(;~(b=getchar());printf(" %c"+!!i,b),a|=b<<8*i++)if(i>4 s"zero"s"one"s"two"s"four"s"five"s"six"s"nine")a=i=0;}

Korzystanie z porównania ciągów

Zaciemnione

#define F(x)if(scanf(#x+B,&A)>0){printf(#x,&A);continue;}
B;A;main(i){for(;i;){B=1;F(\40e%4s)F(\40th%3s)F(\40se%3s)F(\40o%2s)B=2;F(\40tw%1s)F(\40si%1s)B=1;F(\40%4s)i=0;}}


2

Dość długi. Możesz zagrać w golfa w dół.

R , 109 bajtów

function(x)for(i in utf8ToInt(x)){F=F+i;cat(intToUtf8(i),if(F%in%c(322,340,346,426,444,448,529,536,545))F=0)}

Wypróbuj online!


Jakikolwiek sposób na użycie znaków Unicode zamiast cyfr?
Michael Dorgan

Fajna aplikacja 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)
Michael M

2

Haskell , 81 bajtów

f[c]=[c]
f(h:t)=[' '|s<-words"z one tw th f s ei ni",and$zipWith(==)s$h:t]++h:f t

Wypróbuj online!

Wyjaśnienie:

f(h:t)=                      h:f t -- recurse over input string
   [' '|s<-               ]++      -- and add a space for each string s
      words"z one tw th f s ei ni" -- from the list ["z","one","tw","th","f","s","ei","ni"]
      ,and$zipWith(==)s$h:t        -- which is a prefix of the current string

2

Python 3 (bez wyrażenia regularnego) , 85 bajtów

i=3
while i<len(s):
	if s[i-3:i]in'ineiveroneghtwoureesixven':s=s[:i]+' '+s[i:]
	i+=1

Wypróbuj online!


2
Witamy w PPCG!
Laikoni,

To miłe, ale pełny program musi zawierać kod, aby pobierać dane wejściowe.
Jonathan Allan

Zatem jako pełny program 104 bajty . Możesz jednak zaoszczędzić 4, używając, 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).
Jonathan Allan

2

Excel, 181 bajtów

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"z"," z"),"on"," on"),"tw"," tw"),"th"," th"),"f"," f"),"s"," s"),"ei"," ei"),"ni"," ni")

Umieszcza spację przed: z, on, tw, th, f, s, ei,ni


2

Zespół Z80, 46 45 bajtów

; HL is the address of a zero-terminated input string
; DE is the address of the output buffer

Match5: ldi                                 ; copy remaining characters
Match4: ldi
Match3: ld a,32 : ld (de),a : inc de        ; and add space after a matched word.

Uncollapse:

        ld a,(hl) : ldi : or a : ret z      ; copy first byte (finish if it was zero)
        ex af,af'                           ; and save its value for later.

        ldi : ld a,(hl) : ldi               ; copy second and third bytes

        cp 'e' : jr z,Match3                ; is the third letter 'e' or 'o' or 'x'?
        cp 'o' : jr z,Match3
        cp 'x' : jr z,Match3

        ex af,af'                           ; now look at the first letter

        cp 'e' : jr z,Match5                ; is it 't' or 's' or 'e'?
        sub 's' : jr z,Match5
        dec a : jr z,Match5
        jr Match4

(Fajnie było przystosować fajne wyrażenie regularne Uriela do nieprzyjaznego wyrażenia regularnego środowiska).


1

Galaretka , 40 39 bajtów

“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»Ḳe€€@ŒṖẠ€TḢịŒṖK

Wypróbuj online!

Jak to działa

“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»Ḳe€€@ŒṖẠ€TḢịŒṖK
“¢¤Ƙƒ⁺6j¹;Ċ-ḶṃżṃgɼṘƑUẏ{»                 = the compressed string of the digit names
                        Ḳ                = split at spaces
                         e€€@ŒṖ          = check whether each member of each partition of the argument is a digit.
                               Ạ€        = A function that checks whether all values of an array are true, applied to each element.
                                 T       = Finds the index of each truthy element 
                                  Ḣ      = Grab the first element, since we have a singleton array
                                    ịŒṖ  = The previous command gives us the index, partition that splits the input into digits. This undoes it and gives us the partition.
                                       K = Join the array of digits with spaces                



1

Python 3 , bez wyrażenia regularnego,  83 68 65  63 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) :)

def f(s):h=ord(s[0])*ord(s[1])%83%-7%-3+5;print(s[:h]);f(s[h:])

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)


Powracam do tego dużo później i zdaję sobie sprawę, że może to być 68 bajtów:def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
Lynn

Och, wow, h(s)a h(s)jak nie zauważyłem ?! Dzięki Lynn!
Jonathan Allan

Nie jestem pewien, jak wracam do tego pytania i zauważam nowe rzeczy, ale mam h=(ord(s[0])*ord(s[1])%83%7+1)%3+365 bajtów! :)
Lynn

Heh, dzięki Lynn, że pozwoliło to na jeszcze dwa bajty!
Jonathan Allan

0

Galareta , 36 bajtów

œṣj⁶;$}
W;“€ɗİẒmṫṃ¦¦ạỊɦ⁼Fḷeṭḷa»s2¤ç/

Wypróbuj online!

Algorytm:

for x in ['ze', 'ni', 'on', 'tw', 'th', ...]:
    replace x in input by space+x

Założę się, że możemy zrobić jeszcze lepiej.


0

Mathematica, 125 bajtów

(s=#;While[StringLength@s>2,t=1;a="";While[FreeQ[IntegerName/@0~Range~9,a],a=s~StringTake~t++];Print@a;s=StringDrop[s,t-1]])&


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



0

q / kdb +, 59 51 bajtów

Rozwiązanie:

{asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x}

Przykład:

q){asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x}"threesevensevensixninenineninefiveeighttwofiveeightsixthreeeight"
"three"
"seven"
"seven"
"six"
"nine"
"nine"
"nine"
"five"
"eight"
"two"
"five"
"eight"
"six"
"three"
"eight"

Wyjaśnienie:

Szybkie rozwiązanie, prawdopodobnie lepsze i bardziej golfowe podejście.

{asc[raze x ss/:string`z`one`tw`th`f`s`ei`ni]cut x} / ungolfed solution
{                                                 } / lambda with implicit x as input
                                             cut x  / cut x at indices given by left
 asc[                                       ]       / sort ascending
                string`z`one`tw`th`f`s`ei`ni        / string list ("z","one",...)
          x ss/:                                    / string-search left with each right
     raze                                           / reduce down list

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:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.