코드 골프 : 피아노


88

도전

주어진 길이의 입력 음에서 시작하여 피아노 키보드의 일부를 출력하는 문자 수에 따른 가장 짧은 코드입니다.

입력은 [ACDFG]#|[A-G]키보드 인쇄를 시작 하는 음표 ( )와 첫 번째 음표를 포함하여 인쇄 할 키 길이를 나타내는 양수로 구성됩니다.

첫 번째 키는 전체적으로 인쇄되어야합니다. 왼쪽 날카로운 키가 있으면 잘립니다. 시작 키가 예리 할 때 왼쪽 키도 잘립니다.

샤프 키는 계산되지 않고 흰색 키만 계산됩니다.

테스트 케이스

Input
    C 14
Output
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|____|____|____|____|____|____|____|

Input
    D# 1
Output
    ###   |
    ###   |
    ###   |
    ###   |
    ###   |
     |    |
     |    |
     |    |
    _|____|

Input
    A 7
Output
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|

코드 수에는 입력 / 출력 (예 : 전체 프로그램)이 포함됩니다.


5
[A-G]#*? 핸들, 대답이 평균 우리의 필요가 있습니까 B#####E?
아논.

5
키 수에 대해 "키"를 정의하십시오. 예제 "C 14"가 24 개의 키를 인쇄하는 이유는 무엇입니까?
Guffa 2010

53
이제 C 및 C # 솔루션을 얻었으므로 B, D 및 F #이 필요합니다.
LiraNuna 2010

7
다음 코드 골프 :이 피아노에 대한 MIDI 인터페이스를 구현합니다.
Mehrdad Afshari

10
친애하는 친애하는 여러분,이 챌린지를 3 일 후에 종료 해 주신 데 대해 경의를 표합니다. 5 분 후에 다시 열게되었습니다. 그것만으로도 뭔가를 말할 수 있습니다. 커뮤니티는 당신이 좋아하든 싫어하든 이런 종류의 질문을 좋아하고 받아들입니다. 그러나 그렇지 않은 경우 무시 된 태그 목록에 code-golf를 추가하십시오.
LiraNuna 2010

답변:


27

GolfScript-80 자

스크롤 막대없이 한 줄의 #SO에 맞습니다. :)

' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*

GolfScript-81 자

' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*  +*k)>c<n+}%) /'_'*

멋지게 포맷 된 버전 (27 x 3)

' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9*  +*k)>c<n+}%) /'_'*

GolfScript-82 자

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'###  '*' |   '4*+20<.5>+c*k)>c<n+}%)' '/'_'*

GolfScript-85 자

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'###  '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%

멋진 형식의 버전 (17 x 5)

' '/((7&\,.4*@5*+
:k;\~~5*+):c;9,{.
5<3*'###  '*' _'1
/@8=='|'1$3*++4*+
20<.5>+c*k)>c<n}%

GolfScript-94 자

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*'   _'1/{'|'\4*+7*c*f}%

GolfScript-98 자

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+:^)>&c+):&<n]5*[   '_']{['|'\4*+7*c*^>&<n]}%

GolfScript-101 자

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+)>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript-109 자

' ': /~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript-120 자

' '/~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

GolfScript-127 자

' '/~~5*:c;(7&5*:^;,:&;['##  ###  ###   |   ###  ###   |   #'c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

$ echo -n C 14 | ruby golfscript.rb piano.gs 
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo -n D# 1| ruby golfscript.rb piano.gs 
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo -n A 7| ruby golfscript.rb piano.gs 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

다른 도전에 대한 첫 번째 golfscript 항목을 제출하려고 했지만 ( stackoverflow.com/questions/2104556/… ) 마감되었습니다 :-(
mob

2
나는 그들이 학교에서 golfscript를 가르치기를 바랍니다. 내 돈을 돌려 받고 싶어요.
Steve Tjoa 2010

6
좋은. 나중에 PianoScript에 솔루션을 게시 할 것입니다. 6 자 밖에되지 않습니다. :-)
molf 2010

112

Perl, 133 (129) 자

167 160 156 147 142 133 D' 아! 147 개 144 137 134 133 문자

    $ _ = shift; die grep {5> $ n? y / * / # / : y / # * / | /; $ n ++-8 || y / / _ /}
    @ Q = (substr (( "* # #". ( "* # # * # | #") x2) x9,
    4 * / # / + (7 & ord) * 5,1 + / # / + 5 * 팝). $ /) x9

다음은 molf의 Ruby 솔루션에서 몇 가지 아이디어를 빌린 129 char 솔루션입니다.

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ord;
    for $ n (0..8) {print $ /, substr + (join '', map {8- $ n? 5> $ n && $ _ % 7 % 4? "###"
    : "|": "_ | ___"} $ j .. $ j + $ c),! $ k, -3}

Acme :: AsciiArtinator의 도움으로 :

                sub init_piano{$S=$";$H='#';
                (                            $
               T                              ,$P,$U)=qw(
              T                                          |
             _                                            |
            /                                              )
           ;                                                $
          d             =$T.$H.$S.$S;$t                     =
         $             d               .                   $H
        .              $               d                  . $
       S               .$P.$S.$S.$S.$H;$                t=  $
      d.$H.$t.$t;};$_=shift;-/-/;&init_piano();$Z=/#/;-/|   |
      |                                                 |   |
      |                    YAMAHA                       |  /
      ;die grep{4>$n++?y/T/#/:y/#T/ |/;$n-8||y/ /_/;}@q=(m{
     // // /// // /// // /// // /// // /// // /// // /// /   
    // // /// // /// // /// // /// // /// // /// // /// /
   }                                                   .
   substr(${t}x(9),4*${Z}+(7&ord)*5,1+$Z+5*pop).$/)x(8)
          ;   '                            \   /
           | |                              | |
           /_\                              /';

7
하하하, 대단해. Steinway, Yamaha, Young Chang입니까?
Steve Tjoa 2010

2
나는 이것을 북마크하여 "원숭이"농담을받지 않는 사람들에게 보여줄 것이다.
Mehrdad Afshari

3
@ 스티브 -하자 메이크업이 야마하
폭도

6
@mobrule, 당신은 grep을 싫어합니까? 왜 죽기를 원합니까? :(
LiraNuna 2010

Golfscript * 1.3은 105입니다. :)
John La Rooy

34

Ruby-125 자

146 개 144 140 137 134 126 125 문자

a,n=$*;h=a[1]?0:1;s=a[0]-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,"_"}

(두 번째 줄 바꿈은 필요하지 않으며 SO에서 스크롤바를 피하기 위해서만 추가됩니다. 세미콜론은 원하는 경우 줄 바꿈으로 바꿀 수 있습니다.)

루비 1.9 버전은 다르지만 동일한 길이 (치환 a[0]에 의해 a.ord"_"의해 ?_)

a,n=$*;h=a[1]?0:1;s=a.ord-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,?_}

전화

$ ruby piano.rb C 14

Hey VIM은 첫 번째에 138자를 계산합니다.?!?
hurikhan77 2010

a, n = gets.split; ... 동일한 작업을 수행합니다. -3 자
hurikhan77

1
"gets.split"을 "$ *"로 바꾸고 명령 줄에 -8 chars를 입력 할 수도 있습니다
hurikhan77 2010

변경 i%7%4<1||t>4?"_|___":"###__"i%7%4&&t<5?"###__":"_|___"2 개 문자 저장. I love that %7%4idiom
mob

1
그래서 우리는 가장 짧은 해결책에 도달했습니다. 루비 룰즈! :-D
hurikhan77 2010

29

LilyPond 285 288 291 310 315 330 333 340 350 문자

음악 테마에 따라 다음은 악보 조판 용으로 설계된 언어로 된 솔루션 인 LilyPond입니다.

x=#ly:string-substitute
u=#(x"*""###  ""|   *** |   ** ")t=#(x"###"" | "u)q=#read-char
z=#(q)v=#(if(eq?(q)#\#)1 0)y=#(iota(+(*(read)5)1 v))#(format #t"~{~{~a~}
~}"(map(lambda(s)(map(lambda(i)(string-ref s(modulo(+(*(char->integer z)5)i(* v
4))35)))y))(list u u u u u t t t(x" ""_"t))))

용법: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null


4
이것은 아마도 코드 골프에서 LilyPond가 사용되는 것을 본 최초이자 유일한 시간입니다.
cobbal


26

RetroGolf - 애플 소프트 베이직 : 236 239 245 249 257 245 267 285

가독성을 위해 여러 줄로 표시되지만 한 줄이어야합니다.

1K$="##   |   ###  #":K$="##  #"+K$+K$:
 FORI=1TO21:F$=F$+"|____":L$=L$+"|    ":NEXT:
 INPUTN$:S=MID$(N$,2,1)="#":O=(ASC(N$)-65)*5+1+S*4:L=VAL(RIGHT$(N$,2))*5+1+S:
 FORI=1TO5:?MID$(K$+K$+K$,O,L):NEXT:FORI=1TO3:?MID$(L$,O,L):NEXT:?MID$(F$,O,L)

Javascript 또는 에뮬레이터 에서이 Applesoft BASIC Interpreter 로 테스트 할 수 있습니다 .

피아노 http://img685.imageshack.us/img685/3407/piano2.png


사양에 따라 동일한 행에서 두 인수를 모두 읽을 수 있습니까?
KirarinSnow 2010

18

C #-315

매우 간결한 언어는 아니지만 C #에서 골프를 계속합니다 ...

using C=System.Console;class P{static void L(int o,int c,string s){while(c-->0)C.Write(s[(420>>o++%5*2&3)+(91>>(o+2)/5%7&1)*3]);C.WriteLine();}static void Main(string[]a){int i=0,s=a[0].Length-1,c=int.Parse(a[1])*5+1+s,o=(a[0][0]-65+s)*5-s;while(i++<5)L(o,c,"|  ## ");while(i++<8)L(o,c,"|  |  ");L(o,c,"|__|__");}}

23
이제 F # 솔루션이 멜로디를 완성합니다.
LiraNuna 2010

13
유머는 +1, 진부한 유머는 -1, C #과 F #은 일치하므로 +1입니다.
Steve Tjoa

그것을 실행하려고 할 때 System.IndexOutOfRangeException이 발생했습니다.
Fitzchak Yitzchaki

@Mendy : 실행할 때 명령 줄 인수를 제공해야합니다. Visual Studio에서 실행하는 경우 프로젝트의 속성을 열고 디버그 탭으로 이동 한 다음 시작 옵션에서 명령 줄 인수를 입력 할 수 있습니다. 코드를 exe로 컴파일 한 경우 프로그램 이름 뒤에 인수를 사용하여 콘솔 창에서 실행하면됩니다.
Guffa 2010

1
-> 연산자를 아주 잘 사용합니다.
Kevin

16

파이썬-164

k,n=raw_input().split()
m=k[1:]>""
n=int(n)*5+1
o=(ord(k[0])-65)*5+4*m
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print((x+x[::-1][:-1])*n)[o:o+n+m]

tand 의 반복되는 부분을 제거하고 u7을 곱하여 일부 문자를 저장할 수 없습니까?
Matthew Crumley

@Matthew Crumley, 내 솔루션에서 빌려 주시기 바랍니다 :)
John La Rooy

@gnibbler, 나는 실제로 파이썬 프로그래머가 아니기 때문에 (나는 그것을 가지고 놀았지만 광범위하게는 아니었다) 그래서 나는 그것으로 많은 것을 할 수 있을지 의심 스럽다. 원래 솔루션을 볼 때까지 파이썬이 그렇게 문자열을 곱할 수 있다는 사실조차 몰랐습니다.
Matthew Crumley

@gnibbler-멋진 솔루션, 실행하고 싶지만 SyntaxError가 발생합니다 .... C 14 Traceback (최근 호출 마지막) : File "piano.py", line 1, in? k, n = input (). split () 파일 "<문자열>", 1 행 C 14 ^
AJ.

@AJ, 그 오류는 Python3 솔루션에서 비롯된 것 같습니다. 그래도 왜 그런지 잘 모르겠습니다
John La Rooy

15

옥타브 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 개 219 240 244 268 문자

전체 옥타브로 프로그래밍 할 수 있는데 왜 C, C # 또는 F # (또는 B 또는 D) 만 사용합니까?

(명확성을 위해 60 자마다 포장)

x=5*scanf("%2c%d");for k=-8:0disp((s={[t="|   ###  ###  ","#
##   ",t" "]"|    ","|____"}{(k>-4)+!k+1})(1+mod(5*(y=x(2)>1
60)+(-y:x(3))+x(1),rows(s'))))end

예 ...이 솔루션은 실제로 문자열의 복잡한 켤레 전치를 계산합니다.

용법: $ octave -q thisfile.m <input.in >output.out


13

C — 197 203 207 216 224 232 240 문자

#define S"#   |   ###  ###  ##"
main(i,j,l,h,t){char*X[]={"____|","    |",S S,S S},s[i=11];for(scanf("%s%n%d",s,&h,&l);--i>1;puts(""))for(j=t=*s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

이 동등한 194 문자 버전은 버퍼 오버 플로우가 정상이라고 가정합니다.

#define S"#   |   ###  ###  ##"
i=11;main(j,l,h,t){char*X[]={"____|","    |",S S,S S},s;for(scanf("%s%n%d",&s,&h,&l);--i>1;puts(""))for(j=t=s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

1
for(j=0; j<=l*5+h; j++)<-쓸모없는 공백, 그리고 당신도 문자 수에 포함시킨 것 같습니다
Nicolás

12

포스트 스크립트 239 245 293 312 (보통); 219 224 225 231 (ASCII85)

/r{(%stdin)(r)file token pop}def[(]){mul add}/z r(:-)cvs dup length 1
sub/v exch/p r/s(|   ###  ###  ###   |   ###  ###   )([){0 1 v p 5]{s
exch z 0 get 5]v 4]s length mod 1 getinterval print}for/
=}>>begin[[[[[/s(|    )def[[[/s(|____)def[

ASCII85 인코딩을 통해 ASCII 인쇄 가능한 문자 만있는 219 자 프로그램으로 확장 된 바이너리 버전 :

/(|____)/(|    )[/r/(|   ###  ###  ###   |   ###  ###   )<~Ou%G5-$+0=Bl5@JE[d/;P,jagI?HCK@<*JGP,4<rOuSV60p8LhG*5%O8oc=a.=3b)!HsVu23Md=!IHJ_A<K->@5*j;23Md=!HoSBP&-9^09Tk/@ZkI\P"_$^I?I,S+?b-:5*?@Z>?b<9Ou$<H>EUc~>cvx
exec[

용법: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps <input.in >output.out


10
이 대회에서 덜 전통적인 언어를 보는 것을 좋아합니다.
mob

12

F 번호 224 225, 226, 248, 252, 270, 276, 299, 306 개 숯을

let x,(/)=System.Console.ReadLine(),String.replicate
let t,p=(int x.[0]-60)%7*5,int x.[1]%2
let g s i=printf"%s"(i/((99/s).[t+4*p..t+int x.[2..]*5+5*p]+"\n"))
g"|   ###  ###   |   ###  ###  ###   "5 
g"|    "3
g"|____"1

2 개의 모듈을 사용하여 공백 또는 파운드를 감지했습니다. ''은 32 % 2 = 0 '#'은 35 % 2 = 1이고 조건부에서 false에 대해 0을 반환했기 때문에 모듈 결과를 곱했습니다.

<| 연산자는 하나의 공백 문자를 줄입니다. 연산자 오버로딩을 사용하여 다른 문자를 저장했습니다.

실물

let piano_long (input:string) = 
    let sharp, flat = if input.[1] = '#' then 4, 1 else 0, 0

    let note = (int input.[0] - 60) % 7
    let num = int (input.Substring 2)

    let start = note * 5 + sharp
    let stop = num * 5 + 1 + flat

    let top    = "|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |"
    let middle = "|    |    |    |    |    |    |    |    |    |    |    |    |    |    |"
    let bottom = "|____|____|____|____|____|____|____|____|____|____|____|____|____|____|"


    let mutable piano = ""

    for i in 1..5 do 
        piano <- piano + top.Substring(start, stop) + "\n"

    for i in 1..3 do 
        piano <- piano + middle.Substring(start, stop) + "\n"

    piano <- piano + bottom.Substring(start, stop)

    printf "%s\n\n" piano

F #에 문자열 곱하기 연산자가 있으면 46자를
줄일

조금 더 짧게 :let g s i=for i=1 to i do printfn"%s"(String.replicate 99 s).[t+4*p..t+int(x.[2..])*5+5*p]
cfern 2010

감사합니다! 왜 그것을 찾을 수 없었는지 모르겠습니다. 변수에 할당하고 두 번 사용했습니다.
gradbot 2010

이제 .net 함수 이름에 대해 48 자의 세금을 지불하고 있습니다.
gradbot 2010

버전 8을 축하합니다! 나는 당신이 얼마나 다듬 었는지 놀랐습니다.
ChaosPandion 2010

11

나오지 231 235 234 235 237 238 244 268 269 270 276 279 280 282 287 300 307 314 329 338 문자

최대 99 개의 키에 대해 작동합니다. 표준 피아노에는 52 개의 흰색 건반이 있으므로이 정도면 충분합니다.

s/.*/CDEFGABC&=0123456789-/
s/(.).=(.*)\1.*/&\2\2\2\2\2\2\2\2\2\2/
s/ .?(.)=(.*)\1.*-/\2/
s/.*#/%&/
:
s/((.)(.).*\2)[#-9]/\1  \3/
t
s/[^ %CF]/###/g
s/C|F/ | /g
s/(%....)?.{25}(.*)./\2/p
p
p
p
p
s/## /|  /g
s/#[|#]/ |/g
p
p
p
y/ /_/

예 :

$ echo C 14 | sed -rf piano.sed
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo D# 1 | sed -rf piano.sed
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo A 7 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|
$ echo A 52 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

마지막 예제는 양쪽 끝에 가상의 검은 색 키와 함께 표준 키보드를 인쇄합니다.


10

PianoScript-2 자

한 줄짜리입니다.

go

용법:

PianoScript piano.ps G# 11

산출:

###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
 |    |    |    |    |    |    |    |    |    |    |    |
 |    |    |    |    |    |    |    |    |    |    |    |
_|____|____|____|____|____|____|____|____|____|____|____|

PianoScript 언어에 대한 자세한 정보는 여기 에서 찾을 수 있습니다 .


1
0 자도 가능하지 않나요?
YOU

나는 PianoScript ++에서 당신이 하나의 적은 문자로 프로그램을 작성할 수있을 것이라고 가정합니다.
gradbot 2010

4
안타깝게도 당신이이 아이디어를 생각 해낸 첫 번째 사람이 아닙니다.
LiraNuna 2010

4
-1 부정 행위, 그리고 언어에 대한 멋진 이름조차 나오지 않는 경우;)
gnarf

1
피아노 점수가 아닌 스크립트가
지미

10

자바 스크립트-195 자

야 골프는 자기 자신과 경쟁하는 게임이지? :)

k=readFile(0).split(' ')
q=!k[0][1]
r=k[1]
o=''
for(x=10;x--;){p=k[0].charCodeAt(0)-65+!q
s=''
for(j=+r+1;j--;){p=++p%7
s+=x>4&&!p|p%3?'###  ':x?' |   ':'_|___'}o+=s.substring(q,r*5+2)+'\n'}print(o)

gnarf에 의한 솔루션; KirarinSnow에 의해 Rhino로 포팅 됨 (사소한 수정 및 서식 변경 포함) gnarf에 의해 더 떨어져 나갔다; KirarinSnow에서 오류를 수정했습니다. 은닉처k[1]cwallenpoole의

용법: $ cp input.in 0; rhino thisfile.js

빠른 HTML 데모 버전 : 골프 테스트 -추가readFile=prompt;print=function(a) {document.write("<pre>"+a);}


글쎄, 당신은 또한 사양과 경쟁합니다. ;) 테스트 케이스도 통과하지 못합니다. 하나부터 시작하는 것 같습니다.
Guffa 2010

b에 대한 참조는 1 개뿐입니다. readFile (b)를 readFile ( 'substring')으로 변경
Ponkadoodle

- @wallacoloo 하단에있는 부분, 나중에 필요할s=s[b](1-q,p=s.length-3)
gnarf

6

Python3-158

에 저장 inputraw_input. 에 분실 ()에 대한print

k,n=input().split()
o=(ord(k[0])-65)*5
n=int(n)*5+1
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print(((x+x[::-1][:-1])*n)[o+3*len(k[1:]):o+n])

5

F # : 355 개의 중요한 문자

모두 한 줄에 :

let[|x;y|]=System.Console.ReadLine().Split([|' '|])in[for i in 1..9->let r (a:string) b j (s:string)=s.Replace(a,if i>j then b else a)in((String.replicate(int y+1)"23012123012121").Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")|>r"1""#"0|>r"2""##  "0|>r"3"" "0).TrimEnd()|>r"###"" | "5|>r"##""| "5|>r" ""_"8]|>String.concat"\n"|>printfn "%s"

퍼지는:

let piano() =
    let[|x;y|]=System.Console.ReadLine().Split([|' '|])in
    [for i in 1..9->
        let r (a:string) b j (s:string) = s.Replace(a,if i>j then b else a) in
        ((String.replicate (int y+1) "23012123012121")
            .Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")
            |> r "1" "#" 0
            |> r "2" "##  " 0
            |> r "3" " " 0)
            .TrimEnd()|> r "###" " | " 5|> r "##" "| " 5|> r " " "_" 8]
    |> String.concat "\n"
    |> printfn "%s"

@Brian, 팀을 구현 gets하거나 이에 상응하는 것을 얻으십시오 . 우리는 22자를 절약 할 것입니다!
Benjol

골프를 할 때 재귀가 유형 주석을 제거하는 좋은 방법이라는 것을 알았습니다.
gradbot 2010

3

SETL

165 자 그리 블러 파이썬 솔루션의 번역.

get(l);[k,n]:=split(l);o:=(abs k(1)-65)*5;n:=1+5*val n;(for x in['##  ###   |   ### ']*5+[n*'|    ']*3+[n*'|____'])print(((x+reverse x(2..))*n)(o+4*#k-3..o+n));end;

3

D2 (템플릿) : 331 370 400 + 17 자

(Ruby 솔루션을 기반으로합니다.)

압축 :

template J(alias T,int b,int e,r...){static if(e)enum J=T!(b,r)~J!(T,b+1,e-1,r);else enum J="";}template K(int i,int t){enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";}template R(int t,int s,int l,int h){enum R=J!(K,s-h,l,t)[h..$-3]~"\n";}template M(alias k){enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);}

설명 :

/**
    Macros:
        D = <tt>$0</tt>
 */
 ;

/**
    $(D_PSYMBOL J) (short for "join") will evaluate $(D T!(i,r)) for
    $(D_PARAM i) in $(D [b..b+e]). Then, these compile-time strings will be
    concatenated.
 */
template J(alias T,int b,int e,r...){
    static if(e)
        enum J=T!(b,r)~J!(T,b+1,e-1,r);
    else
        enum J="";
}

/**
    $(D_PSYMBOL K) (short for "key") will generate 5 characters as a row of
    key $(D_PARAM i) at row $(D_PARAM t).
 */
template K(int i,int t){
    enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";
}

/**
    $(D_PSYMBOL R) (short for "row") will generate the keyboard at row
    $(D_PARAM t), from key $(D_PARAM s) and sharpness $(D_PARAM h) with a
    length of $(D_PARAM l) keys.
 */
template R(int t,int s,int l,int h){
    enum R=J!(K,s-h,l,t)[h..$-3]~"\n";
}

/**
    $(D_PSYMBOL M) (short for "main") results in the whole keyboard as a string.

    Example:
    -----
    pragma(msg,M!("C 14"));
    pragma(msg,M!("D# 1"));
    pragma(msg,M!("A 7"));
    -----
 */
template M(alias k){
    enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);
}

dmd입력 에서 매개 변수를 전달할 수 없으므로 코드에서 수행해야합니다. 최대 99 개의 키만 지원합니다.


2
입력을 단일 문자열로 만들 수 있습니까? 문제의 일부는 선을 메모, 선택적 샤프 및 지속 시간으로 구문 분석하는 것입니다. 파싱 ​​자체는 일부 언어에서 꽤 많은 문자를 취할 수 있습니다 ...
KirarinSnow

2

하스켈 : 212 개 211 208 문자

a="  |  "
b=" ### "
d=concat.cycle
e=d[b,b,a,b,b,a,b]
f=d[a]
t x s m n=map(take(5*read s+m).drop(5*length['@'..x]-n))[e,e,e,e,e,f,f,f,d["__|__"]]
u(x:'#':s)=t x s 2 4 
u(x:s)=t x s 1 8
main=interact$unlines.u

여전히 ASCII 호환 문자 (특히 "@ABCDEFG"시퀀스)를 가정하지만 더 이상 Char.ord가 필요하지 않습니다.


2

루비-113 자

명령 줄 인수로 실행

$ ruby piano.rb A 7

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=k[0]*5-2+4*s=k.size)[j,c.to_i*5+s]}

루비-118 자

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=2+k[0]*5+4*s=k.size-1)[j..c.to_i*5+s+j]}

2

PHP-208 자

<?$e=45*substr($a=PIANO,2+$d=!($a[1]^~ì))+9+$d*45;$j=9*$c=4*$d;for($b=ord($a[0])-65,--$c;$j<$e;$f[$i=$j++%9].=($c=($c+!$i)%5)%4<2&$i>3&$b%3!=2?Ü:($c?$i?ß: :))$j%45-36?:$b=++$b%7;for(;$a=$f[$i--];)echo~$a,~õ;

개선되어야합니다.

입력은 PIANO라는 상수로 전달되어야합니다.


1

F 번호 414 386 372 개 중요한 문자 :

//wins me 2 characters
open System

//String.replicate, didn't know this existed before reading Juliet
let r=String.replicate  

//print s n times, each time on a newline
let P n s=printf"%s"(r n (s+"\n"))  

//define top rows
let t="##  ###   |   ###  ###   |   ###  #" 

//middle and bottom rows can be defined using 'r'
let m,b=r 7"|    ",r 7"|____" 

//pick of chars from O to n+O from string, wrap round if we go beyond s.Length
let L(s:string)O n=String([|5*O..5*(n+O)|]|>Array.map(fun i->s.[i%35]))

//match input string into two halves
let[|k;n|]=Console.ReadLine().Split([|' '|])

//work out start pos and length (in chars, not keys)
let O,N=
 let K=int k.[0]-65                    //'A'=65, this is why t starts at A
 if k.[0]='#'then(K+3,int n+2)else(K,int n) 

//Print 5 top rows, 3 middle rows and the bottom row
P 5(L t O N)
P 3(L m O N)
P 1(L b O N)

아, 그리고 한 가지 보너스,이 스크립트는 실제로 "F # 372"를 올바르게 처리합니다.하지만 여기에 붙여 넣어도 귀찮게하지 않습니다.

System.Console.ReadLine ()은 정말 엉망입니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.