Tête, épaules, genoux et orteils, genoux et orteils

31

Introduction:

Je pense que nous le savons tous, et il a probablement été traduit dans de nombreuses langues: la chanson pour enfants "Head, Shoulders, Knees and Toes":

Tête, épaules, genoux et orteils, genoux et orteils
Tête, épaules, genoux et orteils, genoux et orteils
Et yeux et oreilles et bouche et nez
Tête, épaules, genoux et orteils, genoux et orteils
wikipedia


Défi:

Entrée: Un entier positif.

Sortie: affichez l'un des mots suivants en fonction de l'entrée en tant que nième index:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Ici, les parties du corps sont ajoutées aux index:

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.

Règles du défi:

  • Vous êtes bien sûr autorisé à utiliser une entrée indexée 1 au lieu de l'index 0. Mais veuillez préciser celui que vous avez utilisé dans votre réponse.
  • La sortie est insensible à la casse, donc si vous voulez la sortir en majuscules, c'est très bien.
  • Vous devez prendre en charge jusqu'à 1 000 entrées au minimum.

Règles générales:

  • C'est du , donc la réponse la plus courte en octets est gagnante.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés, des programmes complets. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • Veuillez également ajouter une explication si nécessaire.

Cas de test (indexés 0):

Input:  Output:
0       head
1       shoulders
7       shoulders
13      ears
20      knees
35      ears
37      nose
98      knees
543     nose
1000    knees
Kevin Cruijssen
la source
3
Ajout de la balise de complexité kolmogorov car la plupart des réponses utiliseront probablement l'entrée comme index cyclique dans un tableau constant, dont la génération dominera le nombre d'octets.
Martin Ender
@MartinEnder Merci. À tort, je n'utilisais que kolmogorov-complexitydes réponses qui ont toujours la même sortie fixe, mais maintenant je vois qu'il s'agit de chaînes de sortie fixes dans le code et de trouver des modèles pour le jouer (ou l'encoder comme avec la réponse 05AB1E de @ Enigma ). Merci de l'avoir ajouté; Je n'étais pas trop sûr des balises pertinentes pour ce défi, qui était l'une de mes questions (malheureusement sans réponse) dans le bac à sable.
Kevin Cruijssen du
1
@KevinCruijssen Au moins votre question a attrapé quelques +1 :) (remarque optimiste) Vous pouvez rechercher dans le bac à sable en utilisant inquestion:2140 shoulders.
Erik the Outgolfer
3
Quelqu'un d'autre a-t-il pris cette chanson dans la tête toute la journée? ...
Kevin Cruijssen

Réponses:

12

05AB1E , 36 35 34 octets

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

Essayez-le en ligne! ou en tant que suite de tests

Explication

“‡ä¾Ø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 bref, nous construisons la liste ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']et l'indexons avec une entrée (indexée 0).

Emigna
la source
4
@KevinCruijssen: Une explication est souvent à venir :) C'est assez obligatoire pour les langues de golf imo.
Emigna
‡ä¾ØsÏ©s¸±ssemble bizarre, étant donné que chaque mot est composé de 2 caractères. Est-ce autre chose?
Erik the Outgolfer
2
@EriktheGolfer: Oui, les 3 ssont là pour pluraliser shoulder, knee, toequi sont singuliers dans le dictionnaire. Nous n'avons pas besoin de cela eyes, earscar ils sont déjà pluralisés dans le dictionnaire, de sorte que la chaîne a la même longueur attendue.
Emigna
Oh, ils m'ont confondu. Merci.
Erik the Outgolfer
31

JavaScript (ES6), 91 88 87 octets

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

Comment ça marche

Nous avons 4 paires de mots distincts qui apparaissent toujours ensemble: «tête» est toujours suivi par «épaules», «genoux» est toujours suivi par «orteils», etc.

Par conséquent, nous pouvons utiliser l'index suivant:

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

Et compressez toute la séquence (dans l'ordre inverse) dans le masque binaire suivant:

00 00 01 11 10 00 00 01 00 00 01

Nous utilisons [ 'knees', 'toes' ]comme première paire pour obtenir autant de zéros de tête que possible.

Nous complétons cette séquence avec un extra 0afin que la valeur extraite soit prémultipliée par 2, ce qui conduit à:

0b00000111100000010000010 = 245890

D'où la formule finale pour le mot correct:

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

Cas de test

Arnauld
la source
10

Python 2, 158 148 137 128 114 109 104 octets

La table de recherche semble meilleure. Également raccourci la grosse chaîne et réorganisé les articles. -5 octets grâce à Rod pour avoir utilisé une chaîne comme liste.

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

solution initiale:

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()
Karl Napf
la source
1
Réponse très originale! +1. Mais, euh ..., la plupart des réponses qui utilisent les chaînes complètes sont plus courtes que cela. Pourtant, j'aime les moyens que vous avez pris pour voir une sorte de motif dans les cordes! Chapeau pour ça.
Kevin Cruijssen
Je pense que vous pouvez créer cette épaule en créant la chaîne suivante: hskteemnehnoyaooaoeeerusduessste ls h dpuis en ajoutant «ers» si vous savez que le mot est censé être «épaules» :)
Kade
1
vous pouvez simplement utiliser c=int('602323'*2+'4517602323'[input()%22])et déposer le hc:
Rod
1
[i%22]le premier, [input()%22]le deuxième
Rod
1
@Rod Ah désolé, si vous regardez votre code assez longtemps, vous devenez aveugle.
Karl Napf
6

Perl, 74 octets

73 octets code + 1 pour -p.

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

Utilise l'indexation basée sur 0. N'affiche pas de séparateur, mais cela pourrait être modifié avec -ldans les drapeaux.

Essayez-le en ligne .

Dom Hastings
la source
vous pouvez enregistrer 1 octet avec x2)x2au lieu dex2),@a
Adam
4

Python 2, 97 90 octets

Il y a peut-être un peu de calcul qui fait que je n'ai pas à faire la liste de mots, mais cela fonctionne pour l'instant!

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

Merci à Flp.Tkc pour avoir économisé 7 octets :)

Kade
la source
1
J'ai eu une solution similaire, mais split()je la raccourcissais:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack
désolé, il devrait y avoir un espace après le 'nez' là :)
FlipTack
@ Flp.Tkc Ouais je venais de réaliser que :) Mise à jour en une seconde!
Kade
4

Java 7, 155 137 131 123 111 110 octets

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

-12 octets grâce à @Neil .
-1 octet en créant sans vergogne un port de la réponse étonnante de @Arnauld .

Java est indexé 0, c'est donc ce que j'ai utilisé.

Non testé et code de test:

Essayez ici.

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

Sortie:

head
shoulders
shoulders
ears
knees
nose
ears
knees
nose
knees
Kevin Cruijssen
la source
1
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}n'est que de 112 octets.
Neil
Si vous essayez de copier à partir du commentaire, vous obtenez des octets supplémentaires invisibles gracieuseté de Stack Exchange.
Neil
@Neil Ok, je suis un idiot .. Aucune idée de la façon dont j'ai compté grossièrement 120 hier soir tard .. C'était probablement trop tard ..>.> Quoi qu'il en soit, je l'ai édité (plus 1 octet supplémentaire en supprimant le espace), alors merci!
Kevin Cruijssen
3

C, 153 octets 141 octets

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

Merci à @cleblanc pour 4 octets. Déclarer b globalement lance une tonne d'avertissements sur la conversion en int, mais n'a pas été interrompu pour moi.

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

Ce n'est pas la plus petite réponse, mais j'ai aimé la technique et j'ai eu du plaisir à trouver quelques modèles.

Journal des modifications:

  • Déplacé bvers global pour éviter char(4 octets)
  • a > 11 && a < 16=> (a & 12) > 8(2 octets)
  • i=(a-6)%10=> i=(a+4)%10pour que i < 2 && i >= 0=> i < 2(6 octets)
nmjcman101
la source
1
Vous pouvez jouer au golf un peu plus loin. En déplaçant b [] vers une portée globale, il peut être déclaré sans utiliser char * comme ceci *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i', puis remplacer le retour b [...] par un put (b [...]), vous pouvez le réduire à 143 octets
cleblanc
+1 Et en plus de la suggestion de @cleblanc , vous pouvez également changer les deux &&en &.
Kevin Cruijssen
Je suis curieux de savoir comment la suggestion @cleblanc sur la déclaration de b fonctionne globalement. Le compilateur m'a dit que ce serait un * int [], et j'ai pensé que la différence de taille casserait le code. Mais ce n'est pas le cas, merci!
nmjcman101
2

JavaScript (ES6) 91 89 octets

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

Lmis
la source
1
Agréable! +1. Lorsque je transfère votre réponse sur Java 7, c'est un solide -7 octets par rapport à la réponse déjà plus courte que la mienne de @ Arnauld. ;) Merci!
Kevin Cruijssen
1
J'ai sauvé un octet en étant créatif avec mon utilisation de %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Neil
2

R, 95 octets

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

Crée un vecteur de caractères pour fonctionner comme une table de recherche. Prend l'entrée de stdin ( 1-indexed) et %%22pour trouver la partie du corps correspondante.

Bonus: %%est vectorisé, ce qui signifie que cela fonctionnera également avec des entrées vectorielles.

Cas de test sur R-fiddle (Notez qu'il s'agit d'une fonction nommée car scanelle ne fonctionne pas sur R-fiddle)

Billywob
la source
2

jq, 80 caractères

(Code de 77 caractères + option de ligne de commande de 3 caractères)

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

Échantillon échantillon:

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

Test en ligne (le passage -rpar l'URL n'est pas pris en charge - vérifiez vous-même la sortie brute.)

homme au travail
la source
2

WinDbg, 207 157 151 151 octets

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

-50 octets en codant le décalage / la longueur des parties du corps en caractères ascii.

-6 octets en utilisant une variable locale lors de la recherche du décalage / de la longueur.

L'entrée se fait avec une valeur définie dans le pseudo-registre $t0 .

Comment ça marche:

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

Exemple de sortie:

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"
Lait
la source
2

PHP, 91 102 118 128 129 129 octets

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

0 indexé

Jusqu'à 91 après la suppression de str_split, je ne savais pas que la chaîne PHP était accessible en tant que tableau de caractères (une chose PHP 5+?)

Jusqu'à 102 grâce à la suggestion d'insertion de nom d'utilisateur pour supprimer les guillemets et autoriser les notifications

CT14.IT
la source
-16 octets: supprime tous les 'mots autour, comme 'head'devient headetc.
insertusernamehere
Je ne sais pas quelles sont les règles avec cela, mais avec une installation PHP par défaut, j'obtiens les avertissements constants non définis attendus en faisant cela
CT14.IT
1
Oui, mais cela correspond parfaitement aux règles du site. Les avis et avertissements peuvent être ignorés.
insertusernamehere
@ CT14.IT, ce n'est pas un avertissement, c'est un avis. «PHP 5.3 ou version ultérieure, la valeur par défaut est E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Ce paramètre n'affiche pas les erreurs de niveau E_NOTICE, E_STRICT et E_DEPRECATED. »- Documentation PHP surerror_reporting .
manatwork
1
Il semble que str_split () soit inutile
Crypto
1

Gelée , 55 octets

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

Essayez-le en ligne! (Indice basé sur 1)

Allons! Vraiment?

En prime, voici la chaîne compressée que je devais utiliser à la place de la ligne supérieure:

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

Les deux codent cette chaîne:

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

Je suppose que je devrais faire de l'exercice maintenant: P

Erik le golfeur
la source
1

Powershell, 91 octets, indexé zéro

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

Approche très simple, générez le tableau des 22 premiers éléments en utilisant une multiplication de chaînes si possible, en les compilant avec des espaces et en les séparant à la fin. (le fractionnement est 2 octets plus court que la configuration équivalente en tant que tableau), puis il suffit de trouver le point dans ce tableau en utilisant le module de l'entrée, pas exactement intéressant ou spécifique à la langue.

Cas de test:

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.

colsw
la source
1

rubis, 81 octets

Fonction lambda utilisant l'indexation zéro.

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

explication

Nous générons le tableau suivant, dont nous utilisons les 16 premiers éléments, couvrant les lignes 2,3,3,4 correctes de la chanson:

%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

Nous prenons n modulo 22 pour le réduire à un seul verset, puis nous soustrayons 6. L'index 6 (par exemple) a maintenant été changé en 0 et pointe vers le bon mot. Indique 0..5 qui pointent vers la première ligne du morceau sont désormais négatifs. Nous utilisons &15(identique à %16mais évite le besoin de crochets) pour mapper la 1ère ligne de la chanson à la 4ème ligne. Ainsi index 0-> -6->10

dans le programme de test

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]}
Level River St
la source
Formule d'index intéressante. Mais la même longueur peut être atteinte sans cela:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
manatwork
1

Befunge, 129 119 octets

0 indexé

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

Essayez-le en ligne!

Explication

Comme Arnauld l'a souligné, les mots viennent par paires, nous avons donc un index de seulement 11 valeurs, puis ajoutons le mot numéro% 2 pour obtenir le mot approprié dans la paire. Les mots sont poussés sur la pile sous la forme d'une chaîne unique séparée par des astérisques pour économiser de l'espace. Nous testons les sauts de mots en prenant la valeur de caractère modulo 7, car seul l'astérisque est un multiple 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)
James Holderness
la source
1

SQL 2005 747 octets

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

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

A besoin d'une table comme celle-ci, où la première colonne est auto-incrémentée:

entrez la description de l'image ici

Il s'agit d'une réponse à un index. Le tableau est rempli la première fois que la procédure stockée est créée - cela ne me permettrait pas de faire tout cela INSERTdans une seule instruction, malheureusement, cette fonctionnalité n'est disponible qu'en >=SQL 2008. Après cela, il utilise l' %22astuce des autres réponses. Une fois le tableau rempli, il n'utilise que la dernière partie:

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
Pete Arden
la source
" ça ne me laisserait pas faire tout l'INSERT en une seule déclaration " pourquoi? Cela ne devrait-il pas être possible dans SQL après 2008?
Kevin Cruijssen du
@KevinCruijssen J'utilise SQL Server 2008 R2, donc c'est étrange ... Je viens de faire un peu plus de recherche sur Google, apparemment c'est quelque chose à voir avec le "niveau de compatibilité" de la base de données, que je viens d'essayer et d'échouer à changer - il est réglé sur 2005 et c'est la valeur maximale, donc il n'a pas cette fonctionnalité. Dois-je soit spécifier la version SQL dans ma réponse, soit supprimer la réponse si elle ne peut pas être raccourcie correctement? Éviscéré car cela me ferait économiser beaucoup de texte ...
Pete Arden
Soit je vais bien, alors c'est votre appel. Personnellement, je joue généralement au golf en Java 7 que je spécifie, car dans la plupart des cas, des réponses plus courtes sont disponibles en Java 8. Vous pouvez spécifier que c'est 2005 de la même manière.
Kevin Cruijssen
@KevinCruijssen Oui, j'ai vu des gens faire ça pour Java et Python. Je ne voudrais pas vraiment faire le changement sans pouvoir tester le code non plus, donc je vais préciser 2005, bravo :)
Pete Arden
1

bash (avec ed), 83 caractères

1 indexé

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

Exemple d'appel:

 $ bash test.sh 1001
 knees
Adam
la source
1

DC , 135 octets

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

Essayez-le en ligne!

Les tableaux dcdoivent être construits un élément à la fois, ce qui prend le poids de cet exercice. Étant donné que les «yeux», les «oreilles», la «bouche» et le «nez» n'apparaissent qu'une seule fois dans notre tableau, nous les insérons simplement. Mais pour les autres, nous économisons quelques octets en les mettant sur la pile comme x[head]x, où x est le milieu de ses trois valeurs, puis nous exécutons la macro [:add6-r;ar:adA+r;ar:a]dshxpour la placer dans le tableau, la retirer, la remettre à la même valeur moins six, la retirer, puis la remettre une dernière fois à la valeur d'origine plus dix. Nous utilisons la valeur moyenne parce quedc nous permet d'utiliser des chiffres hexadécimaux même en mode décimal, et la soustraction Aest un octet de moins que l'ajout16- cela ne fonctionne que parce que toutes les valeurs moyennes sont inférieures à quinze. Nous devons faire les genoux et les orteils deux fois, et rendre notre macro suffisamment intelligente pour trier cela est plus cher que de simplement exécuter la macro deux fois; mais nous économisons des octets ici en chargeant une copie de la chaîne précédemment stockée au lieu de la réécrire ( B 3;aBvs B[toes]B- je pense que cela économise 3 octets au total).

Une fois que nous avons construit le tableau, tout ce que nous devons faire est 22%, puis ;apde le tirer à partir du tableau et d' impression.

brhfl
la source
0

C # 6, 138 octets

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

démo repl.it

Ungolfed + commentaires:

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];
Link Ng
la source
Vous pouvez combiner la chaîne et en utiliser un seul Split, et avoir votre même vérification que ternary ( ?:) entre crochets (avec +4pour la deuxième partie), comme ceci: 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 octets )
Kevin Cruijssen
0

Excel, 146 octets

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

Utilise @ Neil's MOD(MOD(MOD(B1+16,22),16),10)pour économiser des 15octets.

Wernisch
la source