Testa, spalle, ginocchia e dita dei piedi, ginocchia e dita dei piedi


31

Introduzione:

Penso che lo sappiamo tutti, ed è stato probabilmente tradotto in molte lingue diverse: la canzone per bambini "Head, Shoulders, Knees and Toes":

Testa, spalle, ginocchia e dita dei piedi, ginocchia e dita dei piedi
Testa, spalle, ginocchia e dita dei piedi, ginocchia e dita dei piedi
E occhi e orecchie e bocca e naso
Testa, spalle, ginocchia e dita dei piedi, ginocchia e dita dei piedi
wikipedia


Sfida:

Input: un numero intero positivo.

Output: genera una delle seguenti parole in base all'input come n-esimo indice:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Qui le parti del corpo sono aggiunte con gli indici:

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.

Regole della sfida:

  • Ovviamente ti è consentito utilizzare input con 1 indice anziché 0 con indice. Ma specifica quale hai usato nella tua risposta.
  • L'output non fa distinzione tra maiuscole e minuscole, quindi se vuoi riprodurlo in maiuscolo va bene.
  • Dovresti supportare input fino ad almeno 1.000.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si prega di aggiungere una spiegazione, se necessario.

Casi di test (indicizzati 0):

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

3
Aggiunto il tag di complessità kolmogorov poiché la maggior parte delle risposte utilizzerà probabilmente l'input come indice ciclico in un array costante, la cui generazione dominerà il conteggio dei byte.
Martin Ender,

@MartinEnder Grazie. Io, erroneamente, ho usato solo kolmogorov-complexityper risposte che hanno sempre lo stesso output fisso, ma ora vedo che si tratta di stringhe di output fisse nel codice e di trovare schemi per golfarlo (o codificarlo come con la risposta 05AB1E di @ Enigma ). Grazie per averlo aggiunto; Non ero troppo sicuro di quali tag fossero rilevanti per questa sfida, che era una delle mie domande (purtroppo senza risposta) nella Sandbox.
Kevin Cruijssen,


1
@KevinCruijssen Almeno la tua domanda ha catturato alcuni +1: (osservazione ottimistica) Puoi cercare nella sandbox usando inquestion:2140 shoulders.
Erik the Outgolfer,

3
Qualcun altro ha avuto questa canzone bloccata in testa tutto il giorno? ...
Kevin Cruijssen,

Risposte:


12

05AB1E , 36 35 34 byte

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

Provalo online! o come una suite di test

Spiegazione

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

In breve, costruiamo l'elenco ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']e lo indicizziamo con input (0-indicizzato).


4
@KevinCruijssen: Una spiegazione sta arrivando :) È piuttosto obbligatorio per le lingue da golf imo.
Emigna,

‡ä¾ØsÏ©s¸±ssembra strano, considerando che ogni parola ha 2 caratteri. È qualcos'altro?
Erik the Outgolfer,

2
@EriktheGolfer: Sì, i 3 ssono lì per pluralizzare shoulder, knee, toeche sono singolari nel dizionario. Non ne abbiamo bisogno con eyes, earspoiché sono già pluralizzati nel dizionario in modo che la stringa abbia la lunghezza pari prevista.
Emigna,

Oh, mi hanno confuso. Grazie.
Erik the 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]

Come funziona

Abbiamo 4 distinte coppie di parole che appaiono sempre insieme: "testa" è sempre seguita da "spalle", "ginocchia" è sempre seguita da "dita dei piedi", ecc.

Pertanto, possiamo usare il seguente indice:

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

E comprimi l'intera sequenza (in ordine inverso) nella seguente maschera binaria:

00 00 01 11 10 00 00 01 00 00 01

Usiamo [ 'knees', 'toes' ]come prima coppia per ottenere il maggior numero possibile di zeri iniziali.

Riempiamo questa sequenza con un extra in 0modo che il valore estratto sia moltiplicato per 2, il che porta a:

0b00000111100000010000010 = 245890

Da qui la formula finale per la parola corretta:

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

Casi test


10

Python 2, 158 148 137 128 114 109 104 byte

La tabella di ricerca sembra migliore. Accorciava anche la corda grande e riordinava gli oggetti. -5 byte grazie a Rod per l'utilizzo della stringa come elenco.

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

soluzione iniziale:

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
Risposta molto originale! +1. Ma, umm ..., la maggior parte delle risposte che usano le stringhe complete sono più brevi di questa. Tuttavia, mi piace il costo che hai preso per vedere una sorta di schema nelle corde! Chapeau per quello.
Kevin Cruijssen,

Penso che puoi fare questa spalla creando questa stringa: hskteemnehnoyaooaoeeerusduessste ls h de poi aggiungendo 'ers' se sai che la parola dovrebbe essere 'spalle' :)
Kade,

1
puoi semplicemente usare c=int('602323'*2+'4517602323'[input()%22])e rilasciare il hc:
Rod

1
[i%22]il primo, [input()%22]il secondo
Rod,

1
@Rod Ah scusa, se guardi il tuo codice abbastanza a lungo diventi cieco.
Karl Napf,

6

Perl, 74 byte

73 byte codice + 1 per -p.

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

Utilizza l'indicizzazione basata su 0. Non genera un separatore, ma potrebbe essere modificato con -ltra i flag.

Provalo online .


puoi salvare 1 byte con x2)x2invece dix2),@a
Adam

4

Python 2, 97 90 byte

Potrebbe esserci un po 'di matematica che lo rende così non devo fare la lista delle parole, ma per ora funziona!

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

Grazie a Flp.Tkc per aver salvato 7 byte :)


1
Avevo una soluzione simile, ma split()per renderla più breve:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack

scusa, ci dovrebbe essere uno spazio dopo il 'naso' lì :)
FlipTack

@ Flp.Tkc Sì, me ne ero appena reso conto :) Aggiornamento in un secondo!
Kade,

4

Java 7, 155 137 131 123 111 110 byte

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

-12 byte grazie a @Neil .
-1 byte creando spudoratamente una porta della sorprendente risposta di @Arnauld .

Java è indicizzato 0, quindi è quello che ho usato.

Codice non testato e test:

Provalo qui.

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

Produzione:

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];}è solo 112 byte.
Neil,

Se si tenta di copiare dal commento si ottengono alcuni byte extra invisibili per gentile concessione di Stack Exchange.
Neil,

@Neil Ok, sono un idiota .. Non ho idea di come ho contato circa 120 ieri sera tardi .. Probabilmente era troppo tardi ..>.> Comunque, l'ho modificato (più 1 byte aggiuntivo rimuovendo il spazio), quindi grazie!
Kevin Cruijssen,

3

C, 153 byte 141 byte

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

Grazie a @cleblanc per 4 byte. Dichiarare b a livello globale lancia un sacco di avvertimenti sul casting a int, ma non si è rotto per me.

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

Non è la risposta più piccola, ma mi è piaciuta la tecnica e mi sono divertito a trovare alcuni schemi.

changelog:

  • Spostato bin globale per evitare char(4 byte)
  • a > 11 && a < 16=> (a & 12) > 8(2 byte)
  • i=(a-6)%10=> in i=(a+4)%10modo che i < 2 && i >= 0=> i < 2(6 byte)

1
Puoi giocare a golf un po 'più in là. Spostando b [] su un ambito globale, può essere dichiarato senza utilizzare char * in questo modo *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'e quindi sostituire il ritorno b [...] con un put (b [...]) per ridurlo a 143 byte
cleblanc,

+1 E oltre al suggerimento di @cleblanc , puoi anche cambiare entrambi &&in &.
Kevin Cruijssen,

Sono curioso di sapere come funziona il suggerimento di @cleblanc sulla dichiarazione b a livello globale. Il compilatore mi ha detto che sarebbe un * int [] e ho pensato che la differenza di dimensioni avrebbe infranto il codice. Non è così, quindi grazie!
nmjcman101,

2

JavaScript (ES6) 91 89 byte

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
Bello! +1. Quando porto la tua risposta a Java 7 è un solido -7 byte rispetto alla risposta già più breve della mia di Arnauld. ;) Grazie!
Kevin Cruijssen,

1
Ho salvato un byte per essere creativi con il mio uso di %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Neil,

2

R, 95 byte

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

Crea un vettore di caratteri per funzionare come tabella di ricerca. Prende input da stdin ( 1-indexed) e %%22per trovare la parte del corpo corrispondente.

Bonus: %%è vettoriale, il che significa che funzionerà anche con input vettoriale.

Casi di test su R-fiddle (Nota che questa è una funzione denominata perché scannon funziona su R-fiddle)


2

jq, 80 caratteri

(Codice 77 caratteri + opzione riga comandi 3 caratteri)

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

Esecuzione di esempio:

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

Test online (il passaggio -rtramite URL non è supportato: controlla tu stesso l'output non elaborato).


2

WinDbg, 207 157 151 byte

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

-50 byte codificando l'offset / lunghezza delle parti del corpo come caratteri ASCII.

-6 byte usando una var locale quando si cerca l'offset / lunghezza.

L'immissione viene effettuata con un valore impostato nello pseudo-registro $t0.

Come funziona:

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

Uscita campione:

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 byte

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

0-indicizzato

Fino a 91 dopo la rimozione di str_split, non avevo realizzato che la stringa PHP fosse accessibile come array di caratteri (una cosa di PHP 5+?)

Fino a 102 grazie al suggerimento insertusername per rimuovere le virgolette e consentire gli avvisi


-16 byte: rimuovi tutte le 'parole, come 'head'diventa headecc.
inserisci nomeutentequi

Non sono sicuro di quali siano le regole con questo, ma con un'installazione PHP predefinita, ottengo gli avvisi costanti indefiniti previsti quando lo faccio
CT14.IT

1
Sì, ma questo è assolutamente perfetto con le regole del sito. Avvisi e avvertenze possono essere ignorati.
inserire nomeutentequi

@ CT14.IT, che non è un avviso, è un avviso. "PHP 5.3 o successivo, il valore predefinito è E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Questa impostazione non mostra errori di livello E_NOTICE, E_STRICT ed E_DEPRECATED. ”- Documentazione PHP suerror_reporting .
arte

1
Sembra che str_split () sia inutile
Crypto il

1

Gelatina , 55 byte

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

Provalo online! (Indice basato su 1)

Dai! Veramente?

Come bonus, questa è la stringa compressa che avrei dovuto usare al posto della linea superiore:

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

Entrambi codificano questa stringa:

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

Immagino che dovrei fare esercizio adesso: P


1

Powershell, 91 byte, zero indicizzato

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

Approccio molto semplice, genera l'array dei primi 22 elementi usando un po 'di moltiplicazione di stringhe ove possibile, compilandoli con spazi e dividendoli alla fine. (la suddivisione è di 2 byte in meno rispetto all'impostazione equivalente come array) quindi trova il punto in quell'array usando il modulo di input, non esattamente interessante o specifico della lingua.

Caso di prova:

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

eccetera.


1

rubino, 81 byte

Funzione lambda che utilizza l'indicizzazione zero.

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

spiegazione

Generiamo il seguente array, di cui utilizziamo i primi 16 elementi, coprendo le linee corrette 2,3,4 della canzone:

%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

Prendiamo n modulo 22 per ridurlo a un singolo verso, quindi sottraggiamo 6. Ora l'indice 6 (ad esempio) è stato modificato in 0 e punta alla parola giusta. Gli indici 0..5 che indicano la prima riga della canzone sono ora negativi. Usiamo &15(identico %16ma evita la necessità di parentesi) per mappare la prima riga della canzone sulla quarta riga. Quindi indice 0-> -6->10

nel programma di 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]}

Formula indice interessante. Ma la stessa lunghezza può essere raggiunta senza di essa:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
arte

1

Befunge, 129 119 byte

0-indicizzato

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

Provalo online!

Spiegazione

Come ha sottolineato Arnauld , le parole si presentano in coppie, quindi abbiamo un indice di soli 11 valori e quindi aggiungiamo la parola numero% 2 per ottenere la parola appropriata nella coppia. Le parole vengono inserite nello stack come un'unica stringa separata da asterischi per risparmiare spazio. Testiamo le interruzioni di parola prendendo il valore char modulo 7, poiché solo l'asterisco è un multiplo di 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)

1

SQL 2005 747 byte

golfed:

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

È necessaria una tabella come questa, in cui la prima colonna viene auto-incrementata:

inserisci qui la descrizione dell'immagine

Questa è una risposta con un indice. La tabella viene popolata la prima volta che viene creata la procedura memorizzata - non mi consente di fare tutto INSERTin un'unica istruzione, purtroppo, questa funzione è disponibile solo in >=SQL 2008. Dopo questo, usa il %22trucco delle altre risposte. Una volta che la tabella è stata popolata, utilizza solo l'ultima parte:

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

" non mi lascerebbe fare tutto l'INSERTO in una frase " perché? Qualcosa del genere non dovrebbe essere possibile in SQL dopo il 2008?
Kevin Cruijssen,

@KevinCruijssen Sto usando SQL Server 2008 R2, quindi è strano ... Ho appena fatto un po 'di più su Google, apparentemente è qualcosa a che fare con il "Livello di compatibilità" del database, che ho appena provato e fallito per cambiare - è impostato su 2005 e questo è il valore massimo, quindi non ha questa funzione. Devo specificare la versione SQL nella mia risposta o eliminare la risposta se non può essere abbreviata correttamente? E 'sventrato perché mi risparmierebbe molto testo ...
Pete Arden,

O va bene per me, quindi è la tua chiamata. Personalmente di solito gioco a golf in Java 7 che specifico, perché nella maggior parte dei casi sono disponibili risposte più brevi in ​​Java 8. È possibile specificare il 2005 allo stesso modo.
Kevin Cruijssen,

@KevinCruijssen Sì, ho visto persone che lo facevano per Java e Python. Non vorrei davvero apportare la modifica senza essere in grado di testare il codice, quindi specificherò il 2005, evviva :)
Pete Arden,

1

bash (con ed), 83 caratteri

1-indicizzato

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

Chiamata di esempio:

 $ bash test.sh 1001
 knees

1

dc , 135 byte

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

Provalo online!

Le matrici dcdevono essere costruite un elemento alla volta, il che comporta il peso di questo esercizio. Poiché "occhi", "orecchie", "bocca" e "naso" compaiono solo una volta nel nostro array, li inseriamo semplicemente. Ma per gli altri, salviamo alcuni byte mettendoli in pila come x[head]x, dove x è la metà dei suoi tre valori, quindi eseguiamo la macro [:add6-r;ar:adA+r;ar:a]dshxper metterla nell'array, tirarla indietro, rimetterla allo stesso valore meno sei, tirarla indietro e quindi inserirla un'ultima volta al valore originale più dieci. Usiamo il valore medio perché dcci consente di usare cifre esadecimali anche in modalità decimale e la sottrazione Aè di un byte in meno rispetto all'aggiunta16- funziona anche solo perché tutti i valori medi sono inferiori a quindici. Dobbiamo fare due volte le ginocchia e le dita dei piedi e rendere la nostra macro abbastanza intelligente da risolverla è più costoso della semplice esecuzione della macro due volte; ma salviamo qui i byte caricando una copia precedentemente memorizzata della stringa anziché scriverla di nuovo ( B 3;aBvs. B[toes]B- Penso che questo risparmi 3 byte in totale).

Una volta che abbiamo la matrice costruita, tutto quello che dobbiamo fare è 22%e quindi ;apper tirarlo dalla matrice e di stampa.


0

C # 6, 138 byte

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

demo di repl.it

Ungolfed + commenti:

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

Puoi combinare la stringa e usarne una singola Splite avere lo stesso controllo di ternary ( ?:) tra parentesi quadre (con +4per la seconda parte), in questo modo: 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 byte )
Kevin Cruijssen,

0

Excel, 146 byte

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

Usa @ Neil MOD(MOD(MOD(B1+16,22),16),10)per salvare i 15byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.