শীট সংগীত ASCII- আর্ট জেনারেটর


31

দ্রষ্টব্য : অ্যান্ডারস কাসারগ আমাকে সতর্ক করেছেন যে এটি পূর্ববর্তী অন্য প্রশ্নের নকল হতে পারে । এটা মনে হচ্ছে এবং আমি দুঃখিত এটি পোস্ট করার আগে আমি এই প্রশ্নটি খুঁজে পাইনি। তবুও, এই প্রশ্নটি কেবল একটি উত্তর পেয়েছে এবং এটি একটি সহজ, যদি আপনি সকলে এইবার চেষ্টা করতে চান তবে। যদিও এই প্রশ্নটির সদৃশ হিসাবে চিহ্নিত করা শেষ হয়ে গেছে আমি বুঝতে পারি।

চ্যালেঞ্জ

এর মতো একটি ইনপুট দেওয়া হয়েছে:

8g 8Df 4cs 2C 1A

সংক্ষিপ্ততম প্রোগ্রাম / ফাংশনটি লিখুন যা এরকম আউটপুট তৈরি করে:

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

বিধি

আউটপুটে অবশ্যই পাঁচ-লাইনের কর্মীদের সমন্বিত একটি জি-ক্লাফের অঙ্কন দিয়ে শুরু করতে হবে যা ঠিক উপরে দেখানো হয়েছে, কর্মীদের বামে সারিবদ্ধ এবং কর্মী শুরুর পরে একটি একক কলাম রেখে যাবে।

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

নোটগুলি অবশ্যই তার ধরণের উপর নির্ভর করে একটি *বা একটি oঅক্ষর দিয়ে শুরু করতে হবে ।

প্রতিটি *বা একটি oচরিত্রের পৃথকীকরণের ঠিক আটটি কলাম থাকতে হবে :

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

কর্মীদের অবশ্যই টার্মিনেটরের সাথে সমাপ্ত হতে হবে উদাহরণ হিসাবে দেখানো হয়েছে। টার্মিনেটরের বাম বারটি অবশ্যই শেষ নোট থেকে 8 টি কলাম আলাদা করতে হবে।

ইনপুটটি নোটসযুক্ত একটি একক স্ট্রিং হবে (কমপক্ষে একটি, খালি ইনপুট নয়), প্রতিটি একটি সাদা স্থান দ্বারা পৃথক করা (আপনি প্রতিটি নোটটি যথাযথ হিসাবে বিবেচনা করতে পারেন, সুতরাং ত্রুটিগুলি পরীক্ষা করার প্রয়োজন নেই)। অ্যারেতে উপাদান প্রতি নোট সহ আপনি ইনপুটটিকে স্ট্রিংগুলির অ্যারে হিসাবে নিতে পারেন। প্রতিটি নোট জন্য, প্রথম অক্ষর নোট দৈর্ঘ্য (হর হতে হবে 1একটি জন্য পুরো নোট / semibreve , সঙ্গে শুরু হয় o; 2একটি জন্য অর্ধেক নোট / ফোঁটা , সঙ্গে শুরু হয় o; 4একটি জন্য কোয়ার্টার নোট / খেয়ালিপনা , দিয়ে শুরু হয় *আর 8একটি জন্য অষ্টম নোট / কোয়েভার , দিয়ে শুরু হয়*)। দ্বিতীয় চরিত্র নোট (পরবর্তী টেবিল দেখুন) হবে, এবং তৃতীয়, ঐচ্ছিক চরিত্র হতে হবে fবা Fফ্ল্যাট নোট এবংsবা Sতীক্ষ্ণ নোটের জন্য।

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

একথাও ঠিক যে, ইনপুট নোট কেনার ক্ষেত্রে সম্মান করতে হবে, কিন্তু আপনি ক্ষেত্রে নির্বাচন করতে পারবেন fএবংs সংশোধনকারীদের ।

নোটস cএবং Aঅবশ্যই দুটি -(খাত্তরের লাইন) যুক্ত করতে হবে, প্রতিটি পক্ষের একটি করে, তাদের অবশ্যই কর্মীদের প্রসারিত করতে হবে। নোট dএবংG কর্মীদের বাইরে রয়েছে তবে খালি লাইনগুলির প্রয়োজন নেই।

সমতল বা তীক্ষ্ণ নোটগুলি অবশ্যই যুক্ত করতে হবে bবা# বামে দুটি অবস্থান ।

কান্ডগুলি (যদি থাকে তবে) অবশ্যই 4 টি উল্লম্ব বারগুলির সাথে আঁকতে হবে। bউপরের এবং নীচের নোটগুলি অবশ্যই কান্ডটি নীচের দিকে এবং নোটের বাম দিকে আঁকতে হবে। aনীচের থেকে এবং নীচের নোটগুলি অবশ্যই স্টেমটি উপরের দিকে এবং নোটের ডানদিকে আঁকতে হবে। কোভারদের অবশ্যই পতাকাটি অবশ্যই যুক্ত করতে হবে সর্বদা ডানদিকে এবং ঠিক যেমনটি দেখানো হয়েছে, এবং যদি সেগুলির বেশ কয়েকটি একক সারিতে থাকে তবে আপনাকে প্যাঁচানোর দরকার হয় না।

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

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

যথারীতি আপনার প্রোগ্রাম / ফাংশনটি আউটপুট আঁকতে পারে বা স্ট্রিং, স্ট্রিংগুলির অ্যারে, অক্ষরের ম্যাট্রিক্স বা অন্য কোনও যুক্তিসঙ্গত ফর্ম্যাটটি আনতে পারে।

উপকারী সংজুক

এটি , তাই প্রতিটি ভাষার জন্য সংক্ষিপ্ততম প্রোগ্রাম / ফাংশন জিতে যেতে পারে!

বোনাস: বিখ্যাত সুরগুলির সাথে উদাহরণ লেখার চেষ্টা করুন এবং সকলে অনুমান করার চেষ্টা করুন যে এটি কোন সুরটি!




... সুতরাং আমরা কীভাবে স্টেমটি আঁকতে হবে তা জানাতে চিঠির ক্ষেত্রে ব্যবহার করতে পারি না?
নীল

1
@ নীল দুঃখিত, আমি আশঙ্কা করছি আপনি পারবেন না। আমি এই নিয়মটি তৈরি করি নি, আমি এটি পরীক্ষা করেছিলাম : "ডালগুলি সাধারণত মাঝের লাইনে বা তার চেয়ে বেশি নোটের জন্য নীচের দিকে নির্দেশ করে এবং নীচেরগুলির জন্য"।
চার্লি

1
ইনপুট হিসাবে প্রতিটি স্ট্রিংয়ের একক নোট থাকায় আমরা কী স্ট্রিংয়ের অ্যারে নিতে পারি?
শেগি

উত্তর:


13

এসওজিএল ভি0.12 , 178 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

এখানে চেষ্টা করুন!(use সহজেই ব্যবহারের জন্য যুক্ত করা হয়েছে; 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আপনার উদাহরণে নোটটির অবশ্যই নীচের দিকে স্টেমটি নির্দেশ করা উচিত।
চার্লি

@ কার্লোস আলেজো স্থির করেছেন
13:25

গ্রেট! এবং ব্যাখ্যা জন্য ধন্যবাদ!
চার্লি

10

জাভাস্ক্রিপ্ট (ES6), 616 527 বাইট

প্রায় 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
স্টিফেন

2
পিপিসিজিতে আপনাকে স্বাগতম। খুব সুন্দর প্রথম উত্তর :) যদিও আরও কিছুটা গল্ফ করা যায় তবে তা করা যায়। আমি তাড়াতাড়ি পেরেছি এবং এটি 520 বাইটে নামিয়ে দিয়েছি , যা আপনাকে একটি ভাল সূচনা দেওয়া উচিত।
শেগি

অবশ্যই কিছু + এটব / বিটিএ প্রতিস্থাপন করা কিছু বাইট সংরক্ষণ করতে পারে
ডাউনগোট

1
@ শেগি আপনাকে অনেক ধন্যবাদ আমার অনেক কিছু শেখার আছে।
পরিধির মধ্যে

আপনাকে স্বাগতম! :) আপনার কাছে একটি বিপথগামী জায়গা রয়েছে s>6&&(যার পরে আপনি একটি বাইট সংরক্ষণ করতে পারবেন। এছাড়াও আপনি প্রতিস্থাপন সাথে অন্য বাইট সংরক্ষণ করতে পারবেন (w=q+12)সঙ্গে w, repeat(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

প্রয়োজনে খাত্তরের লাইনগুলি এবং নোটটি প্রিন্ট করুন। প্রকৃতপক্ষে লাইনটি কোনও য-সমন্বয়ে মুদ্রিত হয় যদিও স্ট্যাভের উপর এটি মুদ্রণের অবশ্যই কোনও প্রভাব নেই।

¿›ι2

সেমিব্রেভের জন্য আর কিছু করার নেই।

¿›λ⁶«

মিডপয়েন্টের নীচে নোটগুলির জন্য,

↗↑⁴

কান্ডটি উপরের দিকে আঁকুন,

¿›ι8«↘↘¹↓¹

এবং quavers জন্য পতাকা।

»»«

মিডপয়েন্টের উপরে নোটগুলির জন্য,

↙↓⁴

কান্ডটি নীচের দিকে আঁকুন,

¿›ι8«↗↗¹↑¹

এবং quavers জন্য পতাকা।


আপনি এসওজিএলকে মারলেন! :-)
চার্লি

@ কার্লোস আলেজো আমি আশা করি এটি ঘটবে। তবে আমি এটি 20% এর মতও আমাকে পরাজিত করবে বলে আশা করি না।
ডিজাইমা

@ ডিজাইমা হয়তো এটি যদি একটি খাঁটি এএসসিআইআই-আর্ট চ্যালেঞ্জ হত তবে এটির একটি যুক্তিযুক্ত অংশ রয়েছে যা আউটপুটটিকে ইনপুটের উপর নির্ভর করে। তবুও আমি প্রতিটি ভাষা আরও ভাল কি করতে পারে তার অভ্যস্ত হয়ে যাচ্ছি।
চার্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.