Introdução:
Acho que todos sabemos, e provavelmente foi traduzido em vários idiomas diferentes: a música infantil "Cabeça, Ombros, Joelhos e Dedos":
Cabeça, ombros, joelhos e dedos dos pés, joelhos e dedos dos pés
Cabeça, ombros, joelhos e dedos dos pés, joelhos e dedos dos pés
E olhos e orelhas e boca e nariz
Cabeça, ombros, joelhos e dedos dos pés, joelhos e dedos dos pés
wikipedia
Desafio:
Entrada: Um número inteiro positivo.
Saída: imprima uma das seguintes palavras com base na entrada como n-ésimo índice:
head
shoulders
knees
toes
eyes
ears
mouth
nose
Aqui, as partes do corpo são anexadas aos índices:
Head (0), shoulders (1), knees (2) and toes (3), knees (4) and toes (5)
Head (6), shoulders (7), knees (8) and toes (9), knees (10) and toes (11)
And eyes (12) and ears (13) and mouth (14) and nose (15)
Head (16), shoulders (17), knees (18) and toes (19), knees (20) and toes (21)
Head (22), shoulders (23), knees (24) and toes (25), knees (26) and toes (27)
Head (28), shoulders (29), knees (30) and toes (31), knees (32) and toes (33)
And eyes (34) and ears (35) and mouth (36) and nose (37)
Head (38), shoulders (39), knees (40) and toes (41), knees (42) and toes (43)
etc.
Regras do desafio:
- Obviamente, você pode usar entrada indexada em 1 em vez de indexada em 0. Mas especifique qual você usou na sua resposta.
- A saída não diferencia maiúsculas de minúsculas; portanto, se você quiser usá-la em maiúsculas, tudo bem.
- Você deve oferecer suporte a pelo menos 1.000.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste (indexados 0):
Input: Output:
0 head
1 shoulders
7 shoulders
13 ears
20 knees
35 ears
37 nose
98 knees
543 nose
1000 knees
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
fonte
fonte
kolmogorov-complexity
para respostas que sempre têm a mesma saída fixa, mas agora vejo que é sobre cadeias de saída fixas no código e para encontrar padrões para jogar com ele (ou codificá-lo como com a resposta 05AB1E da @ Enigma ). Obrigado por adicioná-lo; Não sabia ao certo quais tags eram relevantes para esse desafio, que foi uma das minhas (infelizmente sem resposta) perguntas na Sandbox.inquestion:2140 shoulders
.Respostas:
05AB1E ,
363534 bytesExperimente online! ou como um conjunto de testes
Explicação
Em resumo, criamos a lista
['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']
e indexamos nela com a entrada (indexada 0).fonte
‡ä¾ØsÏ©s¸±s
parece estranho, considerando que cada palavra tem 2 caracteres. É algo mais?s
existem 3 para pluralizarshoulder, knee, toe
que são singulares no dicionário. Nós não precisamos disso com,eyes, ears
pois eles já estão pluralizados no dicionário, para que a string tenha o comprimento uniforme esperado.JavaScript (ES6),
918887 bytesComo funciona
Temos quatro pares distintos de palavras que sempre aparecem juntos: 'cabeça' é sempre seguida por 'ombros', 'joelhos' é sempre seguida por 'dedos', etc.
Portanto, podemos usar o seguinte índice:
E comprima a sequência inteira (na ordem inversa) na seguinte máscara binária:
Usamos
[ 'knees', 'toes' ]
como o primeiro par para obter o maior número possível de zeros à esquerda.Nós preenchemos essa sequência com um extra
0
para que o valor extraído seja pré-multiplicado por 2, o que leva a:Daí a fórmula final para a palavra correta:
Casos de teste
Mostrar snippet de código
fonte
Python 2,
158148137128114109104 bytesA tabela de pesquisa parece melhor. Também encurtou a corda grande e reorganizou os itens. -5 bytes graças a Rod por usar string como uma lista.
solução inicial:
fonte
hskteemnehnoyaooaoeeerusduessste ls h d
e, em seguida, acrescentar 'ers' se você sabe a palavra é suposto ser 'ombros' :)c=int('602323'*2+'4517602323'[input()%22])
e soltar oh
c:[i%22]
no primeiro,[input()%22]
no segundoPerl, 74 bytes
Código de 73 bytes + 1 para
-p
.Usa indexação baseada em 0. Não gera um separador, mas isso pode ser alterado
-l
nos sinalizadores.Experimente online .
fonte
x2)x2
vez de #x2),@a
Python 2,
9790 bytesPode haver alguma matemática que faça com que eu não precise fazer a lista de palavras, mas isso funciona por enquanto!
Obrigado ao Flp.Tkc por salvar 7 bytes :)
fonte
split()
para torná-lo mais curto:k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 bytes-12 bytes graças a @Neil .
-1 byte, criando descaradamente uma porta da incrível resposta de @Arnauld .
Java é indexado em 0, então foi isso que eu usei.
Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}
tem apenas 112 bytes.C,
153 bytes141 bytesObrigado a @cleblanc por 4 bytes. Declarar b globalmente lança uma tonelada de avisos sobre a conversão para int, mas não quebrou para mim.
Ungolfed:
Não é a menor resposta, mas gostei da técnica e me diverti encontrando alguns padrões.
Changelog:
b
para global para evitarchar
(4 bytes)a > 11 && a < 16
=>(a & 12) > 8
(2 bytes)i=(a-6)%10
=>i=(a+4)%10
para quei < 2 && i >= 0
=>i < 2
(6 bytes)fonte
*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'
e, em seguida, substitui o retorno [...] b por um put (b [...]), você pode reduzi-lo a 143 bytes&&
para&
.JavaScript (ES6)
9189 bytesfonte
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 bytes
Cria um vetor de caractere para funcionar como uma tabela de pesquisa. Pega a entrada de stdin (
1-indexed
) e%%22
encontra a parte do corpo correspondente.Bônus:
%%
é vetorizado, o que significa que isso também funcionará com entradas de vetor.Casos de teste no R-fiddle (Observe que esta é uma função nomeada porque
scan
não funciona no R-fiddle)fonte
jq, 80 caracteres
(Código de 77 caracteres + opção de linha de comando de 3 caracteres)
Exemplo de execução:
Teste on-line (a passagem do
-r
URL não é suportada - verifique você mesmo Raw Output.)fonte
WinDbg,
207157151 bytes-50 bytes, codificando o deslocamento / comprimento das partes do corpo como caracteres ascii.
-6 bytes usando uma var local ao procurar o deslocamento / comprimento.
A entrada é feita com um valor definido no pseudo-registro
$t0
.Como funciona:
Saída de amostra:
fonte
PHP, 91
102118128129Bytes0-Indexado
Até 91 após a remoção do str_split, não percebeu que a string PHP estava acessível como uma matriz de caracteres (uma coisa do PHP 5+?)
Até 102, graças à sugestão de inserir nome de usuário para remover aspas de string e permitir que os avisosfonte
'
palavras ao redor, como'head'
se tornahead
etc.error_reporting
.Geléia , 55 bytes
Experimente online! (Índice baseado em 1)
Vamos! Sério?
Como bônus, esta é a string compactada que eu deveria usar em vez da linha superior:
Ambos codificam esta sequência:
Acho que devo fazer exercício agora: P
fonte
Powershell, 91 bytes, indexado a zero
Abordagem direta, gere a matriz dos 22 primeiros itens, usando alguma multiplicação de cadeias, sempre que possível, compilando-as com espaços e dividindo-as no final. (a divisão é 2 bytes menor que a configuração equivalente como uma matriz), basta encontrar o ponto nessa matriz usando o módulo da entrada, não exatamente interessante ou específico do idioma.
Caso de teste:
etc.
fonte
rubi, 81 bytes
Função Lambda usando indexação zero.
explicação
Geramos a seguinte matriz, da qual usamos os 16 primeiros elementos, cobrindo as linhas corretas 2,3,4 da música:
Tomamos o módulo 22 para reduzi-lo a um único verso e subtraímos 6. Agora, o índice 6 (por exemplo) foi alterado para 0 e aponta para a palavra certa. Indica 0..5 que apontam para a primeira linha da música agora são negativos. Usamos
&15
(idêntico,%16
mas evita a necessidade de colchetes) para mapear a 1ª linha da música para a 4ª linha. Assim índice0
->-6
->10
no programa de teste
fonte
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 bytesIndexado a 0
Experimente online!
Explicação
Como Arnauld apontou, as palavras vêm em pares; portanto, temos um índice de apenas 11 valores e, em seguida, adicionamos a palavra número% 2 para obter a palavra apropriada no par. As palavras são colocadas na pilha como uma única sequência separada por asteriscos para economizar espaço. Testamos as quebras de palavras usando o valor do módulo 7, pois apenas o asterisco é um múltiplo de 7.
fonte
Bytes do SQL 2005 747
Golfe:
Ungolfed:
Precisa de uma tabela como esta, em que a primeira coluna é incrementada automaticamente:
Esta é uma resposta indexada. A tabela é preenchida pela primeira vez procedimento armazenado é criado - não me deixava fazer todo o
INSERT
em uma instrução, lamentavelmente, esse recurso só está disponível em>=SQL 2008
. Depois disso, ele usa o%22
truque das outras respostas. Depois que a tabela foi preenchida, ela usa apenas a última parte:fonte
bash (com ed), 83 caracteres
Indexado 1
Exemplo de chamada:
fonte
dc , 135 bytes
Experimente online!
As matrizes
dc
devem ser construídas um elemento de cada vez, o que leva a maior parte deste exercício. Como 'olhos', 'orelhas', 'boca' e 'nariz' aparecem apenas uma vez em nossa matriz, apenas os inserimos. Mas para os outros, economizamos alguns bytes colocando-os na pilha comox[head]x
, onde x é o meio de seus três valores, em seguida, executamos a macro[:add6-r;ar:adA+r;ar:a]dshx
para colocá-la na matriz, puxamos de volta, colocamos no mesmo valor menos seis, puxamos de volta e colocamos uma última vez no valor original mais dez. Usamos o valor do meio porquedc
nos permite usar dígitos hexadecimais mesmo no modo decimal, e subtrairA
é um byte a menos que adicionar16
- isso também funciona apenas porque todos os valores médios estão abaixo dos quinze. Temos que fazer joelhos e pés duas vezes, e tornar nossa macro inteligente o suficiente para resolver isso é mais caro do que apenas executar a macro duas vezes; mas salvamos os bytes aqui carregando uma cópia armazenada anteriormente da string em vez de gravá-la novamente (B 3;aB
vs.B[toes]B
- acho que isso economiza 3 bytes no total).Uma vez que tenhamos a matriz construído, tudo o que precisamos fazer é
22%
e, em seguida,;ap
para puxá-lo a partir da matriz e de impressão.fonte
C # 6, 138 bytes
demo repl.it
Ungolfed + comentários:
fonte
Split
, e ter o seu mesmo cheque como ternária (?:
) dentro do quadrado de menor e maior (com+4
para a segunda parte), como este:string F(int i)=>"eyes,ears,mouth,nose,head,shoulders,knees,toes,knees,toes".Split(',')[(i+10)%22<4?(i+10)%22%4:(i+6)%22%6+4];
( 126 bytes )Excel, 146 bytes
Usa @ Neil's
MOD(MOD(MOD(B1+16,22),16),10)
para salvar15
bytes.fonte