วาดลายเซ็นของคีย์ ASCII


22

รับอินพุตของบันทึกส่งออกการวาดภาพ ASCII ของคีย์หลักที่สอดคล้องกันในโน๊ตสาม

นี่คือกุญแจสำคัญทั้งหมด (ซึ่งไม่รวมถึงชาร์ปสองเท่าหรือดับเบิลแฟลต) และลายเซ็นคีย์ที่เกี่ยวข้อง:


Circle of Fourths deluxe 4โดยผู้ใช้ Wikipedia เพียงธรรมดา Bill CC ลิขสิทธิ์ -SA 3.0

หากอินพุตเป็นคีย์ที่มี sharps ให้วาด ASCII art ต่อไปนี้ด้วยจำนวน sharps ที่เหมาะสม:

   #
-#-------
      #
----#----
  #
-------#-
     #
---------

---------

และหากการป้อนข้อมูลเป็นกุญแจสำคัญกับแฟลต:

---------
  b
----b----
      b
-b-------
   b
-----b---
       b
---------

นี่เป็นบทสรุปโดยสังเขปของอินพุตที่เป็นไปได้รวมถึงจำนวนชาร์ปหรือแฟลตที่ใช้:

   0   1   2   3   4   5   6   7
#  C   G   D   A   E   B   F#  C#
b  C   F   Bb  Eb  Ab  Db  Gb  Cb

เส้นประทั้งห้าบรรทัดต้องวาดเสมอ แต่อาจมีขีดกลางต่อบรรทัดใด ๆ เช่นจำนวนแม่นหรือเตี้ยมีช่องว่างอย่างน้อยหนึ่งคอลัมน์ในแต่ละด้านตราบใดที่เส้นประแต่ละเส้นมีความยาวเท่ากัน ตัวอย่างเช่นสิ่งเหล่านี้เป็นผลลัพธ์ที่ยอมรับได้สำหรับอินพุตเช่นAbกัน

---------   ------   ---------   ----------------
  b           b           b          b
----b----   ----b-   -------b-   ------b---------

-b-------   -b----   ----b----   ---b------------
   b           b           b          b
---------   ------   ---------   ----------------

---------   ------   ---------   ----------------

ในกรณีของ C Major ที่ไม่มีชาร์ปหรือแฟลตจะสามารถยอมรับจำนวนขีดกลางต่อเส้น (แม้แต่อันเดียว) ได้

จำนวนของช่องว่างนำหน้าหรือต่อท้ายนั้นใช้ได้เช่นเดียวกับช่องว่างต่อท้ายในแต่ละบรรทัด ช่องว่างนำหน้าพิเศษไม่เป็นไรตราบใดที่มีหมายเลขเดียวกันในแต่ละบรรทัด

คุณอาจรับอินพุตเป็นตัวพิมพ์เล็กหรือกำหนดให้อินพุตนั้นไม่มีส่วนที่แหลมคมหรือแบนมีพื้นที่ต่อท้ายหากคุณต้องการ

ตั้งแต่นี้เป็นทางออกที่สั้นที่สุดในไบต์จะเป็นผู้ชนะ



3
@Neil Ah ขอโทษที่ขโมยความท้าทายของคุณ> _ <ฉันค้นหาเว็บไซต์หลักก่อนโพสต์ แต่ไม่คิดว่าจะตรวจสอบกล่องทราย
ลูกบิดประตู

คำตอบ:


3

Python 2 , 206 197 178 175 168 161 ไบต์

ขอบคุณ Mr. Xcoder สำหรับ -12 ไบต์!

นี่คือฟังก์ชันที่ส่งคืนผลลัพธ์เป็นรายการอักขระ 2 มิติ หากอินพุตไม่มีความคมชัด / แบนควรมีช่องว่าง

def f(k,r=range(10)):n="CGDAEB".find(k[0])+7*' #'.find(k[1]);return[[(' -'[i%2],'b#'[n>0])[0<j<=abs(n)and`i`==(n*"1403625"+"5263748")[j-1]]for j in r]for i in r]

ลองออนไลน์!


ผมคิดว่า"FCGDAEB".find(k[0])-1แผนที่Fไป-1และคนอื่น ๆ ในดัชนีของพวกเขา - 1 ดังนั้นฉันคิดว่าn="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)จะทำงานแทน ( 175 bytes? )
Mr. Xcoder

@ Mr.Xcoder มันฉลาด ... ขอบคุณ
FlipTack

3

ถ่าน 60 ไบต์

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ←UO⁹¦⁹-¶Fθ«Jι⊖﹪⊕׳ι⁷#»F±θ«Jι⊕﹪⁺³×⁴ι⁷b

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ

คำนวณจำนวนของชาร์ปในลายเซ็นของคีย์

←UO⁹¦⁹-¶

พิมพ์ขั้นบันได แต่มีหนึ่งตารางด้านซ้ายของจุดกำเนิดเพื่อให้ความคมชัด / แบนแรกอยู่ในคอลัมน์ศูนย์

Fθ«

วนซ้ำกว่าชาร์ปใด ๆ

Jι⊖﹪⊕׳ι⁷#»

คำนวณแถวของความคมชัดและพิมพ์

F±θ«

วนรอบแฟลตใด ๆ

Jι⊕﹪⁺³×⁴ι⁷b

คำนวณแถวของแฟลตและพิมพ์


2

Befunge ขนาด 139 ไบต์

~9%:4%7*+4/7%~6%1-2/7*+vv\`0:\!-g02+*2g00+1%7+g00*+3g00::<<0+55p02:_@
- b#09p01*-1*2p00:`0:-8<>10g`!**:00g2+*\!20g2%*+1g,1+:8`!#^_>$,:1-\^1

ลองออนไลน์!

โปรดทราบว่าอินพุตคาดว่าจะถูกยกเลิกด้วย linefeed ตามปกติจะเกิดขึ้นเมื่อเรียกใช้โปรแกรมแบบโต้ตอบ

คำอธิบาย

เราเริ่มต้นด้วยการอ่านตัวละครสองตัวจาก stdin - โน้ตหลัก, n , และโดยบังเอิญ, a (ซึ่งอาจเป็นตัวป้อนบรรทัดหากไม่มีการบังเอิญ) โดยใช้ค่าที่เราคำนวณจำนวนลายเซ็นที่สำคัญที่Signumดังต่อไปนี้:

signum = (n%9 + n%9%4*7)/4%7 + (a%6 - 1)/2*7 - 8

สิ่งนี้ส่งคืนค่าในช่วง -7 ถึง 7 โดยที่เครื่องหมายบอกเราว่าเราต้องการชาร์ปหรือแฟลต (บวกหรือลบ) และค่าสัมบูรณ์ทำให้เรามีจำนวนเซียนหรือแฟลตที่ต้องการ ดังนั้นเพื่อใช้ในภายหลังเราจะแยกเครื่องหมาย, s , และจำนวนที่ไม่ตั้งใจ, cntด้วย:

s   = (signum > 0)
cnt = abs(signum) 

จากนั้นเรามีลูปซ้อนกันสองลูปซ้ำหมายเลขแถวrจาก 9 ลงไป 0 และหมายเลขคอลัมน์cจาก 0 ถึง 8 สำหรับแถวและคอลัมน์ใดคอลัมน์หนึ่งเราคำนวณว่าควรจะมองเห็นอุบัติเหตุโดยบังเอิญหรือไม่ ชี้ด้วย:

accidental = (r == (c*(s+3) + s)%7 + 1 + s*2) and (c > 0) and (c <= cnt)

หากไม่ใช่อุบัติเหตุเราจำเป็นต้องส่งออกบรรทัดหรือช่องว่างโดยขึ้นอยู่กับว่าแถว, r , เป็นเลขคี่หรือคู่ และถ้ามันเป็นอุบัติเหตุที่เราจำเป็นต้องส่งออกคมหรือแบนขึ้นอยู่กับป้าย s ดังนั้นเราจึงประเมินสูตรต่อไปนี้:

index = (!accidental * (r%2)) + (accidental * (s+2))

ซึ่งทำให้เรามีดัชนีในช่วง 0 ถึง 3 ซึ่งแสดงถึงเส้นหนึ่งช่องว่างช่องว่างแบนหรือคม เราใช้ดัชนีนั้นเพื่อค้นหาอักขระเอาต์พุตที่ต้องการจากตารางซึ่งคุณสามารถเห็นการฝังตัวที่จุดเริ่มต้นของบรรทัดที่สองของรหัส

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