Kopf, Schultern, Knie und Zehen, Knie und Zehen


31

Einführung:

Ich denke, wir alle wissen es und es wurde wahrscheinlich in viele verschiedene Sprachen übersetzt: das Kinderlied "Kopf, Schultern, Knie und Zehen":

Kopf, Schultern, Knie und Zehen, Knie und Zehen
Kopf, Schultern, Knie und Zehen, Knie und Zehen
Und Augen und Ohren und Mund und Nase
Kopf, Schultern, Knie und Zehen, Knie und Zehen
wikipedia


Herausforderung:

Eingabe: Eine positive ganze Zahl.

Ausgabe: Gibt eines der folgenden Wörter basierend auf der Eingabe als n-ten Index aus:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Hier werden die Körperteile mit den Indizes angehängt:

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.

Herausforderungsregeln:

  • Natürlich dürfen Sie anstelle von 0-indizierten Eingaben auch 1-indizierte Eingaben verwenden. Bitte geben Sie jedoch an, welche Sie in Ihrer Antwort verwendet haben.
  • Bei der Ausgabe wird die Groß- und Kleinschreibung nicht berücksichtigt. Wenn Sie die Ausgabe also in Groß- und Kleinschreibung vornehmen möchten, ist dies in Ordnung.
  • Sie sollten Eingaben bis zu mindestens 1.000 unterstützen.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle (0-indiziert):

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

3
Das kolmogorov-Komplexitäts-Tag wurde hinzugefügt, da die meisten Antworten die Eingabe wahrscheinlich als zyklischen Index für ein konstantes Array verwenden, dessen Erzeugung die Byteanzahl dominiert.
Martin Ender

@ MartinEnder Danke. Ich habe fälschlicherweise nur kolmogorov-complexityfür Antworten verwendet, die immer die gleiche feste Ausgabe haben, aber jetzt sehe ich, dass es um feste Ausgabezeichenfolgen im Code geht und um Muster, mit denen man Golf spielen kann (oder um sie wie bei @ Enigmas 05AB1E-Antwort zu codieren ). Vielen Dank für das Hinzufügen; Ich war mir nicht sicher, welche Tags für diese Herausforderung relevant waren, was eine meiner (leider nicht beantworteten) Fragen in der Sandbox war.
Kevin Cruijssen


1
@KevinCruijssen Zumindest hat deine Frage ein paar +1 gefangen :) (optimistische Bemerkung) Du kannst mit in der Sandbox suchen inquestion:2140 shoulders.
Erik der Outgolfer

3
Hat jemand anderes dieses Lied den ganzen Tag im Kopf
festgehalten

Antworten:


12

05AB1E , 36 35 34 Bytes

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

Probieren Sie es online! oder als Testsuite

Erläuterung

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

Kurz gesagt, wir bauen die Liste auf ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']und indizieren sie mit Eingabe (0-indiziert).


4
@ KevinCruijssen: Eine Erklärung wird kommen :) Es ist ziemlich obligatorisch für Golf-Sprachen imo.
Emigna

‡ä¾ØsÏ©s¸±swirkt komisch, wenn man bedenkt, dass jedes Wort 2 Zeichen hat. Ist es etwas anderes
Erik der Outgolfer

2
@EriktheGolfer: Ja, die 3 ssind da, um zu pluralisieren, shoulder, knee, toedie im Wörterbuch Singular sind. Wir brauchen das nicht mit, eyes, earsda sie bereits im Wörterbuch pluralisiert sind, so dass der String die erwartete gerade Länge hat.
Emigna

Oh, sie haben mich verwirrt. Vielen Dank.
Erik der Outgolfer

31

JavaScript (ES6), 91 88 87 Byte

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

Wie es funktioniert

Wir haben 4 verschiedene Wortpaare, die immer zusammen vorkommen: Auf "Kopf" folgt immer "Schultern", auf "Knie" folgt immer "Zehen" usw.

Daher können wir den folgenden Index verwenden:

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

Komprimieren Sie die gesamte Sequenz (in umgekehrter Reihenfolge) in die folgende Binärmaske:

00 00 01 11 10 00 00 01 00 00 01

Wir gebrauchen [ 'knees', 'toes' ] als erstes Paar so viele führende Nullen wie möglich.

Wir füllen diese Sequenz mit einem Extra auf, 0sodass der extrahierte Wert mit 2 vormultipliziert wird, was zu Folgendem führt:

0b00000111100000010000010 = 245890

Daher die endgültige Formel für das richtige Wort:

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

Testfälle


10

Python 2, 158 148 137 128 114 109 104 Bytes

Nachschlagetabelle scheint besser. Verkürzte auch die große Zeichenfolge und ordnete die Elemente neu. -5 Bytes danke an Rod für die Verwendung von String als Liste.

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

Anfangslösung:

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
Sehr originelle Antwort! +1. Aber die meisten Antworten, die die vollständigen Zeichenfolgen verwenden, sind kürzer als diese. Trotzdem gefällt mir der Preis, den Sie für ein Muster in den Saiten haben! Chapeau dafür.
Kevin Cruijssen

Ich denke, Sie können diese Schulter machen, indem Sie die Zeichenfolge so machen: hskteemnehnoyaooaoeeerusduessste ls h dund dann 'ers' anhängen, wenn Sie wissen, dass das Wort 'shoulders' sein soll :)
Kade

1
Sie können einfach c=int('602323'*2+'4517602323'[input()%22])die hc:
Stange

1
[i%22]am ersten, [input()%22]am zweiten
Rod

1
@ Rod Ah sorry, wenn du dir deinen Code lange genug ansiehst, wirst du blind.
Karl Napf

6

Perl, 74 Bytes

73 Byte Code + 1 für -p.

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

Verwendet eine 0-basierte Indizierung. Gibt kein Trennzeichen aus, kann aber mit geändert werden-l in den Flags werden.

Probieren Sie es online aus .


Sie können 1 Byte mit x2)x2anstelle vonx2),@a
Adam

4

Python 2, 97 90 Bytes

Möglicherweise gibt es ein bisschen Mathe, sodass ich die Wortliste nicht erstellen muss, aber das funktioniert erstmal!

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

Danke an Flp.Tkc für das Speichern von 7 Bytes :)


1
Ich habe eine ähnliche Lösung, habe sie aber früher split()kürzer gemacht:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack

Entschuldigung, es sollte ein Leerzeichen nach der 'Nase' sein :)
FlipTack

@ Flp.Tkc Ja, das hatte ich gerade gemerkt :) Aktualisierung in einer Sekunde!
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 dank @Neil .
-1 Byte, indem schamlos ein Port von @Arnauld 's erstaunlicher Antwort erstellt wird .

Java ist 0-indiziert, also habe ich das verwendet.

Ungolfed & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

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];}ist nur 112 Bytes.
Neil

Wenn Sie versuchen, den Kommentar zu kopieren, erhalten Sie einige zusätzliche unsichtbare Bytes mit freundlicher Genehmigung von Stack Exchange.
Neil

@Neil Ok, ich bin ein Idiot .. Keine Ahnung, wie ich gestern abend zu spät rau 120 gezählt habe .. Es war wahrscheinlich zu spät ..>.> Wie auch immer, ich habe es bearbeitet (plus 1 zusätzliches Byte durch Entfernen des space), also danke!
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];}

Vielen Dank an @cleblanc für 4 Bytes. Wenn Sie "b" global deklarieren, werden eine Menge Warnungen bezüglich des Castings auf "int" ausgegeben, die aber für mich nicht unterbrochen wurden.

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

Es ist nicht die kleinste Antwort, aber ich mochte die Technik und hatte Spaß, ein paar Muster zu finden.

Änderungsprotokoll:

  • Verschoben bnach global um zu vermeiden char(4 Bytes)
  • a > 11 && a < 16=> (a & 12) > 8(2 Bytes)
  • i=(a-6)%10=> i=(a+4)%10so dass i < 2 && i >= 0=> i < 2(6 Bytes)

1
Sie können dies ein bisschen weiter unten Golf spielen. Indem Sie b [] in einen globalen Bereich verschieben, können Sie es deklarieren, ohne char * zu verwenden. *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'Ersetzen Sie dann [...] den Rückgabewert b durch put (b). Sie können es auf 143 Byte
Cleblanc

+1 Und zusätzlich zu @cleblancs Vorschlag können Sie auch beides &&in ändern &.
Kevin Cruijssen

Ich bin gespannt, wie der @cleblanc-Vorschlag, b global zu deklarieren, funktioniert. Der Compiler sagte mir, dass es sich um ein * int [] handeln würde, und ich dachte, dass der Größenunterschied den Code sprengen würde. Hat es aber nicht, also danke!
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
Nett! +1. Wenn ich Ihre Antwort auf Java 7 portiere, sind es solide -7 Bytes, verglichen mit der Antwort von @ Arnauld, die bereits kürzer ist als meine. ;) Vielen Dank!
Kevin Cruijssen

1
Ich sparte ein Byte von dem mit meinem Einsatz kreativ zu sein %: 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]

Erstellt einen Zeichenvektor als Nachschlagetabelle. Übernimmt die Eingabe von stdin ( 1-indexed) und %%22sucht das entsprechende Körperteil.

Bonus: %% ist vektorisiert, was bedeutet, dass dies auch mit Vektoreingaben funktioniert.

Testfälle auf R-Geige (Beachten Sie, dass dies eine benannte Funktion ist, da scansie auf R-Geige nicht funktioniert)


2

80 Zeichen

(77 Zeichen Code + 3 Zeichen Befehlszeilenoption)

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

Probelauf:

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

Online-Test (Die Weitergabe -rüber eine URL wird nicht unterstützt. Prüfen Sie die Raw-Ausgabe selbst.)


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 durch Codierung des Offsets / der Länge der Körperteile als ASCII-Zeichen.

-6 Bytes unter Verwendung einer lokalen Variable beim Nachschlagen des Offsets / der Länge.

Die Eingabe erfolgt mit einem im Pseudoregister eingestellten Wert $t0.

Wie es funktioniert:

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

Beispielausgabe:

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

Bis auf 91 nach dem Entfernen von str_split wurde nicht erkannt, dass PHP-Zeichenfolgen als Zeichen-Array verfügbar sind (eine PHP 5+ -Dinge?)

Bis auf 102 dank des Vorschlags, Benutzernamen einzufügen, um Anführungszeichen zu entfernen und die Hinweise zuzulassen


-16 Bytes: Entferne alle ''head'head
umstehenden

Ich bin mir nicht sicher, wie die Regeln lauten, aber bei einer standardmäßigen PHP-Installation erhalte ich die erwarteten undefinierten konstanten Warnungen, wenn ich das tue
CT14.IT

1
Ja, aber das ist absolut in Ordnung mit den Regeln der Site. Hinweise und Warnungen können ignoriert werden.
Insertusernamehere

@ CT14.IT, das ist keine Warnung, ist ein Hinweis. “PHP 5.3 oder höher ist der Standardwert E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Diese Einstellung zeigt keine Fehler auf den Ebenen E_NOTICE, E_STRICT und E_DEPRECATED. ”- PHP-Dokumentation zuerror_reporting .
Manatwork

1
Es scheint, dass str_split () nutzlos ist
Crypto

1

Jelly , 55 Bytes

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

Probieren Sie es online!(1-basierter Index)

Komm schon! "Ja wirklich?"

Als Bonus ist dies die komprimierte Zeichenfolge, die ich anstelle der obersten Zeile verwenden sollte:

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

Beide kodieren diesen String:

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

Ich schätze, ich sollte jetzt trainieren gehen: P


1

Powershell, 91 Bytes, Zero-Indexed

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

Generieren Sie ganz einfach das Array der ersten 22 Elemente, indem Sie nach Möglichkeit eine Zeichenfolgenmultiplikation verwenden, indem Sie sie mit Leerzeichen kompilieren und am Ende aufteilen. (Die Aufteilung ist 2 Byte kürzer als die entsprechende Anordnung als Array). Suchen Sie dann den Punkt in diesem Array anhand des Eingabemoduls, der nicht unbedingt interessant oder sprachspezifisch ist.

Testfall:

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

Rubin, 81 Bytes

Lambda-Funktion mit Null-Indexierung.

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

Erläuterung

Wir erzeugen das folgende Array, von dem wir die ersten 16 Elemente verwenden und die korrekten Zeilen 2,3,4 des Songs abdecken:

%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

Wir nehmen n modulo 22, um es auf einen einzigen Vers zu reduzieren, dann subtrahieren wir 6. Jetzt wurde der Index 6 (zum Beispiel) auf 0 geändert und zeigt auf das richtige Wort. Indizien 0..5, die auf die erste Zeile des Songs zeigen, sind jetzt negativ. Wir verwenden &15(identisch mit, %16aber ohne Klammern), um die 1. Zeile des Songs der 4. Zeile zuzuordnen. Also index 0-> -6->10

im Testprogramm

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

Interessante Indexformel. Aber die gleiche Länge kann auch ohne erreicht werden:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Manatwork 18.11.16

1

Befunge, 129 119 Bytes

0-indiziert

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

Probieren Sie es online!

Erläuterung

Wie Arnauld betonte, kommen die Wörter paarweise vor, sodass wir einen Index von nur 11 Werten haben und dann die Wortnummer% 2 addieren, um das entsprechende Wort im Paar zu erhalten. Die Wörter werden als einzelne Zeichenfolge, die durch Sternchen getrennt sind, auf den Stapel geschoben, um Platz zu sparen. Wir testen auf Wortumbrüche, indem wir den Zeichenwert modulo 7 verwenden, da nur das Sternchen ein Vielfaches von 7 ist.

&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

Golf gespielt:

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

Benötigt eine Tabelle wie diese, in der die erste Spalte automatisch inkrementiert wird:

Bildbeschreibung hier eingeben

Dies ist eine einseitige Antwort. Die Tabelle wird gefüllt, wenn die erste gespeicherte Prozedur erstellt wird. Ich würde nicht alle INSERTin einer Anweisung ausführen. Enttäuschenderweise ist diese Funktion nur in verfügbar >=SQL 2008. Danach verwendet es den %22Trick aus den anderen Antworten. Sobald die Tabelle gefüllt wurde, wird nur der letzte Teil verwendet:

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

" es würde mich nicht alle INSERT in einer Anweisung machen lassen " warum? Sollte nicht etwas wie dies möglich sein , in SQL nach 2008?
Kevin Cruijssen

@KevinCruijssen Ich verwende SQL Server 2008 R2, also ist es seltsam ... Ich habe gerade etwas mehr gegoogelt, anscheinend hat das etwas mit der "Kompatibilitätsstufe" der Datenbank zu tun, die ich gerade ausprobiert habe und die fehlgeschlagen ist zu ändern - es ist auf 2005 eingestellt und dies ist der Maximalwert, daher hat es diese Funktion nicht. Soll ich entweder die SQL-Version in meiner Antwort angeben oder die Antwort löschen, wenn sie nicht richtig gekürzt werden kann? Ausgenommen, das würde mir viel Text ersparen ...
Pete Arden

Entweder geht es mir gut, also ist es dein Anruf. Ich persönlich spiele normalerweise in Java 7, das ich spezifiziere, weil in den meisten Fällen kürzere Antworten in Java 8 verfügbar sind. Sie können das Jahr 2005 auf die gleiche Weise spezifizieren.
Kevin Cruijssen

@ KevinCruijssen Ja, ich habe Leute gesehen, die das für Java und Python gemacht haben. Ich möchte die Änderung nicht wirklich vornehmen, ohne in der Lage zu sein, den Code zu testen, daher werde ich 2005 spezifizieren, Prost :)
Pete Arden

1

Bash (mit Ed), 83 Zeichen

1-indiziert

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

Beispielanruf:

 $ 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

Probieren Sie es online!

Arrays in dcmüssen jeweils als Element erstellt werden, was den Hauptteil dieser Übung ausmacht. Da "Augen", "Ohren", "Mund" und "Nase" in unserem Array nur einmal vorkommen, fügen wir sie einfach ein. Bei den anderen sparen wir ein paar Bytes, indem wir sie wie auf den Stapel legenx[head]x : wobei x Ist der mittlere seiner drei Werte, führen wir das Makro aus [:add6-r;ar:adA+r;ar:a]dshx, um es in das Array einzufügen, es zurückzunehmen, es mit dem gleichen Wert abzuspielen, abzuspielen und es dann ein letztes Mal mit dem ursprünglichen Wert einzufügen plus zehn. Wir verwenden den mittleren Wert, da dcwir selbst im Dezimalmodus hexadezimale Ziffern verwenden können und das Subtrahieren Aein Byte weniger ist als das Addieren16- Das funktioniert auch nur, weil alle Mittelwerte unter fünfzehn liegen. Wir müssen zweimal Knie und Zehen machen, und es ist teurer, unser Makro klug genug zu machen, um das zu klären, als es nur zweimal auszuführen. Aber wir sparen hier Bytes, indem wir eine zuvor gespeicherte Kopie des Strings laden, anstatt ihn erneut auszuschreiben (im B 3;aBGegensatz zu B[toes]B- ich denke, das spart insgesamt 3 Bytes).

Sobald wir das Array aufgebaut haben, alles , was wir tun müssen , ist 22%und dann ;apes aus dem Array und Druck zu ziehen.


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

Repl.it Demo

Ungolfed + Kommentare:

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

Sie können die Zeichenfolge kombinieren und eine einzelne verwenden Splitund das gleiche Häkchen wie ternary ( ?:) in den eckigen Klammern (mit +4für den zweiten Teil) wie 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];
folgt setzen

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)

Verwendet @ Neil MOD(MOD(MOD(B1+16,22),16),10)zum Speichern von 15Bytes.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.