Cancelar recolhimento de dígitos


72

Tarefa

Dada uma sequência de nomes em inglês de dígitos "recolhidos" juntos, assim:

zeronineoneoneeighttwoseventhreesixfourtwofive

Divida a sequência novamente em dígitos:

zero nine one one eight two seven three six four two five

Regras

  • A entrada é sempre uma string. Ele sempre consiste em um ou mais nomes de dígitos em inglês em minúsculas, recolhidos juntos e nada mais.

    • Os nomes dos dígitos em inglês são zero one two three four five six seven eight nine.
  • A saída pode ser uma lista de cadeias ou uma nova cadeia na qual os dígitos são delimitados por cadeias não alfabéticas e não vazias. (Sua saída também pode, opcionalmente, ter essas seqüências no início ou no final, e os delimitadores não precisam ser consistentes. Portanto, mesmo algo como {{ zero0one$$two );é uma resposta válida (se absurda) zeroonetwo.)

  • A resposta mais curta em bytes vence.

Casos de teste

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
Este é um excelente desafio! A tarefa é extremamente fácil de entender e verificar, mas a abordagem correta a ser usada não é muito óbvia. E escolher a abordagem certa pode fazer uma enorme diferença na pontuação. +1 :)
DJMcMayhem

11
Depois de pensar nisso, lembrei-me de um desafio semelhante, porém mais simplista, no golfe da anarquia: sim ! Isso deu algumas respostas surpreendentes em C. Espero ver um desses em breve :)
Lynn

Eu não acho que minha resposta C se qualifique como tal, mas espero que seja um ponto de partida para outros com um senso de humor mais distorcido do que eu.
Michael Dorgan

Tenho certeza de que já vi esse mesmo desafio, mas onde você deve imprimir o número real. Estou quase certo de que também foi postado por você, Lynn; mas eu perdi o link, me ligou com ele?
Magic Octopus Urn

3
@ MichaelDorgan (ou qualquer outro codificador C), você pode dar uma olhada no algoritmo que usei na minha resposta Befunge. Uma conversão direta disso em C me deu uma solução de 104 bytes, que eu acho que supera todas as respostas C existentes. Estou disposto a apostar que isso poderia ser melhorado por alguém com mais habilidades de golfe em C.
James Holderness

Respostas:



17

C (gcc) , 89 80 76 75 72 71 70 69 bytes

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

Experimente online!

(89) Crédito ao gastropner pelo hash XOR.
(76) Agradecemos a Toby Speight pela idéia de usar o 1º e o 3º.
(75) Crédito para Michael Dorgan por '0'48.
(72) Agradecemos a Michael Dorgan e Lynn por literais com caracteres de controle.
(69) Crédito para Lynn por 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 bytes

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

Experimente online!

-3 graças a Lynn .
-4 graças a Uriel 's resposta regex' s.


3
Agradável! import re;re.compile('…').findalldeve salvar alguns bytes. Eu não esperava isso para se transformar em golfe regex :)
Lynn

@ Lynn Espere, espere até que eu termine! :-P EDIT: Na verdade, são 3 bytes.
Erik the Outgolfer

@ Lynn Além disso, você deveria ter transformado isso em expressão regular de código-golfe . ;)
Erik the Outgolfer

Estou esperando uma resposta em C, o que será muito interessante!
Lynn

9

Befunge, 87 85 81 76 bytes

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

Experimente online!

O Befunge não possui instruções de manipulação de strings; portanto, o que fazemos é criar um tipo de hash dos três últimos caracteres encontrados, enquanto os estamos processando.

Esse hash é essencialmente um número base 104 de três dígitos. Toda vez que um novo caractere é lido, modificamos o hash com 104 2 para se livrar do caractere mais antigo, multiplicamos por 104 para criar espaço para o novo caractere e adicionamos o valor ASCII do novo mod 27 (para garantir não transborda).

Para fins de comparação, pegamos esse valor mod 3817, escrevemos na memória (truncando-o para 8 bits), o que resulta em números menores que são mais fáceis de manusear pelo Befunge. Os hashes com os quais devemos comparar são 0, 38, 59, 64, 88, 92, 114, 117 e 123. Se corresponder a algum desses, sabemos que encontramos uma sequência de caracteres que marca o final de um número, então produzimos um espaço adicional e redefinimos o hash para zero.

Se você está se perguntando por que a base 104 ou o mod 3817, esses valores foram cuidadosamente escolhidos para que a lista de hash com a qual precisávamos comparar pudesse ser representada no menor número possível de bytes.


Honestamente, isso me parece bakemoji (ば け も じ). Uau. A descrição do algoritmo é boa e eu vou contemplá-la.
precisa

^, Lembro-me de ver o termo como mojibake (も じ ば け). Como você encontrou esses números (base 104, mod 3187), @JamesHolderness?
Zachary

@ Zacharý Eu escrevi um pequeno script Python que testava diferentes combinações de base e mod para encontrar as que produziriam os resultados corretos quando executadas com todas as entradas esperadas. Depois de saber quais combinações funcionavam, executei as saídas de hash resultantes por meio de um gerador de números Befunge para descobrir qual produzia o código mais curto.
James Holderness

6

Java (OpenJDK 8) , 55 46 43 bytes

Salvando 9 bytes graças ao Forty3 / FrownyFrog

Economizando 3 bytes graças ao Titus

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

Experimente online!

editar: Obrigado pela recepção e explicação das lambdas!


3
Olá, seja bem-vindo ao PPCG! Ótima primeira resposta, e realmente funciona. Aqui está o link do TIO. Lambdas podem ser criadas de várias maneiras. Aqui está outro TIO com algumas lambdas com comentários adicionados para que você possa ver como criá-las. (Sugiro copiá-lo para o Eclipse para que você possa ver o realce do código.) Além disso, pode ser interessante ler dicas de golfe em Java e dicas de golfe em todos os idiomas . Aproveite sua estadia! :)
Kevin Cruijssen

@KevinCruijssen thank you! Sinceramente, estou surpreso que o Java seja mais curto que o JavaScript. Normalmente, quando estou lendo desafios, o JS é muito menor.
Luca H #

JavaScript deve ser 2 bytes mais curto ( gsufixo regex em vez de All).
21417 Neil

@ Neil é mais longo aqui porque está usando em f=(s)=>vez de s->, que é 4 bytes mais curto.
Luca H

11
@LucaH - de acordo com a sugestão do FrownyFrog, você pode reduzir algumas de suas strings de duas letras para caracteres únicos: z | f | s em vez de ze | fo | fi | si | se /
Quarenta3

6

C (gcc) , 179 159 146 139 137 116 107 103 102 bytes

Edit 1: (Adicionado sugestões do Sr. Xcoder - obrigado! - Minha versão macro era do mesmo tamanho que a sua, mas eu gosto mais da sua.)

Edição 2: o indivíduo de caracteres alterado é comparado às chamadas parastrchr()

Edit 3: K & R's as declarações var (Eww!)

Edit 4: Quando uma macro não é suficiente ...

Edit 5: Refeito com o novo algoritmo sugerido acima. Agradecemos a James Holderness por essa ótima idéia!

Edit 6: Removido o set 0, pois parece ir para lá automaticamente - Técnicas de golfe com código de nível mestre usadas (vírgulas, truque printf, etc.) - obrigado gastropner !

Edit 7: Use memchr e corrigiu um bug apontado por James Holderness .

Edit 7: Use &&na verificação final para substituir ?- obrigado 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);}

Experimente online!

Não-golfista (que ainda é muito golfista honestamente ...)


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;
}

Solução grep-esqe antiga e direta:

#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(' ');}}

Versão antiga e limpa.

// 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(' ');
    }
}

Experimente online!


Podemos macro o putchar e tal por alguns bytes, mas em geral, ainda pensando em um algoritmo melhor, se possível.
Michael Dorgan

159 bytes por #defineção putchare remoção de um par de suportes desnecessários.
Mr. Xcoder

2
Um pouco feio, mas usando 136 bytes#define p putchar( (observe o parêntese aberto).
Tom Carpenter

11
109 bytesc,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 21/11

Ah, o truque de impressão que vi abaixo, além da remoção de dois parênteses e chaves. Código de nível de mestre habilitado para :)
Michael Dorgan

5

JavaScript, 66 57 52 44 41 bytes

s=>s.replace(/one|t[wh]|.i|[fsz]/g," $&")

Muito ingênuo, mas funciona.

Boa captura pelo FrownyFrog para usar 2 caracteres .. exceto "one", em que uma verificação pura de 2 caracteres pode atrapalhar a zeronina. Edit: o single fe sforam boas capturas por FrownyFrog que eu negligenciei meus dois primeiros golfe.

Obrigado, Neil, pela sugestão de uma lambda sem nome e por poder usar um único caractere para zdescer para 52.

Titus vem com um RegEx menor. Sinto que estamos indo em direção à regex de Uriel eventualmente.


Ele quebra se você usar dois caracteres e pressionar 'até' até o fim?
FrownyFrog

Estou pensando emz|tw|th|f|s|ei|ni|on
FrownyFrog

11
O @FrownyFrog o vem primeiro, por isso é reconhecido primeiro.
Uriel

11
on|t[wh]|.i|[fsz](-4 bytes)
Titus

2
@Titus - Infelizmente, o on|jogo vai zeroninerenderzer onine
Forty3


5

C, 103 99 bytes

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

Isso funciona para qualquer codificação de caracteres (incluindo caracteres estranhos como EBCDIC), porque não usa o valor numérico dos caracteres de entrada. Em vez disso, localiza a primeira e a terceira letras em uma sequência mágica. A distância entre eles indica quantas letras devem avançar com cada impressão.

Programa de teste

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

11
Alguns bytes podem ser salvos usando a recursão: tio.run/##XY/…
jxh

4

J , 37 35 bytes

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

Experimente online!


2
Solução alternativa legal! Eu tentei f=:[:>'..[eox]|[tse]?....'&rxalle funcionou no intérprete, mas não funciona no TIO.
Galen Ivanov

isso é realmente inteligente, muito bem feito
Jonah

@GalenIvanov TIO tem a versão mais recente, que poderia ser uma regressão no J.
FrownyFrog




3

Pip , 27 bytes

aR`[zfs]|one|[ent][iwh]`s._

Recebe entrada como um argumento de linha de comando. Experimente online!

Substituição simples de regex, insere um espaço antes de cada correspondência de [zfs]|one|[ent][iwh].


Pulando na onda de roubar empréstimos, a expressão regular de Uriel fornece 23 bytes (com -ssinalizador):

a@`..[eox]|[tse]?....`


3

Geléia ,  23  21 bytes

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

Um programa completo imprimindo saída separada por alimentação de linha. Nota: uma vez feito, ele imprime repetidamente linhas vazias "para sempre" (até um enorme limite de recursão ou uma falha seg)

Experimente online! (A saída TIO é acumulada, uma implementação local imprimirá linha por linha)

Quão?

Começando com uma lista de caracteres, o programa repetidamente:

  1. encontra o comprimento da primeira palavra da lista de caracteres usando alguma matemática ordinal;
  2. imprime a palavra mais um avanço de linha; e
  3. remove a palavra do cabeçalho da lista de caracteres

O comprimento da primeira palavra é decidido pela inspeção dos três primeiros caracteres da lista atual de caracteres (necessariamente parte da primeira palavra). O programa os converte em ordinais, multiplica-os, modula o resultado em 953, modula em sete, modula em três e adiciona três:

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.

11
Não tenho certeza se isso é permitido . (Sério, o que você faz quando dois muito upvoted meta-respostas dizem o oposto um do outro?)
Ørjan Johansen

O OP declara explicitamente "Sua saída também pode ter opcionalmente essas seqüências no início ou no final" e esse programa é impresso à medida que é executado, portanto a saída é produzida antes de qualquer terminação forçada.
Jonathan Allan

Claro, mas não acho que o OP considere uma sequência final infinita. E a meta-pergunta é explicitamente sobre o caso em que a saída é impressa primeiro.
Ørjan Johansen

Eu acho que ele cumpre o espírito da exigência (se, por exemplo, impressos cadeias vazias infinitas e , em seguida, as palavras que eu poderia argumentar que não fez)
Jonathan Allan

Então, eu acho que me coloca em campo de "se é um programa e pode justificar ..." :) de Martin
Jonathan Allan

3

C 168 ,145,144, 141 bytes

EDIT: Tentei init 'i' para 1 como assim

a, b; principal (i)

Para se livrar do espaço em branco à esquerda,
mas ele interrompe a entrada começando com três, sete ou oito

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;}

Experimente 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;}

Experimente 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;}

Experimente online!

Ungolfed

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
}

As constantes int tornam-se desnecessárias em grandes deslocando um << 8,
mas no caso de você poder comparar com as strings de alguma forma, deve ser a mais natural

146 Usando comparação de strings

#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;}

Usando comparação de String

Ofuscado

#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

Bastante longo. Você é bem-vindo a jogar golfe.

R , 109 bytes

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)}

Experimente online!


Alguma maneira de usar caracteres unicode em vez de dígitos?
precisa

Boa aplicação de intToUtf8! 90 bytes seria possível utilizando uma abordagem diferente usando expreg:function(x,p=paste,z=p("(",p(c("zero",broman::numbers),collapse="|"),")"))gsub(z,"\\1 ",x)
Michael M

2

Haskell , 81 bytes

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

Experimente online!

Explicação:

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 (sem regex) , 85 bytes

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

Experimente online!


2
Bem-vindo ao PPCG!
Laikoni 23/11

É bom, mas um programa completo deve incluir o código para receber entrada.
Jonathan Allan

Então, como um programa completo 104 bytes . No entanto, você pode salvar 4 usando while s[i:]e, em seguida, pode reduzi-lo a 93 bytes enviando um recursivo lambda(as funções precisam apenas retornar a saída em vez de imprimi-las).
Jonathan Allan

2

Excel, 181 bytes

=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")

Coloca um espaço em frente: z, on, tw, th, f, s, ei,ni


2

Montagem Z80, 46 45 bytes

; 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

(Foi divertido adaptar o regex legal do Uriel a um ambiente hostil ao regex).


1

Geléia , 40 39 bytes

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

Experimente online!

Como funciona

“¢¤Ƙƒ⁺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 , sem regex,  83 68 65  63 bytes

-15 graças a Lynn (refatorar em uma única função)
-3 mais graças a Lynn (evite indexar em uma lista com mais aritmética)
... levando a outro salvamento de 2 bytes (evitando parênteses com módulos negativos) :)

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

Uma função que imprime as palavras separadas por novas linhas e depois gera um IndexError.

Experimente online! (suprime as exceções para permitir várias execuções no conjunto de testes)


Estou revisitando este muito mais tarde e perceber isso poderia ser 68 bytes:def f(s):h=[4,5,3][ord(s[0])*ord(s[1])%83%7%3];print(s[:h]);f(s[h:])
Lynn

Oh uau, h(s)e h(s)como eu não percebi ?! Obrigado Lynn!
Jonathan Allan

Não tenho certeza de como continuo voltando a esta pergunta e percebendo coisas novas, mas tenho h=(ord(s[0])*ord(s[1])%83%7+1)%3+365 bytes! :)
Lynn

Heh, obrigado Lynn, que permitiu que mais dois bytes fossem jogados fora também!
Jonathan Allan

0

Gelatina , 36 bytes

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

Experimente online!

Algoritmo:

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

Aposto que podemos fazer ainda melhor.


0

Mathematica, 125 bytes

(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]])&


Experimente online!

O TIO envia uma mensagem de erro sobre "CountryData" (???)
Não sei por que isso acontece, mas tudo funciona bem no Mathematica



0

q / kdb +, 59 51 bytes

Solução:

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

Exemplo:

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"

Explicação:

Solução rápida, provavelmente melhores e mais abordagens de golfe.

{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

Notas:

46 bytes com alguns jogos simples, substituindo q chamadas por k ones, mas ainda assim uma solução robusta.

asc[(,/)x ss/:($)`z`one`tw`th`f`s`ei`ni]cut x:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.