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 개의 전체 키 출력이 있습니다.

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

표준 허점은 금지되어 있으며 바이트 단위의 최단 답변이 이깁니다!


"표준 허점"이란 무엇입니까?
와일드 카드


모든 라인의 후행 공백이 허용됩니까? 후행 줄 바꿈은 어떻습니까?
Sok

1
@AlexL. 실제 88 건반 피아노에는 55 건반이 있습니다.
DJMcMayhem

1
@BMac> _> 모르겠어요 ... <_ <당신이 무슨 말을하는지 모르겠습니다. 나는 52, 말했다 참조하십시오! R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh에서 명확하게 볼 수 있습니다. 지금은 게시물의 상태를 의미합니다! 어쨌든, 아마도 기존 답변을 깨뜨리지 않을 것입니다. 대부분의 답변은 어쨌든 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

자바 스크립트 (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리터럴 개행 문자를 나타냅니다. 첫 번째 줄 이후의 모든 줄은 |문자로 시작한다는 사실을 활용합니다 . 설명:

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

가능하면 실행 가능한 스 니펫을 추가해야합니다.
Bálint

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

ungolfed 코드, 테스트 스위트 및 기타 기능 은 github 에서 찾을 수 있습니다 .


1

파이썬 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])

이것은 골프를 사용할 수는 있지만 골프장이 어디에 있는지 알지 못할 정도로 이미 코드를 사용하여 너무 놀랐습니다. 모든 골프 제안은 환영합니다.

편집 : 키 높이의 사양을 잘못 읽습니다. 이 버그가 수정되었습니다.

편집 : Neil의 12 가지 핵심 아이디어 를 Javascript 답변에서 빌려 괄호를 제거하고 Python 2로 전환하여 11 바이트를 절약했습니다.

편집 : 기능을 하나의 for루프 로 낮추기 위해 많은 변경 사항이 있습니다.

편집 : 이제 기능 대신 프로그램.

편집 : 이제 print"\n|".join()11 바이트를 절약하기 위해 Neil이 제안한대로 사용 합니다. 바이트를 저장하는 기능으로 프로그램을 다시 설정했습니다.


"\n|".join트릭 을 사용하여 10 바이트를 더 절약 할 수 있다고 생각합니다 .
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에 오신 것을 환영합니다! 아시다시피 코드 골프 과제는 가능한 가장 짧은 코드를 작성하는 것입니다. C #, Java 및 기본적으로 모든 OO 언어와 같은 언어가 종종 잘못된 선택입니다. 그러나 짧은 코드를 작성하는 것은 좋은 습관이 될 수 있으므로 그렇게하지 않는 것이 좋습니다. 마음! 재미, 좋은 행운 작은 C # 코드를 작성하려고 :) 되세요
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub 감사합니다. 저는이 사이트를 처음 접합니다 (물론). 일종의 너무 프로그래밍에 새로운하지만 다하겠습니다 최선 ^ _ ^
로비 코인

모든 <200 바이트 답변 사이에서 4KB 답변을 보는 것이 재미 있습니다. 저는 개인적으로 이러한 코드 골프 문제에 대해 가능한 한 짧은 Java 코드를 작성하는 것을 좋아합니다. 물론 Java와 C #은 다른 답변과 경쟁 할 수 없지만 가능한 짧은 코드를 작성하는 것은 재미 있습니다. 다음은 흥미로운 게시물 입니다. C #의 코드 골프를위한 팁 . 추신 : 정확한 바이트 수를 확인하기 위해 코드를 파일에 복사했습니다 : 4,052 . ;) 어쨌든, PPCG에 오신 것을 환영합니다!
Kevin Cruijssen

2
PPCG에 오신 것을 환영하지만이 답변은 완전히 골퍼해야합니다. 공백과 주석을 제거 할 수 있습니다.
Rɪᴋᴇʀ

1
1 .: 변수의 이름을 바꾸면 길이는 1 자입니다. 2 .: 항상 적절한 바이트 수를 추가하십시오. tk는 바이트 단위 여야합니다.
Bálint
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.