Głowa, ramiona, kolana i palce, kolana i palce

31

Wprowadzenie:

Myślę, że wszyscy o tym wiemy i prawdopodobnie została przetłumaczona na wiele różnych języków: piosenka dla dzieci „Głowa, ramiona, kolana i palce u stóp”:

Głowa, ramiona, kolana i palce, kolana i palce
Głowa, ramiona, kolana i palce, kolana i palce
I oczy, uszy i usta i nos
Głowa, ramiona, kolana i palce, kolana i palce
wikipedia


Wyzwanie:

Dane wejściowe: dodatnia liczba całkowita.

Dane wyjściowe: wypisz jedno z następujących słów na podstawie danych wejściowych jako n-ty indeks:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Tutaj części ciała są dodawane z indeksami:

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.

Zasady konkursu:

  • Oczywiście możesz używać danych wejściowych 1-indeksowanych zamiast 0-indeksowanych. Ale proszę podać, którego użyłeś w swojej odpowiedzi.
  • W danych wyjściowych nie jest rozróżniana wielkość liter, więc jeśli chcesz wyprowadzać je wielkimi literami, to w porządku.
  • Powinieneś obsługiwać dane wejściowe do co najmniej 1000.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe (indeksowane 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
źródło
3
Dodano znacznik złożoności Kołmogorowa, ponieważ większość odpowiedzi prawdopodobnie użyje danych wejściowych jako cyklicznego indeksu w stałej tablicy, którego generowanie zdominuje liczbę bajtów.
Martin Ender
@MartinEnder Thanks. Niepoprawnie użyłem tylko tych kolmogorov-complexityodpowiedzi, które zawsze mają takie same stałe dane wyjściowe, ale teraz widzę, że chodzi o ustalone ciągi wyjściowe w kodzie i znajdowanie wzorców do gry w golfa (lub kodowania go jak w odpowiedzi 05AB1E @ Enigmy ). Dzięki za dodanie; Nie byłem zbyt pewien, jakie tagi są odpowiednie dla tego wyzwania, które było jednym z moich (niestety bez odpowiedzi) pytań w piaskownicy.
Kevin Cruijssen
1
@KevinCruijssen Przynajmniej twoje pytanie złapało niektóre + 1-ki :) (uwaga optymistyczna) Możesz wyszukiwać w piaskownicy za pomocą inquestion:2140 shoulders.
Erik the Outgolfer,
3
Czy ktoś jeszcze utknął w głowie przez cały dzień? ...
Kevin Cruijssen

Odpowiedzi:

12

05AB1E , 36 35 34 bajtów

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

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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

Krótko mówiąc, budujemy listę ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']i indeksujemy ją za pomocą danych wejściowych (indeksowanych 0).

Emigna
źródło
4
@KevinCruijssen: Często pojawia się wyjaśnienie :) Jest to dość obowiązkowe dla języków golfowych imo.
Emigna,
‡ä¾ØsÏ©s¸±swydaje się dziwne, biorąc pod uwagę, że każde słowo składa się z 2 znaków. Czy to coś innego?
Erik the Outgolfer,
2
@EriktheGolfer: Tak, 3 są w liczbie smnogiej, shoulder, knee, toektóre są w liczbie pojedynczej w słowniku. Nie potrzebujemy tego, eyes, earsponieważ są one już pluralizowane w słowniku, więc łańcuch ma oczekiwaną parzystą długość.
Emigna
Och, zmieszali mnie. Dzięki.
Erik the Outgolfer,
31

JavaScript (ES6), 91 88 87 bajtów

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

Jak to działa

Mamy 4 odrębne pary słów, które zawsze pojawiają się razem: po „głowie” zawsze występują „ramiona”, po „kolanach” zawsze występują „palce u nóg” itp.

Dlatego możemy użyć następującego indeksu:

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

I skompresuj całą sekwencję (w odwrotnej kolejności) do następującej maski binarnej:

00 00 01 11 10 00 00 01 00 00 01

Używamy [ 'knees', 'toes' ]jako pierwszej pary, aby uzyskać jak najwięcej zer wiodących, jak to możliwe.

Uzupełniamy tę sekwencję dodatkowym, 0aby wyodrębniona wartość została wstępnie pomnożona przez 2, co prowadzi do:

0b00000111100000010000010 = 245890

Stąd końcowy wzór na właściwe słowo:

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

Przypadki testowe

Arnauld
źródło
10

Python 2, 158 148 137 128 114 109 104 bajtów

Tabela przeglądowa wydaje się lepsza. Skróciłem również duży sznurek i zmieniłem kolejność przedmiotów. -5 bajtów dzięki Rod za użycie łańcucha jako listy.

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

wstępne rozwiązanie:

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
źródło
1
Bardzo oryginalna odpowiedź! +1. Ale, umm ... większość odpowiedzi, które używają kompletnych ciągów, jest krótsza niż ta. Mimo to podoba mi się koszt, jaki wziąłeś, aby zobaczyć jakiś wzór w strunach! Chapeau za to.
Kevin Cruijssen
Myślę, że możesz zrobić to ramię, robiąc to tak: hskteemnehnoyaooaoeeerusduessste ls h da następnie dodając „ers”, jeśli wiesz, że to słowo powinno być „ramiona” :)
Kade
1
możesz po prostu użyć c=int('602323'*2+'4517602323'[input()%22])i upuścić hc:
Rod
1
[i%22]po pierwsze, [input()%22]po drugie
Rod
1
@Rod Ach przepraszam, jeśli spojrzysz na swój kod wystarczająco długo, stracisz wzrok.
Karl Napf,
6

Perl, 74 bajty

73 bajtowy kod + 1 dla -p.

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

Wykorzystuje indeksowanie 0. Nie generuje separatora, ale można to zmienić za -lpomocą flag.

Wypróbuj online .

Dom Hastings
źródło
możesz zapisać 1 bajt x2)x2zamiastx2),@a
Adam
4

Python 2, 97 90 bajtów

Być może jest taka matematyka, więc nie muszę tworzyć listy słów, ale na razie to działa!

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

Dzięki Flp.Tkc za zapisanie 7 bajtów :)

Kade
źródło
1
Mam podobne rozwiązanie, ale split()k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
skróciłem
przepraszam, powinna być spacja za „nosem” :)
FlipTack
@ Flp.Tkc Tak, właśnie zdałem sobie z tego sprawę :) Aktualizacja za sekundę!
Kade
4

Java 7, 155 137 131 123 111 110 bajtów

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

-12 bajtów dzięki @Neil .
-1 bajt, bezwstydnie tworząc port niesamowitej odpowiedzi @Arnauld .

Java jest indeksowana na 0, więc tego właśnie użyłem.

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

head
shoulders
shoulders
ears
knees
nose
ears
knees
nose
knees
Kevin Cruijssen
źródło
1
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}ma tylko 112 bajtów.
Neil,
Jeśli spróbujesz skopiować z komentarza, otrzymasz dodatkowe niewidoczne bajty dzięki uprzejmości Stack Exchange.
Neil,
@Neil Ok, jestem idiotą .. Nie mam pojęcia, jak policzyłem szorstkie 120 wczoraj wieczorem późno .. Prawdopodobnie było już za późno ..>.> W każdym razie edytowałem (plus 1 dodatkowy bajt usuwając spacja), więc dzięki!
Kevin Cruijssen
3

C, 153 bajty 141 bajtów

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

Dzięki @cleblanc za 4 bajty. Deklaracja b globalnie rzuca masę ostrzeżeń o rzucaniu na int, ale nie złamała się dla mnie.

Nie golfowany:

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

To nie jest najmniejsza odpowiedź, ale podobała mi się technika i dobrze się bawiłem, znajdując kilka wzorów.

Dziennik zmian:

  • Przeniesiono bdo globalnego, aby uniknąć char(4 bajty)
  • a > 11 && a < 16=> (a & 12) > 8(2 bajty)
  • i=(a-6)%10=> i=(a+4)%10tak, że i < 2 && i >= 0=> i < 2(6 bajtów)
nmjcman101
źródło
1
Możesz zagrać w golfa nieco dalej. Przenosząc b [] do zakresu globalnego można zadeklarować bez użycia znaku char * w ten sposób, *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'a następnie zastąpić zwracany b [...] puts (b [...]), aby sprowadzić go do 143 bajtów
cleblanc
+1 Oprócz sugestii @cleblanc możesz także zmienić obie opcje&& na &.
Kevin Cruijssen
Jestem ciekawy, jak sugeruje @cleblanc globalne deklarowanie b. Kompilator powiedział mi, że będzie to * int [], i pomyślałem, że różnica wielkości zepsuje kod. Ale tak się nie stało, więc dzięki!
nmjcman101
2

JavaScript (ES6) 91 89 bajtów

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
źródło
1
Miły! +1. Kiedy przesyłam twoją odpowiedź na Javę 7, jest to solidne -7 bajtów w porównaniu z już i tak krótszą niż moja odpowiedź @ Arnauld. ;) Dzięki!
Kevin Cruijssen
1
Uratowałem bajt będąc twórczy z moim użycia %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Neil,
2

R, 95 bajtów

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

Tworzy wektor znaków, aby działał jako tabela odnośników. Pobiera dane wejściowe z stdin ( 1-indexed) i %%22znajduje odpowiednią część ciała.

Bonus: %%jest wektoryzowany, co oznacza, że ​​będzie to również działać z wejściami wektorowymi.

Przypadki testowe na skrzypcach R (zauważ, że jest to nazwana funkcja, ponieważ scannie działa na skrzypcach R)

Billywob
źródło
2

jq, 80 znaków

(Kod 77 znaków + opcja wiersza poleceń 3 znaki)

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

Przykładowy przebieg:

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

Test on-line (Przekazanie -radresu URL nie jest obsługiwane - sprawdź sam wynik wyjściowy).

człowiek w pracy
źródło
2

WinDbg, 207 157 151 bajtów

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

-50 bajtów przez kodowanie przesunięcia / długości części ciała jako znaków ascii.

-6 bajtów przy użyciu lokalnego var podczas wyszukiwania przesunięcia / długości.

Wprowadzanie odbywa się za pomocą wartości ustawionej w pseudorejestru $t0.

Jak to działa:

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

Przykładowe dane wyjściowe:

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"
mleko
źródło
2

PHP, 91 102 118 128 129 Bajtów

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

Indeksowane 0

W dół do 91 po usunięciu str_split, nie zdawałem sobie sprawy, że ciąg PHP jest dostępny jako tablica znaków (PHP 5+?)

Do 102 dzięki sugestii insertusername do usuwania cudzysłowów i dopuszczania powiadomień

CT14.IT
źródło
-16 bajtów: usuń wszystkie 'słowa, takie jak 'head'staje się headitp.
nazwa_wstawcy tutaj
Nie jestem pewien, jakie są przy tym reguły, ale przy domyślnej instalacji PHP otrzymuję oczekiwane niezdefiniowane stałe ostrzeżenia
CT14.IT,
1
Tak, ale jest to absolutnie w porządku z zasadami witryny. Powiadomienia i ostrzeżenia można zignorować.
inserttusernamehere
@ CT14.IT, który nie jest ostrzeżeniem, jest zawiadomieniem. „PHP 5.3 lub nowsza wartość domyślna to E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. To ustawienie nie wyświetla błędów poziomu E_NOTICE, E_STRICT i E_DEPRECATED. ”- Dokumentacja PHP na tematerror_reporting .
manatwork
1
Wygląda na to, że str_split () jest bezużyteczny
Crypto,
1

Galaretka , 55 bajtów

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

Wypróbuj online!(Indeks 1)

Daj spokój! Naprawdę?

Jako bonus, to jest skompresowany ciąg, którego miałem użyć zamiast górnej linii:

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

Oba kodują ten ciąg:

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

Chyba powinienem teraz poćwiczyć: P

Erik the Outgolfer
źródło
1

PowerShell, 91 bajtów, zero indeksowanych

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

Bardzo proste podejście, wygeneruj tablicę pierwszych 22 elementów, używając, w miarę możliwości, mnożenia ciągu znaków, kompilując je ze spacjami i dzieląc na końcu. (dzielenie jest o 2 bajty krótsze niż równoważne ustawienie jako tablica), a następnie po prostu znajdź punkt w tej tablicy, używając modułu wejściowego, niezbyt interesujący lub specyficzny dla języka.

Przypadek testowy:

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

itp.

colsw
źródło
1

rubin, 81 bajtów

Funkcja lambda z wykorzystaniem indeksowania zerowego.

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

wyjaśnienie

Generujemy następującą tablicę, z której korzystamy z pierwszych 16 elementów, obejmujących prawidłowe wiersze 2,3,4 utworu:

%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

Bierzemy n modulo 22, aby zredukować go do jednego wiersza, a następnie odejmujemy 6. Teraz indeks 6 (na przykład) został zmieniony na 0 i wskazuje na właściwe słowo. Wskazuje 0..5, które wskazują na pierwszy wiersz piosenki, są teraz ujemne. Używamy &15(identycznie jak %16w nawiasach, ale unika się potrzeby), aby zamapować pierwszą linię utworu na czwartą linię. Zatem indeks 0-> -6->10

w programie testowym

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
źródło
Ciekawa formuła indeksu. Ale bez tej samej długości można osiągnąć:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
manatwork
1

Befunge, 129 119 bajtów

0-indeksowane

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

Wypróbuj online!

Wyjaśnienie

Jak zauważył Arnauld , słowa występują w parach, więc mamy indeks tylko 11 wartości, a następnie dodajemy słowo% 2, aby uzyskać odpowiednie słowo w parze. Słowa są wypychane na stos jako pojedynczy ciąg oddzielony gwiazdkami, aby zaoszczędzić miejsce. Testujemy dzielenie wyrazów, biorąc wartość char modulo 7, ponieważ tylko gwiazdka jest wielokrotnością 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
źródło
1

SQL 2005 747 bajtów

Gra w golfa:

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

Nie golfowany:

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

Potrzebuje takiej tabeli, w której pierwsza kolumna jest automatycznie zwiększana:

wprowadź opis zdjęcia tutaj

To jest odpowiedź z jednym indeksem. Tabela jest zapełniana przy pierwszym utworzeniu procedury składowanej - nie pozwoliłbym zrobić wszystkiego INSERTw jednym zdaniu, niestety, ta funkcja jest dostępna tylko w >=SQL 2008. Następnie wykorzystuje %22lewę z innych odpowiedzi. Po wypełnieniu tabeli używana jest tylko ostatnia część:

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
źródło
nie pozwoliłoby mi to zrobić WSTAWIENIA w jednym oświadczeniu ” dlaczego? Czy coś takiego nie powinno być możliwe w SQL po 2008 roku?
Kevin Cruijssen
@KevinCruijssen Korzystam z SQL Server 2008 R2, więc to dziwne ... Właśnie zrobiłem trochę Googlinga, najwyraźniej ma to coś wspólnego z „poziomem kompatybilności” bazy danych, który właśnie wypróbowałem i nie udało mi się zmienić - jest ustawiony na 2005 i jest to maksymalna wartość, więc nie ma tej funkcji. Czy powinienem albo podać wersję SQL w mojej odpowiedzi, czy usunąć odpowiedź, jeśli nie można jej odpowiednio skrócić? Patroszony, to zaoszczędziłoby mi dużo tekstu ...
Pete Arden
Dla mnie jedno jest w porządku, więc to twój telefon. Ja osobiście zazwyczaj gram w golfa w Javie 7, którą określam, ponieważ w większości przypadków krótsze odpowiedzi są dostępne w Javie 8. Możesz podać rok 2005 w ten sam sposób.
Kevin Cruijssen
@KevinCruijssen Tak, widziałem ludzi robiących to dla Javy i Pythona. Nie chciałbym też wprowadzać zmian bez możliwości przetestowania kodu, więc określę 2005, pozdrawiam :)
Pete Arden,
1

bash (z ed), 83 znaki

1-indeksowany

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

Przykładowe połączenie:

 $ bash test.sh 1001
 knees
Adam
źródło
1

dc , 135 bajtów

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

Wypróbuj online!

Tablice dcmuszą być budowane jednocześnie, co stanowi ciężar tego ćwiczenia. Ponieważ „oczy”, „uszy”, „usta” i „nos” pojawiają się tylko raz w naszym zestawie, po prostu je wkładamy. Ale dla pozostałych oszczędzamy kilka bajtów, umieszczając je na stosie x[head]x, gdzie x jest środkiem jego trzech wartości, a następnie uruchamiamy makro, [:add6-r;ar:adA+r;ar:a]dshxaby umieścić je w tablicy, pociągnąć z powrotem, umieścić w tej samej wartości pomniejszonej o sześć, wyciągnąć z powrotem, a następnie umieścić po raz ostatni przy pierwotnej wartości plus dziesięć. Używamy wartości środkowej, ponieważ dcpozwala nam używać cyfr szesnastkowych nawet w trybie dziesiętnym, a odejmowanie Ajest o jeden mniej bajtowe niż dodawanie16- Działa to również tylko dlatego, że wszystkie środkowe wartości są mniejsze niż piętnaście. Musimy zrobić kolana i palce u nogi dwa razy, a sprawienie, by nasze makro było wystarczająco inteligentne, aby rozwiązać ten problem, jest droższe niż dwukrotne uruchomienie makra; ale zapisujemy tutaj bajty, ładując wcześniej zapisaną kopię ciągu zamiast zapisywać go ponownie (w B 3;aBporównaniuB[toes]B - myślę, że to oszczędza łącznie 3 bajty).

Kiedy już tablica zbudowana, wszystko co musisz zrobić, to 22%a następnie ;apwyciągnąć go z tablicy i wydrukować.

brhfl
źródło
0

C # 6, 138 bajtów

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

Niegolfowane + komentarze:

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 nr
źródło
Możesz połączyć ciąg i użyć pojedynczego Spliti mieć taki sam czek jak ternary ( ?:) w nawiasach kwadratowych (z +4drugą częścią), w ten sposób: 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 bajtów )
Kevin Cruijssen
0

Excel, 146 bajtów

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

Używa @ Neila MOD(MOD(MOD(B1+16,22),16),10)do zapisywania 15bajtów.

Wernisch
źródło