Đầu, Vai, Đầu gối và Ngón chân, Đầu gối và Ngón chân


31

Giới thiệu:

Tôi nghĩ tất cả chúng ta đều biết điều đó, và nó có lẽ đã được dịch sang vô số ngôn ngữ khác nhau: bài hát thiếu nhi "Head, Shoulders, Knees and Toes":

Đầu, vai, đầu gối và ngón chân, đầu gối và ngón chân
Đầu, vai, đầu gối và ngón chân, đầu gối và ngón chân
Và mắt và tai và miệng và mũi
Đầu, vai, đầu gối và ngón chân, đầu gối và ngón chân
wikipedia


Thử thách:

Đầu vào: Một số nguyên dương.

Đầu ra: Xuất ra một trong những từ sau dựa trên đầu vào là chỉ số thứ n:

head
shoulders
knees
toes
eyes
ears
mouth
nose

Ở đây các bộ phận cơ thể được gắn với các chỉ mục:

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.

Quy tắc thử thách:

  • Tất nhiên, bạn được phép sử dụng đầu vào 1 chỉ mục thay vì 0 chỉ mục. Nhưng vui lòng chỉ định cái nào bạn đã sử dụng trong câu trả lời của bạn.
  • Đầu ra không phân biệt chữ hoa chữ thường, vì vậy nếu bạn muốn xuất nó theo dạng mũ thì tốt.
  • Bạn nên hỗ trợ đầu vào tối thiểu 1.000.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

Các trường hợp thử nghiệm (0 chỉ mục):

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

3
Đã thêm thẻ độ phức tạp kolmogorov vì hầu hết các câu trả lời có thể sẽ sử dụng đầu vào dưới dạng chỉ số tuần hoàn thành một mảng không đổi, mà thế hệ của chúng sẽ chi phối số lượng byte.
Martin Ender

@MartinEnder Cảm ơn. Tôi, không chính xác, chỉ được sử dụng kolmogorov-complexitycho các câu trả lời luôn có cùng một đầu ra cố định, nhưng bây giờ tôi thấy đó là về các chuỗi đầu ra cố định trong mã và tìm các mẫu để chơi nó (hoặc mã hóa nó như với câu trả lời 05AB1E của @ Enigma ). Cảm ơn vì đã thêm nó; Tôi không chắc chắn những thẻ nào có liên quan đến thử thách này, đó là một trong những câu hỏi (không may chưa được trả lời) của tôi trong Sandbox.
Kevin Cruijssen


1
@KevinCruijssen Ít nhất câu hỏi của bạn đã bắt được một số + 1 :) (nhận xét lạc quan) Bạn có thể tìm kiếm trong hộp cát bằng cách sử dụng inquestion:2140 shoulders.
Erik the Outgolfer

3
Có ai khác bị bài hát này mắc kẹt trong đầu cả ngày không? ...
Kevin Cruijssen

Câu trả lời:


12

05AB1E , 36 35 34 byte

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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

Nói tóm lại, chúng tôi xây dựng danh sách ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']và lập chỉ mục vào đó với đầu vào (0-index).


4
@KevinCruijssen: Một lời giải thích sắp có :) Nó khá bắt buộc đối với ngôn ngữ chơi golf imo.
Emigna

‡ä¾ØsÏ©s¸±sCó vẻ kỳ lạ, xem xét rằng mỗi từ là 2 ký tự. Có phải cái gì khác không?
Erik the Outgolfer

2
@EriktheGolfer: Vâng, 3 sngười ở đó để số nhiều shoulder, knee, toesố ít trong từ điển. Chúng ta không cần điều đó eyes, earsvì chúng đã được số nhiều trong từ điển để chuỗi có độ dài dự kiến.
Emigna

Ồ, họ làm tôi bối rối. Cảm ơn.
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]

Làm thế nào nó hoạt động

Chúng tôi có 4 cặp từ riêng biệt luôn xuất hiện cùng nhau: 'đầu' luôn được theo sau bởi 'vai', 'đầu gối' luôn được theo sau bởi 'ngón chân', v.v.

Do đó, chúng ta có thể sử dụng chỉ mục sau:

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

Và nén toàn bộ chuỗi (theo thứ tự ngược lại) vào mặt nạ nhị phân sau:

00 00 01 11 10 00 00 01 00 00 01

Chúng tôi sử dụng [ 'knees', 'toes' ]như cặp đầu tiên để có được càng nhiều số 0 hàng đầu càng tốt.

Chúng tôi thêm chuỗi này với một phần bổ sung 0để giá trị được trích xuất được chia thành 2, dẫn đến:

0b00000111100000010000010 = 245890

Do đó công thức cuối cùng cho từ đúng:

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

Các trường hợp thử nghiệm


10

Python 2, 158 148 137 128 114 109 104 byte

Bảng tra cứu có vẻ tốt hơn. Cũng rút ngắn chuỗi lớn và sắp xếp lại các mục. -5 byte nhờ Rod sử dụng chuỗi làm danh sách.

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

giải pháp ban đầu:

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
Câu trả lời rất độc đáo! +1. Nhưng, umm ..., hầu hết các câu trả lời sử dụng chuỗi hoàn chỉnh đều ngắn hơn thế này. Tuy nhiên, tôi thích khả năng bạn đã có để xem một số loại mô hình trong chuỗi! Chapeau cho điều đó.
Kevin Cruijssen

Tôi nghĩ rằng bạn có thể tạo ra vai này bằng cách tạo chuỗi này: hskteemnehnoyaooaoeeerusduessste ls h dvà sau đó nối thêm 'ers' nếu bạn biết từ được cho là 'vai' :)
Kade

1
bạn chỉ có thể sử dụng c=int('602323'*2+'4517602323'[input()%22])và thả hc:
Rod

1
[i%22]vào lần thứ nhất, [input()%22]vào lần thứ hai
Rod

1
@Rod Ah xin lỗi, nếu bạn nhìn vào mã của mình đủ lâu bạn sẽ bị mù.
Karl Napf

6

Perl, 74 byte

Mã 73 byte + 1 cho -p.

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

Sử dụng lập chỉ mục dựa trên 0. Không xuất ra một dấu phân cách, nhưng điều đó có thể được sửa đổi -ltrong các cờ.

Hãy thử trực tuyến .


bạn có thể tiết kiệm 1 byte x2)x2thay vìx2),@a
Adam

4

Python 2, 97 90 byte

Có thể có một số phép toán làm cho nó vì vậy tôi không phải lập danh sách từ, nhưng điều này có hiệu quả ngay bây giờ!

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

Cảm ơn Flp.Tkc vì đã lưu 7 byte :)


1
Tôi có một giải pháp tương tự, nhưng sử dụng split()để làm cho nó ngắn hơn:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack

xin lỗi, nên có một khoảng trống sau 'mũi' ở đó :)
FlipTack

@ Flp.Tkc Vâng tôi mới nhận ra điều đó :) Cập nhật trong giây lát!
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 nhờ @Neil .
-1 byte bằng cách xấu hổ tạo ra một cổng câu trả lời tuyệt vời của @Arnauld .

Java được lập chỉ mục 0, vì vậy đó là những gì tôi đã sử dụng.

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

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];}chỉ có 112 byte.
Neil

Nếu bạn cố gắng sao chép từ nhận xét, bạn sẽ nhận được một số byte vô hình bổ sung của Stack Exchange.
Neil

@Neil Ok, tôi là một thằng ngốc .. Không biết làm thế nào tôi đếm được 120 ngày hôm qua muộn .. Có lẽ đã quá muộn ..>.> Dù sao, tôi đã chỉnh sửa nó (cộng thêm 1 byte bằng cách xóa không gian), vì vậy cảm ơn!
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];}

Cảm ơn @cleblanc cho 4 byte. Tuyên bố b trên toàn cầu ném một tấn cảnh báo về việc truyền tới int, nhưng không phá vỡ đối với tôi.

Ung dung:

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

Đó không phải là câu trả lời nhỏ nhất, nhưng tôi thích kỹ thuật này và rất vui khi tìm thấy một vài mẫu.

Thay đổi:

  • Đã chuyển bsang toàn cầu để tránh char(4 byte)
  • a > 11 && a < 16=> (a & 12) > 8(2 byte)
  • i=(a-6)%10=> i=(a+4)%10sao cho i < 2 && i >= 0=> i < 2(6 byte)

1
Bạn có thể chơi golf này xuống một chút nữa. Bằng cách di chuyển b [] sang phạm vi toàn cục, nó có thể được khai báo mà không cần sử dụng char * như thế này *b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'và sau đó thay thế trả về b [...] bằng một lệnh đặt (b [...]), bạn có thể giảm xuống còn 143 byte
cleblanc

+1 Và ngoài đề xuất của @cleblanc , bạn cũng có thể thay đổi cả hai &&thành &.
Kevin Cruijssen

Tôi tò mò về cách @cleblanc đề xuất về việc khai báo b trên toàn cầu hoạt động. Trình biên dịch nói với tôi rằng nó sẽ là một * int [] và tôi nghĩ rằng sự khác biệt kích thước sẽ phá vỡ mã. Mặc dù vậy, cảm ơn rất nhiều!
nmjcman101

2

JavaScript (ES6) 91 89 byte

f=
n=>((d='head:shoulders:'+(b='knees:toes:')+b)+d+'eyes:ears:mouth:nose:'+d).split`:`[n%22]

console.log(f.toString().length)
console.log(f(0) === 'head')
console.log(f(1) === 'shoulders')
console.log(f(7) === 'shoulders')
console.log(f(13) === 'ears')
console.log(f(20) === 'knees')
console.log(f(35) === 'ears')
console.log(f(37) === 'nose')
console.log(f(98) === 'knees')
console.log(f(543) === 'nose')
console.log(f(1000) === 'knees')


1
Tốt đẹp! +1. Khi tôi chuyển câu trả lời của bạn sang Java 7, đó là một byte rắn -7 byte so với câu trả lời đã ngắn hơn của tôi của Arnauld. ;) Cảm ơn!
Kevin Cruijssen

1
Tôi đã lưu một byte bằng cách sáng tạo với việc sử dụng %: 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]

Tạo một vectơ ký tự để hoạt động như một bảng tra cứu. Lấy đầu vào từ stdin ( 1-indexed) và %%22để tìm phần cơ thể tương ứng.

Phần thưởng: %%được vector hóa có nghĩa là điều này cũng sẽ hoạt động với đầu vào vector.

Các trường hợp thử nghiệm trên R-fiddle (Lưu ý rằng đây là chức năng được đặt tên vì scankhông hoạt động trên R-fiddle)


2

jq, 80 ký tự

(Tùy chọn dòng lệnh 77 ký tự + 3 ký tự)

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

Chạy mẫu:

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

Kiểm tra trực tuyến (Chuyển -rqua URL không được hỗ trợ - hãy tự kiểm tra Đầu ra thô.)


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 bằng cách mã hóa phần bù / chiều dài của các bộ phận cơ thể dưới dạng ký tự ascii.

-6 byte bằng cách sử dụng var cục bộ khi tra cứu offset / length.

Đầu vào được thực hiện với một giá trị được đặt trong thanh ghi giả $t0.

Làm thế nào nó hoạt động:

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

Đầu ra mẫu:

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


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


0:000> r$t0=7
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000004  "shoulders"


0:000> r$t0=0n13
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n20
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n35
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200001a  "ears"


0:000> r$t0=0n37
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n98
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"


0:000> r$t0=0n543
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
02000023  "nose"


0:000> r$t0=0n1000
0:000> ea2000000"headshoulderskneestoeseyesearsmouthnoseAEEJNFSENFSEAEEJNFSENFSEWE[E_FdEAEEJNFSENF";r$t4=(@$t0%16)*2+2000027;da1FFFFBF+by(@$t4) Lby(@$t4+1)-41
0200000d  "knees"

2

PHP, 91 102 118 128 129 byte

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

0-Index

Xuống tới 91 sau khi loại bỏ str_split, không nhận ra chuỗi PHP có thể truy cập dưới dạng một mảng char (một thứ 5+ PHP?)

Giảm xuống 102 nhờ đề xuất tên người dùng để xóa dấu ngoặc kép và cho phép thông báo


-16 byte: xóa tất cả các 'từ xung quanh, như 'head'trở thành, headv.v.
insertusernamehere

Không chắc chắn các quy tắc này là gì, nhưng với cài đặt PHP mặc định, tôi nhận được các cảnh báo liên tục không xác định dự kiến ​​khi thực hiện điều đó
CT14.IT

1
Có, nhưng điều này hoàn toàn tốt với các quy tắc của trang web. Thông báo và cảnh báo có thể được bỏ qua.
insertusernamehere

@ CT14.IT, đó không phải là một cảnh báo, là một thông báo. Sau đó, PHP PHP 5.3 trở lên, giá trị mặc định là E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED. Cài đặt này không hiển thị E_NOTICE, E_STRICT và các lỗi mức E_DEPRECATED.”- tài liệu PHP vềerror_reporting .
manatwork

1
Có vẻ như str_split () là vô dụng
Crypto

1

Thạch , 55 byte

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

Hãy thử trực tuyến! (Chỉ số dựa trên 1)

Nào! Có thật không?

Như một phần thưởng, đây là chuỗi nén mà tôi phải sử dụng thay vì dòng trên cùng:

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

Cả hai đều mã hóa chuỗi này:

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

Đoán tôi nên đi tập thể dục ngay bây giờ: P


1

Powershell, 91 Byte, Không có chỉ mục

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

Cách tiếp cận rất đơn giản, tạo ra mảng của 22 mục đầu tiên bằng cách sử dụng một số phép nhân chuỗi nếu có thể, bằng cách biên dịch chúng với khoảng trắng và phân tách ở cuối. (chia nhỏ hơn 2 byte so với thiết lập tương đương dưới dạng một mảng) sau đó chỉ cần tìm điểm trong mảng đó bằng cách sử dụng mô-đun của đầu vào, không chính xác thú vị hoặc cụ thể theo ngôn ngữ.

Trường hợp thử nghiệm:

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

v.v.


1

hồng ngọc, 81 byte

Hàm Lambda sử dụng lập chỉ mục bằng không.

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

giải trình

Chúng tôi tạo ra mảng sau, trong đó chúng tôi sử dụng 16 phần tử đầu tiên, bao gồm các dòng chính xác 2,3,4 của bài hát:

%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

Chúng tôi lấy n modulo 22 để giảm nó thành một câu, sau đó chúng tôi trừ đi 6. Bây giờ chỉ số 6 (ví dụ) đã được thay đổi thành 0 và trỏ đến đúng từ. Chỉ 0..5 mà điểm đến dòng đầu tiên của bài hát bây giờ là âm. Chúng tôi sử dụng &15(giống hệt %16nhưng tránh sự cần thiết của dấu ngoặc) để ánh xạ dòng thứ 1 của bài hát sang dòng thứ 4. Do đó, chỉ mục 0-> -6->10

trong chương trình kiểm tra

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

Công thức chỉ số thú vị. Nhưng độ dài tương tự có thể đạt được mà không cần nó:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
manatwork

1

Befunge, 129 119 byte

Chỉ số 0

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

Hãy thử trực tuyến!

Giải trình

Như Arnauld đã chỉ ra, các từ đi theo cặp, vì vậy chúng tôi có một chỉ mục chỉ có 11 giá trị và sau đó thêm số từ% 2 để có được từ thích hợp trong cặp. Các từ được đẩy lên ngăn xếp dưới dạng một chuỗi được phân tách bằng dấu hoa thị để tiết kiệm không gian. Chúng tôi kiểm tra ngắt từ bằng cách lấy giá trị char modulo 7, vì chỉ dấu hoa thị là bội số của 7.

&29+2*%               n = getint() % 22             // % 22 to ensure it's in range
:2/2g                 i = index_array[n/2]          // we use n/2 because words are paired
-"/"                  i -= '/'                      // convert from ASCII to 1-based value
\2%+                  i += n%2                      // get the correct word in the pair
00p                   index = i                     // save for later

"head*shoulders*knees*toes*eyes*ears*mouth*nose"    // push all the words onto the stack

700g1-:|              while (index-1 != 0) {        // the 7 is used in the drop loop   
  00p                   index = index-1             
  >%#7_                 do while (pop() % 7)        // drop up to the next '*' (%7==0)
                      }                    

$$                    pop();pop()                   // get rid of index and extra 7

: 7 % _               while ((c = pop()) % 7)       // output up to the next '*' (%7==0)
 > : ,                  putchar(c)

1

SQL 2005 747 byte

Chơi gôn

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

Ung dung:

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

Cần một bảng như thế này, trong đó cột đầu tiên được tự động tăng:

nhập mô tả hình ảnh ở đây

Đây là một câu trả lời một chỉ mục. Bảng được điền vào lần đầu tiên quy trình lưu trữ được tạo - nó sẽ không cho phép tôi thực hiện tất cả các INSERTcâu lệnh trong một, thật đáng thất vọng, tính năng này chỉ khả dụng >=SQL 2008. Sau này, nó sử dụng %22thủ thuật từ các câu trả lời khác. Khi bảng đã được điền, nó chỉ sử dụng phần cuối cùng:

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

" Nó sẽ không cho phép tôi thực hiện tất cả CHỨNG MINH trong một tuyên bố " tại sao? Không nên làm điều gì đó như thế này trong SQL sau năm 2008?
Kevin Cruijssen

@KevinCruijssen Tôi đang sử dụng SQL Server 2008 R2, thật lạ ... Tôi vừa mới thực hiện thêm một số Google, rõ ràng đó là một việc phải làm với "Mức độ tương thích" của cơ sở dữ liệu, tôi đã thử và thất bại để thay đổi - nó được đặt thành năm 2005 và đây là giá trị tối đa, vì vậy nó không có tính năng này. Tôi có nên, chỉ định phiên bản SQL trong câu trả lời của mình hoặc xóa câu trả lời nếu không thể rút ngắn đúng? Gutted vì điều đó sẽ tiết kiệm cho tôi rất nhiều văn bản ...
Pete Arden

Hoặc là tốt với tôi, vì vậy đó là cuộc gọi của bạn. Cá nhân tôi thường chơi golf trong Java 7 mà tôi chỉ định, vì trong hầu hết các trường hợp, các câu trả lời ngắn hơn đều có sẵn trong Java 8. Bạn có thể chỉ định năm 2005 theo cách tương tự.
Kevin Cruijssen

@KevinCruijssen Vâng, tôi đã thấy mọi người làm điều đó cho Java và Python. Sẽ không thực sự muốn thực hiện thay đổi mà không thể kiểm tra mã, vì vậy tôi sẽ chỉ định năm 2005, chúc mừng :)
Pete Arden

1

bash (có ed), 83 ký tự

1 chỉ mục

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

Cuộc gọi mẫu:

 $ bash test.sh 1001
 knees

1

dc , 135 byte

6[head]6[:add6-r;ar:adA+r;ar:a]dshx7[shoulders]7lhx8[knees]8lhxA 2;aAlhx9[toes]9lhxB 3;aBlhx[eyes]C:a[ears]D:a[mouth]E:a[nose]F:a22%;ap

Hãy thử trực tuyến!

Mảng trong dcphải được xây dựng một yếu tố tại một thời điểm, chiếm phần lớn của bài tập này. Vì 'mắt', 'tai', 'miệng' và 'mũi' chỉ xuất hiện một lần trong mảng của chúng tôi, chúng tôi chỉ đưa chúng vào. Nhưng đối với những người khác, chúng tôi lưu một vài byte bằng cách đặt chúng vào ngăn xếp như x[head]x, trong đó x là giữa của ba giá trị của nó, sau đó chúng tôi chạy macro [:add6-r;ar:adA+r;ar:a]dshxđể đặt nó vào mảng, kéo nó trở lại, đặt nó ở cùng một giá trị ít hơn sáu, kéo nó trở lại, sau đó đặt nó vào lần cuối cùng ở giá trị ban đầu cộng mười. Chúng tôi sử dụng giá trị trung bình vì dccho phép chúng tôi sử dụng các chữ số hex ngay cả trong chế độ thập phân và phép trừ Alà một byte ít hơn so với việc thêm16- điều này cũng chỉ hoạt động vì tất cả các giá trị trung bình đều dưới mười lăm. Chúng ta phải làm hai đầu gối và ngón chân hai lần, và làm cho macro của chúng ta đủ thông minh để sắp xếp thứ đó đắt hơn là chỉ chạy macro hai lần; nhưng chúng tôi lưu các byte ở đây bằng cách tải một bản sao được lưu trữ trước đó của chuỗi thay vì viết lại ( B 3;aBso với B[toes]B- tôi nghĩ điều này tiết kiệm tổng cộng 3 byte).

Khi chúng ta đã xây dựng được mảng, tất cả những gì chúng ta cần làm là 22%và sau đó ;apkéo nó ra khỏi mảng và in.


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

thay thế bản demo

Ungolfed + bình luận:

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

Bạn có thể kết hợp chuỗi và sử dụng một chuỗi và Splitkiểm tra tương tự như ternary ( ?:) bên trong dấu ngoặc vuông (với +4phần thứ hai), như thế này: 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)

Sử dụng @ Neil MOD(MOD(MOD(B1+16,22),16),10)để lưu 15byte.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.