Cabeza, hombros, rodillas y dedos de los pies, rodillas y dedos de los pies


31

Introducción:

Creo que todos lo sabemos, y probablemente se haya traducido en muchos idiomas diferentes: la canción infantil "Head, Shoulders, Knees and Toes":

Cabeza, hombros, rodillas y dedos de los pies, rodillas y dedos de los pies
Cabeza, hombros, rodillas y dedos de los pies, rodillas y dedos de los pies
Y ojos y oídos y boca y nariz
Cabeza, hombros, rodillas y dedos de los pies, rodillas y dedos de los pies
wikipedia


Reto:

Entrada: un entero positivo.

Salida: emite una de las siguientes palabras según la entrada como n-ésimo índice:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Aquí las partes del cuerpo se agregan con los í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.

Reglas de desafío:

  • Por supuesto, puede usar una entrada indexada en 1 en lugar de 0 indexada. Pero especifique cuál ha utilizado en su respuesta.
  • La salida no distingue entre mayúsculas y minúsculas, por lo que si desea generarla en mayúsculas, está bien.
  • Debe admitir entradas de al menos 1,000.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados, programas completos. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba (indexados a 0):

Input:  Output:
0       head
1       shoulders
7       shoulders
13      ears
20      knees
35      ears
37      nose
98      knees
543     nose
1000    knees

3
Se agregó la etiqueta de complejidad kolmogorov ya que la mayoría de las respuestas probablemente usarán la entrada como un índice cíclico en una matriz constante, cuya generación dominará el recuento de bytes.
Martin Ender

@MartinEnder Gracias. Yo, incorrectamente, solo lo usé kolmogorov-complexitypara respuestas que siempre tienen la misma salida fija, pero ahora veo que se trata de cadenas de salida fijas en el código y de encontrar patrones para jugarlo (o codificarlo como con la respuesta 05AB1E de @ Enigma ). Gracias por agregarlo; No estaba muy seguro de qué etiquetas eran relevantes para este desafío, que era una de mis preguntas (desafortunadamente sin respuesta) en el Sandbox.
Kevin Cruijssen


1
@KevinCruijssen Al menos su pregunta captó algunos +1 :) (observación optimista) Puede buscar en el sandbox usando inquestion:2140 shoulders.
Erik the Outgolfer

3
¿Alguien más tuvo esta canción atrapada en su cabeza todo el día? ...
Kevin Cruijssen

Respuestas:


12

05AB1E , 36 35 34 bytes

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

Pruébalo en línea! o como un conjunto de pruebas

Explicación

“‡ä¾Ø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

En resumen, construimos la lista ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']y la indexamos con entrada (indexada a 0).


44
@KevinCruijssen: Una explicación está por venir :) Es bastante obligatorio para los idiomas de golf imo.
Emigna

‡ä¾ØsÏ©s¸±sParece extraño, teniendo en cuenta que cada palabra tiene 2 caracteres. ¿Es algo más?
Erik the Outgolfer

2
@EriktheGolfer: Sí, los 3 sestán ahí para pluralizar los shoulder, knee, toecuales son singulares en el diccionario. No necesitamos eso eyes, earsya que ya están pluralizados en el diccionario para que la cadena tenga la longitud par esperada.
Emigna

Oh, ellos me confundieron. Gracias.
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]

Cómo funciona

Tenemos 4 pares distintos de palabras que siempre aparecen juntas: a 'cabeza' siempre le siguen 'hombros', a 'rodillas' siempre le siguen 'dedos de los pies', etc.

Por lo tanto, podemos usar el siguiente índice:

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

Y comprima toda la secuencia (en orden inverso) en la siguiente máscara binaria:

00 00 01 11 10 00 00 01 00 00 01

Usamos [ 'knees', 'toes' ]el primer par para obtener la mayor cantidad posible de ceros a la izquierda.

Rellenamos esta secuencia con un extra 0para que el valor extraído sea premultiplicado por 2, lo que conduce a:

0b00000111100000010000010 = 245890

De ahí la fórmula final para la palabra correcta:

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

Casos de prueba


10

Python 2, 158 148 137 128 114 109 104 bytes

La tabla de búsqueda parece mejor. También acortó la cadena grande y reordenó los artículos. -5 bytes gracias a Rod por usar string como lista.

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

solución 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
Respuesta muy original! +1. Pero, umm ..., la mayoría de las respuestas que usan cadenas completas son más cortas que esto. Aún así, ¡me gusta el dinero que te diste para ver algún tipo de patrón en las cadenas! Chapeau por eso.
Kevin Cruijssen

Creo que puedes hacer este hombro haciendo la cadena así: hskteemnehnoyaooaoeeerusduessste ls h dy luego agregando 'ers' si sabes que se supone que la palabra es 'hombros' :)
Kade

1
simplemente puede usar c=int('602323'*2+'4517602323'[input()%22])y soltar el hc:
Rod

1
[i%22]en el primero, [input()%22]en el segundo
Rod

1
@ Rod Ah lo siento, si miras tu código lo suficiente, te quedas ciego.
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]

Utiliza indexación basada en 0. No genera un separador, pero eso podría modificarse con -llas banderas.

Pruébalo en línea .


puede guardar 1 byte con en x2)x2lugar dex2),@a
Adam

4

Python 2, 97 90 bytes

Puede haber algunas matemáticas que lo hacen así que no tengo que hacer la lista de palabras, ¡pero esto funciona por ahora!

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

Gracias a Flp.Tkc por guardar 7 bytes :)


1
split()k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Obtuve

lo siento, debería haber un espacio después de la 'nariz' allí :)
FlipTack

@ Flp.Tkc Sí, me acabo de dar cuenta :) ¡Actualización en un 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 gracias a @Neil .
-1 byte creando descaradamente un puerto de la sorprendente respuesta de @Arnauld .

Java está indexado en 0, así que eso es lo que he usado.

Ungolfed y código de prueba:

Pruébalo aquí.

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

Salida:

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];}solo tiene 112 bytes.
Neil

Si intenta copiar del comentario, obtendrá algunos bytes invisibles adicionales, cortesía de Stack Exchange.
Neil

@Neil Ok, soy un idiota ... No tengo idea de cómo he contado 120 mal ayer por la noche tarde ... Probablemente fue demasiado tarde ...>.> De todos modos, lo he editado (más 1 byte adicional al eliminar el espacio), así que gracias!
Kevin Cruijssen

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

Gracias a @cleblanc por 4 bytes. La declaración de b en todo el mundo arroja un montón de advertencias sobre el envío a int, pero no me rompió.

Sin golf:

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

No es la respuesta más pequeña, pero me gustó la técnica y me divertí encontrando algunos patrones.

Registro de cambios:

  • Movido ba 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
Puedes jugar golf un poco más allá. Al mover b [] a un ámbito global, se puede declarar sin usar char * de esta manera *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'y luego reemplazar el retorno b [...] con un put (b [...]) puede reducirlo a 143 bytes
cleblanc

+1 Y además de la sugerencia de @cleblanc , también puede cambiar ambos &&a &.
Kevin Cruijssen

Tengo curiosidad por saber cómo funciona la sugerencia @cleblanc sobre la declaración de b global El compilador me dijo que sería un * int [], y pensé que la diferencia de tamaño rompería el código. Sin embargo, no fue así, ¡gracias!
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
¡Agradable! +1. Cuando transfiero su respuesta a Java 7, es un sólido -7 bytes en comparación con la respuesta de @ Arnauld, que ya es más corta que la mía. ;) ¡Gracias!
Kevin Cruijssen

1
Me salvó un byte por ser creativa con mi uso de %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Neil

2

R, 95 bytes

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

Crea un vector de caracteres para funcionar como una tabla de búsqueda. Toma información de stdin ( 1-indexed) y %%22para encontrar la parte del cuerpo correspondiente.

Bonus: %%está vectorizado, lo que significa que esto también funcionará con entradas de vector.

Casos de prueba en R-Fiddle (Tenga en cuenta que esta es una función con nombre porque scanno funciona en R-Fiddle)


2

jq, 80 caracteres

(Código de 77 caracteres + opción de línea de comando de 3 caracteres)

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

Ejecución de muestra:

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

Prueba en línea ( -rno se admite el paso por la URL; compruebe usted mismo la salida sin formato)


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 el desplazamiento / longitud de las partes del cuerpo como caracteres ascii.

-6 bytes usando una var local al buscar el desplazamiento / longitud.

La entrada se realiza con un valor establecido en el pseudo registro $t0.

Cómo 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.

Salida de muestra:

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

Hasta 91 después de la eliminación de str_split, no me di cuenta de que la cadena PHP era accesible como una matriz de caracteres (¿una cosa PHP 5+?)

Hasta 102 gracias a la sugerencia de insertusername para eliminar comillas y permitir los avisos


-16 bytes: eliminar 'palabras completas, como se 'head'vuelve headetc.
insertusernamehere

No estoy seguro de cuáles son las reglas con esto, pero con una instalación predeterminada de PHP, recibo las advertencias constantes indefinidas esperadas al hacer eso
CT14.IT

1
Sí, pero esto está absolutamente bien con las reglas del sitio. Los avisos y advertencias pueden ser ignorados.
insertusernamehere

@ CT14.IT, eso no es una advertencia, es un aviso. "PHP 5.3 o posterior, el valor predeterminado es E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Esta configuración no muestra los errores de nivel E_NOTICE, E_STRICT y E_DEPRECATED. ”- Documentación PHP sobreerror_reporting .
manatwork

1
Parece que str_split () es inútil
Crypto

1

Jalea , 55 bytes

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

Pruébalo en línea! (Índice basado en 1)

¡Venga! De Verdad?

Como beneficio adicional, esta es la cadena comprimida que se suponía que debía usar en lugar de la línea superior:

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

Ambos codifican esta cadena:

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

Supongo que debería hacer ejercicio ahora: P


1

Powershell, 91 bytes, indexado a cero

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

Enfoque muy sencillo, genere la matriz de los primeros 22 elementos utilizando alguna multiplicación de cadenas cuando sea posible, compilándolos con espacios y dividiéndolos al final. (la división es 2 bytes más corta que la configuración equivalente como una matriz) y luego encuentre el punto en esa matriz usando el módulo de la entrada, no exactamente interesante o específico del idioma.

Caso de prueba:

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

rubí, 81 bytes

Función lambda con indexación cero.

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

explicación

Generamos la siguiente matriz, de la cual usamos los primeros 16 elementos, cubriendo las líneas correctas 2,3,4 de la canción:

%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 n módulo 22 para reducirlo a un solo verso, luego restamos 6. Ahora el índice 6 (por ejemplo) se ha cambiado a 0 y apunta a la palabra correcta. Las indicaciones 0..5 que apuntan a la primera línea de la canción ahora son negativas. Usamos &15(idéntico %16pero evita la necesidad de corchetes) para mapear la primera línea de la canción a la cuarta línea. Así índice 0-> -6->10

en programa de prueba

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

Interesante fórmula de índice. Pero se puede lograr la misma duración sin él:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
trabajo de

1

Befunge 129 129 119 bytes

0 indexado

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

Pruébalo en línea!

Explicación

Como señaló Arnauld , las palabras vienen en pares, por lo que tenemos un índice de solo 11 valores y luego agregamos el número de palabra% 2 para obtener la palabra apropiada en el par. Las palabras se insertan en la pila como una sola cadena separada por asteriscos para ahorrar espacio. Probamos los saltos de palabras tomando el valor de carácter módulo 7, ya que solo el asterisco es un 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

SQL 2005 747 bytes

Golfizado:

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

Sin golf:

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

Necesita una tabla como esta, donde la primera columna se incrementa automáticamente:

ingrese la descripción de la imagen aquí

Esta es una respuesta indexada. La tabla se llena la primera vez que se crea el procedimiento almacenado; no me deja hacer todo INSERTen una declaración, decepcionantemente, esta función solo está disponible en >=SQL 2008. Después de esto, usa el %22truco de las otras respuestas. Una vez que la tabla ha sido poblada, solo usa la ú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

" no me dejaría hacer todo el INSERTAR en una sola declaración " ¿por qué? ¿No debería ser posible algo así en SQL después de 2008?
Kevin Cruijssen

@KevinCruijssen Estoy usando SQL Server 2008 R2, por lo que es extraño ... Acabo de hacer un poco más de Google, aparentemente es algo que tiene que ver con el "Nivel de compatibilidad" de la base de datos, que acabo de probar y fallé para cambiar: está configurado en 2005 y este es el valor máximo, por lo que no tiene esta función. ¿Debo especificar la versión de SQL en mi respuesta o eliminar la respuesta si no se puede acortar correctamente? Destripado porque eso me ahorraría mucho texto ...
Pete Arden

O bien está bien para mí, así que es tu decisión. Personalmente, generalmente juego golf en Java 7, que especifico, porque en la mayoría de los casos hay respuestas más cortas disponibles en Java 8. Puede especificar que es 2005 de la misma manera.
Kevin Cruijssen

@KevinCruijssen Sí, he visto gente haciendo eso para Java y Python. Realmente no me gustaría hacer el cambio sin poder probar el código tampoco, así que especificaré 2005, saludos :)
Pete Arden

1

bash (con ed), 83 caracteres

1 indexado

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

Llamada de muestra:

 $ bash test.sh 1001
 knees

1

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

Pruébalo en línea!

Las matrices dcdeben construirse un elemento a la vez, lo que lleva la peor parte de este ejercicio. Dado que 'ojos', 'orejas', 'boca' y 'nariz' solo aparecen una vez en nuestra matriz, simplemente los introducimos. Pero para los demás, ahorramos algunos bytes colocándolos en la pila como x[head]x, donde x es el medio de sus tres valores, luego ejecutamos la macro [:add6-r;ar:adA+r;ar:a]dshxpara colocarla en la matriz, tirar hacia atrás, ponerla en el mismo valor menos seis, tirar hacia atrás y luego ponerla por última vez en el valor original más diez. Usamos el valor medio porque dcnos permite usar dígitos hexadecimales incluso en modo decimal, y restar Aes un byte menos que sumar16- esto también solo funciona porque todos los valores medios son menores de quince. Tenemos que hacer rodillas y dedos de los pies dos veces, y hacer que nuestra macro sea lo suficientemente inteligente como para resolverlo es más costoso que simplemente ejecutar la macro dos veces; pero aquí guardamos bytes cargando una copia previamente almacenada de la cadena en lugar de escribirla nuevamente ( B 3;aBvs. B[toes]B- Creo que esto ahorra 3 bytes en total).

Una vez que hemos construido la matriz, todo lo que tenemos que hacer es 22%y después ;apde llevarlo a cabo de la matriz y de impresión.


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 de repl.it

Ungolfed + comentarios:

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

Puede combinar la cadena y usar una sola Split, y tener su mismo cheque como ternary ( ?:) dentro de los corchetes (con +4para la segunda parte), así: 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)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.