代码高尔夫:钢琴

88

挑战

以字符数量最少的代码输出一个从给定音符开始的钢琴键盘部分,该部分长度由输入确定。

输入包括一个音符([ACDFG]#|[A-G]),表示从哪个键开始打印键盘,以及一个正数,表示要打印的键数,包括第一个音符在内。

第一个键应该完整地打印出来 - 如果它有左边的升号键,则将其切断,同样,当起始键为升调时,左侧键也将被切断。

只计算白键,黑键不计入长度。

测试用例

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

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

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

代码计数包括输入/输出(即完整程序)。


5
这句话的意思是:[A-G]#*是否意味着我们需要将,比如说,B#####处理成E - Anon.
5
请为“key”的计数定义“key”。为什么例子“C 14”打印出24个键? - Guffa
53
好的,既然我们已经有了 C 和 C# 的解决方案,现在我们需要 B、D 和 F#。 - LiraNuna
7
下一个代码高尔夫:为这些钢琴实现一个MIDI接口。 - Mehrdad Afshari
10
亲爱的闭合者们,我向你们致敬,因为你们在三天后成功关闭了这个挑战。我们让它在5分钟内重新开放。这就足以说明一些事情 - 不管你喜不喜欢,社区都喜欢和接受这种问题。但如果你不喜欢,请将“code-golf”标签添加到您忽略的标签列表中。 - LiraNuna
显示剩余13条评论
22个回答

2
Haskell: 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。


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() 真是让人沮丧...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接