ASCII鍵署名を描く


22

音符の入力が与えられると、高音部記号の対応する主キーのASCII図面を出力します。

すべての主要なキー(二重シャープまたは二重フラットを含まない)とそれらに対応するキーシグネチャは次のとおりです。


ウィキペディアのユーザーによる5分の1のデラックス4、プレーンビル、著作権CC BY-SA 3.0

入力がシャープのあるキーである場合、適切な数のシャープを使用して次のASCIIアートを描画します。

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

---------

そして、入力がフラットを持つキーの場合:

---------
  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

ダッシュの5行すべてを常に描画する必要がありますが、各行のダッシュの長さが同じである限り、シャープまたはフラットの各側に少なくとも1列のパディングがあるように、行ごとに任意の数のダッシュが存在する場合があります。たとえば、これらはすべて入力の許容可能な出力でもありますAb

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

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

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

シャープもフラットもないCメジャーの場合、1行(1つでも)に任意の正数のダッシュを使用できます。

各行の末尾のスペースと同様に、任意の量の先頭または末尾の空白で問題ありません。各行に同じ番号がある限り、余分な先行スペースは問題ありません。

必要に応じて、入力を小文字で入力したり、シャープまたはフラットなしの入力に末尾スペースを含めるように要求したりできます。

これはであるため、バイト単位の最短ソリューションが勝ちます。



3
@Neil Ah、チャレンジを盗んでごめんなさい> _ <投稿する前にメインサイトを検索しましたが、サンドボックスをチェックするつもりはありませんでした。
ドアノブ

回答:


3

パイソン2206の197 178 175 168 161バイト

-12バイトのXcoder氏に感謝します!

これは、結果を文字の2Dリストとして返す関数です。入力にシャープ/フラットが含まれていない場合は、スペースを埋め込む必要があります。

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バイト?
Xcoder氏17

@ Mr.Xcoderそれは賢い...ありがとうございます。
FlipTack

3

、60バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

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

調号のシャープの数を計算します。

←UO⁹¦⁹-¶

ステーブを印刷しますが、最初のシャープ/フラットが列0になるように、原点から1つ左の正方形にします。

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

オンラインでお試しください!

通常、プログラムを対話式で実行するときに発生するように、入力は改行で終了することに注意してください。

説明

最初に、標準入力から2つの文字を読み取ることから始めます。メインのメモ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) 

次に、ネストされた2つのループがあり、行番号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の範囲のインデックスが得られ、ライン、スペース、フラット、またはシャープのいずれかを表します。このインデックスを使用して、必要な出力文字をテーブルから検索します。これは、コードの2行目の先頭に埋め込まれていることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.