Major Dichotomy สาขาวิชาเอก


15

กำหนดรายการของคอร์ดที่ระบุว่าเป็น 'Major' หรือ 'Minor'

อินพุต

อินพุตจะเป็นรายการของคอร์ดหนึ่งรายการต่อบรรทัดประกอบด้วย 3 โน้ตคั่นด้วยช่องว่าง แต่ละโน้ตจะประกอบด้วยชื่อโน้ตเป็นตัวพิมพ์ใหญ่ ( A- G) และตัวเลือกที่ไม่ตั้งใจ ( #หรือb) คอร์ดอาจอยู่ในการผกผันใด ๆ (เช่นบันทึกอาจอยู่ในลำดับใด ๆ )

เอาท์พุต

หากคอร์ดเป็นส่วนใหญ่เอาต์พุต 'เมเจอร์' หากคอร์ดน้อยแสดงผลลัพธ์ 'Minor' หากคอร์ดไม่ได้เป็นหลักหรือรองให้เอาบรรทัดว่างออก

ตัวอย่าง

อินพุต

C E G
F Ab C
C Eb Gb
E G B
Db F Ab
Bb G D
D A Gb

เอาท์พุต

Major
Minor

Minor
Major
Minor
Major

สคริปต์ทดสอบ

ในบางคำถามที่ผ่านมาของฉันฉันได้พบเห็นสคริปต์ทดสอบอีกครั้ง แต่เดิมสร้างโดยJoeyและVenteroเพื่อให้กรณีทดสอบสำหรับคำถามนี้:

การใช้งาน: ./test [your program and its arguments]

รางวัล

แต่ละรายการที่ฉันสามารถตรวจสอบว่าตรงตามข้อกำหนดผ่านการทดสอบและเห็นได้ชัดว่ามีความพยายามในการเล่นกอล์ฟบางอย่างจะได้รับ upvote จากฉัน (ดังนั้นโปรดให้คำแนะนำการใช้งานพร้อมคำตอบของคุณ) ทางออกที่สั้นที่สุดภายใน 13 พ.ย. 2555 จะได้รับการยอมรับในฐานะผู้ชนะ

ทฤษฎีเล็กน้อย

สำหรับผู้ที่ไม่มีความรู้ทฤษฎีดนตรีนี่คือข้อมูลที่เพียงพอสำหรับคุณในการแข่งขัน

คอร์ดหลักหรือคอร์ดรองประกอบด้วยสามโน้ตซึ่งคั่นด้วยรูปแบบของเซมิโคลอนเฉพาะ หากเราพิจารณาว่ารูท (โน้ตล่าง) ของคอร์ดเป็น 0 ดังนั้นคอร์ดหลักคือรูปแบบ 0-4-7 และคอร์ดรองเป็นรูปแบบ 0-3-7 สิ่งต่าง ๆ ถูกทำให้อึดอัดใจมากขึ้นโดยความจริงที่ว่าบางบันทึกแยกออกเป็นสองส่วนและบางอันแยกกันเป็นน้ำเสียง การแพร่กระจายของ semitones จากAb- G#เป็นดังนี้:

G#/Ab A A#/Bb B/Cb B#/C C#/Db D D#/Eb E/Fb E#/F F#/Gb G G#/Ab
  0   1   2    3     4    5   6   7    8     9    10  11  12

G#/Abหมายถึงว่าเป็นโน้ตตัวเดียวกันเป็นG# Abจากนี้เราจะเห็นได้ว่าคอร์ดAb C Ebนั้นเป็นคอร์ดที่สำคัญและนั่นAb Cb Ebก็รองลงมา

จะทำให้เรื่องยุ่งยากเพิ่มเติมคอร์ดEb Cb Abถือว่าเป็นเช่นเดียวกับAb Cb Eb, Cb Eb AbและCb Ab Ebและอื่น ๆ ทุกรูปแบบเหล่านี้ยังคงเป็นคอร์ดเล็กน้อย


2
ฉันคิดว่าเครื่องมือทดสอบ bash ของคุณต้องการอินพุตและคำตอบที่คาดหวังเปลี่ยนไป
flodel

@flodel ใช่คุณพูดถูก ขออภัยด้วยฉันได้ทำการแก้ไขแล้ว ฉันจะต้องตรวจสอบว่าสคริปต์ทดสอบ Powershell ไม่มีปัญหาเดียวกัน
Gareth

คำตอบ:


3

GolfScript, 83 ตัวอักษร

n%{' '%{1\{'A#BC D EF G'?+}/.}%$(+2/{~- 12%}%.(+.(+]$0=.$]10,7>?'MMaijnoorr

'>2%}%

นี่เป็นทางออกแรกอย่างรวดเร็ว; ฉันแน่ใจว่านี้สามารถเล่นกอล์ฟต่อไป ผ่านชุดทดสอบ bash หลังจากแก้ไขข้อผิดพลาดที่ชี้โดย flodel ในความคิดเห็น

แก้ไข 1:บันทึก 5 ตัวอักษรด้วยวิธีที่สั้นกว่าเพื่อจดจำรูปแบบคอร์ดหลักและรองที่เป็นที่ยอมรับ

แก้ไข 2:บันทึกอีก 2 ตัวอักษรพร้อมการเข้ารหัสเอาต์พุตขนาดกะทัดรัดเพิ่มเติมซึ่งได้แรงบันดาลใจจากโซลูชันของ grc (ขอขอบคุณ!) ในฐานะที่เป็นผลข้างเคียงตอนนี้รหัสจะพิมพ์บรรทัดว่างพิเศษหลังจากเอาท์พุท แต่สายรัดทดสอบดูเหมือนว่าจะยอมรับดังนั้นฉันเดาว่ามันใช้ได้ :)

นี่คือวิธีการทำงาน:

  • วนรอบด้านนอกn%{ }%n*เพียงแยกอินพุตเป็นบรรทัดเรียกใช้โค้ดภายในวงเล็บปีกกาสำหรับแต่ละบรรทัดและรวมผลลัพธ์ด้วยการขึ้นบรรทัดใหม่

  • ' '%แยกแต่ละบรรทัดเป็นอาร์เรย์ของบันทึกย่อ สำหรับแต่ละโน้ตเหล่า1\{'A#BC D EF G'?+}/นั้นจากนั้นแปลงโน้ตนั้นเป็นตัวเลขเซมิโคลอนโดยค้นหาอักขระแต่ละตัวในสตริง'A#BC D EF G'และเพิ่มตำแหน่ง (ซึ่งจะเป็น -1 สำหรับอักขระใด ๆ ที่ไม่พบในสตริงโดยเฉพาะอย่างยิ่งรวมถึงb) (ฉันแน่ใจว่าผมเคยเห็นเคล็ดลับนี้ใช้มาก่อน.) สุดท้ายที่.ซ้ำกันแต่ละหมายเลขเพื่อที่ว่าในตอนท้ายของห่วงเช่นการป้อนข้อมูลที่ได้กลายมาเป็นF Ab C[9 9 0 0 4 4]

  • จากนั้นเราจะจัดเรียงบันทึกด้วย$ย้ายโน้ตตัวแรกที่จะจบลงด้วย(+และแยกอาร์เรย์เป็นคู่กับเพื่อที่จะมีลักษณะเช่นนี้เหมือน2/ [[9 0] [0 4] [4 9]]จากนั้น{~- 12%}%แมคู่ของบันทึกลงในความแตกต่างของแต่ละโมดูโล 12 [9 8 7]หันอาร์เรย์ตัวอย่างของเราเข้าไป

  • ถัดไป.(+สร้างสำเนาของอาร์เรย์และหมุนองค์ประกอบของมันไปทางซ้ายหนึ่งตำแหน่ง เราทำสองครั้งนี้และเก็บสำเนาลงในอาร์เรย์ที่มีเพื่อให้ตัวอย่างของเราตอนนี้ดูเหมือนว่า][[9 8 7] [8 7 9] [7 9 8]]

  • จากนั้นเราจะจัดเรียงอาร์เรย์นี้ของอาร์เรย์ที่มี$และใช้องค์ประกอบแรก - ในกรณีนี้ด้วย[7 9 8] - 0=จากนั้นเราจะสร้างสำเนาของอาร์เรย์นี้ ( .) เรียงลำดับ ( $) รวบรวมทั้งอาร์เรย์ที่ไม่ได้เรียงและไม่เรียงในอาร์เรย์อื่น ( ]) และค้นหาการเกิดขึ้นครั้งแรกของอาร์เรย์[7 8 9](ซึ่งเขียนเป็น10,7>บันทึกสองตัวอักษร) ) ในนั้น.

  • สิ่งนี้จะทำให้เราทั้งสอง0(ถ้าไม่ได้เรียงเป็นแถว[7 8 9]และเป็นหลักคือคอร์ด), 1(ถ้าเรียงเป็นเรียงลำดับของการเรียงสับเปลี่ยน[7 8 9]ซึ่งที่ระบุว่าองค์ประกอบแรกจะต้องเล็กที่สุดสามารถ[7 9 8]ทำให้คอร์ดเล็กน้อย) หรือ-1(ถ้าแม้อาร์เรย์ที่เรียงไม่เท่ากัน[7 8 9])

  • หมายเลขนี้จะถูกใช้เป็นดัชนีเริ่มต้นในสตริง"MMaijnoorr\n\n"(โดยที่\ns ถูกกำหนดให้เป็น linefeeds จริงในรหัส) จากที่เราใช้ตัวละครนั้นและทุก ๆ วินาทีที่ตามมาเป็นเอาท์พุท หากดัชนีเป็น -1 เราจะเริ่มจากอักขระตัวสุดท้ายของสตริงซึ่งเป็นเพียงตัวดึงข้อมูลบรรทัด


คำอธิบายที่ดี ฉันมีปัญหาเดียวกันกับ GolfScript - ฉันสามารถเรียกใช้มันทีละครั้งเพื่อทดสอบด้วยecho "G# B# Eb" | ruby golfscript.rb ilmari.gsแต่ฉันจะรันสคริปต์ทดสอบได้อย่างไร ฉันลองแล้ว./test ruby golfscript.rb ilmari.gsแต่มันไม่มีอะไรเลย (ผมเคยรับแล้วคุณ +1 เพราะการทำงานอย่างเห็นได้ชัด แต่ฉันแค่อยากรู้)
แกเร็ ธ

1
@Gareth: ดูเหมือนว่าเป็นข้อผิดพลาดในสคริปต์ทดสอบการทุบตี - มันไม่ได้จัดการหลายอาร์กิวเมนต์ที่ถูกต้อง การแก้ไขปัญหานั้นแทนที่args="$@"ด้วยargs=("$@")และมีgot=$("$cmd" "$args") got=$("$cmd" "${args[@]}")(หรือเพียงแค่golfscript.rbเรียกใช้งานได้และเรียกใช้เป็น./test ./golfscript.rb chords.gs.)
Ilmari Karonen

4

Python, 160

f='A#BC D EF G3453543'.find
try:
 while 1:x,y,z=sorted(map(lambda x:f(x[0])+f(x[1:])+1,raw_input().split()));print'MMianjoorrr'[f(`y-x`+`z-y`)/14:-1:2]
except:0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.