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 código de golf , 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
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
fuente
fuente
kolmogorov-complexity
para 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.inquestion:2140 shoulders
.Respuestas:
05AB1E ,
363534 bytesPruébalo en línea! o como un conjunto de pruebas
Explicación
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).fuente
‡ä¾ØsÏ©s¸±s
Parece extraño, teniendo en cuenta que cada palabra tiene 2 caracteres. ¿Es algo más?s
están ahí para pluralizar losshoulder, knee, toe
cuales son singulares en el diccionario. No necesitamos esoeyes, ears
ya que ya están pluralizados en el diccionario para que la cadena tenga la longitud par esperada.JavaScript (ES6),
918887 bytesCó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:
Y comprima toda la secuencia (en orden inverso) en la siguiente máscara binaria:
Usamos
[ 'knees', 'toes' ]
el primer par para obtener la mayor cantidad posible de ceros a la izquierda.Rellenamos esta secuencia con un extra
0
para que el valor extraído sea premultiplicado por 2, lo que conduce a:De ahí la fórmula final para la palabra correcta:
Casos de prueba
Mostrar fragmento de código
fuente
Python 2,
158148137128114109104 bytesLa 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.
solución inicial:
fuente
hskteemnehnoyaooaoeeerusduessste ls h d
y luego agregando 'ers' si sabes que se supone que la palabra es 'hombros' :)c=int('602323'*2+'4517602323'[input()%22])
y soltar elh
c:[i%22]
en el primero,[input()%22]
en el segundoPerl, 74 bytes
Código de 73 bytes + 1 para
-p
.Utiliza indexación basada en 0. No genera un separador, pero eso podría modificarse con
-l
las banderas.Pruébalo en línea .
fuente
x2)x2
lugar dex2),@a
Python 2,
9790 bytesPuede haber algunas matemáticas que lo hacen así que no tengo que hacer la lista de palabras, ¡pero esto funciona por ahora!
Gracias a Flp.Tkc por guardar 7 bytes :)
fuente
split()
k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 bytes-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í.
Salida:
fuente
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.C,
153 bytes141 bytesGracias 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:
No es la respuesta más pequeña, pero me gustó la técnica y me divertí encontrando algunos patrones.
Registro de cambios:
b
a 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)fuente
*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&&
a&
.JavaScript (ES6)
9189 Bytesfuente
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 bytes
Crea un vector de caracteres para funcionar como una tabla de búsqueda. Toma información de stdin (
1-indexed
) y%%22
para 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
scan
no funciona en R-Fiddle)fuente
jq, 80 caracteres
(Código de 77 caracteres + opción de línea de comando de 3 caracteres)
Ejecución de muestra:
Prueba en línea (
-r
no se admite el paso por la URL; compruebe usted mismo la salida sin formato)fuente
Windbg
207157151 bytes-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:
Salida de muestra:
fuente
PHP, 91
102118128129Bytes0-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 avisosfuente
'
palabras completas, como se'head'
vuelvehead
etc.error_reporting
.Jalea , 55 bytes
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:
Ambos codifican esta cadena:
Supongo que debería hacer ejercicio ahora: P
fuente
Powershell, 91 bytes, indexado a cero
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:
etc.
fuente
rubí, 81 bytes
Función lambda con indexación cero.
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:
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%16
pero evita la necesidad de corchetes) para mapear la primera línea de la canción a la cuarta línea. Así índice0
->-6
->10
en programa de prueba
fuente
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge
129 129119 bytes0 indexado
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.
fuente
SQL 2005 747 bytes
Golfizado:
Sin golf:
Necesita una tabla como esta, donde la primera columna se incrementa automáticamente:
Esta es una respuesta indexada. La tabla se llena la primera vez que se crea el procedimiento almacenado; no me deja hacer todo
INSERT
en una declaración, decepcionantemente, esta función solo está disponible en>=SQL 2008
. Después de esto, usa el%22
truco de las otras respuestas. Una vez que la tabla ha sido poblada, solo usa la última parte:fuente
bash (con ed), 83 caracteres
1 indexado
Llamada de muestra:
fuente
cc , 135 bytes
Pruébalo en línea!
Las matrices
dc
deben 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 comox[head]x
, donde x es el medio de sus tres valores, luego ejecutamos la macro[:add6-r;ar:adA+r;ar:a]dshx
para 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 porquedc
nos permite usar dígitos hexadecimales incluso en modo decimal, y restarA
es 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;aB
vs.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;ap
de llevarlo a cabo de la matriz y de impresión.fuente
C # 6, 138 bytes
demo de repl.it
Ungolfed + comentarios:
fuente
Split
, y tener su mismo cheque como ternary (?:
) dentro de los corchetes (con+4
para 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 )Excel, 146 bytes
Utiliza @ Neil's
MOD(MOD(MOD(B1+16,22),16),10)
para guardar15
bytes.fuente