ASCII anahtar imzası çizme


22

Bir not girişi göz önüne alındığında, tiz nota anahtarı üzerinde karşılık gelen ana anahtarın bir ASCII çizimi çıktı.

İşte tüm ana anahtarlar (çift keskinlik veya çift daire içermeyen) ve bunlara karşılık gelen anahtar imzalar:


Vikipedi kullanıcı tarafından beşinci deluxe 4 Çember Sadece düz Bill, telif hakkı CC BY-SA 3.0

Giriş, keskin bir anahtar ise, aşağıdaki ASCII resmini uygun sayıda keskinleştirme ile çizin:

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

---------

Ve giriş, dairelerin bulunduğu bir anahtar ise:

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

İşte olası girdilerin yanı sıra kaç tane kesici veya daire kullandıklarının kısa bir özeti:

   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

Beş çizgi çizgisinin tamamı her zaman çizilmelidir, ancak çizgi ya da daire çizgileri, her çizgi çizgisinin aynı uzunluğa sahip olduğu sürece her bir tarafta en az bir dolgu kolonuna sahip olacak şekilde çizgi başına herhangi bir çizgi olabilir. Örneğin, bunların tümü girdi için kabul edilebilir çıktılardır Ab:

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

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

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

Keskin veya yassı olmayan C major durumunda, hat başına herhangi bir pozitif tire (hatta bir tane) kabul edilebilir.

Her satırdaki sondaki boşluklar gibi herhangi bir satırdaki veya sondaki boşluk, her şey yolundadır. Her satırda aynı sayıda olduğu sürece ekstra boşluklar tamamdır.

Küçük harflerle giriş yapabilir veya keskin veya düz olmayan girişlerin istediğiniz bir boşluk içermesini isteyebilirsiniz.

Bu olduğundan, bayttaki en kısa çözüm kazanacaktır.



3
@Neil Ah, meydan okuduğun için üzgünüm> _ <Göndermeden önce ana siteyi aradım, ancak sanal alanı kontrol etmeyi düşünmedim.
Doorknob

Yanıtlar:


3

Python 2 , 206 197 178 175 168 161 bayt

-12 bayt için Bay Xcoder'a teşekkürler!

Bu, sonucu 2B karakter listesi olarak döndüren bir işlevdir. Giriş keskin / düz içermiyorsa boşluk bırakılmalıdır.

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]

Çevrimiçi deneyin!


Bence "FCGDAEB".find(k[0])-1haritalar Fiçin -1sanırım bu yüzden, 1 - kendi indeksine ve başkalarını n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)yerine çalışacak. ( 175 bayt? )
Bay Xcoder

@ Mr.Xcoder Bu akıllı ... teşekkür ederim.
FlipTack

3

Kömür , 60 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

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

Anahtar imzasındaki keskinlik sayısını hesaplayın.

←UO⁹¦⁹-¶

Çıtayı yazdırın, ancak başlangıçtan bir kare sola çevirin, böylece ilk keskin / daire sıfır sütununda olur.

Fθ«

Herhangi bir keskinliğin üzerinden döngü.

Jι⊖﹪⊕׳ι⁷#»

Keskin satırını hesaplayın ve yazdırın.

F±θ«

Tüm dairelerin üzerinde döngü.

Jι⊕﹪⁺³×⁴ι⁷b

Dairenin satırını hesaplayın ve yazdırın.


2

Befunge, 139 bayt

~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

Çevrimiçi deneyin!

Girişin, tipik olarak programı etkileşimli olarak çalıştırırken gerçekleşeceği gibi bir satır besleme ile sonlandırılmasının beklendiğini unutmayın.

açıklama

Stdin'den iki karakter okuyarak başlıyoruz - ana nota, n ve kazara, a ( kazayla olmazsa satırlık olabilir). Bu değerleri kullanarak, anahtar imza numarasını, signum'u aşağıdaki gibi hesaplıyoruz :

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

Bu, -7 ila 7 aralığında bir değer döndürür; burada işaret bize keskinlik veya düzlüklere ihtiyacımız olup olmadığını (pozitif veya negatif) söyler ve mutlak değer bize gerekli keskinlik veya düzlük sayısını verir. Bu yüzden daha sonra kullanmak için cnt işaretini, s ve kazara sayımını cnt ile birlikte çıkartıyoruz :

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

Sonra, r , 9'dan 0'a kadar olan bir satır numarası, 0'dan 8'e kadar bir c numaralı , yinelenen iki iç içe döngümüz var. Belirli bir satır ve sütun için, kazara bunda görünür olup olmadığını hesaplıyoruz. ile işaret:

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

Yanlışlıkla değilse, satırın r , tek mi yoksa çift mi olduğuna bağlı olarak bir satır veya boşluk çıkarmamız gerekir . Ve eğer kazara ise, işarete bağlı olarak keskin veya düz çıkmamız gerekir, s . Bu yüzden aşağıdaki formülü değerlendiriyoruz:

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

Bu bize 0 ila 3 aralığında bir çizgi verir, ya bir çizgiyi, bir boşluğu, düz ya da keskinliği temsil eder. Bu dizini, ikinci kod satırının başında gömülü olarak görebileceğiniz bir tablodaki gerekli çıktı karakterini aramak için kullanırız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.