Baş, Omuzlar, Dizler ve Parmaklar, Dizler ve Parmaklar


31

Giriş:

Bence hepimiz biliyoruz ve muhtemelen birçok farklı dile çevrildi: "Baş, Omuzlar, Dizler ve Parmaklar" çocuk şarkısı:

Baş, omuzlar, dizler ve ayak parmakları, dizleri ve ayak parmakları
Baş, omuzlar, dizler ve ayak parmakları, dizleri ve ayak parmakları
Ve gözü kulağı ve ağız ve burun
Başkanı, omuzlar, dizler ve ayak parmakları, dizleri ve ayak parmakları
wikipedia


Meydan okuma:

Giriş: Pozitif bir tamsayı.

Çıktı: n-inci dizini girişine göre aşağıdaki sözcüklerden birini çıktı:

head
shoulders
knees
toes
eyes
ears
mouth
nose

İşte vücut kısımları indekslerle eklenmiştir:

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.

Meydan okuma kuralları:

  • Elbette, 0 indeksli yerine 1 indeksli girişi kullanmanıza izin verilir. Ancak lütfen cevabınızda hangisini kullandığınızı belirtin.
  • Çıktı büyük / küçük harfe duyarsızdır, bu nedenle iyi olan büyük harflerle çıktı almak istiyorsanız.
  • En az 1.000 kadar girişi desteklemelisin.

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, codegolfing olmayan dillerle cevap göndermekten vazgeçmesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem ile uygun parametreler, tam programlar kullanabilirsiniz. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları (0 indeksli):

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

3
Kolmogorov karmaşıklık etiketini ekledik çünkü çoğu cevap muhtemelen girdiyi döngüsel bir indeks olarak kullanacak ve üretimi bayt sayısına baskın gelecek.
Martin Ender

@MartinEnder Teşekkürler. Ben, hatalı olarak, sadece kolmogorov-complexityher zaman aynı sabit çıktılı olan cevaplar için kullandım , ama şimdi kodda sabit çıktı dizgileri ve bunun golf oynamak için kalıplar bulduğu (ya da @ Enigma'nın 05AB1E yanıtı gibi kodladığı gibi ) olduğunu görüyorum . Bunu eklediğiniz için teşekkür ederiz; Sandbox'taki (maalesef cevapsız) sorularımdan biri olan bu zorluk için hangi etiketlerin alakalı olduğundan emin değildim.
Kevin Cruijssen


1
@KevinCruijssen En azından sorunuz bazılarını + 1'lerden aldı :) (iyimser bir açıklama) Sandbox kullanarak arama yapabilirsiniz inquestion:2140 shoulders.
Outgolfer Erik 17:16

3
Bu şarkıyı bütün gün kafasında sıkıştı mı? ...
Kevin Cruijssen

Yanıtlar:


12

05AB1E , 36 35 34 bayt

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

Çevrimiçi deneyin! veya Test paketi olarak

açıklama

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

Kısacası listeyi hazırlıyoruz ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']ve girişini içeri giriyoruz (0 dizinlenmiş).


4
@KevinCruijssen: Bir açıklama ofc geliyor :) Bu, golf dillerinin imo için oldukça zorunlu.
Emigna

‡ä¾ØsÏ©s¸±sHer kelimenin 2 karakter olduğunu göz önünde bulundurarak garip görünüyor. Başka bir şey mi var?
Outgolfer Erik,

2
@EriktheGolfer: Evet, 3'lü sözlükte tekil olan sçoğullaştırmak için var shoulder, knee, toe. eyes, earsZaten sözlükte çoğullandıkları için buna ihtiyacımız yok , bu yüzden dize beklenen çift uzunluğa sahip olacak.
Emigna

Oh, kafamı karıştırdılar. Teşekkürler.
Outgolfer Erik 17:16

31

JavaScript (ES6), 91 88 87 bayt

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

Nasıl çalışır

Her zaman bir arada görünen 4 farklı kelime çiftimiz var: 'kafa'yı daima' omuzlar ',' dizleri 'her zaman' ayak parmakları 'vb. Takip eder.

Bu nedenle, aşağıdaki indeksi kullanabiliriz:

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

Ve tüm diziyi (ters sırada) aşağıdaki ikili maskeye sıkıştırın:

00 00 01 11 10 00 00 01 00 00 01

[ 'knees', 'toes' ]Mümkün olduğunca çok sayıda lider sıfır elde etmek için ilk çift olarak kullanıyoruz .

Bu diziyi bir ekstra 0ile dolduruyoruz, böylece çıkarılan değer 2'ye kadar önceden yerleştirilmiş, bu da şöyle:

0b00000111100000010000010 = 245890

Dolayısıyla doğru kelime için son formül:

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

Test durumları


10

Python 2, 158 148 137 128 114 109 104 bayt

Arama tablosu daha iyi görünüyor. Ayrıca büyük ipi kısaltmış ve öğeleri yeniden sıralamıştır. Dize listesi olarak kullanmak için Rod -5 bayt teşekkürler.

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

ilk çözüm:

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
Çok orijinal cevap! +1. Fakat, umm ..., dizelerin tamamını kullanan çoğu cevap bundan daha kısa. Yine de, tellerde bir çeşit kalıp görmek için aldığınız parayı seviyorum! Bunun için Chapeau.
Kevin Cruijssen

Sanırım ipi şu hale getirerek bu omuzu yapabilirsiniz: hskteemnehnoyaooaoeeerusduessste ls h dve eğer kelimenin 'omuz' olması gerektiğini biliyorsanız, 'ers' ekleyerek :) :)
Kade

1
Sadece c kullanmak c=int('602323'*2+'4517602323'[input()%22])ve bırakabilirsiniz h:
Rod

1
[i%22]birincisi, [input()%22]ikincisinde
Rod

1
@Rod Ah üzgünüm, kodunuza yeterince bakarsanız, kör olursunuz.
Karl Napf

6

Perl, 74 bayt

İçin 73 bayt kodu + 1 -p.

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

0 tabanlı endeksleme kullanır. Bir ayırıcı çıkarmaz, ancak -lbayraklarda değişiklik yapılabilir .

Çevrimiçi deneyin .


x2)x2bunun yerine 1 byte tasarruf edebilirsinizx2),@a
Adam

4

Python 2, 97 90 Bayt

Bunu yapan bazı matematik olabilir, bu yüzden kelime listesini yapmak zorunda kalmam ama bu şimdilik işe yarıyor!

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

7 byte tasarruf için Flp.Tkc teşekkürler :)


1
Benzer bir çözüm buldum ama split()kısaltmak için kullandım:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack 17:16

üzgünüm, orada 'burun' sonra bir boşluk olmalı :)
FlipTack

@ Flp.Tkc Evet, daha yeni farkına vardım :) Bir saniyede güncelleme!
Kade

4

Java 7, 155 137 131 123 111 110 bayt

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

@Neil sayesinde -12 bayt . Utanmadan @Arnauld'un şaşırtıcı cevabının
limanı yaratarak -1 byte .

Java 0 dizinli, bu yüzden kullandım.

Ungolfed ve test kodu:

Burada dene.

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

Çıktı:

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];}sadece 112 bayttır.
Neil

Yorumdan kopyalamaya çalışırsanız, Stack Exchange'in izniyle görünmez bazı baytlar alırsınız.
Neil

@Neil Tamam, ben bir aptalım .. Dün akşam geç saatte nasıl kaba bir şekilde saydım bilmiyorum .. Muhtemelen çok geç oldu ..>. boşluk), çok teşekkürler!
Kevin Cruijssen

3

C, 153 bayt 141 bayt

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

4 byte için @cleblanc'e teşekkürler. B 'nin küresel olarak ilan edilmesi int a intikam konusunda tonlarca uyarı verir, fakat benim için kırılmadı.

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

Bu en küçük cevap değil, ancak tekniği sevdim ve birkaç desen bulmaktan zevk aldım.

Değişiklikler:

  • Kaçının (4 byte) bönlemek için global taşındıchar
  • a > 11 && a < 16=> (a & 12) > 8(2 bayt)
  • i=(a-6)%10=> i=(a+4)%10öyle ki i < 2 && i >= 0=> i < 2(6 bayt)

1
Bu biraz daha golf oynayabilirsiniz. B [] 'ı global bir kapsamda hareket ettirmek suretiyle, char * kullanılmadan ilan edilebilir *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i've daha sonra b [...]' nin yerine bir biter (b [...]) getirilerek 143 bayta indirilir
cleblanc

1 Ve ilaveten @cleblanc 'ın önerisi, ayrıca her iki değiştirebilir &&için &.
Kevin Cruijssen

@ Blyclanc 'in global olarak b ilan edilmesine dair önerisinin nasıl olduğunu merak ediyorum. Derleyici bana bunun bir * int [] olacağını söyledi ve boyut farkının kodu kıracağını düşündüm. Olmadı, çok teşekkürler!
nmjcman101

2

JavaScript (ES6) 91 89 Bayt

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
Güzel! +1. Cevabınızı Java 7'ye aktardığımda, @ Arnauld'un zatenkinden daha kısa cevabına kıyasla katı bir -7 bayttır. ;) Teşekkürler!
Kevin Cruijssen

1
Ben benim kullanımı ile yaratıcı olarak bir byte kurtardı %: n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10].
Neil

2

R, 95 bayt

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

Arama tablosu olarak işlev görecek bir karakter vektörü oluşturur. Stdin ( 1-indexed) ' den girdi alır %%22ve karşılık gelen vücut parçasını bulur.

Bonus: %%vektörleştirilmiştir, bunun bir vektör girişi ile de çalışacağı anlamına gelir.

R-fiddle'daki test durumları (Bunun R-fiddle'dascan çalışmadığından adlandırılmış bir işlev olduğunu unutmayın )


2

jq, 80 karakter

(77 karakter kod + 3 karakter komut satırı seçeneği)

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

Örnek çalışma:

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

Çevrimiçi test ( -rURL'den geçmek desteklenmez - Ham Çıktıyı kendiniz kontrol edin.)


2

WinDbg, 207 157 151 bayt

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

Vücut parçalarının ofset / uzunluğunu ascii karakter olarak kodlayarak -50 bayt.

Ofset / uzunluk ararken yerel var kullanarak -6 bayt.

Giriş, sahte kayıt defterinde ayarlanmış bir değerle yapılır $t0.

Nasıl çalışır:

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

Örnek çıktı:

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 Bayt

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

0-Endeksli

Str_split kaldırıldıktan sonra 91'e kadar, PHP string'in karakter dizisi olarak erişilebilir olduğunu fark etmedi (PHP 5+ şey?)

Dize kotalarını kaldırmak ve bildirimlere izin vermek için kullanıcı adı önerisi sayesinde 102'ye kadar


-16 bayt: Tüm kaldırmak 'gibi, etrafında kelimeleri 'head'olur headvs.
insertusernamehere

Kuralların bununla ilgili olduğundan emin değilim, ancak varsayılan PHP kurulumunda bunu yaparken beklenen tanımsız sabit uyarıları
alıyorum

1
Evet, ancak bu kesinlikle site kurallarına uygundur. Bildirimler ve uyarılar göz ardı edilebilir.
insertusernamehere

@ CT14.IT, bu bir uyarı değildir, bir bildirimdir. “PHP 5.3 veya üstü, varsayılan değer E_ALL ve ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Bu ayar E_NOTICE, E_STRICT ve E_DEPRECATED seviye hatalarını göstermiyor. ”- PHP hakkındaerror_reporting .
Manatwork

1
Görünüşe göre str_split () işe yaramaz
Crypto

1

Jöle , 55 bayt

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

Çevrimiçi deneyin! (1 tabanlı dizin)

Haydi! Gerçekten mi?

Bir bonus olarak, bu üst satır yerine kullanmam gereken sıkıştırılmış dizedir:

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

Her ikisi de bu dizgiyi kodlar:

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

Sanırım şimdi egzersiz yapmalıyım: P


1

Powershell, 91 Bayt, Sıfır Dizinli

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

Çok basit bir yaklaşımla, mümkün olan yerlerde bazı derleme çarpmalarını kullanarak boşluklarla derleyerek ve sonunda bölerek ilk 22 öğenin dizisini oluşturun. (bölme, dizi olarak eşdeğer kurulumdan daha kısa 2 bayttır), o zaman tam olarak ilginç veya dile özgü değil, sadece girişin modülünü kullanarak o dizideki noktayı bulun.

Test durumu:

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

vb.


1

yakut, 81 bayt

Lambda işlevi sıfır indeksleme kullanarak.

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

açıklama

Şarkının 2,3,4 doğru çizgilerini kapsayan ilk 16 elemanı kullandığımız aşağıdaki diziyi üretiyoruz:

%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

Tek bir ayete indirgemek için n modulo 22 alıyoruz, sonra 6'yı çıkarıyoruz. Şimdi endeks 6 (örneğin) 0 olarak değiştirildi ve doğru kelimeyi işaret etti. Şarkının ilk satırına işaret eden 0..5 işareti şimdi negatif. Şarkının 1. satırını 4. satıra eşlemek için kullanıyoruz &15( %16parantez gereksinimi ile aynı değiliz ). Böylece indeks 0-> -6->10

test programında

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

İlginç bir endeks formülü. Ancak aynı uzunluk onsuz da elde edilebilir:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
Manat çalışması 18:16

1

Befunge, 129 119 bayt

0 endeksli

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

Çevrimiçi deneyin!

açıklama

Arnauld'un belirttiği gibi , kelimeler çiftler halinde gelir, bu yüzden sadece 11 değerden oluşan bir indekse sahip oluruz ve daha sonra çifti bulmak için% 2 kelimesini ekleriz. Kelimeler, yer kazanmak için yıldızlarla ayrılmış tek bir dize olarak yığının üzerine itilir. Kelime sonları modulo 7 char değerini alarak test ediyoruz, çünkü sadece yıldız işareti 7'nin katıdır.

&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 Bayt

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

İlk sütunun otomatik olarak arttığı yerde böyle bir tablo gerekir:

görüntü tanımını buraya girin

Bu tek indeksli bir cevaptır. Tablo ilk kez saklı yordam oluşturulduğunda doldurulur - hepsi INSERTbir arada bildirimi yapmama izin vermedi , hayal kırıklığı yaratıyor, bu özellik yalnızca içeride mevcut >=SQL 2008. Bundan sonra %22, diğer cevaplardaki hileyi kullanır . Tablo doldurulduktan sonra, sadece son kısmı kullanır:

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

"bir INSERT'in hepsini bir açıklamada yapmama izin vermedi " neden? Böyle bir şey 2008'den sonra SQL'de mümkün olmaz mı?
Kevin Cruijssen

@KevinCruijssen SQL Server 2008 R2 kullanıyorum, bu yüzden garip ... Biraz daha Googling yaptım, görünüşe göre sadece denedim ve başaramadığım veritabanının "Uyumluluk Seviyesi" ile bir ilgisi var değiştirmek için - 2005'e ayarlanmıştır ve bu maksimum değerdir, bu nedenle bu özelliğe sahip değildir. Ya da benim cevabımda SQL sürümünü belirtmeli miyim, yoksa doğru şekilde kısaltılamazsa cevabı mı sileyim? Bana çok fazla metin kazandıracağı için ...
Pete Arden

Her ikisi de benim için iyi, bu yüzden senin kararın. Kişisel olarak genellikle belirttiğim Java 7'de golf oynuyorum, çünkü çoğu durumda Java 8'de daha kısa cevaplar mevcut. 2005'i aynı şekilde belirtebilirsiniz.
Kevin Cruijssen

@KevinCruijssen Evet, bunu Java ve Python için yapan insanlar gördüm. Kodu da sınamadan değişiklik yapmak istemezdim, bu yüzden 2005, şerefe :) belirteceğim
Pete Arden

1

bash (ed ile), 83 karakter

1 endeksli

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

Örnek arama:

 $ bash test.sh 1001
 knees

1

dc , 135 bayt

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

Çevrimiçi deneyin!

Dizilerin dcbir seferde bir eleman inşa edilmesi gerekir, bu da bu alıştırmanın zahmetine katlanır. 'Gözler', 'kulaklar', 'ağız' ve 'burun' dizimizde yalnızca bir kez göründüğünden beri, sadece onları içeri sokarız.x[head]x x'in olduğu üç değerinin ortasıdır, sonra [:add6-r;ar:adA+r;ar:a]dshxonu diziye koymak, geri çekmek, aynı değerde altıdan daha küçük bir değere koymak, geri çekmek ve orijinal değerinde son bir kez koymak için makroyu çalıştırırız. artı on. Orta değeri kullanıyoruz, çünkü dcondalık modda bile onaltılık rakam kullanmamıza ve çıkarmamıza izin veriyor.A , eklemekten bir bit daha az16- bu sadece işe yarar çünkü orta değerlerin tümü onbeşin altındadır. Dizleri ve ayak parmaklarını iki kere yapmalıyız ve makroyu çözecek kadar akıllı hale getirmeliyiz, sadece makroyu iki kere çalıştırmaktan daha pahalıdır; fakat daha önce saklamak yerine dizenin daha önceden saklanmış bir kopyasını yükleyerek baytları kaydederiz ( B 3;aBvs. B[toes]B- bunun toplam 3 bayt'ı kurtardığını düşünüyorum).

Biz dizi inşa ettikten sonra, yapmanız gereken tek şey 22%ve sonra ;apdiziden ve baskı onu çekin.


0

C # 6, 138 bayt

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

Ungolfed + yorum:

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

Dizeyi birleştirip bir tane kullanabilir Splitve ?:köşeli parantezlerin içinde ( +4ikinci kısım için ) üçlü ( ) gibi aynı çekinizi alabilirsiniz : 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 bayt )
Kevin Cruijssen

0

Excel, 146 bayt

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

Bayt'ı MOD(MOD(MOD(B1+16,22),16),10)kurtarmak için @ Neil's kullanır 15.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.