Gambar tanda tangan kunci ASCII


22

Diberikan input dari catatan, menghasilkan gambar ASCII dari kunci utama yang sesuai pada kunci treble.

Berikut adalah semua kunci utama (yang tidak termasuk benda tajam ganda atau flat ganda) dan tanda tangan kunci yang sesuai:


Circle of 5ths deluxe 4 oleh pengguna Wikipedia Just plain Bill, copyright CC BY-SA 3.0

Jika input adalah kunci dengan benda tajam, gambarkan seni ASCII berikut dengan jumlah benda tajam yang sesuai:

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

---------

Dan jika input adalah kunci dengan flat:

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

Berikut adalah ringkasan singkat dari input yang mungkin serta berapa banyak benda tajam atau flat yang mereka gunakan:

   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

Kelima garis garis harus selalu digambar, tetapi mungkin ada sejumlah garis per garis sehingga benda tajam atau flat memiliki setidaknya satu kolom bantalan di setiap sisi, selama setiap garis garis memiliki panjang yang sama. Sebagai contoh, ini semua juga merupakan input yang dapat diterima untuk input Ab:

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

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

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

Dalam kasus C mayor, yang tidak memiliki benda tajam atau flat, jumlah tanda hubung positif per baris (bahkan satu) dapat diterima.

Jumlah spasi spasi apa pun yang memimpin atau tertinggal tidak masalah, seperti halnya spasi tambahan pada setiap baris. Ruang pemimpin tambahan tidak apa-apa asalkan ada nomor yang sama di setiap baris.

Anda dapat mengambil input dalam huruf kecil atau meminta input tanpa tajam atau datar berisi ruang tambahan, jika diinginkan.

Karena ini adalah , solusi terpendek dalam byte akan menang.



3
@Neil Ah, maaf karena mencuri tantangan Anda> _ <Saya mencari situs utama sebelum memposting tetapi tidak berpikir untuk memeriksa kotak pasir.
Gagang Pintu

Jawaban:


3

Python 2 , 206 197 178 175 168 161 byte

Terima kasih kepada Tn. Xcoder untuk -12 byte!

Ini adalah fungsi yang mengembalikan hasilnya sebagai daftar karakter 2D. Jika input tidak mengandung tajam / rata, itu harus diisi dengan spasi.

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]

Cobalah online!


Saya pikir "FCGDAEB".find(k[0])-1peta Fke -1dan yang lain ke indeks mereka - 1, jadi saya pikir n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)akan berfungsi sebagai gantinya. ( 175 byte? )
Tn. Xcoder

@ Mr.Xcoder Itu pintar ... terima kasih.
FlipTack

3

Arang , 60 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Hitung jumlah benda tajam dalam tanda tangan kunci.

←UO⁹¦⁹-¶

Cetak paranada, tetapi satu persegi kiri dari asalnya sehingga tajam / rata pertama di kolom nol.

Fθ«

Ulangi semua benda tajam.

Jι⊖﹪⊕׳ι⁷#»

Hitung baris yang tajam dan cetaklah.

F±θ«

Lingkari semua flat.

Jι⊕﹪⁺³×⁴ι⁷b

Hitung baris flat dan cetaklah.


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

Cobalah online!

Perhatikan bahwa input diharapkan diakhiri dengan linefeed, seperti yang biasanya terjadi ketika menjalankan program secara interaktif.

Penjelasan

Kita mulai dengan membaca dua karakter dari stdin - catatan utama, n , dan tidak disengaja, a (yang dapat menjadi umpan baris jika tidak ada yang tidak disengaja). Dengan menggunakan nilai-nilai itu, kami menghitung nomor tanda tangan kunci, signum , sebagai berikut:

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

Ini mengembalikan nilai dalam rentang -7 hingga 7, di mana tanda memberi tahu kita apakah kita membutuhkan benda tajam atau flat (positif atau negatif), dan nilai absolut memberi kita jumlah benda tajam atau flat yang diperlukan. Jadi untuk penggunaan nanti, kita mengekstrak tanda, s , dan jumlah tak disengaja, cnt , dengan:

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

Kemudian kita memiliki dua loop bersarang, iterasi nomor baris, r , dari 9 ke 0, dan nomor kolom, c , dari 0 hingga 8. Untuk baris dan kolom tertentu, kami menghitung apakah suatu kecelakaan harus terlihat pada saat itu. poin dengan:

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

Jika ini bukan kebetulan, kita perlu menampilkan garis atau spasi tergantung pada apakah baris, r , ganjil atau genap. Dan jika itu tidak disengaja, kita perlu mengeluarkan tajam atau flat tergantung pada tanda, s . Jadi kami mengevaluasi rumus berikut:

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

Yang memberi kami indeks dalam kisaran 0 hingga 3, mewakili garis, spasi, flat, atau tajam. Kami cukup menggunakan indeks itu untuk mencari karakter output yang diperlukan dari sebuah tabel, yang dapat Anda lihat tertanam pada awal baris kode kedua.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.