Bàn phím đàn piano ASCII


24

Phím đàn piano rộng 3 ký tự và cao 7 ký tự. Tuy nhiên, nếu mỗi phím rộng 3 charactes, sẽ không đủ chỗ cho các phím đen. Đó là lý do tại sao một số phím trắng có phần bị cắt ra. Có 3 loại phím trắng.

Các phím bị thiếu một nửa bên phải (R):

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

Các phím bị thiếu một nửa bên trái (L):

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

Và các phím có nửa bên trái và bên phải bị thiếu (M):

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

Trên một bàn phím thực, mô hình của những thứ này diễn ra như sau:

RMLRMML, RMLRMML, RMLRMML...

và lặp lại cho tổng số 88 phím. Bây giờ bạn không thể nhìn thấy nó khi các phím được hiển thị riêng lẻ, nhưng khi bạn đẩy chúng lại với nhau, bạn có thể thấy các phím màu đen.

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

Nhiệm vụ của bạn

Cho số nguyên dương N , in nghệ thuật đàn piano ASCII này với N phím trắng. Bạn sẽ có thể xử lý bất kỳ N bao gồm từ 1 đến 52 (vì đàn piano 88 phím thực sự có 52 phím trắng). Đây là đầu ra thử nghiệm từ 1 đến 8, và sau đó mô hình tăng theo kiểu tương tự.

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

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

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

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

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

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

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

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

Và cuối cùng nhưng không kém phần quan trọng, đây là một đầu ra 52 phím đầy đủ:

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

Các lỗ hổng tiêu chuẩn bị cấm và câu trả lời ngắn nhất tính theo byte sẽ thắng!


"Lỗ hổng tiêu chuẩn" là gì?
tự đại diện

3
@Wildcard meta.codegolf.stackexchange.com/questions/1061/ triệt
DJMcMayhem

Là dấu cách trên bất kỳ / tất cả các dòng được phép? Làm thế nào về một dòng mới trailing?
Sok

1
@AlexL. Vì đàn piano 88 phím thực sự có 55 phím trắng .
DJMcMayhem

1
@BMac> _> Tôi không ... <_ <Tôi không biết bạn đang nói về cái gì. Tôi nói 52, thấy chưa! Bạn có thể thấy rõ nó trong R̶e̶v̶i̶s̶i̶o̶n̶ H̶i̶s̶t̶o̶r̶y̶ Uh, ý tôi là trạng thái của bài viết ngay bây giờ! Dù sao, rất may là có lẽ sẽ không phá vỡ bất kỳ câu trả lời hiện có nào, vì hầu hết chúng có thể hoạt động đến 55+.
DJMcMayhem

Câu trả lời:


4

Pyth, 68 65 63 byte

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

Hãy thử trực tuyến!

Bộ thử nghiệm.

Trong phiên bản này, tôi chỉ thay thế các bài tập (J và K) bên trong để lưu 2 byte. Do đó, hãy đọc phiên bản dưới đây.

Phiên bản 65 byte trước đó với lời giải thích

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

Hãy thử trực tuyến!

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)

Ma thuật đen

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

Tôi chỉ có trò đùa của bạn. Rên rỉ ...
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|`

Trường hợp \nđại diện cho nhân vật dòng chữ mới. Tận dụng thực tế là tất cả các dòng sau lần đầu tiên bắt đầu với một |nhân vật. Giải trình:

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>

Chỉnh sửa: Đã lưu 2 byte bằng cách sửa lỗi đọc sai của tôi về thông số kỹ thuật trên chiều cao của các phím.


2
Bạn, thưa ngài, chỉ cần thổi tâm trí của tôi.
Robbie Coyne

Oh điều này là tốt, bạn có thể thêm một số loại walk walk?
nobe4

Bạn nên thêm một đoạn mã có thể chạy nếu bạn có thể.
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]}}

Ungolfed trong chương trình thử nghiệm

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

Số lượng các phím trắng để hiển thị phải có trên ngăn xếp khi bắt đầu chương trình.

Chỉnh sửa : Tôi đã quản lý để tắt một vài byte thông qua việc kết hợp đầu ra cho các dòng 5/6 và 7. Phiên bản trước:

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

Như thường lệ, hãy thêm mã vào <?php, đặt mã vào tệp PHP (đặt tên cho nó keyboard.php) và chạy nó bằng cách sử dụng:

$ php -d error_reporting=0 keyboard.php 55

Hai byte nữa có thể được lưu trên PHP7 bằng cách nén việc khởi tạo $n$ssử dụng lần đầu tiên:

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

Mã không mã hóa, một bộ kiểm tra và các tính năng khác có thể được tìm thấy trên github .


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

Điều này có thể sử dụng một số môn đánh gôn nhưng tôi đã loay hoay với mã này đến mức tôi có thể không thấy các điểm chơi gôn ở đâu. Bất kỳ đề nghị chơi golf đều được chào đón.

Chỉnh sửa: Đọc sai thông số kỹ thuật về chiều cao của các phím. Lỗi này đã được cố định.

Chỉnh sửa: Mượn ý tưởng chính 12 của Neil từ câu trả lời Javascript của anh ấy, xóa một số dấu ngoặc đơn và chuyển sang Python 2 để lưu 11 byte.

Chỉnh sửa: Rất nhiều thay đổi để đưa chức năng xuống một forvòng lặp.

Chỉnh sửa: Bây giờ là một chương trình thay vì một chức năng.

Chỉnh sửa: Bây giờ sử dụng print"\n|".join()theo đề xuất của Neil để lưu 11 byte. Biến chương trình trở lại thành một chức năng để lưu một byte.


Tôi nghĩ bạn có thể tiết kiệm thêm 10 byte bằng cách sử dụng "\n|".jointhủ thuật của tôi .
Neil

Ah, tôi đã quên xóa khoảng cách giữa print"\n|"!
Neil

0

C # 1683 byte

Vì vậy, .... sau khi thấy câu trả lời của Neil ở trên, điều này khá xấu hổ, nhưng dù sao tôi cũng sẽ đăng nó vì tôi phải mất một thời gian (chúc phúc). Tôi đã sử dụng C # để tạo của tôi. Bên trong lớp "Fncs" tôi đã tạo ra một mảng các thứ tự điển hình của các khóa. Sau đó, tôi đã tạo một hàm có thể cho phép người dùng nhận được một chỉ mục thích hợp cho mảng này dựa trên một số nguyên cho trước. Để chỉnh sửa các dòng riêng lẻ, tôi đã tạo một lớp "PianoPal" chứa từ điển lưu trữ nhiều chuỗi đại diện cho các dòng riêng lẻ. Cuối cùng, tôi đã tạo ra hàm "DrawKey" để thêm văn bản phù hợp vào từng dòng riêng lẻ và hàm "GetKeys" trả về giá trị chuỗi tổng thể.

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
Xin chào, chào mừng đến với PPCG! Như bạn có thể nhận thấy, các thử thách chơi gôn mã là về việc viết mã ngắn nhất có thể. Các ngôn ngữ như C #, Java và về cơ bản là bất kỳ ngôn ngữ OO nào thường là một lựa chọn tồi. Tuy nhiên, nó có thể là một cách thực hành tuyệt vời để viết mã ngắn vì vậy tôi không cố gắng ngăn cản bạn làm như vậy :) Đối với câu trả lời của bạn, đó là một cách hay để giải quyết vấn đề này nếu bạn không giữ độ dài của mã lí trí! Chúc bạn vui vẻ và may mắn khi cố gắng viết mã C # nhỏ :)
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Cảm ơn, tôi thực sự mới đối với trang web này (tất nhiên). Cũng mới tham gia lập trình nhưng tôi sẽ cố gắng hết sức ^ _ ^
Robbie Coyne

Thật buồn cười khi thấy câu trả lời 4KB giữa tất cả các câu trả lời <200 byte. Cá nhân tôi cũng thích viết mã Java càng ngắn càng tốt cho các thách thức Codegolf này, vì tôi chưa bao giờ sử dụng bất kỳ ngôn ngữ codegolf nào cả. Tất nhiên Java và C # không bao giờ có thể cạnh tranh với các câu trả lời khác, nhưng thật vui khi thử và tạo mã càng ngắn càng tốt. Đây là một bài đăng bạn có thể thấy thú vị: Mẹo chơi gôn trong C # . PS: Tôi đã sao chép mã của bạn vào một tệp để xem số byte chính xác, đó là: 4.052 . ;) Dù sao, chào mừng bạn đến với PPCG!
Kevin Cruijssen

2
Chào mừng bạn đến với PPCG, nhưng câu trả lời này cần phải được đánh gôn đầy đủ. Tôi thấy khoảng trắng và ý kiến ​​có thể được gỡ bỏ.
Rɪᴋᴇʀ

1
1.: Đổi tên các biến của bạn, vì vậy chúng dài 1 ký tự 2.: Luôn thêm số byte thích hợp, nó cần tk chính xác byte
Bálint
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.