ASCIIピアノキーボード


24

ピアノのキーの幅は3文字、高さは7文字です。ただし、すべてのキーの幅が3文字である場合、黒いキー用のスペースが十分にありません。そのため、一部の白いキーの一部が切り取られています。白鍵には3種類あります。

右半分がないキー(R):

____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

左半分が欠落しているキー(L):

 ____
 |  |
 |  |
 |  |
 |  |
|   |
|   |
|___|

そして、左半分と右半分が欠けているキー(M):

 ___
 | | 
 | | 
 | | 
 | | 
|   |
|   |
|___|

実際のキーボードでは、これらのパターンは次のようになります。

RMLRMML, RMLRMML, RMLRMML...

合計88のキーを繰り返します。キーが個別に表示されている場合は表示されませんが、それらを一緒に押し込むと、黒いキーが表示されます。

_________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

あなたのタスク

正の整数Nを指定すると、N個の白鍵でピアノのこのASCIIアートを印刷します。1から52までの任意のNを処理できるはずです(実際の88キーのピアノには52の白いキーがあるため)。ここに1から8までのテスト出力があり、その後、パターンは同様に増加します。

1
____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

2
________
|  | | |
|  | | |
|  | | |
|  | | |
|   |   |
|   |   |
|___|___|

3
_____________
|  | | | |  |
|  | | | |  |
|  | | | |  |
|  | | | |  |
|   |   |   |
|   |   |   |
|___|___|___|

4
________________
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|   |   |   |   |
|   |   |   |   |
|___|___|___|___|

5
____________________
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|   |   |   |   |   |
|   |   |   |   |   |
|___|___|___|___|___|

6
________________________
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|___|___|___|___|___|___|

7
_____________________________
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|

8
________________________________ 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|

そして最後になりましたが、以下は52キーの完全な出力です。

_________________________________________________________________________________________________________________________________________________________________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

標準的な抜け穴は禁止されており、バイト単位の最短回答が勝ちです!


「標準的な抜け穴」とは何ですか?
ワイルドカード


あらゆる/すべての行の末尾のスペースは許可されますか?末尾の改行はどうですか?
ソク

1
@AlexL。本物の88鍵ピアノには55個の白い鍵があるため
DJMcMayhem

1
@BMac> _>わからない... <_ <あなたが何を言っているのかわからない。52 と言った R—e—v—i—s—i—o—n̶̶H̶i̶s̶t̶o̶r̶y̶でそれをはっきりと見ることができます。とにかく、ありがたいことに、既存の回答を壊すことはないでしょう。なぜなら、それらのほとんどはおそらく55+以上で動作するからです。
DJMcMayhem

回答:


4

Pyth、68 65 63バイト

*lJ:+\|s@Lj;*L" |"_j4536 7*4Q" $"k\_jb+*4]J*2]K+\|*Q"   |":Kd\_

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

テストスイート。

このバージョンでは、2バイトを節約するために、内部で割り当て(JとK)を置き換えました。したがって、以下のバージョンをお読みください。

説明付きの以前の65バイトバージョン

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"kK+\|*Q"   |"*lJ\_jb+*4]J*2]K:Kd\_

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

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"k    This part generates the most irregular line.

        j;*L" |"_j4536 7            Generate the whole line by black magic
      @L                *4Q         Get the first (4*input) characters of it, with wrapping.
  +\|                               Add "|" in front of it (we took away the first "|")
 :                         " $"k    Replace the ending space by nothing
J                                   Store the line to J.


K+\|*Q"   |"      This part generates the line just below the irregular line.
    *Q"   |"      Repeat "   |" input times
 +\|              Prepend "|"
K                 Store to K


*lJ\_     Now we can actually start printing

*  \_     Repeat "_" ...
 lJ                      [the length of J] times
          (and implicitly print it out)


jb+*4]J*2]K

   *4]J             Repeat J 4 times
       *2]K         Repeat K 2 times
  +                 Concatenate them together
jb                  Join with newlines
                    (and implicitly print it out)

:Kd\_

:K      Replace in K
  d                  " "
   \_                    by "_"
        (and implicitly print it out)

黒魔術

We find the irregular line from input=7, and cut out the first "|":
"  | | | |  |  | | | | | |  |"
 2  1 1 1 2  2  1 1 1 1 1 2

j;*L" |"_j4536 7    Black magic.

         j4536 7    4536 converted to base 7: [1,6,1,4,0]
        _           Reverse: [0,4,1,6,1]
  *L" |"            Repeat " |" <each element> times:
                    [""," | | | |"," |"," | | | | | |"," |"]
j;                  Join by whitespace:
                    "  | | | |  |  | | | | | |  |"

冗談を言っただけです。うめき声...-
ニール

11

JavaScript(ES6)、155 149 147バイト

n=>[`_`[r=`repeat`](n*4+(9>>n%7&1)),s=[...Array(n*12/7|0)].map((_,i)=>1998>>i%12&1?` |`:`  |`).join``,s,s,s,s=`   |`[r](n),s,`___|`[r](n)].join`\n|`

where \nは、リテラルの改行文字を表します。最初の|文字以降のすべての行が文字で始まるという事実を活用します。説明:

f=
n=>[                        // Start by building up a list of rows
 `_`[r=`repeat`](n*4+       // 4 underscores per key
  (9>>n%7&1)),              // Third and seventh keys have one extra
 s=[...Array(n*12/7|0)]     // Calculate total of white and black keys
  .map((_,i)=>              // Process each key in turn
   1998>>i%12&1?` |`:`  |`  // Bitmap of narrow and wide keys
  ).join``,                 // Join the keys together
 s,s,s,                     // Repeated 4 times in total
 s=`   |`[r](n),            // Full width part of the white keys
 s,                         // Repeated twice in total
 `___|`[r](n)               // Base of the white keys
].join`\n|`                 // Join the rows together
<input type="number" oninput="o.textContent=f(this.value);"><pre id=o>

編集:キーの高さに関する仕様の誤読を修正して、2バイトを保存しました。


2
あなたは、私の心を吹き飛ばしました。
ロビーコイン

ああ、これは良いことです。何らかのウォークスルーを追加できますか?
nobe4

可能であれば、実行可能なスニペットを追加する必要があります。
バリント

1

ルビー、119バイト

->n{puts ?_*(1+n*4+(0<=>-n%7%4)),(0..6).map{|i|("01"+("%b"%[0xAADAAAD,13][i/4]*99)).tr('10',' |_|'[i/6*2,2])[0,1+n*4]}}

テストプログラムでゴルフをしていない

f=->n{
  puts ?_*(1+n*4+(0<=>-n%7%4)),           #Draw 1+n*4 _'s for top row (one less if -n%7%4>0, black note), then...
  (0..6).map{|i|                          #Cycle through remaining 7 rows
    ("01"+("%b"%[0xAADAAAD,13][i/4]*99)).   #Generate string version of binary number corresponding to pattern, repeat 99 times.
    tr('10',' |_|'[i/6*2,2]                 #Binary 1-> space or underscore. Binary 0 -> | (These choices ensured no leading 0)
    )[0,1+n*4]                              #truncate to the right amount of keys.
  }
}


10.times{|j|f[j]}

1

> <>、188 182バイト

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~:7=?;ao"|"o1+:0$0$
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"| _"{:}7=?$~::oooo1+:&:&(3*2+1$
>^
^
0120112
  | | | |  |

表示する白いキーの数は、プログラムの開始時にスタック上に存在する必要があります。

編集:5/6行と7行の出力を結合することで、数バイトを削ることができました。以前のバージョン:

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~ao"|"o1+:0$0$.
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"|   "oooo1+:&:&(3*2+1$
 ^
 "|___"oooo1+:&:&=?;
0120112
  | | | |  |

1

PHP、238バイト

$n=$argv[1];$s=str_repeat;echo'_'.$s($a=$s('_',28),$m=($n-$r=$n%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

いつものように、コードの<?php先頭にを追加し、PHPファイルに入れて(名前を付けましょうkeyboard.php)、次を使用して実行します:

$ php -d error_reporting=0 keyboard.php 55

さらに二つのバイトが初期化絞ってPHP7上に保存することができます$nし、$sその最初の使用には:

echo'_'.($s=str_repeat)($a=$s('_',28),$m=($n-$r=($n=$argv[1])%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

使用されていないコード、テストスイート、その他の機能はgithubにあります。


1

Pythonの3 2、191 185 180 182 171 145の 144 133 132バイト

def k(n):print"\n|".join(["_"*(4*n+(9>>n%7&1))]+[''.join("   ||"[1998>>j%12&1::2]for j in range(n*12/7))]*4+["   |"*n]*2+["___|"*n])

これはいくつかのゴルフを使用する可能性がありますが、私はすでにコードをいじくり回しているので、ゴルフ可能なスポットがどこにあるか分からないかもしれません。ゴルフの提案は大歓迎です。

編集:キーの高さに関する仕様を読み間違えます。このバグは修正されました。

編集: Javascriptの回答からNeilの12の重要なアイデアを借り、括弧をいくつか削除し、Python 2に切り替えて11バイトを節約しました。

編集:関数を1つのforループに戻すための多くの変更。

編集:関数ではなくプログラムになりました。

編集:print"\n|".join()ニールの提案どおりに使用して11バイトを節約します。プログラムをバイトに保存する関数に戻しました。


私の"\n|".joinトリックを使えば、さらに10バイト節約できると思います。
ニール

ああ、私は間にスペースを削除し忘れていprint"\n|"
ニール

0

C#1683バイト

だから....上記のニールの答えを見た後はかなり恥ずかしいですが、とにかくそれを投稿します。私はC#を使用して私のものを作成しました。「Fncs」クラス内で、キーの一般的な順序の配列を作成しました。次に、指定された整数に基づいてこの配列の適切なインデックスをユーザーが取得できるようにする関数を作成しました。個々の行を編集するために、個々の行を表す複数の文字列を格納する辞書を含む「PianoKeyboard」クラスを作成しました。最後に、適切なテキストを個々の行に追加する「DrawKey」関数と、全体の文字列値を返す「GetKeys」関数を作成しました。

namespace ASCIIPiano{public enum WhiteKeyType{Left,Middle,Right}public static class Fncs{public static WhiteKeyType[] Order{get{return new WhiteKeyType[]{WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Right,WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Middle,WhiteKeyType.Right};}}public static PianoKeyboard DrawKey(this PianoKeyboard keyboard, WhiteKeyType type){keyboard.Append(1,"_____");if (type == WhiteKeyType.Left){keyboard.Append( 2,"|  | ");keyboard.Append( 3,"|  | ");keyboard.Append( 4,"|  | ");keyboard.Append( 5, "|  | ");}else if (type == WhiteKeyType.Middle){keyboard.Append(2, " | | ");keyboard.Append(3," | | ");keyboard.Append( 4," | | ");keyboard.Append(5," | | ");}else{keyboard.Append( 2," |  |");keyboard.Append(3, " |  |");keyboard.Append(4," |  |");keyboard.Append(5, " |  |");}keyboard.Append(6,"|   |");keyboard.Append(7,"|   |");keyboard.Append(8,"|___|");return keyboard;}public static int GetWhiteKeyIndex(this int number){return number % 7;}public static string GetKeys(this int quantityofwhitekeys){PianoKeyboard keyboard = new PianoKeyboard();for (int i = 0; i < quantityofwhitekeys; i++){WhiteKeyType key=Fncs.Order[i.GetWhiteKeyIndex()];keyboard.DrawKey(key);}return keyboard.TOTALSTRING;}}public class PianoKeyboard{public PianoKeyboard(){}private Dictionary<int, string> lines = new Dictionary<int, string>();public void Append(int index,string value){if (index > 8 || index < 1){throw new Exception("URGH!");}else{if (lines.Keys.Contains(index)){lines[index] += value;}else{lines.Add(index, value);}}}public string TOTALSTRING{get{string returner = "";foreach (int key in lines.Keys){returner += lines[key] + "\n";}return returner;}}}}

1
こんにちは、PPCGへようこそ!お気づきかもしれませんが、コードゴルフの課題は、可能な限り短いコードを書くことです。そのため、C#、Java、基本的にオブジェクト指向言語などの言語は、ほとんどの場合、悪い選択です。しかし、短いコードを書くことは素晴らしい練習になる可能性がありますので、そうすることを妨げようとはしていません:)あなたの答えは、コードの長さを維持しない場合にこの問題を解決する良い方法ですマインド!小さなC#コードを書いて
みてください。)

@BassdropCumberwubwubwubおかげで、私は実際にこのサイトに(もちろん)初めてです。プログラミングも初めてですが、頑張ります^ _ ^
ロビーコイン

すべての<200バイトの回答の間に4KBの回答が表示されるのは面白いです。個人的には、これらのCodegolfの課題のためにJavaコードをできるだけ短く書くのが好きです。もちろん、JavaとC#は他の答えと競合することはありませんが、できるだけ短いコードを作成して試してみるのは楽しいです。興味深いと思われる投稿を以下に示します。C#でのコードゴルフのヒント。PS:コードをファイルにコピーして、正確なバイト数4,052を確認しました。;)とにかく、PPCGへようこそ!
ケビンCruijssen 16年

2
PPCGへようこそ。ただし、この答えは完全にゴルフする必要があります。削除可能な空白とコメントが表示されます。
Rɪᴋᴇʀ

1
1 .:彼らは長い間している1文字2:常にそれが正確なバイトであるTK必要があり、適切なバイト数を追加するので、あなたの変数の名前を変更する
バリント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.