คีย์บอร์ดเปียโน ASCII


24

ปุ่มเปียโนมีความกว้าง 3 ตัวอักษรและสูง 7 ตัว อย่างไรก็ตามหากทุกปุ่มมีความกว้าง 3 ตัวอักษรจะไม่มีที่ว่างพอสำหรับปุ่มสีดำ นั่นเป็นสาเหตุที่ทำให้ปุ่มสีขาวบางส่วนถูกตัดออกบางส่วน ปุ่มสีขาวมี 3 ประเภท

กุญแจที่ขาดหายไปครึ่งขวา (R):

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

แป้นที่ขาดหายไปครึ่งซ้าย (L):

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

และปุ่มที่มีครึ่งซ้ายและครึ่งขวาหายไป (M):

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

บนคีย์บอร์ดจริงรูปแบบของสิ่งเหล่านี้จะเป็นดังนี้:

RMLRMML, RMLRMML, RMLRMML...

และทำซ้ำทั้งหมด 88 ปุ่ม ตอนนี้คุณไม่สามารถมองเห็นมันได้เมื่อมีการแสดงปุ่มต่าง ๆ แต่เมื่อคุณดันมันเข้าด้วยกันคุณจะเห็นปุ่มสีดำ

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

งานของคุณ

รับจำนวนเต็มบวกNให้พิมพ์ ASCII-art ของเปียโนด้วยปุ่มขาวN คุณควรสามารถจัดการN ได้ตั้งแต่ 1 ถึง 52 (เนื่องจากเปียโน 88 คีย์จริงมี 52 คีย์สีขาว) นี่คือเอาต์พุตทดสอบตั้งแต่ 1 ถึง 8 และหลังจากนั้นรูปแบบจะเพิ่มขึ้นในลักษณะเดียวกัน

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

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

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

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

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

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

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

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

และสุดท้าย แต่ไม่ท้ายสุดนี่คือเอาท์พุทคีย์เต็ม 52 รายการ:

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

ช่องโหว่มาตรฐานถูกแบนและคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


"ช่องโหว่มาตรฐาน" คืออะไร
สัญลักษณ์แทน


อนุญาตให้เว้นวรรคต่อท้ายสำหรับทุกบรรทัดหรือไม่? ขึ้นบรรทัดใหม่อย่างไร
Sok

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

ลองออนไลน์!

ชุดทดสอบ

ในรุ่นนี้ฉันเพิ่งทดแทนการมอบหมาย (J และ K) ภายในเพื่อบันทึก 2 ไบต์ ดังนั้นให้อ่านเวอร์ชั่นด้านล่าง

เวอร์ชัน 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:
                    "  | | | |  |  | | | | | |  |"

ฉันแค่ตลกของคุณ คร่ำครวญ ...
Neil

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

ไหน\nหมายถึงอักขระ newline ที่แท้จริง ยกระดับความจริงที่ว่าทุกบรรทัดหลังจากที่เริ่มต้นครั้งแรกกับ|ตัวละคร คำอธิบาย:

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
คุณครับแค่ทำให้ใจของฉัน
Robbie Coyne

โอ้นี่เป็นสิ่งที่ดีคุณสามารถเพิ่มคำแนะนำบางอย่างได้หรือไม่?
nobe4

คุณควรเพิ่มข้อมูลโค้ดที่รันได้หากทำได้
Bálint

1

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

Ungolfed ในโปรแกรมทดสอบ

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

รหัส ungolfed, ชุดทดสอบและสินค้าอื่น ๆ สามารถพบได้บน 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])

นี่อาจใช้การตีกอล์ฟ แต่ฉันเล่นซอกับรหัสมากจนฉันอาจไม่เห็นจุดที่สามารถเล่นกอล์ฟได้ คำแนะนำการเล่นกอล์ฟใด ๆ ยินดีต้อนรับ

แก้ไข:ใส่สเป็คผิดที่ความสูงของปุ่ม ข้อผิดพลาดนี้ได้รับการแก้ไขแล้ว

แก้ไข: แนวคิดหลัก 12 ข้อของนีลที่ยืมมาจากคำตอบ Javascript ของเขาลบวงเล็บบางส่วนแล้วเปลี่ยนเป็น Python 2 เพื่อบันทึก 11 ไบต์

แก้ไข: มีการเปลี่ยนแปลงมากมายเพื่อให้ฟังก์ชั่นลดลงเป็นหนึ่งforลูป

แก้ไข:ตอนนี้โปรแกรมแทนฟังก์ชั่น

แก้ไข:ตอนนี้ใช้print"\n|".join()ตามที่แนะนำโดย Neil เพื่อบันทึก 11 ไบต์ เปลี่ยนโปรแกรมกลับเป็นฟังก์ชันเพื่อบันทึกไบต์


ฉันคิดว่าคุณสามารถประหยัดอีก 10 ไบต์โดยใช้"\n|".joinเคล็ดลับของฉัน
Neil

อาฉันลืมที่จะลบช่องว่างระหว่างprintและ"\n|"!
Neil

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! ในขณะที่คุณอาจสังเกตเห็นความท้าทายของ code-golf กำลังเกี่ยวกับการเขียนรหัสที่สั้นที่สุด ภาษาอย่าง C #, Java และภาษา OO ส่วนใหญ่มักเป็นตัวเลือกที่ไม่ดี อย่างไรก็ตามมันเป็นวิธีที่ดีในการเขียนรหัสย่อดังนั้นฉันไม่พยายามกีดกันคุณจากการทำเช่นนั้น :) สำหรับคำตอบของคุณมันเป็นวิธีที่ดีในการแก้ปัญหานี้หากคุณไม่รักษาความยาวของรหัสไว้ ใจ! ขอให้สนุกและขอให้โชคดีในการเขียนโค้ด C # เล็ก :)
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub ขอบคุณจริง ๆ แล้วฉันใหม่กับเว็บไซต์นี้ (แน่นอน) ค่อนข้างใหม่สำหรับการเขียนโปรแกรมด้วย แต่ฉันจะทำให้ดีที่สุด ^ _ ^
Robbie Coyne

ตลกที่เห็นคำตอบ 4KB ระหว่างคำตอบ <200 ไบต์ทั้งหมด ฉันเองก็ชอบที่จะเขียนโค้ดภาษาจาวาให้สั้นที่สุดเท่าที่จะเป็นไปได้สำหรับความท้าทาย Codegolf เหล่านี้เนื่องจากฉันไม่เคยใช้ภาษา codegolf เลย แน่นอนว่า Java และ C # ไม่สามารถแข่งขันกับคำตอบอื่น ๆ ได้ แต่มันสนุกที่จะลองและสร้างรหัสให้สั้นที่สุด นี่คือการโพสต์ที่คุณอาจพบที่น่าสนใจ: เคล็ดลับสำหรับรหัสการเล่นกอล์ฟใน C # PS: ผมได้คัดลอกโค้ดของคุณไปยังไฟล์ที่จะเห็นจำนวนเงินที่แน่นอนของไบต์ซึ่งเป็น: 4,052 ;) อย่างไรก็ตามยินดีต้อนรับสู่ PPCG!
Kevin Cruijssen

2
ยินดีต้อนรับสู่ PPCG แต่คำตอบนี้จำเป็นต้องได้รับการตีกอล์ฟให้เต็มที่ ฉันเห็นช่องว่างและความคิดเห็นที่สามารถลบได้
Rɪᴋᴇʀ

1
1: เปลี่ยนชื่อตัวแปรของคุณดังนั้นพวกเขาจึงมีความยาว 1 ตัวอักษร 2: เพิ่มจำนวนไบต์ที่เหมาะสมเสมอมันต้องแม่นยำเป็นไบต์ไบต์
Bálint
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.