Vẽ chữ ký khóa ASCII


22

Đưa ra một đầu vào của một ghi chú, xuất ra một bản vẽ ASCII của khóa chính tương ứng trên khóa của âm bổng.

Dưới đây là tất cả các khóa chính (không bao gồm chia đôi hoặc căn hộ kép) và chữ ký khóa tương ứng của chúng:


Vòng tròn thứ năm deluxe 4 bởi người dùng Wikipedia Chỉ cần Bill đơn giản, bản quyền CC BY-SA 3.0

Nếu đầu vào là một khóa có hình sắc nét, hãy vẽ nghệ thuật ASCII sau với số lượng hình sắc nét phù hợp:

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

---------

Và nếu đầu vào là một chìa khóa với căn hộ:

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

Dưới đây là một bản tóm tắt ngắn gọn về các đầu vào có thể cũng như số lượng vật sắc nhọn hoặc căn hộ mà chúng sử dụng:

   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

Tất cả năm dòng dấu gạch ngang phải luôn được vẽ, nhưng có thể có bất kỳ số dấu gạch ngang nào trên mỗi dòng sao cho phần sắc nét hoặc căn hộ có ít nhất một cột đệm ở mỗi bên, miễn là mỗi dòng dấu gạch ngang có cùng độ dài. Ví dụ, đây đều là những đầu ra cũng được chấp nhận cho đầu vào Ab:

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

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

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

Trong trường hợp C chính, không có sắc nét cũng như căn hộ, bất kỳ số dấu gạch ngang dương nào trên mỗi dòng (thậm chí một) đều được chấp nhận.

Bất kỳ khoảng trắng hàng đầu hoặc dấu vết nào đều tốt, cũng như khoảng trắng ở mỗi dòng. Không gian hàng đầu bổ sung là được miễn là có cùng một số trên mỗi dòng.

Bạn có thể lấy đầu vào bằng chữ thường hoặc yêu cầu đầu vào không có đầu nhọn hoặc phẳng chứa một khoảng trắng ở cuối, nếu bạn mong muốn.

Vì đây là , giải pháp ngắn nhất tính bằng byte sẽ giành chiến thắng.



3
@Neil Ah, xin lỗi vì đã đánh cắp thử thách của bạn> _ <Tôi đã tìm kiếm trang web chính trước khi đăng nhưng không nghĩ sẽ kiểm tra hộp cát.
Doorknob

Câu trả lời:


3

Python 2 , 206 197 178 175 168 161 byte

Cảm ơn ông Xcoder cho -12 byte!

Đây là một hàm trả về kết quả dưới dạng danh sách các ký tự 2D. Nếu đầu vào không chứa sắc nét / phẳng, nó sẽ được đệm bằng một khoảng trắng.

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]

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


Tôi nghĩ rằng "FCGDAEB".find(k[0])-1bản đồ Fđến -1và những người khác theo chỉ mục của họ - 1, vì vậy tôi nghĩ n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)sẽ thay thế. ( 175 byte? )
Ông Xcoder

@ Mr.Xcoder Thật thông minh ... cảm ơn bạn.
FlipTack

3

Than , 60 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

Tính số lượng vật sắc nhọn trong chữ ký khóa.

←UO⁹¦⁹-¶

In stave, nhưng một hình vuông bên trái của điểm gốc sao cho độ sắc nét / phẳng đầu tiên nằm trong cột 0.

Fθ«

Vòng lặp trên bất kỳ vật sắc nhọn.

Jι⊖﹪⊕׳ι⁷#»

Tính hàng sắc nét và in nó.

F±θ«

Vòng qua bất kỳ căn hộ.

Jι⊕﹪⁺³×⁴ι⁷b

Tính hàng phẳng và in nó.


2

Befunge, 139 byte

~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

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

Lưu ý rằng đầu vào dự kiến ​​sẽ được kết thúc bằng một nguồn cấp dữ liệu, như thường xảy ra khi chạy chương trình một cách tương tác.

Giải trình

Chúng tôi bắt đầu bằng cách đọc hai ký tự từ stdin - ghi chú chính, n và một sự tình cờ, một (có thể là một dòng cấp nếu không có sự tình cờ). Sử dụng các giá trị đó, chúng tôi tính toán số chữ ký chính, ký hiệu , như sau:

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

Điều này trả về một giá trị trong phạm vi -7 đến 7, trong đó dấu hiệu cho chúng ta biết chúng ta cần vật sắc nhọn hay căn hộ (dương hay âm) và giá trị tuyệt đối cho chúng ta số lượng vật sắc nhọn hoặc căn hộ cần thiết. Vì vậy, để sử dụng sau, chúng tôi trích xuất dấu, s và số đếm ngẫu nhiên, cnt , với:

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

Sau đó, chúng ta có hai vòng lặp lồng nhau, lặp lại một số hàng, r , từ 9 xuống 0 và một số cột, c , từ 0 đến 8. Đối với một hàng và cột cụ thể, chúng tôi tính toán xem có nên nhìn thấy một sự tình cờ ở đó không điểm với:

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

Nếu đó không phải là ngẫu nhiên, chúng ta cần xuất ra một dòng hoặc khoảng trắng tùy thuộc vào hàng, r , là số lẻ hay số chẵn. Và nếu đó là một sự tình cờ, chúng ta cần xuất ra một nét hoặc phẳng tùy thuộc vào dấu hiệu, s . Vì vậy, chúng tôi đánh giá công thức sau đây:

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

Điều này cho chúng ta một chỉ số trong phạm vi 0 đến 3, đại diện cho một dòng, một không gian, một mặt phẳng hoặc sắc nét. Chúng tôi chỉ đơn giản sử dụng chỉ mục đó để tra cứu ký tự đầu ra cần thiết từ một bảng mà bạn có thể thấy được nhúng ở đầu dòng mã thứ hai.

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.