Kepala, Bahu, Lutut dan Jari Kaki, Lutut dan Jari Kaki

31

Pengantar:

Saya pikir kita semua tahu itu, dan itu mungkin telah diterjemahkan dalam banyak bahasa yang berbeda: lagu anak-anak "Head, Shoulders, Knees and Toes":

Kepala, bahu, lutut dan kaki, lutut dan kaki
Kepala, bahu, lutut dan kaki, lutut dan kaki
Dan mata dan telinga dan mulut dan hidung
Kepala, bahu, lutut dan kaki, lutut dan kaki
wikipedia


Tantangan:

Input: Bilangan bulat positif.

Keluaran: Keluarkan salah satu kata berikut berdasarkan input sebagai indeks ke-n:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Di sini bagian-bagian tubuh ditambahkan dengan indeks:

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.

Aturan tantangan:

  • Anda tentu saja diperbolehkan untuk menggunakan input 1-diindeks daripada 0-diindeks. Tapi tolong sebutkan yang mana yang Anda gunakan dalam jawaban Anda.
  • Outputnya tidak sensitif huruf besar, jadi jika Anda ingin menampilkannya dalam huruf besar, itu bagus.
  • Anda harus mendukung input hingga setidaknya 1.000.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji (0-diindeks):

Input:  Output:
0       head
1       shoulders
7       shoulders
13      ears
20      knees
35      ears
37      nose
98      knees
543     nose
1000    knees
Kevin Cruijssen
sumber
3
Menambahkan tag kompleksitas kolmogorov karena sebagian besar jawaban mungkin akan menggunakan input sebagai indeks siklik ke dalam array konstan, yang generasinya akan mendominasi jumlah byte.
Martin Ender
@ MartinEnder Terima kasih. Saya, secara keliru, hanya digunakan kolmogorov-complexityuntuk jawaban yang selalu memiliki output tetap yang sama, tetapi sekarang saya melihat bahwa ini tentang string output-tetap dalam kode, dan menemukan pola untuk golf itu (atau menyandikannya seperti dengan jawaban 05AB1E @ Enigma ). Terima kasih telah menambahkannya; Saya tidak terlalu yakin tag apa yang relevan untuk tantangan ini, yang merupakan salah satu pertanyaan saya (sayangnya tidak dijawab) di Sandbox.
Kevin Cruijssen
1
@KevinCruijssen Setidaknya pertanyaan Anda menangkap beberapa +1 :) (komentar optimis) Anda dapat mencari di kotak pasir menggunakan inquestion:2140 shoulders.
Erik the Outgolfer
3
Apakah ada orang lain yang lagu ini terjebak di kepala mereka sepanjang hari? ...
Kevin Cruijssen

Jawaban:

12

05AB1E , 36 35 34 byte

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

Cobalah online! atau sebagai Test suite

Penjelasan

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

Singkatnya, kami membuat daftar ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']dan mengindeksnya dengan input (diindeks 0).

Emigna
sumber
4
@KevinCruijssen: Penjelasan akan datang :) Ini cukup wajib untuk golf bahasa imo.
Emigna
‡ä¾ØsÏ©s¸±stampak aneh, mengingat bahwa setiap kata adalah 2 karakter. Apakah ini sesuatu yang lain?
Erik the Outgolfer
2
@EriktheGolfer: Ya, 3 s's ada untuk mempluralkan shoulder, knee, toeyang tunggal dalam kamus. Kita tidak memerlukan itu dengan eyes, earskarena mereka sudah jamak dalam kamus sehingga string memiliki panjang genap yang diharapkan.
Emigna
Oh, mereka membuatku bingung. Terima kasih.
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]

Bagaimana itu bekerja

Kami memiliki 4 pasang kata yang berbeda yang selalu muncul bersama: 'kepala' selalu diikuti oleh 'bahu', 'lutut' selalu diikuti oleh 'jari kaki', dll.

Karena itu, kita dapat menggunakan indeks berikut:

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

Dan kompres seluruh urutan (dalam urutan terbalik) ke dalam topeng biner berikut:

00 00 01 11 10 00 00 01 00 00 01

Kami menggunakan [ 'knees', 'toes' ]sebagai pasangan pertama untuk mendapatkan nol terkemuka sebanyak mungkin.

Kami membungkus urutan ini dengan ekstra 0sehingga nilai yang diekstraksi di-pre-multiplied oleh 2, yang mengarah ke:

0b00000111100000010000010 = 245890

Maka rumus terakhir untuk kata yang benar:

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

Uji kasus

Arnauld
sumber
10

Python 2, 158 148 137 128 114 109 104 byte

Tabel pencarian tampaknya lebih baik. Juga memperpendek string besar dan memesan kembali item. -5 byte terima kasih kepada Rod untuk menggunakan string sebagai daftar.

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

solusi awal:

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
sumber
1
Jawaban yang sangat asli! +1. Tapi, umm ..., sebagian besar jawaban yang menggunakan string lengkap lebih pendek dari ini. Namun, saya suka tawaran yang Anda ambil untuk melihat semacam pola di string! Chapeau untuk itu.
Kevin Cruijssen
Saya pikir Anda dapat membuat bahu ini dengan membuat string ini: hskteemnehnoyaooaoeeerusduessste ls h ddan kemudian menambahkan 'ers' jika Anda tahu kata itu seharusnya 'bahu' :)
Kade
1
Anda bisa menggunakan c=int('602323'*2+'4517602323'[input()%22])dan menjatuhkan hc:
Rod
1
[i%22]pada yang pertama, [input()%22]pada yang kedua
Rod
1
@Rod Ah maaf, jika Anda melihat kode Anda cukup lama, Anda menjadi buta.
Karl Napf
6

Perl, 74 byte

73 byte kode +1 untuk -p.

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

Menggunakan pengindeksan berbasis 0. Tidak menghasilkan pemisah, tapi itu bisa diubah dengan -ldi flag.

Cobalah online .

Dom Hastings
sumber
Anda dapat menyimpan 1 byte dengan x2)x2bukannyax2),@a
Adam
4

Python 2, 97 90 Bytes

Mungkin ada beberapa matematika yang membuatnya jadi saya tidak perlu membuat daftar kata, tetapi ini berfungsi untuk saat ini!

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

Terima kasih kepada Flp.Tkc untuk menghemat 7 byte :)

Kade
sumber
1
Saya mendapat solusi yang serupa, tetapi digunakan split()untuk membuatnya lebih pendek:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack
maaf, harus ada spasi setelah 'hidung' di sana :)
FlipTack
@ Flp.Tkc Ya saya baru menyadari itu :) Memperbarui sebentar!
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 terima kasih kepada @Neil .
-1 byte dengan tanpa malu-malu membuat port jawaban luar biasa @Arnauld .

Java diindeks 0, jadi itulah yang saya gunakan.

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

head
shoulders
shoulders
ears
knees
nose
ears
knees
nose
knees
Kevin Cruijssen
sumber
1
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}hanya 112 byte.
Neil
Jika Anda mencoba menyalin dari komentar Anda mendapatkan beberapa byte tambahan tak terlihat milik Stack Exchange.
Neil
@Neil Ok, saya idiot .. Tidak tahu bagaimana saya menghitung dengan kasar 120 malam kemarin terlambat .. Mungkin sudah terlambat ..>.> Lagi pula, saya sudah mengeditnya (ditambah 1 byte tambahan dengan menghapus ruang), terima kasih!
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];}

Terima kasih kepada @cleblanc untuk 4 byte. Mendeklarasikan b secara global memberikan banyak peringatan tentang casting ke int, tetapi tidak merusak bagi saya.

Tidak Disatukan:

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

Itu bukan jawaban terkecil, tapi saya suka tekniknya, dan bersenang-senang menemukan beberapa pola.

Changelog:

  • Pindah bke global untuk menghindari char(4 byte)
  • a > 11 && a < 16=> (a & 12) > 8(2 byte)
  • i=(a-6)%10=> i=(a+4)%10sehingga i < 2 && i >= 0=> i < 2(6 byte)
nmjcman101
sumber
1
Anda dapat menurunkan ini sedikit lebih jauh. Dengan memindahkan b [] ke lingkup global, ia dapat dideklarasikan tanpa menggunakan char * seperti ini *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'dan kemudian ganti kembali b [...] dengan put (b [...]) Anda bisa mendapatkannya hingga 143 byte
cleblanc
+1 Dan sebagai tambahan atas saran @cleblanc , Anda juga dapat mengubah keduanya &&menjadi &.
Kevin Cruijssen
Saya ingin tahu bagaimana saran @cleblanc tentang mendeklarasikan b berfungsi secara global. Compiler mengatakan kepada saya itu akan menjadi * int [], dan saya pikir perbedaan ukuran akan memecahkan kode. Itu tidak, jadi terima kasih!
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')

Lmis
sumber
1
Bagus! +1. Ketika saya mem-port jawaban Anda ke Java 7, itu adalah -7 byte solid dibandingkan dengan jawaban Arnauld yang sudah lebih pendek dari milik saya. ;) Terima kasih!
Kevin Cruijssen
1
Aku menyimpan byte dengan menjadi kreatif dengan penggunaan saya %: 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]

Membuat vektor karakter berfungsi sebagai tabel pencarian. Mengambil input dari stdin ( 1-indexed) dan %%22untuk menemukan bagian tubuh yang sesuai.

Bonus: %%adalah vektor yang artinya ini akan bekerja dengan input vektor juga.

Menguji kasus pada R-fiddle (Perhatikan bahwa ini adalah fungsi yang dinamai karena scantidak berfungsi pada R-fiddle)

Billywob
sumber
2

jq, 80 karakter

(77 karakter kode + 3 opsi opsi baris perintah)

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

Contoh dijalankan:

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

Tes online (Melewati -rURL tidak didukung - periksa sendiri Output Raw.)

manatwork
sumber
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 dengan menyandikan offset / panjang bagian tubuh sebagai ascii chars.

-6 byte dengan menggunakan var lokal saat mencari offset / panjang.

Input dilakukan dengan nilai yang ditetapkan dalam register semu $t0.

Bagaimana itu bekerja:

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

Output sampel:

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"
susu
sumber
2

PHP, 91 102 118 128 129 Bytes

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

Diindeks 0

Turun ke 91 setelah penghapusan str_split, tidak menyadari bahwa string PHP dapat diakses sebagai array char (hal PHP 5+?)

Turun ke 102 berkat saran nama pengguna untuk menghapus kutipan string dan mengizinkan pemberitahuan

CT14.IT
sumber
-16 byte: hapus seluruh 'kata, seperti 'head'menjadi headdll.
masukkan nama pengguna
Tidak yakin apa aturannya dengan ini, tetapi dengan pemasangan PHP default, saya mendapatkan peringatan konstan yang tidak terdefinisi yang diharapkan saat melakukan itu
CT14.IT
1
Ya, tapi ini sama sekali tidak masalah dengan aturan situs. Pemberitahuan dan peringatan dapat diabaikan.
masukkan nama pengguna
@ CT14.IT, itu bukan peringatan, adalah pemberitahuan. “PHP 5.3 atau lebih baru, nilai standarnya adalah E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Pengaturan ini tidak menunjukkan kesalahan level E_NOTICE, E_STRICT, dan E_DEPRECATED. "- Dokumentasi PHP tentangerror_reporting .
manatwork
1
Tampaknya str_split () tidak berguna
Crypto
1

Jelly , 55 byte

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

Cobalah online! (Indeks berbasis 1)

Ayolah! Sangat?

Sebagai bonus, ini adalah string terkompresi yang seharusnya saya gunakan sebagai ganti dari baris teratas:

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

Keduanya menyandikan string ini:

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

Sepertinya saya harus berolahraga sekarang: P

Erik the Outgolfer
sumber
1

Powershell, 91 Bytes, Zero-Indexed

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

Pendekatan yang sangat mudah, menghasilkan array dari 22 item pertama menggunakan beberapa perkalian string jika memungkinkan, dengan mengompilasinya dengan spasi dan membelah di akhir. (splitting adalah 2 byte lebih pendek dari setup setara dengan array) kemudian temukan titik dalam array menggunakan modulus input, tidak persis menarik atau spesifik bahasa.

Kasus cobaan:

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

dll.

colsw
sumber
1

ruby, 81 byte

Fungsi Lambda menggunakan pengindeksan nol.

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

penjelasan

Kami menghasilkan array berikut, yang kami gunakan 16 elemen pertama, yang mencakup garis yang benar 2,3,4 lagu:

%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

Kita mengambil n modulo 22 untuk menguranginya menjadi satu ayat, lalu kita kurangi 6. Sekarang indeks 6 (misalnya) telah diubah menjadi 0 dan menunjuk ke kata yang tepat. Indicies 0..5 yang mengarah ke baris pertama lagu sekarang negatif. Kami menggunakan &15(identik dengan %16tetapi menghindari kebutuhan tanda kurung) untuk memetakan baris 1 lagu ke baris 4. Jadi indeks 0-> -6->10

dalam program uji

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
sumber
Formula indeks yang menarik. Tetapi panjang yang sama dapat dicapai tanpa itu:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
manatwork
1

Befunge, 129 119 byte

Diindeks 0

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

Cobalah online!

Penjelasan

Seperti yang Arnauld tunjukkan, kata-kata tersebut berpasangan, jadi kami memiliki indeks dengan hanya 11 nilai dan kemudian menambahkan kata angka% 2 untuk mendapatkan kata yang tepat dalam pasangan tersebut. Kata-kata didorong ke tumpukan sebagai string tunggal yang dipisahkan oleh tanda bintang untuk menghemat ruang. Kami menguji kata istirahat dengan mengambil nilai char modulo 7, karena hanya tanda bintang yang merupakan kelipatan dari 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
sumber
1

SQL 2005 747 Bytes

Golf:

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

Tidak Disatukan:

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

Membutuhkan tabel seperti ini, di mana kolom pertama bertambah secara otomatis:

masukkan deskripsi gambar di sini

Ini adalah jawaban yang diindeks satu. Tabel diisi saat prosedur pertama kali disimpan dibuat - itu tidak akan membiarkan saya melakukan semua INSERTdalam satu pernyataan, mengecewakan, fitur ini hanya tersedia di >=SQL 2008. Setelah ini, ia menggunakan %22trik dari jawaban lain. Setelah tabel sudah diisi, itu hanya menggunakan bagian terakhir:

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
sumber
" itu tidak akan membiarkan saya melakukan semua INSERT dalam satu pernyataan " mengapa? Tidakkah hal seperti ini dimungkinkan dalam SQL setelah 2008?
Kevin Cruijssen
@KevinCruijssen Saya menggunakan SQL Server 2008 R2, jadi ini aneh ... Saya baru saja melakukan lebih banyak Googling, rupanya ada hubungannya dengan "Tingkat Kompatibilitas" dari database, yang baru saja saya coba dan gagal untuk mengubah - ini diatur ke 2005 dan ini adalah nilai maksimal, sehingga tidak punya fitur ini. Haruskah saya menentukan versi SQL dalam jawaban saya, atau menghapus jawaban jika tidak dapat dipersingkat dengan benar? Memusnahkan itu akan menyelamatkan saya banyak teks ...
Pete Arden
Baik saya baik-baik saja, jadi itu panggilan Anda. Saya pribadi biasanya bermain golf di Java 7 yang saya tentukan, karena dalam kebanyakan kasus, jawaban yang lebih pendek tersedia di Java 8. Anda bisa menentukan 2005 dengan cara yang sama.
Kevin Cruijssen
@KevinCruijssen Ya, saya pernah melihat orang melakukan itu untuk Java dan Python. Tidak akan benar-benar ingin melakukan perubahan tanpa bisa menguji kodenya, jadi saya akan tentukan 2005, tepuk tangan :)
Pete Arden
1

bash (dengan ed), 83 karakter

1-diindeks

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

Contoh panggilan:

 $ bash test.sh 1001
 knees
Adam
sumber
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

Cobalah online!

Array dcharus dibangun elemen pada satu waktu, yang mengambil beban dari latihan ini. Karena 'mata', 'telinga', 'mulut', dan 'hidung' hanya muncul satu kali dalam array kami, kami hanya memasukkannya. Tetapi untuk yang lain, kami menyimpan beberapa byte dengan meletakkannya di tumpukan seperti x[head]x, di mana x adalah tengah dari tiga nilainya, lalu kita jalankan makro [:add6-r;ar:adA+r;ar:a]dshxuntuk meletakkannya di dalam array, menariknya kembali, meletakkannya pada nilai yang sama kurang dari enam, menariknya kembali, dan kemudian memasukkannya ke dalam terakhir kali pada nilai aslinya ditambah sepuluh. Kami menggunakan nilai tengah karena dcmemungkinkan kami untuk menggunakan digit hex bahkan dalam mode desimal, dan mengurangi Asatu byte lebih sedikit daripada menambahkan16- ini juga hanya berfungsi karena semua nilai tengah di bawah lima belas. Kita harus melakukan lutut dan kaki dua kali, dan membuat makro kita cukup pintar untuk mengatasinya lebih mahal daripada hanya menjalankan makro dua kali; tapi kami menyimpan byte di sini dengan memuat salinan string yang tersimpan sebelumnya daripada menuliskannya lagi ( B 3;aBvs. B[toes]B- saya pikir ini menyimpan total 3 byte).

Setelah kami telah array dibangun, semua yang perlu kita lakukan adalah 22%dan kemudian ;apmenariknya dari array dan cetak.

brhfl
sumber
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 repl.it

+ Komentar tidak dikumpulkan:

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];
Tautan Ng
sumber
Anda dapat menggabungkan string dan menggunakan tunggal Split, dan memiliki pemeriksaan yang sama dengan ternary ( ?:) di dalam tanda kurung siku (dengan +4untuk bagian kedua), seperti ini: 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)

Menggunakan @ Neil MOD(MOD(MOD(B1+16,22),16),10)untuk menyimpan 15byte.

Wernisch
sumber