Keyboard piano ASCII

24

Tombol piano memiliki lebar 3 karakter, dan tinggi 7 karakter. Namun, jika setiap kunci memiliki 3 karakter lebar, tidak akan ada cukup ruang untuk kunci hitam. Itu sebabnya beberapa kunci putih dipotong bagiannya. Ada 3 jenis kunci putih.

Kunci dengan setengah kanan yang hilang (R):

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

Kunci dengan setengah kiri hilang (L):

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

Dan kunci dengan bagian kiri dan kanan hilang (M):

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

Pada keyboard asli, polanya seperti ini:

RMLRMML, RMLRMML, RMLRMML...

dan ulangi total 88 kunci. Sekarang Anda tidak dapat melihatnya ketika tombol ditampilkan secara individual, tetapi ketika Anda mendorongnya bersama, Anda dapat melihat kunci hitam.

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

Tugas Anda

Dengan bilangan bulat positif N , cetak ASCII-art dari piano ini dengan tombol N putih. Anda harus dapat menangani N dari 1 hingga 52 inklusif (karena piano 88-key asli memiliki 52 kunci putih). Berikut ini adalah hasil tes dari 1 hingga 8, dan setelah itu polanya meningkat dengan cara yang serupa.

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

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

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

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

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

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

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

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

Dan yang tak kalah pentingnya, berikut ini adalah 52 output kunci penuh:

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

Celah standar dilarang, dan jawaban terpendek dalam byte menang!

DJMcMayhem
sumber
Apa itu "celah standar"?
Wildcard
Apakah spasi tambahan di setiap / semua garis diizinkan? Bagaimana dengan baris baru yang tertinggal?
Sok
1
@AlexL. Karena piano 88-key asli memiliki 55 kunci putih .
DJMcMayhem
1
@BMac> _> Saya tidak ... <_ <Saya tidak tahu apa yang Anda bicarakan. Saya katakan 52, lihat! Anda dapat dengan jelas melihatnya di R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Eh, maksudku keadaan pos sekarang! Ngomong-ngomong, syukurlah bahwa mungkin tidak akan merusak jawaban yang ada, karena sebagian besar dari mereka mungkin bekerja sampai 55+.
DJMcMayhem

Jawaban:

4

Pyth, 68 65 63 byte

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

Cobalah online!

Suite uji.

Dalam versi ini, saya hanya mengganti tugas (J dan K) di dalam untuk menghemat 2 byte. Karena itu, baca versi di bawah ini.

Versi 65-byte sebelumnya dengan penjelasan

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

Cobalah online!

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)

Sihir hitam

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:
                    "  | | | |  |  | | | | | |  |"
Biarawati Bocor
sumber
Saya baru saja mendapat lelucon Anda. Groan ...
Neil
11

JavaScript (ES6), 155 149 147 byte

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

Dimana \nmewakili karakter baris baru literal. Memanfaatkan fakta bahwa semua garis setelah mulai pertama dengan |karakter. Penjelasan:

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>

Sunting: Disimpan 2 byte dengan memperbaiki kesalahan saya membaca spesifikasi pada ketinggian tombol.

Neil
sumber
2
Anda, Tuan, baru saja membuat saya bingung.
Robbie Coyne
Oh ini bagus, bisakah Anda menambahkan semacam panduan?
nobe4
Anda harus menambahkan snippet runnable jika Anda bisa.
Bálint
1

Ruby, 119 byte

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

Tidak digabungkan dalam program uji

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]}
Level River St
sumber
1

> <>, 188 182 byte

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

Jumlah tombol putih untuk ditampilkan harus ada pada tumpukan saat program dimulai.

Sunting : Saya berhasil mencukur beberapa byte dengan menggabungkan output untuk baris 5/6 dan 7. Versi sebelumnya:

&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
  | | | |  |
Sok
sumber
1

PHP, 238 byte

$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";

Seperti biasa, tambahkan dulu kode <?php, masukkan ke dalam file PHP (beri nama keyboard.php) dan jalankan dengan menggunakan:

$ php -d error_reporting=0 keyboard.php 55

Dua byte lagi dapat disimpan di PHP7 dengan menekan inisialisasi $ndan $ske dalam penggunaan pertama mereka:

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

Kode ungolfed, test suite dan barang lainnya dapat ditemukan di github .

aksioma
sumber
1

Python 3 2, 191 185 180 182 171 145 144 133 132 byte

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

Ini bisa menggunakan beberapa golf tetapi saya sudah terlalu mengutak-atik kode sehingga saya mungkin tidak melihat di mana tempat golf. Saran bermain golf dipersilakan.

Sunting: Salah membaca spesifikasi pada ketinggian tombol. bug ini telah diperbaiki.

Sunting: Gagasan 12 kunci Neil yang dipinjam dari jawaban Javascript-nya, menghapus beberapa tanda kurung, dan beralih ke Python 2 untuk menyimpan 11 byte.

Sunting: Banyak perubahan untuk menurunkan fungsi ke satu forloop.

Sunting: Sekarang program alih-alih fungsi.

Sunting: Sekarang menggunakan print"\n|".join()seperti yang disarankan oleh Neil untuk menghemat 11 byte. Mengubah program kembali menjadi fungsi untuk menghemat satu byte.

Sherlock9
sumber
Saya pikir Anda bisa menyimpan 10 byte lagi dengan menggunakan "\n|".jointrik saya .
Neil
Ah, saya lupa menghapus ruang antara printdan "\n|"!
Neil
0

C # 1683 byte

Jadi .... setelah melihat jawaban Neil di atas ini cukup memalukan, tetapi saya tetap akan mempostingnya karena butuh beberapa saat (berkah). Saya menggunakan C # untuk membuat milik saya. Di dalam kelas "Fncs", saya membuat array dari urutan kunci. Kemudian, saya membuat fungsi yang memungkinkan pengguna untuk mendapatkan indeks yang sesuai untuk array ini berdasarkan integer yang diberikan. Untuk mengedit setiap baris, saya membuat kelas "PianoKeyboard" yang berisi kamus yang menyimpan banyak string yang mewakili masing-masing baris. Akhirnya, saya membuat fungsi "DrawKey" yang menambahkan teks yang sesuai ke masing-masing baris dan fungsi "GetKeys" yang mengembalikan nilai string keseluruhan.

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;}}}}
Robbie Coyne
sumber
1
Hai, selamat datang di PPCG! Seperti yang mungkin Anda perhatikan, tantangan kode golf adalah menulis kode sesingkat mungkin. Bahasa-bahasa seperti C #, Java dan pada dasarnya semua bahasa OO karenanya merupakan pilihan yang paling buruk. Namun, ini bisa menjadi praktik yang bagus untuk menulis kode pendek jadi saya tidak mencoba untuk mencegah Anda melakukan hal itu :) Adapun jawaban Anda, ini adalah cara yang bagus untuk menyelesaikan masalah ini jika Anda tidak akan menyimpan panjang kode di pikiran! Selamat bersenang-senang, dan semoga berhasil mencoba menulis kode C # kecil :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Terima kasih, saya sebenarnya baru di situs ini (tentu saja). Agak baru dalam pemrograman juga, tetapi saya akan melakukan yang terbaik ^ _ ^
Robbie Coyne
Lucu melihat jawaban 4KB di antara semua <200 byte jawaban. Saya pribadi juga suka menulis kode Java sesingkat mungkin untuk tantangan Codegolf ini, karena saya tidak pernah menggunakan bahasa codegolf sama sekali. Tentu saja Java dan C # tidak pernah dapat bersaing dengan jawaban lain, tetapi menyenangkan untuk mencoba dan membuat kode sesingkat mungkin. Berikut adalah pos yang mungkin menarik bagi Anda: Kiat untuk bermain golf kode di C # . PS: Saya telah menyalin kode Anda ke file untuk melihat jumlah byte yang tepat, yaitu: 4,052 . ;) Bagaimanapun, selamat datang di PPCG!
Kevin Cruijssen
2
Selamat datang di PPCG, tetapi jawaban ini harus sepenuhnya golf. Saya melihat spasi dan komentar yang bisa dihapus.
R
1
1 .: Ubah nama variabel Anda, jadi mereka 1 karakter panjangnya 2 .: Selalu tambahkan jumlah byte yang tepat, perlu tk menjadi byte yang tepat
Bálint