# Cardeais e ordinais, 1 a 100

28

Aqui está um simples para esticar seus músculos de compressão. Seu código (um programa completo) deve gerar a representação em inglês de todos os números cardinais de 1 a 100 e, em seguida, todos os números ordinais de 1 a 100. Os números em cada lista devem ser delimitados por vírgulas e espaços e adequadamente hifenizado. Cada lista deve começar com uma única letra maiúscula e concluir com um período. As duas listas devem ser separadas por uma nova linha.

Por uma questão de clareza, você deve produzir este fluxo de bytes exato:

``````One, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two, thirty-three, thirty-four, thirty-five, thirty-six, thirty-seven, thirty-eight, thirty-nine, forty, forty-one, forty-two, forty-three, forty-four, forty-five, forty-six, forty-seven, forty-eight, forty-nine, fifty, fifty-one, fifty-two, fifty-three, fifty-four, fifty-five, fifty-six, fifty-seven, fifty-eight, fifty-nine, sixty, sixty-one, sixty-two, sixty-three, sixty-four, sixty-five, sixty-six, sixty-seven, sixty-eight, sixty-nine, seventy, seventy-one, seventy-two, seventy-three, seventy-four, seventy-five, seventy-six, seventy-seven, seventy-eight, seventy-nine, eighty, eighty-one, eighty-two, eighty-three, eighty-four, eighty-five, eighty-six, eighty-seven, eighty-eight, eighty-nine, ninety, ninety-one, ninety-two, ninety-three, ninety-four, ninety-five, ninety-six, ninety-seven, ninety-eight, ninety-nine, one hundred.
First, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth, seventeenth, eighteenth, nineteenth, twentieth, twenty-first, twenty-second, twenty-third, twenty-fourth, twenty-fifth, twenty-sixth, twenty-seventh, twenty-eighth, twenty-ninth, thirtieth, thirty-first, thirty-second, thirty-third, thirty-fourth, thirty-fifth, thirty-sixth, thirty-seventh, thirty-eighth, thirty-ninth, fortieth, forty-first, forty-second, forty-third, forty-fourth, forty-fifth, forty-sixth, forty-seventh, forty-eighth, forty-ninth, fiftieth, fifty-first, fifty-second, fifty-third, fifty-fourth, fifty-fifth, fifty-sixth, fifty-seventh, fifty-eighth, fifty-ninth, sixtieth, sixty-first, sixty-second, sixty-third, sixty-fourth, sixty-fifth, sixty-sixth, sixty-seventh, sixty-eighth, sixty-ninth, seventieth, seventy-first, seventy-second, seventy-third, seventy-fourth, seventy-fifth, seventy-sixth, seventy-seventh, seventy-eighth, seventy-ninth, eightieth, eighty-first, eighty-second, eighty-third, eighty-fourth, eighty-fifth, eighty-sixth, eighty-seventh, eighty-eighth, eighty-ninth, ninetieth, ninety-first, ninety-second, ninety-third, ninety-fourth, ninety-fifth, ninety-sixth, ninety-seventh, ninety-eighth, ninety-ninth, one hundredth.
``````

Este é o código de golfe, a resposta mais curta em bytes ganha.

Respostas:

28

# Lisp comum, 8882 80 bytes

``````(format t"~@(~{~R~^, ~}~).
~:*~@(~{~:R~^, ~}~)."(loop as i to 99 collect(1+ i)))
``````

(Faz parte da linguagem, espero que você não se importe)

### Saída

``````One, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two, thirty-three, thirty-four, thirty-five, thirty-six, thirty-seven, thirty-eight, thirty-nine, forty, forty-one, forty-two, forty-three, forty-four, forty-five, forty-six, forty-seven, forty-eight, forty-nine, fifty, fifty-one, fifty-two, fifty-three, fifty-four, fifty-five, fifty-six, fifty-seven, fifty-eight, fifty-nine, sixty, sixty-one, sixty-two, sixty-three, sixty-four, sixty-five, sixty-six, sixty-seven, sixty-eight, sixty-nine, seventy, seventy-one, seventy-two, seventy-three, seventy-four, seventy-five, seventy-six, seventy-seven, seventy-eight, seventy-nine, eighty, eighty-one, eighty-two, eighty-three, eighty-four, eighty-five, eighty-six, eighty-seven, eighty-eight, eighty-nine, ninety, ninety-one, ninety-two, ninety-three, ninety-four, ninety-five, ninety-six, ninety-seven, ninety-eight, ninety-nine, one hundred.
First, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth, seventeenth, eighteenth, nineteenth, twentieth, twenty-first, twenty-second, twenty-third, twenty-fourth, twenty-fifth, twenty-sixth, twenty-seventh, twenty-eighth, twenty-ninth, thirtieth, thirty-first, thirty-second, thirty-third, thirty-fourth, thirty-fifth, thirty-sixth, thirty-seventh, thirty-eighth, thirty-ninth, fortieth, forty-first, forty-second, forty-third, forty-fourth, forty-fifth, forty-sixth, forty-seventh, forty-eighth, forty-ninth, fiftieth, fifty-first, fifty-second, fifty-third, fifty-fourth, fifty-fifth, fifty-sixth, fifty-seventh, fifty-eighth, fifty-ninth, sixtieth, sixty-first, sixty-second, sixty-third, sixty-fourth, sixty-fifth, sixty-sixth, sixty-seventh, sixty-eighth, sixty-ninth, seventieth, seventy-first, seventy-second, seventy-third, seventy-fourth, seventy-fifth, seventy-sixth, seventy-seventh, seventy-eighth, seventy-ninth, eightieth, eighty-first, eighty-second, eighty-third, eighty-fourth, eighty-fifth, eighty-sixth, eighty-seventh, eighty-eighth, eighty-ninth, ninetieth, ninety-first, ninety-second, ninety-third, ninety-fourth, ninety-fifth, ninety-sixth, ninety-seventh, ninety-eighth, ninety-ninth, one hundredth.
``````

### Explicações

• `(format t "<control string>" <arguments>)`formata a cadeia de controle de acordo com os argumentos (variadic) e imprime na saída padrão (porque `t`)

• `(loop ...)` constrói a lista de números inteiros de 1 a 100

• `~@( ... ~)` coloca em maiúscula a string retornada pela string de controle interno
• `~{ ... ~}` itera sobre o argumento atual e aplica a formatação interna a cada elemento
• Dentro da iteração, tudo o que se segue não`~^` é impresso na última iteração: é usado para adicionar o separador de espaço de vírgula entre os elementos.
• `~R` gera o argumento atual como um cardeal
• `~:R` gera o argumento atual como um ordinal
• `~%` gera uma nova linha
• `~:*`redefina o argumento atual a ser processado como o anterior, que é usado aqui para reutilizar a lista de números inteiros pela segunda vez.

Economizou 2 bytes graças a PrzemysławP.

1
E eu pensei que a minha resposta 340-byte foi impressionante ...
kirbyfan64sos

3
Seu representante neste momento é bonito 1337! : D Então, infelizmente, não posso aprovar esta solução ... :(
Numeri diz Reinstate Monica

2
@Numeri Você pode votar agora. ;)
DLosc 5/09/15

1
Soluções em curto que a complexidade kolomogorov da entrada são sempre muito impressionantes! Bem feito.
Isaacg

1
@DLosc Foi muito bom para eu quebrar ...: D
Numeri diz Reinstate Monica

9

# Pyth, 366 342 340 bytes

``````Lcbdj=Y", "++rhJy"one two three four five six seven eight nine"3+tJ+y"ten eleven twelve"+=Nm+d"teen"=by"thir four fif six seven eigh nine"sm+dm++d\-kJKy"twenty thirty forty fifty sixty seventy eighty ninety"+=H"one hundred"\.jY+rh=J++y"first second third"m+d=T"th"tPby"ninth"3+++tJy"tenth eleventh twelfth"+m+dTNsm++Pd"ieth"m++d\-kJK+H"th."
``````

Demonstração ao vivo.

## Versão de 342 bytes:

``````Lcbdj", "++rhJy"one two three four five six seven eight nine"3+tJ+y"ten eleven twelve"+=Nm+d"teen"=by"thir four fif six seven eigh nine"sm+dm++d\-kJKy"twenty thirty forty fifty sixty seventy eighty ninety"+=H"one hundred"\.j", "+rh=J++y"first second third"m+d"th"tPby"ninth"3+++tJy"tenth eleventh twelfth"+m+d"th"Nsm++Pd"ieth"m++d\-kJK+H"th."
``````

## Versão de 366 bytes:

``````Lcbd
j", "++"One"+tJy"one two three four five six seven eight nine"+y"ten eleven twelve"+=Nm+d"teen"y"thir four fif six seven eigh nine"sm+dm++d\-kJKy"twenty thirty forty fifty sixty seventy eighty ninety"+=H"one hundred"\.
j", "+"First"+++t=Jy"first second third fourth fifth sixth seventh eighth ninth"y"tenth eleventh twelfth"+m+d"th"Nsm++Pd"ieth"m++d\-kJK+H"th."
``````

6

# PHP - 491 bytes

Pequena fraude aqui para os cardeais (estou usando a classe NumberFormatter que vem como padrão no PHP):

``````echo'One, ';\$x=new NumberFormatter(0,5);for(\$i=1;\$i++<100;)echo\$x->format(\$i).(\$i>99?
'.':', ');echo"
";\$y=[First,second,third,fourth,fifth,sixth,seventh,eighth,ninth,tenth,
eleventh,twelfth,thirteenth,fourteenth,fifteenth,sixteenth,seventeenth,eighteenth,nineteenth,
twentieth];for(\$z=[thirtieth,fortieth,fiftieth,sixtieth,seventieth,eightieth,ninetieth];
\$j++<99;\$q=floor(\$j/10),\$w=\$z[\$q-2])echo\$j<21?\$y[\$j-1]:(\$j%10?\$x->format(\$q*10).'-'.
strtolower(\$y[\$j%10-1]):\$w),', ';echo'one hundredth.';
``````

2
Geralmente, são permitidos avisos, remova todos os `@`(-4 bytes). Use uma nova linha em vez de escrever `\n`(-1 byte). Coloque a definição de `\$z`na inicialização do segundo `for`loop (-1 byte).
Blackhole

Guardar 6 bytes, utilizando o método de procedimento, em vez do construtor orientada a objectos
rink.attendant.6

6

## PHP 5.3 ou superior, 195 bytes

Isso inclui o caractere de nova linha.

Faz parte da `NumberFormatter`aula, assim como a resposta de razvan . Exceto que eu explico os cardeais e ordinais de acordo com a UTI.

``````\$f=numfmt_create(en,5);\$g=clone\$f;\$g->setTextAttribute(6,'%spellout-ordinal');for(\$x=\$y='',\$i=1;\$i++<100;){\$x.=\$f->format(\$i).(\$z=\$i<=99?', ':'');\$y.=\$g->format(\$i).\$z;}echo"One, \$x.
First, \$y.";``````

Agradável! Eu não tinha ideia do formato% spellout-ordinal.
Razvan

4

# Bytes 231 do Oracle SQL

SqlFiddleLiveDemo

`````` SELECT 'O'||SUBSTR(LISTAGG(TO_CHAR(TO_DATE(level,'j'),'jsp'),', ')WITHIN GROUP(ORDER BY level),2)||'.','F'||SUBSTR(LISTAGG(TO_CHAR(TO_DATE(level,'j'),'jTHSP'),', ')WITHIN GROUP(ORDER BY level),2)||'.' FROM DUAL CONNECT BY level<101
``````

3

# JavaScript ES6, 562 464 bytes

Ainda nem terminou o golfe!

``````n=>(f=(a,b)=>Array(89).fill(a=btoa(a+`·§·,í*íË7èº»rÍø·,ìrÎÇ¯z{rÍè Ü³)Þ·,ó`).split`z`).map((l,i)=>i<1?b:i<20?a[i]:a[18+(i-i%10)/10]+'-'+a[i%10]).join`, `+', one hundred')(`¢w³·
3¶Þ{7èº¼ß÷³²,s±ëÞ7¢s)ÞÎ×§Íé^½éó·¥½ìí*íyéó~«µç§Íøµç§ÎÈ±µç§ÎÇ¯z{^z|Þmyéó)Þµç§ÎÜÜ³¶«·,ß¢êíË7â~Ü³²,mË;½éíË7¢rÎx§µì³`,'One')+`
`+f(`~*ì·;rÝÎØb­Üß¢êí7â~Øs²,m;½éí7¢Øs)Þ¶íz{aÍé^½éí;pz[Þ¶í*íyéí7èº»^z{aÍøµç§¶ì^z{aÎÇ¯z{^z{aÍè ×Øs)Þµç§¶ó`,'First')+'th'
``````

Se isso não funcionar, talvez seja necessário adicionar um hexdump por causa de todos os caracteres especiais. Informe-me se for esse o caso e chegarei até você amanhã.

Se houver algum erro de digitação também me avise.

Código em pastebin (testado no Safari Nightly)

# Explicação

Pode parecer um monte de personagens ilegíveis, mas na verdade é bem simples.

Começamos gerando os cardeais. Essa matriz é compactada usando a `btoa`função

``````['one', ..., 'eighteen', 'nineteen', 'twenty', 'thirty', ...,'ninety']
``````

Para percorrer um "intervalo", usamos o seguinte:

Agora, geramos uma matriz de comprimento 89 usando. O `...`é o que descompacta a matriz

``````Array(89).fill(...)
``````

Então mapeie através dele, i é o índice:

``````.map((l,i)=>
``````

Agora, para a condição, `i < 1`ou se for o primeiro item, usaremos uma versão em maiúscula de um / primeiro

``````i<1?b
``````

Caso contrário ... se for inferior a 20, produzimos onze ... dezenove

``````i<20?a[i]:
``````

Caso contrário ... usando `(i-i%10)/10`, obtemos o último dígito do número. Adicionamos 18 a ele para compensar 1..19. Nós adicionamos um `-`e depois adicionamos o último dígito, ou i% 10

Finalmente, adicionamos 'cem' até o fim, porque não o fazemos.

Repetimos isso para os dois tipos de números e separamos com uma nova linha

Tentei com o FireFox: o código postado é defeituoso. O código em pastebin está ok, mas perde um período após o primeiro `hundred`. Geral: ótimo trabalho | +1
edc65

O que há com os caracteres especiais?
luminoso

3

# C ++ 704 642 620 602

Sem o uso de biblioteca diferente `ostream` `operator<<()`para `char*`s.

``````#include<iostream>
char*q,a[]="|one|two|three|four|five|six|seven|eight|ni&u\$Il%*twel&bthirte\$Q(P#tif#j)/#k'L#|)y#r*4#s'9rst&>cond*5d)zh)gh)U#V)Ch)2h(}#V09\$m0M\$I0]'g0k)B0|*I#}1A+4\$01f+y1u\$\$|+/nty+(y*`#X*3y)p#V)Ly))y(dyC5~hundred)Oie1o#|1c#}*E#s*a#t*}\$&+9#|+T#|+uth",b[448],*s=a,*t=b;int i,j,k;auto p(int k){for(s=b;k--;)while(*s++);return s;}int main(){for(;k=*s++;)if(k>98)*t++=k<'|'?k:" "[k<'~'];else for(i=(k-35)*95+*s++-32,q=t-i/9,k=3+i%9;k--;)*t++=*q++;for(j=0;j<2;++j)for(i=1;b[1+126*j]^=32*(i<3),k=i<20?i:i%10,i<101;++i)std::cout<<p(40+!k*j*11+i/10)<<"-"[!k|i<20]<<p(j*20+k)<<", \0.\n"+i/100*3;}``````

Com algum espaço em branco e alguns comentários:

``````#include <iostream>

// Encoded as literal characters or offset/length pairs for previous runs of characters, LZ like
char *q, a[] =
"|one|two|three|four|five|six|seven|eight|ni&u\$Il%*twel&bthirte\$Q(P#tif#j)/"
"#k'L#|)y#r*4#s'9rst&>cond*5d)zh)gh)U#V)Ch)2h(}#V09\$m0M\$I0]'g0k)B0|*I#}1A+4\$01f+y1u\$\$|"
"+/nty+(y*`#X*3y)p#V)Ly))y(dyC5~hundred)Oie1o#|1c#}*E#s*a#t*}\$&+9#|+T#|+uth",
b[448], *s = a, *t = b;

int i, j, k;

// Find the kth null separated string in array b
auto p(int k) {
for (s = b; k--;)
while (*s++)
;
return s;
}

int main() {
// Decode the compressed 'primitives' we use to build up the output.
for (; k = *s++;)
if (k > 98)
*t++ = k < '|' ? k : " "[k < '~'];
else
for (i = (k - 35) * 95 + *s++ - 32, q = t - i / 9, k = 3 + i % 9; k--;) *t++ = *q++;

// Loop twice over numbers 1-100, building up output from the 'primitives' in our array
for (j = 0; j < 2; ++j)
for (i = 1; b[1 + 126 * j] ^= 32 * (i < 3), k = i < 20 ? i : i % 10, i < 101; ++i)
std::cout << p(40 + !k * j * 11 + i / 10) << "-"[!k | i < 20] << p(j * 20 + k)
<< ", \0.\n" + i / 100 * 3;
}``````

A cadeia compactada é decodificada de `a`para `b`:

``````|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|
sixteen|seventeen|eighteen|nineteen||first|second|third|fourth|fifth|sixth|seventh|eighth|
ninth|tenth|eleventh|twelfth|thirteenth|fourteenth|fifteenth|sixteenth|seventeenth|
eighteenth|nineteenth|||twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety|one~
hundred|||twentieth|thirtieth|fourtieth|fiftieth|sixtieth|seventieth|eightieth|
ninetieth|one~hundredth;
``````

Sem as novas linhas. Durante a descompressão, `|`s são substituídos por `'\0'`e `~`s são substituídos por `' '`(peculiaridade da maneira como os caracteres são codificados em ASCII imprimível). Essas seqüências 'primitivas' são pesquisadas pelo índice na `b`matriz usando a `p`função e usadas para montar a saída.

A compactação é um esquema simples do tipo LZ, onde os caracteres são codificados como literais ou como um deslocamento negativo no buffer e um comprimento de execução (codificado em dois caracteres) se uma correspondência de comprimento> = 3 for encontrada. A string pode ser compactada ainda mais usando caracteres não imprimíveis, mas eu gosto que meu código seja copiado e colado com segurança :)

1

# Javascript (ES6), 713

Semelhante ao meu segundo envio de PHP sobre esta questão . (2444 - 713) / 2444 = compressão de 70,8%.

``````a=`Onez]cu^dP~Ntenz\`zHlvezmwgwjwkw{wqwpwHnQxZx]xcxux^xdxPx~xNmQXZX]XcXuX^XdXPX~XNforQbZb]bcbub^bdbPb~bNjQWZW]WcWuW^WdWPW~WNkQVZV]VcVuV^VdVPV~VN{QUZU]UcUuU^UdUPU~UNqQTZT]TcTuT^TdTPT~TNpQSZS]ScSuS^SdSPS~SNy.
``````

Violino

DankMemes

1

# Mathematica 415 391 407

Os cardeais são dados por `IntegerName[n]`. Os ordinais são derivados dos cardeais.

``````s = StringRiffle; y = IntegerName; t = StringReplace;
k@n_ := If[(z = (TextWords["first second third a fifth a a a ninth,a, a twelfth a a a a a eighteenth a, twentieth"])[[n]]) == "a", y@n <> "th", z]
g@n_ := Module[{i = IntegerDigits[n], z}, z := y[Quotient[n, 10]*10];Which[n == 100, "one hundredth", n < 20, k[n], i[[-1]] == 0, t[z, "y" -> "ieth"], 3 > 2, z <> "-" <> k[i[[-1]]]]]
t[(s[y@Range@100 /. "one" -> "One", ", "] <> ".") <> s[g /@ Range@100 /. "first" -> "\nFirst", ", "] <> ".", "tt" -> "t"]
``````

Saída:

``````One, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two, thirty-three, thirty-four, thirty-five, thirty-six, thirty-seven, thirty-eight, thirty-nine, forty, forty-one, forty-two, forty-three, forty-four, forty-five, forty-six, forty-seven, forty-eight, forty-nine, fifty, fifty-one, fifty-two, fifty-three, fifty-four, fifty-five, fifty-six, fifty-seven, fifty-eight, fifty-nine, sixty, sixty-one, sixty-two, sixty-three, sixty-four, sixty-five, sixty-six, sixty-seven, sixty-eight, sixty-nine, seventy, seventy-one, seventy-two, seventy-three, seventy-four, seventy-five, seventy-six, seventy-seven, seventy-eight, seventy-nine, eighty, eighty-one, eighty-two, eighty-three, eighty-four, eighty-five, eighty-six, eighty-seven, eighty-eight, eighty-nine, ninety, ninety-one, ninety-two, ninety-three, ninety-four, ninety-five, ninety-six, ninety-seven, ninety-eight, ninety-nine, one hundred.
First, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth, thirteenth, fourteenth, fifteenth, sixteenth, seventeenth, eighteenth, nineteenth, twentieth, twenty-first, twenty-second, twenty-third, twenty-fourth, twenty-fifth, twenty-sixth, twenty-seventh, twenty-eighth, twenty-ninth, thirtieth, thirty-first, thirty-second, thirty-third, thirty-fourth, thirty-fifth, thirty-sixth, thirty-seventh, thirty-eighth, thirty-ninth, fortieth, forty-first, forty-second, forty-third, forty-fourth, forty-fifth, forty-sixth, forty-seventh, forty-eighth, forty-ninth, fiftieth, fifty-first, fifty-second, fifty-third, fifty-fourth, fifty-fifth, fifty-sixth, fifty-seventh, fifty-eighth, fifty-ninth, sixtieth, sixty-first, sixty-second, sixty-third, sixty-fourth, sixty-fifth, sixty-sixth, sixty-seventh, sixty-eighth, sixty-ninth, seventieth, seventy-first, seventy-second, seventy-third, seventy-fourth, seventy-fifth, seventy-sixth, seventy-seventh, seventy-eighth, seventy-ninth, eightieth, eighty-first, eighty-second, eighty-third, eighty-fourth, eighty-fifth, eighty-sixth, eighty-seventh, eighty-eighth, eighty-ninth, ninetieth, ninety-first, ninety-second, ninety-third, ninety-fourth, ninety-fifth, ninety-sixth, ninety-seventh, ninety-eighth, ninety-ninth, one hundredth.
``````

1
Alguns incorretos #`eightth`
Mario Trucco

Você estava certo! Agora eu os corrigi.
DavidC

Você poderia mudar `"first" -> "\nFirst"`para `"fir" -> "\nFir"`salvar 4 bytes.
LegionMammal978

@ LegionMamal978, Boa sugestão, mas não funcionará porque estamos substituindo elementos (palavras) em uma lista: "first" é um elemento da lista, mas "fir" não é. Se tentarmos implementar sua sugestão depois que a lista de elementos for `StringJoin`editada, "vigésimo primeiro ... trigésimo primeiro ..." se tornará "vigésimo primeiro ... trigésimo primeiro ...".
DavidC

1

# JavaScript (ES6), 480

``````/*TEST: redirect console output to snippet body */ console.log=x=>O.innerHTML=x

// Not a function, as a complete program is requested
b=x=>btoa(x).split`/`;
Z=i=>z[i]||z[i-8]||z[i-18];
y=b("ýø«²ßìyÊ'wûa·ýøÿÿÞ)ÿÿûpzWÿÿÿÿÿÿÿ");
z=b("þÞþÜ(þØkyïß¢êÿ~+ÞþÈ±þÇ¯zÞmþx§{û^÷¥z÷§þÜ÷¿¶«ÿ÷âÿÿz(!ÿûpzÿ~ÿÿÿÿ");
o=(z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z[S='slice'](0,10).map(d=>Z(i)+(d?'ty-'+d:'ty')))+`,\${h='one hundred'}.\nF`).split`,`;
q=y.map((v,i)=>i<4?v:`\${v||o[i]}th`);
q=z.map((v,i)=>i<20?' '+q[i]:q[S](0,10).map(d=>' '+Z(i)+(d?'ty-'+d:'tieth')));
console.log('O'+o.join`, `[S](3)+`\${q}, \${h}th.`[S](4))

// INFO: z uncompressed is [,one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,,fif,,,eigh,,twen,,for,,,,,]
// INCO: y uncompressed is [,first,second,third,,fif,,,eigh,nin,,,twelf,,,,,,,,,]``````
``#O { white-space: pre-wrap }``
``<pre id=O></pre>``

0

# PHP - 842 bytes

Omitindo tags iniciais e finais regulares do PHP, a compactação é de 1 - 842/2445 = 65,6%

Basicamente, obtendo a saída `base64_encode(gzdeflate(\$input, 9));`e revertendo as operações. Obviamente, se eu optar pela saída em 8 bits puros vs. 64 base, seria 25% menor, mas correndo o risco de encontrar caracteres de escape ou não imprimíveis.

``````echo gzinflate(base64_decode('VZRdcuIwEITfcwoOQHKMfd1DBGnlKspUEYfEt1+rf2bGL6gbkLplS9/ftV0v28/j+BjPduj++H4en8vr0F/L7/HRXm29Xtryb2zXy7pgAr6585ftp93nv7exPLc2v5lrSC2d4lhKYk6ixJJQc1WqY7F12z2+P1gPmi2lWVaOnW1QXQY7sI6602k/ctrW3MHuUeHUekTUCqdTuMzyyl8YLq1wOofTMbw/kI2B0ZRIlvQrylxpxFIjVZKhNMqkUeTxdnYNioRkJKUiYXw2ekZCM5JSkTCOhGHkPAe7BkZSIlKSkTSMlPahdKQkI2kUSaNInLg9hGJlGGyjaFmF2zFeLu9GqSDrErKsgS93jywhjQ7WrCDHBjYoIIN863JFI12O4bhgu0eGSyPcmuFyDLdBuAzCrRkuVzAR4UfaZXyvt2e7fbz9WZ5feDafj/XGK3ATMQaPyuDrG36AQ3sZWHYOm769+/eJIEw0g7CWKOR1JUWiXL+VDGnzSGuv29JCzkeBLQRWtBOTCRsqZDrN7MVplxVPxXvPSajYoNoYOWxjzuRzLW0SVaeZvTi3KbwqPtoEsviIXcYcQhfTh1XMLr3oWsSzehrVKABL6xLBML9adRCY2EE4UgfBjB0CZnVWT+MOSbS00cFQ85liB5OKh1x8YgfTDR2SbnVWT+MrkIhL6w5BuTzMahHI0mV7nY5q4o5dCu7Os3u1p0tZO1XqjRP24l6xVnAMrQJeLBX8Q6fCv9PMXpwKVQgW7zrJwbjZbBNgQ5ugGdsEENGmAPE0sxenNpWKxReCtWxTyLiNj7f/'));
``````
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.