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 kode-golf , 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
code-golf
string
kolmogorov-complexity
Kevin Cruijssen
sumber
sumber
kolmogorov-complexity
untuk 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.inquestion:2140 shoulders
.Jawaban:
05AB1E ,
363534 byteCobalah online! atau sebagai Test suite
Penjelasan
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).sumber
‡ä¾ØsÏ©s¸±s
tampak aneh, mengingat bahwa setiap kata adalah 2 karakter. Apakah ini sesuatu yang lain?s
's ada untuk mempluralkanshoulder, knee, toe
yang tunggal dalam kamus. Kita tidak memerlukan itu denganeyes, ears
karena mereka sudah jamak dalam kamus sehingga string memiliki panjang genap yang diharapkan.JavaScript (ES6),
918887 byteBagaimana 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:
Dan kompres seluruh urutan (dalam urutan terbalik) ke dalam topeng biner berikut:
Kami menggunakan
[ 'knees', 'toes' ]
sebagai pasangan pertama untuk mendapatkan nol terkemuka sebanyak mungkin.Kami membungkus urutan ini dengan ekstra
0
sehingga nilai yang diekstraksi di-pre-multiplied oleh 2, yang mengarah ke:Maka rumus terakhir untuk kata yang benar:
Uji kasus
Tampilkan cuplikan kode
sumber
Python 2,
158148137128114109104 byteTabel pencarian tampaknya lebih baik. Juga memperpendek string besar dan memesan kembali item. -5 byte terima kasih kepada Rod untuk menggunakan string sebagai daftar.
solusi awal:
sumber
hskteemnehnoyaooaoeeerusduessste ls h d
dan kemudian menambahkan 'ers' jika Anda tahu kata itu seharusnya 'bahu' :)c=int('602323'*2+'4517602323'[input()%22])
dan menjatuhkanh
c:[i%22]
pada yang pertama,[input()%22]
pada yang keduaPerl, 74 byte
73 byte kode +1 untuk
-p
.Menggunakan pengindeksan berbasis 0. Tidak menghasilkan pemisah, tapi itu bisa diubah dengan
-l
di flag.Cobalah online .
sumber
x2)x2
bukannyax2),@a
Python 2,
9790 BytesMungkin ada beberapa matematika yang membuatnya jadi saya tidak perlu membuat daftar kata, tetapi ini berfungsi untuk saat ini!
Terima kasih kepada Flp.Tkc untuk menghemat 7 byte :)
sumber
split()
untuk membuatnya lebih pendek:k='head shoulders '+'knees toes '*2
print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
Java 7,
155137131123111110 byte-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.
Keluaran:
sumber
String c(int i){return "head,shoulders,knees,toes,knees,toes,eyes,ears,mouth,nose".split(",")[(i+16)%22%16%10];}
hanya 112 byte.C,
153 byte141 byteTerima kasih kepada @cleblanc untuk 4 byte. Mendeklarasikan b secara global memberikan banyak peringatan tentang casting ke int, tetapi tidak merusak bagi saya.
Tidak Disatukan:
Itu bukan jawaban terkecil, tapi saya suka tekniknya, dan bersenang-senang menemukan beberapa pola.
Changelog:
b
ke global untuk menghindarichar
(4 byte)a > 11 && a < 16
=>(a & 12) > 8
(2 byte)i=(a-6)%10
=>i=(a+4)%10
sehinggai < 2 && i >= 0
=>i < 2
(6 byte)sumber
*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'
dan kemudian ganti kembali b [...] dengan put (b [...]) Anda bisa mendapatkannya hingga 143 byte&&
menjadi&
.JavaScript (ES6)
9189 Bytessumber
%
:n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
.R, 95 byte
Membuat vektor karakter berfungsi sebagai tabel pencarian. Mengambil input dari stdin (
1-indexed
) dan%%22
untuk 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
scan
tidak berfungsi pada R-fiddle)sumber
jq, 80 karakter
(77 karakter kode + 3 opsi opsi baris perintah)
Contoh dijalankan:
Tes online (Melewati
-r
URL tidak didukung - periksa sendiri Output Raw.)sumber
WinDbg,
207157151 byte-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:
Output sampel:
sumber
PHP, 91
102118128129BytesDiindeks 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 pemberitahuansumber
'
kata, seperti'head'
menjadihead
dll.error_reporting
.Jelly , 55 byte
Cobalah online! (Indeks berbasis 1)
Ayolah! Sangat?
Sebagai bonus, ini adalah string terkompresi yang seharusnya saya gunakan sebagai ganti dari baris teratas:
Keduanya menyandikan string ini:
Sepertinya saya harus berolahraga sekarang: P
sumber
Powershell, 91 Bytes, Zero-Indexed
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:
dll.
sumber
ruby, 81 byte
Fungsi Lambda menggunakan pengindeksan nol.
penjelasan
Kami menghasilkan array berikut, yang kami gunakan 16 elemen pertama, yang mencakup garis yang benar 2,3,4 lagu:
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%16
tetapi menghindari kebutuhan tanda kurung) untuk memetakan baris 1 lagu ke baris 4. Jadi indeks0
->-6
->10
dalam program uji
sumber
->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Befunge,
129119 byteDiindeks 0
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.
sumber
SQL 2005 747 Bytes
Golf:
Tidak Disatukan:
Membutuhkan tabel seperti ini, di mana kolom pertama bertambah secara otomatis:
Ini adalah jawaban yang diindeks satu. Tabel diisi saat prosedur pertama kali disimpan dibuat - itu tidak akan membiarkan saya melakukan semua
INSERT
dalam satu pernyataan, mengecewakan, fitur ini hanya tersedia di>=SQL 2008
. Setelah ini, ia menggunakan%22
trik dari jawaban lain. Setelah tabel sudah diisi, itu hanya menggunakan bagian terakhir:sumber
bash (dengan ed), 83 karakter
1-diindeks
Contoh panggilan:
sumber
dc , 135 byte
Cobalah online!
Array
dc
harus 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 sepertix[head]x
, di mana x adalah tengah dari tiga nilainya, lalu kita jalankan makro[:add6-r;ar:adA+r;ar:a]dshx
untuk 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 karenadc
memungkinkan kami untuk menggunakan digit hex bahkan dalam mode desimal, dan mengurangiA
satu 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;aB
vs.B[toes]B
- saya pikir ini menyimpan total 3 byte).Setelah kami telah array dibangun, semua yang perlu kita lakukan adalah
22%
dan kemudian;ap
menariknya dari array dan cetak.sumber
C # 6, 138 byte
demo repl.it
+ Komentar tidak dikumpulkan:
sumber
Split
, dan memiliki pemeriksaan yang sama dengan ternary (?:
) di dalam tanda kurung siku (dengan+4
untuk 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 )Excel, 146 byte
Menggunakan @ Neil
MOD(MOD(MOD(B1+16,22),16),10)
untuk menyimpan15
byte.sumber