活页乐谱ASCII艺术生成器


31

注意:Anders Kaseorg警告我,这可能是另一个先前问题的重复。看来是这样,很抱歉,我在发布此问题之前没有找到该问题。尽管如此,这个问题只收到一个答案,这个答案比较简单,以防万一大家都想尝试一下。不过,我将了解该问题是否最终被标记为重复。

挑战

给定这样的输入:

8g 8Df 4cs 2C 1A

编写产生如下输出的最短程序/函数:

    /\                                         -o-
   | |
---|-|---------------------------------------------------|-|
   |/                                                    | |
---/|--------|\----b-*-----------------------------------|-|
  / |        | |    |                  o                 | |
-|--|--------|------|-----------------|------------------|-|
 | (| \      |      | |               |                  | |
-|--|--)----*-------|/---------|------|------------------|-|
  \ | /                        |      |                  | |
-----|-------------------------|-------------------------|-|
     |                         |
   *_/                      #-*-

规则

输出必须由五行工作人员组成,开始时必须完全像上面所示的那样绘制G型谱,并与工作人员的左侧对齐,并在工作人员启动后仅留下一列。

    /\  
   | |
---|-|--
   |/   
---/|---
  / |   
-|--|---
 | (| \ 
-|--|--)
  \ | / 
-----|--
     |  
   *_/
^
Single column

注释必须以a *o字符开头,具体取决于其类型。

必须有分离的每正好八列*o字符:

    /\                                         -o-
   | |
---|-|---------------------------------------------------|-|
   |/                                                    | |
---/|--------|\----b-*-----------------------------------|-|
  / |        | |    |                  o                 | |
-|--|--------|------|-----------------|------------------|-|
 | (| \      |      | |               |                  | |
-|--|--)----*-------|/---------|------|------------------|-|
  \ | /                        |      |                  | |
-----|-------------------------|-------------------------|-|
     |                         |
   *_/                      #-*-
   ↑        ↑        ↑        ↑        ↑        ↑        ↑
   8 columns of separation

如图所示,工作人员必须使终结器与右侧对齐。终止符的左栏必须与最后一个音符分隔8列。

输入将是包含注释的单个字符串(至少一个,没有空输入),每个用空格隔开(您可以认为每个注释都是正确的,因此无需检查错误)。您还可以将输入作为字符串数组,并在数组中的每个元素上加上一个注释。每个音符,第一个字符将是音符长度(的分母1为一个全音符/ semibreve,与开始o; 2用于二分音符/微量,开始用o; 4用于四分音符/四分音符,开始于*;以及8用于第八音符/颤音,以*)。第二个字符将是音符(请参见下表),第三个可选字符将是f或(F用于平面音符和/ sS尖锐音符)。

    ---    A (ledger line)
           G
--------   F
           E
--------   D
           C
--------   b
           a
--------   g
           f
--------   e
           d
    ---    c (ledger line)

显然,输入必须注意音符的大小写,但是您可以选择fs修饰符的大小写。

注意,c并且A必须增加两条-(分类帐行),每边各增加一条,因为它们必须扩展人员。注意dG不在工作人员之列,但不需要分类帐行。

展平或尖锐票据必须添加b#在音符的左侧两个位置。

茎(如果有)必须用4条竖线绘制。从Notes b及以上必须提请干向下,并在音符的左侧。a下方和下方的音符必须向上且在音符的右侧绘制茎。八分音符必须始终向右且完全如图所示添加标志,并且如果连续有多个,则不需要将其标记。

--------------------------

-----|\----b-*------------
     | |    |             
-----|------|-------------
     |      | |           
----*-------|/---------|--
    ↑↑                 |  
----||------↑↑---------|--
    ||      ||         |
    ||      ||      #-*-
    |\      |\        ↑↑
    | Stem  | Note    | Stem
    Note    Stem      Note

和往常一样,您的程序/函数可以直接绘制输出或返回字符串,字符串数组,字符矩阵或任何其他合理格式。

有用的链接

这是,因此每种语言中最短的程序/功能可能会获胜!

奖励:尝试用著名的旋律写一些例子,让每个人都猜出它是哪种旋律!


沙盒
查理


...所以我们甚至不能使用字母的大小写来告诉绘制茎的方法?
尼尔

1
@尼尔,对不起,我怕你不能。我没有制定该规则,而是检查了以下内容:“词干通常指向下方以找到中线或更高位置的音符,并指向下方的音符”。
查理

1
我们可以接受一个字符串数组作为输入,每个字符串都是一个音符吗?
毛茸茸的

Answers:


13

SOGL V0.12178个 175 174 173 172 171 字节

l9*6«+@*@¶¹┐∑:@┌ŗ4Ο"γ;]∑«;‽ΗmzΖH+īN D‼,ΨU‛y‚_○¤└yΨšI‘7n2∆╬5;{" -o-”;l3=?Jζ2%Ƨ#bWGk+;}Jz7m««:U+;W7«κArBb3>?Ζo*ŗ}a2\?┌@ŗ}ē9*LI+a╬5b1>?4┐∙b8=?"■QD³‘┼}e9*5+a4-8a>?5+;2-;G↕№}╬5

在这里尝试!(增加了θ以便于使用;要以171个字节运行,它希望输入位于堆栈上)

据我所知,这是可行的,但是如果您发现任何问题,请告诉我。

说明:

第一部分:画布创作

l                                get the length of that array
 9*                              multiply by 9
   6«+                           add 12
      @*                         get that many spaces
        @¶                       push a space and a newline
          ¹                      put all the strings on the stack in an array
           ┐∑                    join with vertical bars
             :                   duplicate that string (which is a line with the ending barline but no staff)
              @┌ŗ                replace spaces with dashes (to make it a line with staff)
                 4Ο              encase 4 copies of the space lines in lines with the dashes
                   "...‘         push the G-clef without newlines
                        7n       split into an array of items of length 7
                          2∆╬5   at 1-indexed coordinates [2; -1] place the G-clef in the staff lines, extending the arrays size 
                              ;  get the input split on spaces back on top of the stack

第二部分:循环,音符头放置

{                        loop over the input split on spaces
" -o-”                    push a template for a note head and leger lines
      ;                   get the input optop
       l3=?            }  if the length of the input is 3, then
           J                pop the last letter off from the input
            ζ               get its unicode point
             2%             modulo 2
               Ƨ#bW         get its index in "#b"
                   G        get the template ontop
                    k       remove its 1st letter
                     +      join the replaced input and the template
                      ;     get the input back ontop to be consisntent with how the if started

sidequest: parse the rest of the inputs
J                  pop the last letter off of the remaining input string (the note), leaving the note length as string on the stack below
 z                 push the lowercase alphabet
  7m               get its first 7 letters
    ««             put the first 2 at the end
      :            duplicate it
       U+          append it uppercased to the original
         ;W        get the notes letter ontop and get its 1-indexed index in that just created string
           7«κ     subtract it from 14
              A    save on variable A
               r   convert the note length to a number
                B  save on variable B

b3>?    }          if b>3 (aka if note length is either 4 or 8)
    Ζo*ŗ             replace "o" with "*"
         a2\?   }  if a divides by 2 (aka there isn't staff nor leger lines required)
             ┌@ŗ     replace "-" with " "

ē          push the value of variable E and after that increase it (default is user input number, which errors and defaults to 0)
 9*        multiply by 9
   LI+     increase by 11
      a    push variable a
       ╬5  at those positions (e*9+11, a) insert the note head template in the canvas

第三部分:国旗和茎

b1>?                      if b (note length)>1 (aka if the stem is needed at all)
    4┐∙                   get an array of 4 vertical bars
       b8=?       }       if b==8 (aka if the flag is needed)
           "■QD³‘           push "\    |"
                 ┼          add verically-down-then-horizontally-right

e9*                       push e*9 (now e starts with 1 as it's been increased) (the X coordinate for the flag)
   5+                     add 5 to it
     a4-                  push a-4 (the Y coordinate, 4 less than the note head as arrays get inserted from the top-left corner)
        8a>?         }    if 8>a (aka if the flag needs to be rotated)
            5+              add 5 to the Y coordinate
              ;2-;          subtract 2 from the X coordinate
                  G         get the stem&flag or stem ontop
                   ↕№       reverse it vertically and mirror characters
                      ╬5  insert the array of the stem and maybe flag at those coordinates

您的代码几乎是完美的。唯一的缺点是2bs示例中的音符必须使茎向下。
查理

@CarlosAlejo固定
dzaima

大!并感谢您的解释!
查理

10

的JavaScript(ES6),616个 527字节

感谢@shaggy删除了将近90个字节

我对笔记一无所知...直到现在,希望我做对了。

f=i=>i.map((v,p)=>(k[e=(w=q+12)*(l="AGFEDCbagfedc".search(v[1]))+p*9+12]="o*"[(s=v[0])>3|0],l<1|l>11&&(k[e-1]=k[e+1]="-"),(t=v[2])&&(k[e-2]="b#"[t>"f"|0]),--s&&[1,2,3,4].map(i=>(k[(b=l<8)?e+w*i-1:e-w*i+1]="|",s>6&&( b?k[e+w*4]="/":k[e-w*4+2]="\\",k[b?e+w*3+1:e-w*3+3]='|')))),k=[...`    /\\  ${s=" ".repeat(q=i.length*9)}  
   | |  ${s}    
---|-|--${l="-".repeat(q)+"|-|"}
   |/   ${t=s+"| |"}
---/|---${l}
  / |   ${t}
-|--|---${l}
 | (| \\ ${t}
-|--|--)${l}
  \\ | / ${t}
-----|--${l}
     |  ${s}   
   *_/  ${s}`])&&k.join``

console.log(f(["8g","8Df","4cs","2C","1A"]))
.as-console-wrapper { max-height: 100% !important; top: 0 }
.as-console-row:after { display: none !important; }

说明

f=i=>i.map((v,p)=>( // for each note

  k[e=(w=q+12)*(l="AGFEDCbagfedc".search(v[1]))+p*9+12]= // position in 1D array to set the note to
  "o*"[(s=v[0])>3|0], // note value (either o or *)

  l<1|l>11&&(k[e-1]=k[e+1]="-"), // add leger line

  (t=v[2])&&(k[e-2]="b#"[t>"f"|0]), // add sharp or flat

  --s&&[1,2,3,4].map(i=> // add the 4 stem lines
                     (k[(b=l<8)?e+w*i-1:e-w*i+1]="|", // durration over eigth note => add stem

                      s>6&&( // if to add a flag
                        b?k[e+w*4]="/":k[e-w*4+2]="\\", // add flag either on left or the right side

                        k[b?e+w*3+1:e-w*3+3]='|') // add the line after the flag
                     )
                    )
),
// template, extended to the final length with lines
k=[...`    /\\  ${s=" ".repeat(q=i.length*9)}  
   | |  ${s}   
---|-|--${l="-".repeat(q)+"|-|"}
   |/   ${t=s+"| |"}
---/|---${l}
  / |   ${t}
-|--|---${l}
 | (| \\ ${t}
-|--|--)${l}
  \\ | / ${t}
-----|--${l}
     |  ${s}   
   *_/  ${s}`])&&k.join``

认为您可以通过保存t[0]和来保存一些字节t[2],然后就可以了q=t.length*9
Stephen

2
欢迎来到PPCG。很好的第一个答案:)不过,还有很多其他事情可以做。我快速通过了if并将其降低到520字节,这应该为您提供一个良好的开端。
毛茸茸的

当然,某些替换+ atob / btoa将节省一些字节
Downgoat '17

1
@Shaggy非常感谢你。我有很多要学习的。

不客气:)您有一个杂散空间,之后s>6&&(可以节省一个字节。您还可以通过更换保存另一个字节(w=q+12)wrepeat(q=i.length*9)repeat(w=i.length*9)repeat(q)repeat(w,w+=12)
毛茸茸的

9

木炭180个 171 168 163字节

F⁵⁺⸿⸿×-⁺²⁷×⁸№θ ↑⁹←↙↓⁹J⁴¦⁹↑⁶↗¹↑²↖¹↓↙¹↓³↙²↓³ \M²↑(| ↘¹↙)↙¹↓²↙¹↑←_*F⪪θ «A⌕AGFEDCbagfedc§ι¹λJχλA⁺⁹χχ¿⁼³Lι§b#⁼§ι²s→P׳¬﹪λ²→P§o*›ι4¿›ι2¿›λ⁶«↗↑⁴¿›ι8«↘↘¹↓¹»»«↙↓⁴¿›ι8«↗↗¹↑¹

在线尝试!链接是详细版本的代码。说明:

F⁵⁺⸿⸿×-⁺²⁷×⁸№θ ↑⁹←↙↓⁹

打印五线谱。

J⁴¦⁹↑⁶↗¹↑²↖¹↓↙¹↓³↙²↓³ \M²↑(| ↘¹↙)↙¹↓²↙¹↑←_*

打印谱号。

F⪪θ «

循环浏览每个音符。

A⌕AGFEDCbagfedc§ι¹λ

找到音符的Y坐标。

JχλA⁺⁹χχ

这真的很偷偷摸摸:χ是一个预定义为10的变量,如果它有一个,则恰好是第一个音符偶然的X坐标。跳到该位置后,将添加9,代表下一个音符位置。

¿⁼³Lι§b#⁼§ι²s→

如果有的话,请打印意外内容。

P׳¬﹪λ²→P§o*›ι4

如有必要,打印分类帐行和注释。实际上,尽管在梯级上打印该线当然没有影响,但该线已打印在任何偶数y坐标上。

¿›ι2

半裸手无所事事。

¿›λ⁶«

对于低于中点的音符,

↗↑⁴

向上拉茎,

¿›ι8«↘↘¹↓¹

和颤抖的标志。

»»«

对于高于中点的音符,

↙↓⁴

向下拉茎,

¿›ι8«↗↗¹↑¹

和颤抖的标志。


你打败了SOGL!:-)
查理

@CarlosAlejo我希望它会发生。但是我确实希望它也能击败我20%。
dzaima

@dzaima也许是纯粹的ASCII艺术挑战,但这也有一个逻辑部分,使输出取决于输入。尽管如此,我仍然习惯于每种语言可以做得更好。
查理
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.