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 Code-Golf , 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
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
quelle
quelle
kolmogorov-complexity
fü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.inquestion:2140 shoulders
.Antworten:
05AB1E ,
363534 BytesProbieren Sie es online! oder als Testsuite
Erläuterung
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).quelle
‡ä¾ØsÏ©s¸±s
wirkt komisch, wenn man bedenkt, dass jedes Wort 2 Zeichen hat. Ist es etwas anderess
sind da, um zu pluralisieren,shoulder, knee, toe
die im Wörterbuch Singular sind. Wir brauchen das nicht mit,eyes, ears
da sie bereits im Wörterbuch pluralisiert sind, so dass der String die erwartete gerade Länge hat.JavaScript (ES6),
918887 ByteWie 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:
Komprimieren Sie die gesamte Sequenz (in umgekehrter Reihenfolge) in die folgende Binärmaske:
Wir gebrauchen
[ 'knees', 'toes' ]
als erstes Paar so viele führende Nullen wie möglich.Wir füllen diese Sequenz mit einem Extra auf,
0
sodass der extrahierte Wert mit 2 vormultipliziert wird, was zu Folgendem führt:Daher die endgültige Formel für das richtige Wort:
Testfälle
Code-Snippet anzeigen
quelle
Python 2,
158148137128114109104 BytesNachschlagetabelle 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.
Anfangslösung:
quelle
hskteemnehnoyaooaoeeerusduessste ls h d
und dann 'ers' anhängen, wenn Sie wissen, dass das Wort 'shoulders' sein soll :)c=int('602323'*2+'4517602323'[input()%22])
dieh
c:[i%22]
am ersten,[input()%22]
am zweitenPerl, 74 Bytes
73 Byte Code + 1 für
-p
.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 .
quelle
x2)x2
anstelle vonx2),@a
Python 2,
9790 BytesMöglicherweise gibt es ein bisschen Mathe, sodass ich die Wortliste nicht erstellen muss, aber das funktioniert erstmal!
Danke an Flp.Tkc für das Speichern von 7 Bytes :)
quelle
split()
kürzer gemacht:k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 Bytes-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.
Ausgabe:
quelle
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.C
153 Bytes141 BytesVielen 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:
Es ist nicht die kleinste Antwort, aber ich mochte die Technik und hatte Spaß, ein paar Muster zu finden.
Änderungsprotokoll:
b
nach global um zu vermeidenchar
(4 Bytes)a > 11 && a < 16
=>(a & 12) > 8
(2 Bytes)i=(a-6)%10
=>i=(a+4)%10
so dassi < 2 && i >= 0
=>i < 2
(6 Bytes)quelle
*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&&
in ändern&
.JavaScript (ES6)
9189 Bytesquelle
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 Bytes
Erstellt einen Zeichenvektor als Nachschlagetabelle. Übernimmt die Eingabe von stdin (
1-indexed
) und%%22
sucht 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
scan
sie auf R-Geige nicht funktioniert)quelle
80 Zeichen
(77 Zeichen Code + 3 Zeichen Befehlszeilenoption)
Probelauf:
Online-Test (Die Weitergabe
-r
über eine URL wird nicht unterstützt. Prüfen Sie die Raw-Ausgabe selbst.)quelle
WinDbg,
207157151 Bytes-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:
Beispielausgabe:
quelle
PHP, 91
102118128129Bytes0-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 zuzulassenquelle
'
'head'
head
error_reporting
.Jelly , 55 Bytes
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:
Beide kodieren diesen String:
Ich schätze, ich sollte jetzt trainieren gehen: P
quelle
Powershell, 91 Bytes, Zero-Indexed
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:
etc.
quelle
Rubin, 81 Bytes
Lambda-Funktion mit Null-Indexierung.
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:
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,%16
aber ohne Klammern), um die 1. Zeile des Songs der 4. Zeile zuzuordnen. Also index0
->-6
->10
im Testprogramm
quelle
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 Bytes0-indiziert
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.
quelle
SQL 2005 747 Bytes
Golf gespielt:
Ungolfed:
Benötigt eine Tabelle wie diese, in der die erste Spalte automatisch inkrementiert wird:
Dies ist eine einseitige Antwort. Die Tabelle wird gefüllt, wenn die erste gespeicherte Prozedur erstellt wird. Ich würde nicht alle
INSERT
in einer Anweisung ausführen. Enttäuschenderweise ist diese Funktion nur in verfügbar>=SQL 2008
. Danach verwendet es den%22
Trick aus den anderen Antworten. Sobald die Tabelle gefüllt wurde, wird nur der letzte Teil verwendet:quelle
Bash (mit Ed), 83 Zeichen
1-indiziert
Beispielanruf:
quelle
dc , 135 Bytes
Probieren Sie es online!
Arrays in
dc
mü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, dadc
wir selbst im Dezimalmodus hexadezimale Ziffern verwenden können und das SubtrahierenA
ein 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 (imB 3;aB
Gegensatz zuB[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;ap
es aus dem Array und Druck zu ziehen.quelle
C # 6, 138 Bytes
Repl.it Demo
Ungolfed + Kommentare:
quelle
Split
und das gleiche Häkchen wie ternary (?:
) in den eckigen Klammern (mit+4
für den zweiten Teil) wiestring 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];
Excel, 146 Bytes
Verwendet @ Neil
MOD(MOD(MOD(B1+16,22),16),10)
zum Speichern von15
Bytes.quelle