O texto do livro infantil Urso Polar, Urso Polar, O que você ouve? tem um padrão muito simples. Você pode usar o texto para ensinar conceitos de programação introdutórios.
Meu filho ficou rapidamente entediado com essa idéia, então decidi jogar golfe com ela.
O desafio
Na sua linguagem de programação preferida, escreva o menor programa possível que imprimirá o texto a seguir. A saída deve corresponder exatamente, incluindo maiúsculas e minúsculas, espaçamento e pontuação.
Polar Bear, Polar Bear, what do you hear?
I hear a lion roaring in my ear.
Lion, Lion, what do you hear?
I hear a hippopotamus snorting in my ear.
Hippopotamus, Hippopotamus, what do you hear?
I hear a flamingo fluting in my ear.
Flamingo, Flamingo, what do you hear?
I hear a zebra braying in my ear.
Zebra, Zebra, what do you hear?
I hear a boa constrictor hissing in my ear.
Boa Constrictor, Boa Constrictor, what do you hear?
I hear an elephant trumpeting in my ear.
Elephant, Elephant, what do you hear?
I hear a leopard snarling in my ear.
Leopard, Leopard, what do you hear?
I hear a peacock yelping in my ear.
Peacock, Peacock, what do you hear?
I hear a walrus bellowing in my ear.
Walrus, Walrus, what do you hear?
I hear a zookeeper whistling in my ear.
Zookeeper, Zookeeper, what do you hear?
I hear children...
...growling like a polar bear,
roaring like a lion,
snorting like a hippopotamus,
fluting like a flamingo,
braying like a zebra,
hissing like a boa constrictor,
trumpeting like an elephant,
snarling like a leopard,
yelping like a peacock,
bellowing like a walrus...
that's what I hear.
code-golf
string
kolmogorov-complexity
aaaantoína
fonte
fonte
B
e estãoC
dentroPolar Bear
e sãoBoa Constrictor
necessárias? (Em Batch isso custa-me 10% da minha contagem de bytes ...)Respostas:
05AB1E,
349331330322314311 bytesExperimente online
Explicação
•4i;kV_†©:š×Îj€Yå—‚‘%˜ESδþ¤çÑ9¶‹{Å€7¾à{Ì®qA•
Corda embalada contendo os sons
GROWL0ROAR0SNORT0FLUT0BRAY0HISS0TRUMPET0SNARL0YELP0BELLOW0WHISTL
35B0¡…ing«lV
Descompacte, divida em 0, adicione "ing" a cada palavra, converta para menor e armazene na variável Y
•7ü[¿‘¢wÀ¶à-‚¤î„jHâ™ÐJ'µ‡ÀÂý6›ü‚š¸€%NtÅýµL›fU¥ì€€uîT¡›Ÿ{!œ>'Ì&ý§¨Ü?é>•
Corda embalada contendo os animais
POLAR1BEAR0LION0HIPPOPOTAMUS0FLAMINGO0ZEBRA0BOA1CONSTRICTOR0ELEPHANT0LEOPARD0PEACOCK0WALRUS0ZOOKEEPER
36B1ð:0¡™
Descompacte, substitua 1 pelo espaço, divida em 0 e converta em maiúscula
D©„, «D‚ø
Duplique, salve para registrar-se para uso posterior, adicione "," a uma cópia, duplique e zip.
“€À€·€î—«?“¶«¸
As palavras do dicionário "o que você ouve?", Seguidas por uma nova linha, adicionada a uma nova lista
‘€JU
O produto cartesiano da lista de "Animal, Animal" e "o que você ouve? \ N", achatou e juntou-se e o armazena na variável X. Pruduz a lista de cadeias de caracteres da forma "Animal, Animal, o que você ouve? N "
¦“„¾“‚˜l
Pegue a lista restante de animais de antes, remova o tratador e adicione crianças, converta para minúsculas.
v
Para cada animal:
Pressione "Eu ouço 0 no meu ouvido.", Divida em 0 e pressione como strings separadas.
yð«Y¦õ‚˜Nè«
Pressione "som animal" com crianças sem som
sr„ a
Pressione "a" no lugar correto
N5Qi'n«}
Se o animal for "Elefante", adicione "n"
ð«
Adicione espaço.
N9›ijrj¨ðs«…...«}
Se animal for criança, remova o espaço e adicione "..."
srJˆ}
Junte-se à frase "Eu ouço um (n) som de animal no meu ouvido". (assim como os filhos), armazene na matriz global e no loop final
X¯‚ø€J
Recupere as primeiras linhas, feche e junte-se para produzir a primeira parte da rima "Animal, Animal, o que você ouve? \ NEu ouço um (n) som de animal no meu ouvido."
vy,¶?}
Imprimir seguido de nova linha.
…...DU?
Imprima "..." e armazene uma cópia na variável X.
Y¨v
Para cada som, exceto "assobio":
N__i ', ¶} Para cada linha, exceto a primeira, inicie-a com ", \ n" (fazendo com que a vírgula continue na linha anterior)
yð“€è€…“
Empurre som, espaço e "como um"
N6Qi'n«}
Se o elefante adicionar "n".
ð®NèJl?}X,
Recupere o animal salvo no registro, junte-se a tudo, imprima e finalize o loop seguido de "...". Isso produz o "som como um animal (n)", linhas.
“€Š's€À I—«.“?
Imprima a string do dicionário "é isso que eu ouço".
fonte
PHP,
420414434414412 bytesligue da CLI ou adicione-o
<pre>
à saída.demolir
fonte
JavaScript,
545541497 bytesUm desafio bastante divertido!
Obrigado Downgoat por me salvar
27toneladas de bytes usandoatob
, e Titus por 4 bytes!Ungolfed:
fonte
a.map((n,m)=>n>9||(p+=s[n]...))
c=console.log;
no início e use c () para salvar 6 bytes. Ou simplesmente salve a string em uma variável e imprima-a uma vez com alert ().c=console.log
não funciona porquelog
tem de ter umthis
dosconsole
ou ela produz um erro. (? A menos que isso não acontece em alguns navegadores / ambientes) A idéia de colocar tudo isso em um sons de cordas bom, embora/// ,
523512 bytesExperimente online!
608 bytes a menos que a mensagem real (1120), isso é menos da metade (560)!
fonte
Dyalog APL , 387 bytes
Para facilitar a leitura:
⎕UCS¯2(219⌶)¯128+⎕UCS'
...'
⎕UCS '
...'
converter string em pontos de código Unicode¯128+
subtraia 128 para obter -128 ≤ n ≤ 127¯2(219⌶)
un-zlib⎕UCS
converter pontos de código Unicode em stringA cadeia de origem são os seguintes 365 bytes de pontos de código Unicode zlib'ed:
fonte
Python 3,
497484480 bytes(O crédito por 13 bytes salvos deve ser enviado para Gábor Fekete e outros 4 bytes foram salvos por Taylor Lopez.)
Então você provavelmente poderia adivinhar que eu usaria uma linguagem como Python como ferramenta de ensino. Este foi o programa antes de eu começar a jogar.
fonte
a=A[i]
paraa,b=A[i]
e então você pode escrevera
e emb
vez dea[0]
ea[1]
. Isso economizará 12 bytes.N=lambda m:("a","an")["E"==m[0]]+" "+m.lower()
paraN=lambda m:"an"[:("E"==m[0])+1]
en=a[0]+", ";P(n+n+"what do you hear?")
paraa+=", ";P(a+a+"what do you hear?")
economizará mais 2 bytes.len(A)
, já que o objetivo desse desafio é simplesmente gerar a saída estática (não lidar com a entrada dinâmica), é aceitável usar um código11
embutido para salvar bytes?Pyth -
427384 BytesExperimente aqui - permalink
fonte
ing
s? Eu fico louco vendo o PHP vencer o Pyth.a elephant
.C #,
575525520526507504497494493 bytesC # lambda onde a saída é a
string
.Explicação
t
como uma string com o formatonoise,animal,noise,animal,...
e dividido por,
.r
es
.r
é a primeira parte da música es
a última parte.z
en
está aqui para lidarElephant
.t
e construar
es
no mesmo loop. Ternário estranho + material interpolado.Código
Experimente online!
fonte
Python 2 - 454 bytes
fonte
R
518509482477474465452456 bytesLink para o R-Fiddle para experimentar o código
children
fora do vectora
, e se livrou de entrada correspondente nod
vector para salvar 8 byteschildren
, economizou mais 27 bytes.tolower
função, salvou 5 byteswriteLines
porcat
e reformate adequadamente (adicionado\n
em locais) salvou 3 bytesd
houver apenas 7 elementos, e não o 11 completo, R apenas retornará ao início novamente. Como 11 <14, isso funciona para nós. Salvou 9 bytes.cat
A função estava se separando de" "
, alterada de volta parawriteLines
. Adicionado 4 bytes (cat
pode ser corrigido adicionando,sep=""
à função)fonte
' '
antes de cada item doa
depois"Polar Bear"
. Isso é normal?C #,
592572 bytesMe diverti muito aceitando esse desafio com meu colega! Obrigado pela ideia.
Formatado:
EDIT: Obrigado por suas inúmeras e impressionantes dicas, elas ajudaram muito e vou tentar fazer com que as outras funcionem também.
fonte
new[]
o.new string[]
Também você pode fazer isso em uma função anônima como em @ aloisdg de respostaa elephant
armadilha (eu também). Éan elephant
;)Lote,
650647 bytesPorque
%*
é a coisa mais próxima que o Lote tem de uma matriz. Se eu posso usarPolar bear
eBoa constrictor
então posso economizar 10% ... mas ainda tenho mais de 50% do texto original ...Edit: Salvo 3 bytes, definindo
e=echo(
com um(
espaço em vez de um espaço, o que me permite usá-lo para ecoar linhas em branco, embora eu precise escrever@echo off
na íntegra.fonte
Bash + zcat, 402 bytes
Apenas uma piada:
um script bash de 2 linhas que se arrasta e canaliza a segunda linha para o zcat.
A segunda linha é o texto compactado em gzip.
Como prepará-lo: todo o texto em um arquivo
a
. EntãoO arquivo criado quando executado retorna o texto inicial, 402 bytes.
fonte
tail -n+2 \$0|zcat;exit
seguido apenas por uma nova linha e uma sequência binária de 379 bytes (a versão compactada do texto proposto). Você sabia o motivo do voto negativo? (é um procedimento semi-padrão para bash auto-instalar scripts com um arquivo dentro, IMHO não é tão diferente do uso de uma biblioteca em c ++).zcat
), portanto, seu cabeçalho deve ser ( Bash + coreutils, 402 bytes ) em vez de ( Bash (com zcat) 402 ). E você pode editar sua resposta (basta anexar<!>
no final de sua postagem)? Eu quero removerzcat
não é da coreutils, vem com elagzip
. Em muitos sistemas existe um script que chamagzip -cd "$@"
... BTW eu modifiquei em Bash + zcat, 402 bytes.F #,
591589579576573567552 bytesEsta é a minha primeira tentativa no código de golfe com um idioma que eu gosto. Aposto que existem algumas maneiras de diminuir isso. É executado no FSI, portanto, não há necessidade de clichê .NET.
Editar: Raspou 10 bytes removendo
\r
. Ele ainda é bom no VSCode, então vá entender. Corte outros três bytes com a composição da função e outros três com um lambda e, em seguida, seis com um loop for em vez do Seq.iter (eliminando o lambda). Finalmente, 15 bytes foram cortados reorganizandoa(s:string)
fonte
Emacs Lisp, 576 (621) bytes
Ao consertar "um elefante", leva um pouco mais de tempo:
Ungolfed:
fonte
^[aeiou]
para^e
, não é?C, 596 bytes
Ligue
f()
sem argumentos. Este não é o melhor golfe do mundo, eu provavelmente posso diminuir mais.Experimente em ideone.
fonte
a[99][99]
->**a
(-6). Você não pode ligarf()
sem argumentos aqui, você precisa de umn
. Substituaf(n){
porf{n;
. Outro -1 aqui. Além disso,f()
agora é exigível.**a
significa uma matriz de matrizes de caracteres (ou um ponteiro de ponteiro de caractere) e, para mim, sempre funcionou (gcc 4.8). Qual compilador você usa? Se você não usa o gcc, deve especificá-lo. Se você usa o gcc, é o padrão.a[99][99]
pora[<how many elements do I modify?>+1][<what is the maximum length of any string in here?>+1]
.Python 3,
442441 bytesungolfed:
Basicamente, apenas um loop que cria duas strings representando as duas partes da história. A
'n'[:'el'in n]
lida com o "um" para elefante. As[44:-30]
costeletas "Eu ouço um urso polar rosnando no meu ouvido" e a trilha "assobiando como um tratador".fonte
QB64 (QuickBASIC), 581 bytes
O código se expande um pouco quando você o joga no intérprete, mas esse arquivo de origem é válido para carregar como está. Se você quiser ver toda a saída antes que ela passe, precisará adicionar uma
width 80,46
instrução ao início.fonte
GOSUB
/ emRETURN
vez deCALL
/SUB
/END SUB
. Além disso, você pode soltar as aspasDATA
para todas as entradas que não possuem espaços. Finalmente, como existe apenas um animal que começa com uma vogal,A$="Elephant"
na verdade é 1 byte menor queLEFT$(A$,1)="E"
. Bom uso deRESTORE
, BTW!Bytes LUA 535
ungolfed:
Experimente online
fonte
PHP, 366 bytes
Resposta preguiçosa, mas por que escrever um descompressor personalizado quando o gzip está disponível?
Despejo hexadecimal de código PHP (pode ser salvo com xxd -r )
Usei algumas iterações do zopfli para converter o texto de origem em 349 bytes de dados compactados, evitando o caractere 'que, caso contrário, precisaria ser escapado com barras invertidas.
fonte
Japt ,
308303299295288280294289286 bytesContém um monte de não imprimíveis; siga o link abaixo para visualizá-los.
Teste-o
+14 bytes porque eu enrolei a linha da morsa; precisará passar por outro passe na semana que vem para ver se consigo recuperar algum desses bytes.
fonte
Powershell
921889886898 Bytesnão é perfeito, mas economiza 300 bytes :)
Edição: Obrigado Jonathan Frech, eu salvei 32 bytes. E obrigado Veskah por corrigir a saída.
fonte
ö
ser mais eficiente em bytes?ö
é representado apenas usando um único byte em algumas páginas de código; o UTF-8 requer dois bytes para esse caractere.an elephant
Há também uma quebra de linha extra entre as estrofes anteriores que podem ser eliminadas removendo o"n"
.clojure, 526 bytes
Aqui está a minha tentativa inicial. Tem que amar a formatação e como é ilegível. Espero que os avisos
use 'clojure.string
sejam aceitáveis.Experimente online.
Código formatado:
fonte
Java,
571 555538 ou 516 bytesMas apenas 516 bytes são necessários para obter o resultado no JShell
fonte
an
vsa
.. Eu fixo e golfed-lo para 507 bytesi
com0
até10
mudarb=a[i-1]
comb=a[i++]
e remover o incremento, onde é atualmente.Swift2, 519 bytes
fonte
Haskell
537499497 bytesUsando a convenção de que uma solução não precisa ser executável, apenas produza a saída através de alguma função, isso pode ser reduzido para 479 bytes. A saída está em
g
:fonte
C (clang) , 552 bytes
Experimente online!
fonte
Perl 5 , 413 bytes
Experimente online!
fonte
JavaScript, 424 bytes
Teste-o
fonte
Pitão, 342 bytes
Experimente online aqui .
Explicação a seguir.
fonte