Cabeça, ombros, joelhos e dedos dos pés, joelhos e dedos dos pés


31

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 é , 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

3
Adicionada a tag de complexidade kolmogorov, já que a maioria das respostas provavelmente usará a entrada como um índice cíclico em uma matriz constante, cuja geração dominará a contagem de bytes.
Martin Ender

@MartinEnder Thanks. Eu, incorretamente, só usei kolmogorov-complexitypara 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.
Kevin Cruijssen 17/11


1
@KevinCruijssen Pelo menos a sua pergunta pegou alguns + 1s :) (observação otimista) Você pode pesquisar na sandbox usando inquestion:2140 shoulders.
Erik the Outgolfer

3
Alguém mais ficou com essa música presa na cabeça o dia todo? ...
Kevin Cruijssen

Respostas:


12

05AB1E , 36 35 34 bytes

“‡ä¾ØsÏ©s¸±s“#2䤫Г—íÖÇ©¢ÄÓ#s)˜è

Experimente online! ou como um conjunto de testes

Explicação

“‡ä¾ØsÏ©s¸±s“                        # dictionary string 'head shoulders knees toes'
             #                       # split on spaces
              2ä                     # split in 2 parts
                ¤                    # get the last part ['knees', 'toes']
                 «                   # concatenate and flatten
                                     # STACK: [['head', 'shoulders'], ['knees', 'toes'], 'knees', 'toes']
                  Ð                  # triplicate
                   “—íÖÇ©¢ÄÓ        # dictionary string 'eyes ears mouth nose'
                             #s      # split on spaces and swap top 2 elements of stack
                               )˜    # wrap stack in a list and flatten
                                 è   # index into list with input

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


4
@KevinCruijssen: Uma explicação é muitas vezes vinda :) É bastante obrigatório para os idiomas de golfe.
Emigna

‡ä¾ØsÏ©s¸±sparece estranho, considerando que cada palavra tem 2 caracteres. É algo mais?
Erik the Outgolfer

2
@EriktheGolfer: Sim, sexistem 3 para pluralizar shoulder, knee, toeque são singulares no dicionário. Nós não precisamos disso com, eyes, earspois eles já estão pluralizados no dicionário, para que a string tenha o comprimento uniforme esperado.
Emigna

Oh, eles me confundiram. Obrigado.
Erik the Outgolfer

31

JavaScript (ES6), 91 88 87 bytes

n=>'knees,toes,head,shoulders,eyes,ears,mouth,nose'.split`,`[(245890>>(n%22&~1))&6|n%2]

Como 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:

00: [ 'knees', 'toes' ]
01: [ 'head', 'shoulders' ]
10: [ 'eyes', 'ears' ]
11: [ 'mouth', 'nose' ]

E comprima a sequência inteira (na ordem inversa) na seguinte máscara binária:

00 00 01 11 10 00 00 01 00 00 01

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 0para que o valor extraído seja pré-multiplicado por 2, o que leva a:

0b00000111100000010000010 = 245890

Daí a fórmula final para a palavra correta:

(245890 >> (n % 22 & ~1)) & 6 | n % 2

Casos de teste


10

Python 2, 158 148 137 128 114 109 104 bytes

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

c=int('602323'*2+'4517602323'[input()%22])
print"smkteehnhonoyaeooueeerasutesssdelhs"[c::8]+"ders"*(c<1)

solução inicial:

n=input()%22
n-=10*(n>15)
if n>=12:n-=8
else:n%=6;n-=2*(n>3)
print"hskteemnehnoyaooaoeeerusduessste ls   h  d       e       r       s"[n::8].strip()

1
Resposta muito original! +1. Mas, umm ..., a maioria das respostas que usam as seqüências completas são mais curtas que isso. Ainda assim, eu gosto do dinheiro que você teve para ver algum tipo de padrão nas cordas! Chapeau por isso.
Kevin Cruijssen

Eu acho que você pode fazer este ombro, fazendo a corda esta: hskteemnehnoyaooaoeeerusduessste ls h de, em seguida, acrescentar 'ers' se você sabe a palavra é suposto ser 'ombros' :)
Kade

1
você pode simplesmente usar c=int('602323'*2+'4517602323'[input()%22])e soltar o hc:
Rod

1
[i%22]no primeiro, [input()%22]no segundo
Rod

1
@ Rod Ah desculpe, se você olhar para o seu código por tempo suficiente, você fica cego.
19416 Karl Napf

6

Perl, 74 bytes

Código de 73 bytes + 1 para -p.

$_=(@a=(head,shoulders,(knees,toes)x2),@a,eyes,ears,mouth,nose,@a)[$_%22]

Usa indexação baseada em 0. Não gera um separador, mas isso pode ser alterado -lnos sinalizadores.

Experimente online .


você pode economizar 1 byte com, em x2)x2vez de #x2),@a
11/11 Adam

4

Python 2, 97 90 bytes

Pode haver alguma matemática que faça com que eu não precise fazer a lista de palavras, mas isso funciona por enquanto!

lambda n,k='head shoulders '+'knees toes '*2:(k*2+'eyes ears mouth nose '+k).split()[n%22]

Obrigado ao Flp.Tkc por salvar 7 bytes :)


1
Eu tenho uma solução semelhante, mas usado split()para torná-lo mais curto:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack

Desculpe, não deve haver um espaço após o 'nariz' lá :)
FlipTack

@ Flp.Tkc Sim, eu tinha acabado de perceber isso :) Atualizando em um segundo!
Kade

4

Java 7, 155 137 131 123 111 110 bytes

String c(int i){return"knees,toes,head,shoulders,eyes,ears,mouth,nose".split(",")[(245890>>(i%22&~1))&6|i%2];}

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

class M{
  static String c(int i){
    return "knees,toes,head,shoulders,eyes,ears,mouth,nose".split(",")
      [(245890>>(i%22&~1))&6|i%2];
  }

  public static void main(String[] a){
    System.out.println(c(0));
    System.out.println(c(1));
    System.out.println(c(7));
    System.out.println(c(13));
    System.out.println(c(20));
    System.out.println(c(35));
    System.out.println(c(37));
    System.out.println(c(98));
    System.out.println(c(543));
    System.out.println(c(1000));
  }
}

Saída:

head
shoulders
shoulders
ears
knees
nose
ears
knees
nose
knees

1
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.
Neil

Se você tentar copiar do comentário, obterá alguns bytes extras invisíveis, cortesia do Stack Exchange.
21316 Neil

@ Neil Ok, eu sou um idiota .. Não faço ideia de como contei 120 irregularmente ontem à noite tarde .. Provavelmente era tarde demais ..>.> De qualquer forma, editei (mais um byte adicional removendo o espaço), então obrigado!
18716 Kevin Murrijssen

3

C, 153 bytes 141 bytes

*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"};i;char*g(a){a%=22;i=(a+4)%10;return b[a<4?a:(a&12)>8?a-8:i<2?i:a%2+2];}

Obrigado 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:

*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"};
i;
char* g(a) {
    a%=22;
    i=(a+4)%10;
    return b[a < 4        ? a
            :(a & 12) > 8 ? a-8
            :i < 2        ? i
            :               a % 2 + 2];
}

Não é a menor resposta, mas gostei da técnica e me diverti encontrando alguns padrões.

Changelog:

  • Movido bpara global para evitar char(4 bytes)
  • a > 11 && a < 16=> (a & 12) > 8(2 bytes)
  • i=(a-6)%10=> i=(a+4)%10para que i < 2 && i >= 0=> i < 2(6 bytes)

1
Você pode jogar isso um pouco mais longe. Movendo b [] para um escopo global, ele pode ser declarado sem o uso de char * assim *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
cleblanc 17/11/16

+1 E além da sugestão de @cleblanc , você também pode alterar ambos &&para &.
Kevin Cruijssen

Estou curioso para saber como funciona a sugestão @cleblanc sobre declarar b globalmente. O compilador me disse que seria um * int [] e pensei que a diferença de tamanho quebraria o código. Mas não, então obrigada!
nmjcman101

2

JavaScript (ES6) 91 89 bytes

f=
n=>((d='head:shoulders:'+(b='knees:toes:')+b)+d+'eyes:ears:mouth:nose:'+d).split`:`[n%22]

console.log(f.toString().length)
console.log(f(0) === 'head')
console.log(f(1) === 'shoulders')
console.log(f(7) === 'shoulders')
console.log(f(13) === 'ears')
console.log(f(20) === 'knees')
console.log(f(35) === 'ears')
console.log(f(37) === 'nose')
console.log(f(98) === 'knees')
console.log(f(543) === 'nose')
console.log(f(1000) === 'knees')


1
Agradável! +1. Quando eu porto sua resposta para o Java 7, são -7 bytes sólidos em comparação com a resposta já mais curta que a minha do @ Arnauld. ;) Obrigado!
Kevin Cruijssen

1
Salvei um byte por ser criativo com o meu uso de %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
187 Neil

2

R, 95 bytes

c(o<-c("head","shoulders",y<-c("knees","toes"),y),o,"eyes","ears","mouth","nose",o)[scan()%%22]

Cria um vetor de caractere para funcionar como uma tabela de pesquisa. Pega a entrada de stdin ( 1-indexed) e %%22encontra 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 scannão funciona no R-fiddle)


2

jq, 80 caracteres

(Código de 77 caracteres + opção de linha de comando de 3 caracteres)

((("head shoulders "+"knees toes "*2)*2+"eyes ears mouth nose ")*2/" ")[.%22]

Exemplo de execução:

bash-4.3$ jq -r '((("head shoulders "+"knees toes "*2)*2+"eyes ears mouth nose ")*2/" ")[.%22]' <<< 1000
knees

Teste on-line (a passagem do -rURL não é suportada - verifique você mesmo Raw Output.)


2

WinDbg, 207 157 151 bytes

ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41

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

* Initialization, writes this string at address 0x2000000. The nonsense after the body parts
* are the offsets and lengths of the body parts in the first part of the string, each of
* which is incremented by 0x41 to make it a printable ascii character.
ea 2000000 
        "headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";


* Display the output:
r$t4=(@$t0%16)*2+2000027
da1FFFFBF+by(@$t4) Lby(@$t4+1)-41

* Display output explanation:
r $t4 = (@$t0%16)*2+2000027   * Set $t4 = input, @$t0, mod 22, doubled +0x2000027
by(@$t4)                      * byte_at(@$t4)-0x41 is the {Offset} into the string 
                              * for the start of output. The -0x41 is already subtracted
                              * from 0x2000000 to make 0x1FFFFBF.
Lby(@$t4+1)-41                * byte_at(@$t4+1)-0x41 is the {Length} of the output.
da 1FFFFBF+{Offset} L{Length} * Display {Length} chars from {Offset} of the above string.

Saída de amostra:

0:000> r$t0=0
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000000  "head"


0:000> r$t0=1
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000004  "shoulders"


0:000> r$t0=7
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000004  "shoulders"


0:000> r$t0=0n13
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n20
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n35
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n37
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n98
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n543
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n1000
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"

2

PHP, 91 102 118 128 129 Bytes

<?=[head,shoulders,knees,toes,eyes,ears,mouth,nose]['0123230123234567012323'[$argv[1]%22]];

0-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 avisos


-16 bytes: remover todas as 'palavras ao redor, como 'head'se torna headetc.
insertusernamehere

Não tenho certeza quais são as regras com isso, mas com um PHP padrão de instalação, recebo os avisos constantes indefinidos esperados quando fazer isso
CT14.IT

1
Sim, mas isso é absolutamente adequado às regras do site. Avisos e avisos podem ser ignorados.
insertusernamehere

@ CT14.IT, que não é um aviso, é um aviso. “PHP 5.3 ou posterior, o valor padrão é E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Esta configuração não mostra os erros de nível E_NOTICE, E_STRICT e E_DEPRECATED. ”- documentação do PHP sobreerror_reporting .
manatwork

1
Parece que str_split () é inútil
Crypto

1

Geléia , 55 bytes

“¥ḷne“¥ṇṭḲ»ẋ2ṭ“¢1$“@⁼5⁼»µẋ2;“¥ḳVo“¥ḳ'k“£Qo“£³ạ»;⁸FḊḲ
ị¢

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:

“¡¦ṡb[wfe=⁺żɦ4Gƈġhḳ"ẇ⁴ż>oH¹8ṡʠʠḟṀUṿḶ>¬Þ:ĖẇrṗṁɼlDṫỤ¬ȷ⁶Dḥci*⁻³GḲOÞạṖṃ\»

Ambos codificam esta sequência:

head shoulders knees toes knees toes head shoulders knees toes knees toes eyes ears mouth nose head shoulders knees toes knees toes

Acho que devo fazer exercício agora: P


1

Powershell, 91 bytes, indexado a zero

$a='head shoulders '+'knees toes '*2;($a*2+'eyes ears mouth nose '+$a).Split()[$args[0]%22]

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:

PS C:\++\golf> 0..1000|%{.\hskt $_}
head
shoulders
knees
toes
knees
toes
head
shoulders
knees
toes
knees
toes
eyes
ears
mouth
nose
head
shoulders
knees
toes
knees
toes
head
shoulders
knees
toes
....

etc.


1

rubi, 81 bytes

Função Lambda usando indexação zero.

->n{("head shoulders#{" knees toes "*2}eyes ears mouth nose".split*2)[n%22-6&15]}

explicação

Geramos a seguinte matriz, da qual usamos os 16 primeiros elementos, cobrindo as linhas corretas 2,3,4 da música:

%w{head shoulders knees toes knees toes
   eyes ears mouth nose
   head shoulders knees toes knees toes

   eyes ears mouth nose}                  #last 4 elements not used

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, %16mas evita a necessidade de colchetes) para mapear a 1ª linha da música para a 4ª linha. Assim índice 0-> -6->10

no programa de teste

f=->n{("head shoulders#{" knees toes "*2}eyes ears mouth nose".split*2)[n%22-6&15]}

#call as below to test index 0..43
44.times{|i|p f[i]}

Fórmula de índice interessante. Mas o mesmo comprimento pode ser conseguido sem ele:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
manatwork

1

Befunge, 129 119 bytes

Indexado a 0

&29+2*%:2/v>00p>%#7_v
+%2\-"/"g2<|<:-1g007<"head*shoulders*knees*toes*eyes*ears*mouth*nose"p00
02202246022>$$:>7#:%#,_@

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.

&29+2*%               n = getint() % 22             // % 22 to ensure it's in range
:2/2g                 i = index_array[n/2]          // we use n/2 because words are paired
-"/"                  i -= '/'                      // convert from ASCII to 1-based value
\2%+                  i += n%2                      // get the correct word in the pair
00p                   index = i                     // save for later

"head*shoulders*knees*toes*eyes*ears*mouth*nose"    // push all the words onto the stack

700g1-:|              while (index-1 != 0) {        // the 7 is used in the drop loop   
  00p                   index = index-1             
  >%#7_                 do while (pop() % 7)        // drop up to the next '*' (%7==0)
                      }                    

$$                    pop();pop()                   // get rid of index and extra 7

: 7 % _               while ((c = pop()) % 7)       // output up to the next '*' (%7==0)
 > : ,                  putchar(c)

1

Bytes do SQL 2005 747

Golfe:

GO
CREATE PROCEDURE H @n INT AS BEGIN IF NOT EXISTS(SELECT*FROM R)BEGIN INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('eyes')INSERT INTO R VALUES('ears')INSERT INTO R VALUES('mouth')INSERT INTO R VALUES('nose')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')END SELECT W FROM R WHERE I=@n%22 END

Ungolfed:

GO
CREATE PROCEDURE H
@n INT 
AS 
BEGIN IF NOT EXISTS(SELECT*FROM R)
BEGIN 
INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('eyes')INSERT INTO R VALUES('ears')INSERT INTO R VALUES('mouth')INSERT INTO R VALUES('nose')INSERT INTO R VALUES('head')INSERT INTO R VALUES('shoulders')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')INSERT INTO R VALUES('knees')INSERT INTO R VALUES('toes')
END 
SELECT W FROM R WHERE I=@n%22 END

Precisa de uma tabela como esta, em que a primeira coluna é incrementada automaticamente:

insira a descrição da imagem aqui

Esta é uma resposta indexada. A tabela é preenchida pela primeira vez procedimento armazenado é criado - não me deixava fazer todo o INSERTem uma instrução, lamentavelmente, esse recurso só está disponível em >=SQL 2008. Depois disso, ele usa o %22truque das outras respostas. Depois que a tabela foi preenchida, ela usa apenas a última parte:

SELECT W FROM R WHERE I=@n%22

Input:  Output:
R 1       head
R 2       shoulders
R 8       shoulders
R 14      ears
R 21      knees
R 36      ears
R 38      nose
R 99      knees
R 54      nose
R 1001    knees

" não me deixou fazer todo o INSERT em uma declaração " por quê? Algo assim não deveria ser possível no SQL após 2008?
Kevin Cruijssen

@KevinCruijssen Estou usando o SQL Server 2008 R2, então é estranho ... Acabei de pesquisar um pouco mais no Google, aparentemente tem algo a ver com o "Nível de compatibilidade" do banco de dados, que acabei de tentar e falhei para mudar - está definido como 2005 e esse é o valor máximo, portanto, não possui esse recurso. Devo especificar a versão do SQL na minha resposta ou excluir a resposta se não puder ser reduzida adequadamente? Eviscerado, como que iria me salvar um monte de texto ...
Pete Arden

Ou está tudo bem para mim, então a decisão é sua. Pessoalmente, geralmente jogo golfe no Java 7, que eu especifico, porque na maioria dos casos, respostas mais curtas estão disponíveis no Java 8. Você pode especificar o ano de 2005 da mesma maneira.
18716 Kevin Kurtzssen

@KevinCruijssen Sim, eu já vi pessoas fazendo isso para Java e Python. Não realmente gostaria de fazer a mudança sem ser capaz de testar o código seja, por isso vou especificar de 2005, cheers :)
Pete Arden

1

bash (com ed), 83 caracteres

Indexado 1

ed<<<"a
head
shoulders
knees
toes
eyes
ears
mouth
nose
.
3,4t4
1,6y
6x
$(($1%22))"

Exemplo de chamada:

 $ bash test.sh 1001
 knees

1

dc , 135 bytes

6[head]6[:add6-r;ar:adA+r;ar:a]dshx7[shoulders]7lhx8[knees]8lhxA 2;aAlhx9[toes]9lhxB 3;aBlhx[eyes]C:a[ears]D:a[mouth]E:a[nose]F:a22%;ap

Experimente online!

As matrizes dcdevem 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 como x[head]x, onde x é o meio de seus três valores, em seguida, executamos a macro [:add6-r;ar:adA+r;ar:a]dshxpara 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 subtrair Aé 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;aBvs.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, ;appara puxá-lo a partir da matriz e de impressão.


0

C # 6, 138 bytes

string F(int i)=>(i+10)%22<4?"eyes,ears,mouth,nose".Split(',')[(i+10)%22%4]:"head,shoulders,knees,toes,knees,toes".Split(',')[(i+6)%22%6];

demo repl.it

Ungolfed + comentários:

string F(int i)=>
    // Is it eyes/ears/mouth/nose?
    (i+10)%22<4
        // If yes, then set index to 4-word line and take modular 4
        // String array constructed by splitting comma-delimited words
        ? "eyes,ears,mouth,nose".Split(',')
            [(i+10)%22%4]
        // Else set index to last 6-word line and take modular 6
        : "head,shoulders,knees,toes,knees,toes".Split(',')
            [(i+6)%22%6];

Você pode combinar a corda e usar um único Split, e ter o seu mesmo cheque como ternária ( ?:) dentro do quadrado de menor e maior (com +4para 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 )
Kevin Cruijssen

0

Excel, 146 bytes

=MID("Head     ShouldersKnees    Toes     Eyes     Ears     Mouth    Nose",CHOOSE(MOD(MOD(MOD(B1+16,22),16),10)+1,1,10,19,28,19,28,37,46,55,64),9)

Usa @ Neil's MOD(MOD(MOD(B1+16,22),16),10)para salvar 15bytes.

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.