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 code-golf , 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
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
la source
la source
kolmogorov-complexity
des 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.inquestion:2140 shoulders
.Réponses:
05AB1E ,
363534 octetsEssayez-le en ligne! ou en tant que suite de tests
Explication
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).la source
‡ä¾ØsÏ©s¸±s
semble bizarre, étant donné que chaque mot est composé de 2 caractères. Est-ce autre chose?s
sont là pour pluralisershoulder, knee, toe
qui sont singuliers dans le dictionnaire. Nous n'avons pas besoin de celaeyes, ears
car ils sont déjà pluralisés dans le dictionnaire, de sorte que la chaîne a la même longueur attendue.JavaScript (ES6),
918887 octetsComment ç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:
Et compressez toute la séquence (dans l'ordre inverse) dans le masque binaire suivant:
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
0
afin que la valeur extraite soit prémultipliée par 2, ce qui conduit à:D'où la formule finale pour le mot correct:
Cas de test
Afficher l'extrait de code
la source
Python 2,
158148137128114109104 octetsLa 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.
solution initiale:
la source
hskteemnehnoyaooaoeeerusduessste ls h d
puis en ajoutant «ers» si vous savez que le mot est censé être «épaules» :)c=int('602323'*2+'4517602323'[input()%22])
et déposer leh
c:[i%22]
le premier,[input()%22]
le deuxièmePerl, 74 octets
73 octets code + 1 pour
-p
.Utilise l'indexation basée sur 0. N'affiche pas de séparateur, mais cela pourrait être modifié avec
-l
dans les drapeaux.Essayez-le en ligne .
la source
x2)x2
au lieu dex2),@a
Python 2,
9790 octetsIl 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!
Merci à Flp.Tkc pour avoir économisé 7 octets :)
la source
split()
je la raccourcissais:k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 octets-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.
Sortie:
la source
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.C,
153 octets141 octetsMerci à @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:
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:
b
vers global pour éviterchar
(4 octets)a > 11 && a < 16
=>(a & 12) > 8
(2 octets)i=(a-6)%10
=>i=(a+4)%10
pour quei < 2 && i >= 0
=>i < 2
(6 octets)la source
*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&&
en&
.JavaScript (ES6)
9189 octetsla source
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 octets
Crée un vecteur de caractères pour fonctionner comme une table de recherche. Prend l'entrée de stdin (
1-indexed
) et%%22
pour 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
scan
elle ne fonctionne pas sur R-fiddle)la source
jq, 80 caractères
(Code de 77 caractères + option de ligne de commande de 3 caractères)
Échantillon échantillon:
Test en ligne (le passage
-r
par l'URL n'est pas pris en charge - vérifiez vous-même la sortie brute.)la source
WinDbg,
207157151 151 octets-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:
Exemple de sortie:
la source
PHP, 91
102118128129 129octets0 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 notificationsla source
'
mots autour, comme'head'
devienthead
etc.error_reporting
.Gelée , 55 octets
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:
Les deux codent cette chaîne:
Je suppose que je devrais faire de l'exercice maintenant: P
la source
Powershell, 91 octets, indexé zéro
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:
etc.
la source
rubis, 81 octets
Fonction lambda utilisant l'indexation zéro.
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:
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 à%16
mais évite le besoin de crochets) pour mapper la 1ère ligne de la chanson à la 4ème ligne. Ainsi index0
->-6
->10
dans le programme de test
la source
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 octets0 indexé
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.
la source
SQL 2005 747 octets
Golfé:
Ungolfed:
A besoin d'une table comme celle-ci, où la première colonne est auto-incrémentée:
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
INSERT
dans une seule instruction, malheureusement, cette fonctionnalité n'est disponible qu'en>=SQL 2008
. Après cela, il utilise l'%22
astuce des autres réponses. Une fois le tableau rempli, il n'utilise que la dernière partie:la source
bash (avec ed), 83 caractères
1 indexé
Exemple d'appel:
la source
DC , 135 octets
Essayez-le en ligne!
Les tableaux
dc
doivent ê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 commex[head]x
, où x est le milieu de ses trois valeurs, puis nous exécutons la macro[:add6-r;ar:adA+r;ar:a]dshx
pour 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 soustractionA
est 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;aB
vsB[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;ap
de le tirer à partir du tableau et d' impression.la source
C # 6, 138 octets
démo repl.it
Ungolfed + commentaires:
la source
Split
, et avoir votre même vérification que ternary (?:
) entre crochets (avec+4
pour 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 )Excel, 146 octets
Utilise @ Neil's
MOD(MOD(MOD(B1+16,22),16),10)
pour économiser des15
octets.la source