หัว, ไหล่, หัวเข่าและเท้า, หัวเข่าและเท้า


31

บทนำ:

ฉันคิดว่าเราทุกคนรู้และมันอาจถูกแปลเป็นภาษาต่าง ๆ มากมาย: เพลงเด็ก "Head, shoulders, Knees and Toes":

หัว, ไหล่, หัวเข่าและเท้า, หัวเข่าและเท้า
หัว, หัวเข่า, และหัวเข่าและนิ้วเท้า
และตาและหูและปากและจมูก
หัว, ไหล่, หัวเข่าและเท้า, หัวเข่าและเท้า
วิกิพีเดีย


ท้าทาย:

อินพุต:จำนวนเต็มบวก

เอาท์พุท:เอาท์พุทหนึ่งในคำต่อไปนี้ขึ้นอยู่กับอินพุตเป็นดัชนี n-th:

head
shoulders
knees
toes
eyes
ears
mouth
nose

ส่วนต่าง ๆ ของร่างกายจะถูกผนวกเข้ากับดัชนี:

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.

กฏท้าทาย:

  • แน่นอนว่าคุณได้รับอนุญาตให้ใช้อินพุต 1 ดัชนีแทนที่จะเป็นดัชนี 0 แต่โปรดระบุว่าคุณใช้คำตอบแบบไหน
  • เอาต์พุตไม่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กดังนั้นหากคุณต้องการส่งออกในรูปแบบตัวพิมพ์ใหญ่
  • คุณควรสนับสนุนอินพุตได้ไม่น้อยกว่า 1,000

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

กรณีทดสอบ (ดัชนี 0):

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

3
เพิ่มแท็กความซับซ้อนของ kolmogorov เนื่องจากคำตอบส่วนใหญ่อาจใช้อินพุตเป็นดัชนีแบบวนซ้ำในอาร์เรย์คงที่ซึ่งการสร้างจะครองจำนวนไบต์
Martin Ender

@MartinEnder ขอบคุณ ฉันไม่ถูกต้องใช้เฉพาะkolmogorov-complexityสำหรับคำตอบที่มักจะมีการส่งออกคงที่เหมือนกัน แต่ตอนนี้ผมเห็นว่ามันเกี่ยวกับการแก้ไขเอาท์พุทสตริงในรหัสและหารูปแบบการกอล์ฟมัน (หรือเข้ารหัสมันเช่นเดียวกับ@ ปริศนาของคำตอบ 05AB1E ) ขอบคุณที่เพิ่มเข้ามา; ฉันไม่แน่ใจว่าแท็กใดที่เกี่ยวข้องกับความท้าทายนี้ซึ่งเป็นหนึ่งในคำถามของฉัน (ยังไม่ได้รับคำตอบ) ใน Sandbox
Kevin Cruijssen


1
@KevinCruijssen อย่างน้อยคำถามของคุณจับบาง +1 :) (พูดในแง่ดี) คุณสามารถค้นหาใน sandbox inquestion:2140 shouldersใช้
Erik the Outgolfer

3
ทุกคนมีเพลงนี้ติดอยู่ในหัวของพวกเขาตลอดทั้งวันหรือไม่ ...
Kevin Cruijssen

คำตอบ:


12

05AB1E , 36 35 34 ไบต์

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

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

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

ในระยะสั้นเราจะสร้างรายการ ['head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes', 'eyes', 'ears', 'mouth', 'nose', 'head', 'shoulders', 'knees', 'toes', 'knees', 'toes']และจัดทำดัชนีด้วยอินพุต (ดัชนี 0)


4
@KevinCruijssen: คำอธิบายกำลังจะมา :) มันเป็นข้อบังคับสำหรับการเล่นกอล์ฟภาษา imo
Emigna

‡ä¾ØsÏ©s¸±sดูเหมือนว่าแปลกเพราะแต่ละคำมี 2 ตัวอักษร มันเป็นอย่างอื่น?
Erik the Outgolfer

2
@EriktheGolfer: ใช่ 3 คนsอยู่ตรงนั้นเพื่อให้มีหลายฝ่ายshoulder, knee, toeที่เป็นเอกพจน์ในพจนานุกรม เราไม่ต้องการด้วยeyes, earsเนื่องจากพวกเขามีพหูพจน์ในพจนานุกรมอยู่แล้วดังนั้นสตริงจึงมีความยาวเท่ากัน
Emigna

โอ้พวกเขาทำให้ฉันสับสน ขอบคุณ
Erik the Outgolfer

31

JavaScript (ES6), 91 88 87 ไบต์

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

มันทำงานอย่างไร

เรามีคำที่แตกต่างกัน 4 คู่ที่มักปรากฏด้วยกัน: 'หัว' มักตามด้วย 'ไหล่', 'หัวเข่า' จะตามด้วย 'นิ้วเท้า' ฯลฯ

ดังนั้นเราสามารถใช้ดัชนีต่อไปนี้:

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

และบีบอัดลำดับทั้งหมด (ตามลำดับย้อนกลับ) ลงในรูปแบบไบนารีต่อไปนี้:

00 00 01 11 10 00 00 01 00 00 01

เราใช้[ 'knees', 'toes' ]เป็นคู่แรกเพื่อให้ได้เลขศูนย์นำหน้ามากที่สุด

เราตัดลำดับนี้ด้วยค่าพิเศษ0เพื่อให้ค่าที่แยกออกมานั้นถูกกำหนดล่วงหน้าจำนวน 2 ซึ่งนำไปสู่:

0b00000111100000010000010 = 245890

ดังนั้นสูตรสุดท้ายสำหรับคำที่ถูกต้อง:

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

กรณีทดสอบ


10

Python 2, 158 148 137 128 114 109 104 ไบต์

ตารางการค้นหาดูดีขึ้น สั้นลงด้วยสตริงขนาดใหญ่และจัดเรียงรายการอีกครั้ง -5 ไบต์ขอบคุณ Rod สำหรับการใช้สตริงเป็นรายการ

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

วิธีแก้ปัญหาเบื้องต้น:

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
คำตอบที่เป็นต้นฉบับมาก! +1 แต่อืมม ... คำตอบส่วนใหญ่ที่ใช้สตริงทั้งหมดจะสั้นกว่านี้ แต่ถึงกระนั้นฉันชอบที่คุณจ่ายเพื่อดูรูปแบบบางอย่างในสาย! Chapeau สำหรับเรื่องนั้น
Kevin Cruijssen

ฉันคิดว่าคุณสามารถทำให้ไหล่นี้โดยการสตริงนี้hskteemnehnoyaooaoeeerusduessste ls h dแล้วท้าย 'ERS' ถ้าคุณรู้ว่าคำว่าควรจะเป็น 'ไหล่' :)
Kade

1
คุณสามารถใช้c=int('602323'*2+'4517602323'[input()%22])และปล่อยhc:
Rod

1
[i%22]ในวันแรกของ[input()%22]วันที่สอง
Rod

1
@ Rod Ah ขออภัยถ้าคุณดูรหัสของคุณนานพอที่คุณตาบอด
Karl Napf

6

Perl, 74 ไบต์

73 รหัสไบต์ + 1 -pสำหรับ

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

ใช้การจัดทำดัชนีแบบ 0 ไม่ส่งออกตัวคั่น แต่สามารถแก้ไขได้-lในแฟล็ก

ลองมันออนไลน์


คุณสามารถบันทึก 1 ไบต์ด้วยx2)x2แทนx2),@a
Adam

4

Python 2 97 90 Bytes

อาจมีคณิตศาสตร์บางอย่างที่ทำให้ฉันไม่ต้องทำรายการคำ แต่ตอนนี้ใช้ได้ตอนนี้!

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

ขอบคุณ Flp.Tkc สำหรับการบันทึก 7 ไบต์ :)


1
ฉันได้โซลูชันที่คล้ายกัน แต่เคยsplit()ทำให้สั้นลง:k='head shoulders '+'knees toes '*2 print(k*2+'eyes ears mouth nose'+k).split()[input()%22]
FlipTack

ขออภัยควรมีช่องว่างหลังจาก 'จมูก' ที่นั่น :)
FlipTack

@ Flp.Tkc ใช่ฉันเพิ่งรู้ว่า :) อัปเดตในวินาที!
Kade

4

Java 7, 155 137 131 123 111 110 ไบต์

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

-12 ไบต์ขอบคุณที่@Neil
-1 ไบต์โดยการสร้างพอร์ตของ@Arnauld อย่างไร้ยางอาย 'คำตอบที่น่าตื่นตาตื่นใจ

Java นั้นได้รับการจัดทำดัชนี 0 ดังนั้นนั่นคือสิ่งที่ฉันใช้

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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

เอาท์พุท:

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];}มีขนาด 112 ไบต์เท่านั้น
Neil

หากคุณพยายามที่จะคัดลอกจากความคิดเห็นที่คุณได้รับความพิเศษที่มองไม่เห็นไบต์แลกเปลี่ยนกองซ้อน
Neil

@ นีลโอเคฉันเป็นคนงี่เง่า .. ไม่รู้ว่าฉันนับ 120 คนเมื่อวานเย็นแล้ว .. มันอาจจะสายเกินไป .. >.>> อย่างไรก็ตามฉันได้ทำการแก้ไข (บวก 1 ไบต์เพิ่มเติมด้วยการลบ พื้นที่) ดังนั้นขอบคุณ!
Kevin Cruijssen

3

C, 153 ไบต์ 141 ไบต์

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

ขอบคุณ @cleblanc สำหรับ 4 ไบต์ การประกาศขทั่วโลกมีคำเตือนมากมายเกี่ยวกับการส่งไปยัง int แต่ไม่ได้ทำให้ฉันเสียหาย

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

มันไม่ใช่คำตอบที่เล็กที่สุด แต่ฉันชอบเทคนิคและสนุกกับการหารูปแบบบางอย่าง

การเปลี่ยนแปลง:

  • ย้ายbไปที่ส่วนกลางเพื่อหลีกเลี่ยงchar(4 ไบต์)
  • a > 11 && a < 16=> (a & 12) > 8(2 ไบต์)
  • i=(a-6)%10=> i=(a+4)%10ดังนั้นi < 2 && i >= 0=> i < 2(6 ไบต์)

1
คุณสามารถตีกอล์ฟนี้ลงอีกเล็กน้อย โดยการย้าย b [] ไปยังขอบเขตทั่วโลกมันสามารถประกาศได้โดยไม่ต้องใช้ถ่าน * เช่นนี้*b[]={"head","shoulders","knees","toes","eyes","ears","mouth","nose"},i'แล้วแทนที่ return b [... ] ด้วย put (b [... ]) คุณสามารถทำให้มันลดลงถึง 143 bytes
cleblanc

1 และนอกเหนือไปจาก@cleblanc 's ข้อเสนอแนะของคุณยังสามารถเปลี่ยนทั้งการ&& &
Kevin Cruijssen

ฉันอยากรู้ว่า @cleblanc ข้อเสนอแนะเกี่ยวกับการประกาศขทั่วโลกทำงานอย่างไร คอมไพเลอร์บอกฉันว่ามันจะเป็น * int [] และฉันคิดว่าความแตกต่างของขนาดจะทำให้โค้ดแตก มันไม่ได้เป็นเช่นนั้นขอบคุณมาก!
nmjcman101

2

JavaScript (ES6) 91 89 ไบต์

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
ดี! +1 เมื่อฉันส่งคำตอบของคุณไปยัง Java 7 มันมีขนาด -7 ไบต์เปรียบเทียบกับ @ Arnauld คำตอบที่สั้นกว่าของฉันแล้ว ;) ขอบคุณ!
Kevin Cruijssen

1
ฉันบันทึกไบต์โดยความคิดสร้างสรรค์กับการใช้งานของฉัน:% n=>`head:shoulders:knees:toes:knees:toes:eyes:ears:mouth:nose`.split`:`[(n+16)%22%16%10]
Neil

2

R, 95 ไบต์

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

สร้างเวกเตอร์อักขระเพื่อทำงานเป็นตารางการค้นหา รับอินพุตจาก stdin ( 1-indexed) และ%%22เพื่อค้นหาส่วนของร่างกายที่สอดคล้องกัน

โบนัส: %%เป็นแบบเวกเตอร์ซึ่งหมายความว่าสิ่งนี้จะทำงานกับอินพุตแบบเวกเตอร์ได้เช่นกัน

กรณีทดสอบบน R-fiddle (โปรดทราบว่านี่เป็นฟังก์ชันที่มีชื่อเพราะscanไม่สามารถใช้งานได้กับ R-fiddle)


2

jq, 80 ตัวอักษร

(77 ตัวอักษรรหัส + 3 ตัวเลือกบรรทัดคำสั่ง)

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

วิ่งตัวอย่าง:

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

การทดสอบออนไลน์ ( -rไม่รองรับการส่งผ่าน URL - ตรวจสอบข้อมูลดิบด้วยตัวคุณเอง)


2

WinDbg, 207 157 151 bytes

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

-50 ไบต์โดยการเข้ารหัสออฟเซ็ต / ความยาวของส่วนต่าง ๆ ของร่างกายเป็น ASCII chars

-6 ไบต์โดยใช้ var ท้องถิ่นเมื่อค้นหาออฟเซ็ต / ความยาว

อินพุตถูกกระทำด้วยค่าที่ตั้งใน pseudo-register $t0การป้อนข้อมูลจะทำกับชุดค่าในการหลอกทะเบียน

มันทำงานอย่างไร:

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

ตัวอย่างผลลัพธ์:

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ไบต์

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

0 การจัดทำดัชนี

การกำจัด str_split ลงไปที่ 91 ทำให้ไม่ทราบว่ามีการเข้าถึงสตริงของ PHP ในรูปแบบอักขระพิเศษ (เป็นสิ่ง PHP 5+ หรือไม่)

ลดลงถึง 102 ด้วยคำแนะนำสำหรับการแทรกชื่อผู้ใช้สำหรับการลบเครื่องหมายคำพูดสตริงและอนุญาตให้มีการแจ้งเตือน


-16 ไบต์:ลบ'คำทั้งหมดเช่น'head'กลายheadเป็นต้น
insertusernamehere

ไม่แน่ใจว่ากฎอยู่กับสิ่งนี้ แต่ด้วยการติดตั้ง PHP เริ่มต้นฉันได้รับการเตือนคงที่ที่ไม่ได้กำหนดที่คาดไว้เมื่อทำเช่นนั้น
CT14.IT

1
ใช่ แต่สิ่งนี้ใช้ได้ดีกับกฎของเว็บไซต์ สามารถละเว้นการแจ้งเตือนและคำเตือนได้
insertusernamehere

@ CT14.IT ไม่ใช่คำเตือนเป็นประกาศ “ PHP 5.3 หรือใหม่กว่าค่าเริ่มต้นคือ E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED การตั้งค่านี้ไม่ได้แสดงข้อผิดพลาดระดับ E_NOTICE, E_STRICT และ E_DEPRECATED.” - เอกสารเกี่ยวกับ PHP error_reporting
จัดการ

1
ดูเหมือนว่า str_split () ไม่มีประโยชน์
Crypto

1

เยลลี่ 55 ไบต์

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

ลองออนไลน์!(ดัชนีที่ใช้ 1)

มาเลย! จริงๆ?

เป็นโบนัสนี่คือสตริงการบีบอัดที่ฉันควรใช้แทนบรรทัดบนสุด:

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

ทั้งสองเข้ารหัสสตริงนี้:

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

เดาว่าฉันควรไปออกกำลังกายตอนนี้:


1

Powershell, 91 ไบต์, ทำดัชนีเป็นศูนย์

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

วิธีการที่ตรงไปตรงมามากสร้างอาร์เรย์ของ 22 รายการแรกโดยใช้การคูณสตริงหากทำได้โดยการคอมไพล์ด้วยช่องว่างและการแยกที่ท้าย (การแยกสั้นกว่าการตั้งค่าที่เทียบเท่ากับ 2 ไบต์เป็น 2 ไบต์) จากนั้นให้หาจุดในอาเรย์นั้นโดยใช้โมดูลัสของอินพุตไม่ใช่ที่น่าสนใจหรือเฉพาะภาษา

กรณีทดสอบ:

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

เป็นต้น


1

ทับทิม 81 ไบต์

ฟังก์ชั่นแลมบ์ดาใช้ดัชนีเป็นศูนย์

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

คำอธิบาย

เราสร้างอาเรย์ต่อไปนี้ซึ่งเราใช้องค์ประกอบ 16 รายการแรกซึ่งครอบคลุมรายการที่ถูกต้อง 2,3,4 เพลง:

%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

เราใช้โมดูล่า 22 เพื่อลดให้เป็นข้อเดียวจากนั้นเราลบ 6 ตอนนี้ดัชนี 6 (ตัวอย่าง) ได้เปลี่ยนเป็น 0 และชี้ไปที่คำที่ถูกต้อง ข้อ 0..5 ซึ่งชี้ไปที่บรรทัดแรกของเพลงจะเป็นค่าลบ เราใช้&15(เหมือนกัน%16แต่หลีกเลี่ยงความต้องการวงเล็บ) ในแผนที่บรรทัดที่ 1 ของเพลงไปยังบรรทัดที่ 4 ดัชนีดังนั้น0-> -6->10

ในโปรแกรมทดสอบ

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

สูตรดัชนีที่น่าสนใจ แต่ความยาวเท่ากันสามารถทำได้โดยปราศจากมัน:->n{(((%w{head shoulders}+%w{knees toes}*2)*2+%w{eyes ears mouth nose})*2)[n%22]}
จัดการ

1

Befunge, 129 119 ไบต์

0 การจัดทำดัชนี

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

ลองออนไลน์!

คำอธิบาย

ดังที่Arnauldชี้ให้เห็นคำต่าง ๆ เข้ามาเป็นคู่ดังนั้นเราจึงมีดัชนีเพียง 11 ค่าจากนั้นเพิ่มหมายเลขคำ% 2 เพื่อให้ได้คำที่เหมาะสมในคู่ คำจะถูกส่งไปยังสแต็กเป็นสตริงเดียวโดยคั่นด้วยเครื่องหมายดอกจันเพื่อประหยัดพื้นที่ เราทดสอบการแบ่งคำด้วยการใช้ค่าถ่านโมดูโล 7 เนื่องจากเครื่องหมายดอกจันมีค่าเท่ากับ 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 Bytes

แข็งแรงเล่นกอล์ฟ:

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

ต้องการตารางเช่นนี้โดยที่คอลัมน์แรกถูกเพิ่มโดยอัตโนมัติ:

enter image description here

นี่คือคำตอบที่จัดทำดัชนีไว้หนึ่งข้อ ตารางที่มีประชากรเป็นครั้งแรกขั้นตอนการเก็บจะถูกสร้างขึ้น - มันจะไม่ให้ฉันทำทั้งหมดในงบหนึ่งผิดหวังคุณลักษณะนี้เป็นเพียงในที่มีอยู่INSERT >=SQL 2008หลังจากนี้จะใช้%22เคล็ดลับจากคำตอบอื่น ๆ เมื่อมีการเติมข้อมูลในตารางแล้วจะใช้ส่วนสุดท้ายเท่านั้น:

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

" จะไม่ให้ฉันทำ INSERT ทั้งหมดในข้อความเดียว " ทำไม? ไม่ควรเป็นอย่างนี้ใน SQL หลังจากปี 2008?
Kevin Cruijssen

@KevinCruijssen ฉันใช้ SQL Server 2008 R2 ดังนั้นมันแปลก ... ฉันเพิ่งทำ Googling เพิ่มเติมดูเหมือนว่ามันเป็นเรื่องเกี่ยวกับ "ระดับความเข้ากันได้" ของฐานข้อมูลซึ่งฉันพยายามและล้มเหลว เปลี่ยน - มันถูกตั้งค่าเป็น 2005 และนี่คือค่าสูงสุดดังนั้นจึงไม่มีคุณสมบัตินี้ ฉันควรระบุเวอร์ชัน SQL ในคำตอบของฉันหรือลบคำตอบหากไม่สามารถย่อให้สั้นลงได้อย่างเหมาะสมหรือไม่ เสียใจมากที่ช่วยฉันข้อความจำนวนมาก ...
Pete Arden

อย่างใดอย่างหนึ่งก็ดีโดยฉันดังนั้นจึงเป็นสายของคุณ โดยส่วนตัวแล้วฉันมักจะเล่นกอล์ฟใน Java 7 ที่ฉันระบุเพราะในกรณีส่วนใหญ่คำตอบที่สั้นกว่าจะมีใน Java 8 คุณสามารถระบุว่าเป็น 2005 ในวิธีเดียวกัน
Kevin Cruijssen

@KevinCruijssen ใช่ฉันเคยเห็นคนทำอย่างนั้นกับ Java และ Python ไม่ต้องการทำการเปลี่ยนแปลงโดยไม่สามารถทดสอบรหัสได้ดังนั้นฉันจะระบุปี 2005 ไชโย :)
Pete Arden

1

ทุบตี (กับเอ็ด), 83 ตัวอักษร

1 การจัดทำดัชนี

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

ตัวอย่างการโทร:

 $ bash test.sh 1001
 knees

1

dc , 135 ไบต์

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

ลองออนไลน์!

อาร์เรย์dcจะต้องสร้างองค์ประกอบในแต่ละครั้งซึ่งต้องใช้ความรุนแรงของการออกกำลังกายนี้ เนื่องจาก 'ตา', 'หู', 'ปาก' และ 'จมูก' ปรากฏขึ้นเพียงครั้งเดียวในชุดของเราเราเพียงแค่เปิดพวกเขา แต่สำหรับคนอื่น ๆ เราบันทึกสองสามไบต์ด้วยการวางลงบนสแต็กx[head]xโดยที่xเป็นกึ่งกลางของค่าสามค่าจากนั้นเราเรียกใช้แมโคร[:add6-r;ar:adA+r;ar:a]dshxเพื่อวางลงในอาร์เรย์ดึงมันกลับมาใส่ในค่าเดียวกันน้อยกว่าหกดึงกลับแล้วใส่ครั้งเดียวในค่าเดิมครั้งสุดท้าย บวกสิบ เราใช้ค่ากลางเพราะdcอนุญาตให้เราใช้เลขฐานสิบหกแม้ในโหมดเลขฐานสิบและการลบAเป็นหนึ่งไบต์ที่น้อยกว่าการเพิ่ม16 - สิ่งนี้ใช้งานได้เพราะค่ากลางทั้งหมดต่ำกว่าสิบห้าค่า เราต้องทำเข่าและนิ้วเท้าสองครั้งและการทำให้แมโครของเราฉลาดพอที่จะแยกแยะว่ามันแพงกว่าแค่เรียกใช้มาโครสองครั้ง แต่เราจะบันทึกไบต์ที่นี่โดยการโหลดสำเนาที่เก็บไว้ก่อนหน้าของสตริงแทนที่จะเขียนมันออกมาอีกครั้ง ( B 3;aBเทียบกับB[toes]B- ฉันคิดว่านี่จะช่วยประหยัด 3 ไบต์ทั้งหมด)

เมื่อเราได้สร้างอาร์เรย์ทั้งหมดจำเป็นที่เราจะทำคือ22%แล้ว;apจะดึงมันจาก array และพิมพ์


0

C # 6, 138 ไบต์

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 การสาธิต

Ungolfed + ความคิดเห็น:

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

คุณสามารถรวมสตริงและใช้เดี่ยวSplitและมีการตรวจสอบเดียวกันของคุณเป็น ternary ( ?:) ภายในวงเล็บเหลี่ยม (กับ+4ส่วนที่สอง) เช่นนี้: 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 bytes )
Kevin Cruijssen

0

Excel, 146 ไบต์

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

ใช้ @ Neil MOD(MOD(MOD(B1+16,22),16),10)เพื่อบันทึก15ไบต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.