আমার বহুবৃত্তে আমাকে সাহায্য করুন


17

আমি একজন সংগীতশিল্পী, এবং আমার জীবনে আরও পলিরম প্রয়োজন!

একটি পলিরিহম সংগীতের ক্ষেত্রে ঘটে (এবং প্রকৃতিতে) যখন দুটি ইভেন্ট (ক্লিপস, নোটস, ফায়ারফ্লাইস ফ্ল্যাশিং ইত্যাদি) দুটি নিয়মিত বিরতিতে ঘটে থাকে। দুটি ধরণের ইভেন্ট একই ব্যবধানে বিভিন্ন সংখ্যক বার ঘটে।

যদি আমি একই বাম হাতে দু'বার বাম হাত দিয়ে এবং ডান হাত দিয়ে 3 বার ট্যাপ করি তবে এটি দেখতে কিছুটা অল্প দেখাচ্ছে:

  ------
R . . .
L .  .  

উপরের হাইফেনগুলি পলিমার্থিক প্যাটার্নের দৈর্ঘ্য বোঝায়, যা সর্বনিম্ন সাধারণ একাধিক বা 2 এবং 3। এটি প্যাটার্নটি পুনরাবৃত্তি করে এমন বিন্দু হিসাবে বোঝা যায়।

একটি 'মেটাারিথম'ও রয়েছে, যা উভয় হাত আলতো চাপ দিলে উত্পাদিত প্যাটার্ন:

  ------
R . . .
L .  .  
M . ...

এটি 3: 2 এর অনুপাত সহ একটি সাধারণ এবং খুব সাধারণ পলিরিথম।

আসুন কেবল বলি যে আমি আমার মাথার বাইরে কাজ করতে পারি এমন একটি সাধারণ পলিরিহম করতে চাই না, তাই আমার জন্য এটির কাজ করার জন্য আমার কিছু প্রয়োজন। আমি কাগজে দীর্ঘমেয়াদে এটি করতে পারি, বা ...


নিয়মাবলী:

  • উপরে বর্ণিত হিসাবে পলিরিথম ডায়াগ্রাম তৈরি ও প্রদর্শন করতে কিছু কোড লিখুন।
  • যে কোনও পুরানো ভাষা, কয়েকটি বাইটের জন্য চেষ্টা করুন।
  • আপনার কোড দুটি আর্গুমেন্ট লাগে:
    • বাম হাত দিয়ে ট্যাপের সংখ্যা (ধনাত্মক পূর্ণসংখ্যার)
    • ডান হাত দিয়ে ট্যাপের সংখ্যা (ধনাত্মক পূর্ণসংখ্যার)
  • এটি দৈর্ঘ্যটি কার্যকর করবে, যা দুটি আর্গুমেন্টের জন্য সর্বনিম্ন সাধারণ একাধিক।
  • শীর্ষ রেখায় দুটি সাদা অংশের অক্ষর থাকবে এবং হাইফেনগুলি দৈর্ঘ্য (দৈর্ঘ্য * '-') প্রদর্শন করবে
  • দ্বিতীয় এবং তৃতীয় রেখাগুলি ডান এবং বাম হাতের জন্য প্যাটার্ন প্রদর্শন করবে:
    • এটি আর বা এল দিয়ে শুরু হবে, কোন হাতটি এটি স্পষ্ট করে তারপরে চিহ্নিত করুন by
    • এই হাতের ব্যবধানটি তার যুক্তি দ্বারা বিভক্ত দৈর্ঘ্য।
    • আপনার পছন্দসই যে অক্ষর দ্বারা চিহ্নিত করা হয়, সেগুলি তৃতীয় অক্ষর থেকে শুরু হবে। এরপরে এটি একই চরিত্রের 'ইন্টারভাল' অক্ষরগুলি পৃথকভাবে প্রদর্শন করবে।
    • এটি দৈর্ঘ্যের লাইনের চেয়ে বেশি দীর্ঘ হবে না।
  • চতুর্থ লাইনটি মেটেরিথম:
    • এটি একটি উচ্চতর কেস এম দিয়ে শুরু করবে, তার পরে একটি স্থান থাকবে by
    • তৃতীয় চরিত্রের পরে এটি প্রতিটি অবস্থান যেখানে একটি ডান বা বাম হাতের উপর একটি ট্যাপ আছে সেখানে একটি অক্ষর (আপনার চয়ন করা কোনও চরিত্র) প্রদর্শিত হবে।
  • শ্বেত স্পেস অনুসরণ করা অপ্রাসঙ্গিক।

পরীক্ষার কেস:

r = 3, l = 2

  ------
R . . .
L .  .  
M . ...

r = 4, l = 3

  ------------
R .  .  .  .    
L .   .   .    
M .  .. . ..

r = 4, l = 5

  --------------------
R .    .    .    .                     
L .   .   .   .   .      
M .   ..  . . .  ..

r = 4, l = 7

  ----------------------------
R .      .      .      .      
L .   .   .   .   .   .   .   
M .   .  ..   . . .   ..  .

r = 4, l = 8

  --------
R . . . . 
L ........
M ........

শুভ গল্ফিং!


আপনার পরীক্ষার কেসগুলিতে প্রচুর ট্রেলিং হোয়াইটস্পেস অন্তর্ভুক্ত রয়েছে, আমরা কি সেগুলি বাদ দিতে পারি / আরও যুক্ত করতে পারি?
wastl

আমরা গ্রহণ করতে হবে না rএবং lদুটি পৃথক মান হিসাবে? উদাহরণস্বরূপ, আমরা পরিবর্তে একটি দ্বি-উপাদান অ্যারে গ্রহণ করতে পারি? তাদের ক্রম সম্পর্কে কীভাবে তা কঠোরভাবে rঅনুসরণ করা হয় l?
সুক

@ সোক এটি 'দুটি যুক্তি' এর ব্যাখ্যা হিসাবে গ্রহণযোগ্য
এজেফারাডে

এটি কি আসলে চিত্রটি মুদ্রণ করা দরকার, বা এটি কেবল এটি ফিরিয়ে দিতে পারে?
মনিকা পুনরায় ইনস্টল করুন - নোটমায়ার্ড

@ আইমনোটমায়ার্ড ফিরিয়ে দেওয়া ঠিক আছে।
এজেফারাডে

উত্তর:


6

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

ট্যাপ চরিত্র 0হিসাবে আউটপুট ।

r=>l=>`  ${g=n=>n?s.replace(/./g,(_,x)=>[,a=x%(k/r),x%=k/l,a*x][n]&&' '):++k%l|k%r?'-'+g():`-
`,s=g(k=0)}R ${g(1)}L ${g(2)}M `+g(3)

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

আমরা দুটি ভিন্ন উদ্দেশ্যে একই সহায়ক সহায়ক ফাংশন ব্যবহার করি।()

()0=LCM(,R)

g = _ => ++k % l | k % r ? '-' + g() : `-\n`

গুলি

()1এন3এক্সগুলি0

g = n => s.replace(/./g, (_, x) => [, a = x % (k / r), x %= k / l, a * x][n] && ' ')

4

জাভা 11, 226 234 233 219 বাইট

String h(int r,int l,int m){var s="";for(;m>0;)s+=m%r*(m--%l)<1?'.':32;return s;}

r->l->{int a=r,b=l,m;for(;b>0;b=a%b,a=m)m=b;m=r*l/a;return"  "+repeat("-",m)+"\nR "+h(m/r,m+1,m)+"\nL "+h(m/l,m+1,m)+"\nM "+h(m/r,m/l,m);}

লম্বা ধরনের; খুব খারাপ জাভা একটি lcm()ফাংশন নেই। এটি এখানে অনলাইনে ব্যবহার করে দেখুন (টিআইওর কাছে এখনও জাভা 11 নেই, সুতরাং এটি পরিবর্তে একটি সহায়ক পদ্ধতি ব্যবহার করে String.repeat())।

আমার প্রাথমিক সংস্করণটি ট্যাপের সংখ্যার পরিবর্তে কলগুলির মধ্যে ব্যবধান নিয়েছে। এখনই স্থির। 1 বাইট গল্ফ করার জন্য কেভিন ক্রুইজসেনকে ধন্যবাদ ।

Ungolfed:

String h(int r, int l, int m) { // helper function returning a line of metarhythm; parameters are: tap interval (right hand), tap interval (left hand), length
    var s = ""; // start with an empty String
    for(; m > 0; ) // repeat until the length is reached
        s += m % r * (m-- % l) < 1 ? '.' : 32; // if at least one of the hands taps, add a dot, otherwise add a space (ASCII code 32 is ' ')
    return s; // return the constructed line
}

r -> l -> { // lambda taking two integers in currying syntax and returning a String
    int a = r, b = l, m; // duplicate the inputs
    for(; b > 0; b = a % b, a = m) // calculate the GCD of r,l using Euclid's algorithm:
        m=b; // swap and replace one of the inputs by the remainder of their division; stop once it hits zero
    m = r * l / a; // calculate the length: LCM of r,l using a=GCD(r,l)
    return // build and return the output:
    "  " + "-".repeat(m) // first line, m dashes preceded by two spaces
    + "\nR " + h(m / r, m + 1, m) // second line, create the right-hand rhythm; by setting l = m + 1 for a metarhythm, we ensure there will be no left-hand taps
    + "\nL " + h(m / l, m + 1, m) // third line, create the left-hand rhythm the same way; also note that we pass the tap interval instead of the number of taps
    + "\nM " + h(m / r, m / l, m); // fourth line, create  the actual metarhythm
}

এটি খুব বেশি নয়, তবে -1 বাইট এ পরিবর্তন ?".":" "করে ?'.':32
কেভিন ক্রুইজসেন 14

@ কেভিন ক্রুজসেন প্রতিটি বাইট গণনা করেছেন :-) ধন্যবাদ!
ওব্লান্স

4

পাইথন 2 , 187 185 183 174 166 156 148 147 145 বাইট

-ট্যাপ চরিত্র হিসাবে ব্যবহার করে

a,b=r,l=input()
while b:a,b=b,a%b
w=r*l/a
for x,y,z in zip(' RLM',(w,r,l,r),(w,r,l,l)):print x,''.join('- '[i%(w/y)!=0<i%(w/z)]for i in range(w))

এটি অনলাইন চেষ্টা করুন!


সংরক্ষিত:

  • -২ বাইটস, জোনাথন ফ্রেচের জন্য ধন্যবাদ

[i%(w/y)and i%(w/z)>0]হতে পারে [i%(w/y)!=0<i%(w/z)]
জোনাথন ফ্রেচ 1'18 এ 17 ই



3

পাইথন 2 , 185 228 223 234 249 বাইট

def f(r,l):
     c='.';d=' ';M,R,L=[r*l*[d]for _ in d*3]
     for i in range(r*l):
      if i%r<1:L[i]=M[i]=c
      if i%l<1:R[i]=M[i]=c
      if r<R.count(c)and l<L.count(c):R[i]=L[i]=M[i]=d;break
     print d,i*'-','\nR',''.join(R),'\nL',''.join(L),'\nM',''.join(M)

এটি অনলাইন চেষ্টা করুন!


আমি স্রেফ এটি টিআইও-তে কপি-পেস্ট করেছি এবং সেখান থেকে উত্পন্ন ফর্ম্যাটটি নিয়েছি। আপনি যা ভাবেন তার চেয়ে কম বাইটে এটি সম্পন্ন হয়;)
এজেফারাডে

@ ফিল্ড r=4, l=8আমার পক্ষে ভাল কাজ করে
সোনারাদ 10

দৈর্ঘ্যটি সর্বনিম্ন সাধারণ একাধিক বলে মনে করা হয়। R = 4, l = 8 এর সাথে এটি 8 হওয়া উচিত তবে এটি প্রদর্শিত হয় আপনার আউটপুট অনেক দীর্ঘ (8 * 4?)।
ওব্লান্স

1
এটি এখনও এলসিএম দেয় না; যেমন 15,25, এটি দেয় 375তবে তা হওয়া উচিত 75
ওবালান্স

1
আমি বিশ্বাস করি শেষ চেকটি প্রতিস্থাপন করা যেতে পারে i%r+i%l+0**i<1। এছাড়াও, আপনি কোডের পূর্ববর্তী সংস্করণগুলি মুছে ফেলতে পারেন, যেহেতু এগুলি যে কেউ দেখতে চায় সেগুলির সম্পাদনা ইতিহাসে সেগুলি সংরক্ষণ করা হবে
জো কিং

2

জেলি , 32 বাইট

æl/Ḷ%Ɱµa/ṭ=0ị⁾. Z”-;ⱮZ“ RLM”żK€Y

এটি অনলাইন চেষ্টা করুন!

তালিকা হিসাবে ইনপুট নেয় [L,R]

æl/       Get LCM of this list.
   Ḷ      Range [0..LCM-1]
    %Ɱ    Modulo by-each-right (implicitly the input, [L,R]):
           [[0%L ... (LCM-1)%L], [0%R ... (LCM-1)%R]]
µ         Take this pair of lists, and:
 a/ṭ      Append their pairwise AND to the pair.
    =0    Is zero? Now we have a result like:
              [[1 0 0 1 0 0 1 0 0 1 0 0 1 0 0]
               [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0]
               [1 0 0 1 0 1 1 0 0 1 1 0 1 0 0]]

ị⁾.       Convert this into dots and spaces.
Z”-;ⱮZ    Transpose, prepend a dash to each, transpose. Now we have
              ['---------------'
               '.  .  .  .  .  '
               '.    .    .    '
               '.  . ..  .. .  ']

“ RLM”ż       zip(' RLM', this)
       K€     Join each by spaces.
         Y    Join the whole thing by newlines.

1

সি (জিসিসি), 204 বাইট

p(s){printf(s);}
g(a,b){a=b?g(b,a%b):a;}
h(r,l,m){for(;m;)p(m%r*(m--%l)?" ":".");}
f(r,l,m,i){m=r*l/g(r,l);p("  ");for(i=m;i-->0;)p("-");p("\nR ");h(m/r,m+1,m);p("\nL ");h(m/l,m+1,m);p("\nM ");h(m/r,m/l,m);}

আমার জাভা উত্তর পোর্ট । সাথে কল f(number_of_right_hand_taps, number_of_left_hand_taps)। এটি এখানে অনলাইনে চেষ্টা করুন



1

পাইথ, 53 বাইট

j.b+NYc"  L R M "2++*\-J/*FQiFQKm*d+N*\ t/JdQsmeSd.TK

গল্ফের জন্য অবশ্যই রুম। আমার সময় পেলে তা করবে।
এখানে চেষ্টা করুন

ব্যাখ্যা

j.b+NYc"  L R M "2++*\-J/*FQiFQKm*d+N*\ t/JdQsmeSd.TK
                       J/*FQiFQ                        Get the LCM.
                    *\-                                Take that many '-'s.
                               Km*d+N*\ t/dJQ          Fill in the taps.
                                             smeSd.TK  Get the metarhythm.
                  ++                                   Append them all.
      c"  L R M "2                                     Get the prefixes.
 .b+NY                                                 Prepend the prefixes.
j                                                      Join with newlines.

1

সি # (ভিজ্যুয়াল সি # ইন্টারেক্টিভ সংকলক) , 254 বাইট


গল্ফড এটি অনলাইন চেষ্টা করুন!

(r,l)=>{int s=l>r?l:r,S=s;while(S%l>0|S%r>0)S+=s;string q(int a){return"".PadRight(S/a,'.').Replace(".",".".PadRight(a,' '));}string R=q(S/r),L=q(S/l),M="";s=S;while(S-->0)M=(R[S]+L[S]>64?".":" ")+M;return"  ".PadRight(s+2,'-')+$"\nR {R}\nL {L}\nM {M}";}

Ungolfed

( r, l ) => {
    int
        s = l > r ? l : r,
        S = s;

    while( S % l > 0 | S % r > 0 )
        S += s;

    string q( int a ) {
        return "".PadRight( S / a, '.' ).Replace( ".", ".".PadRight( a, ' ' ) );
    }

    string
        R = q( S / r ),
        L = q( S / l ),
        M = "";

    s = S;

    while( S-- > 0 )
        M = ( R[ S ] + L[ S ] > 64 ? "." : " " ) + M;

    return "  ".PadRight( s + 2, '-') + $"\nR {R}\nL {L}\nM {M}";
}

সম্পূর্ণ কোড

Func<Int32, Int32, String> f = ( r, l ) => {
    int
        s = l > r ? l : r,
        S = s;

    while( S % l > 0 | S % r > 0 )
        S += s;

    string q( int a ) {
        return "".PadRight( S / a, '.' ).Replace( ".", ".".PadRight( a, ' ' ) );
    }

    string
        R = q( S / r ),
        L = q( S / l ),
        M = "";

    s = S;

    while( S-- > 0 )
        M = ( R[ S ] + L[ S ] > 64 ? "." : " " ) + M;

    return "  ".PadRight( s + 2, '-') + $"\nR {R}\nL {L}\nM {M}";
};

Int32[][]
    testCases = new Int32[][] {
        new []{ 3, 2 },
        new []{ 4, 3 },
        new []{ 4, 5 },
        new []{ 4, 7 },
        new []{ 4, 8 },
    };

foreach( Int32[] testCase in testCases ) {
    Console.Write( $" Input: R: {testCase[0]}, L: {testCase[1]}\nOutput:\n{f(testCase[0], testCase[1])}" );
    Console.WriteLine("\n");
}

Console.ReadLine();

রিলিজ

  • v1.0 - 254 bytes- প্রাথমিক সমাধান।

মন্তব্য

  • না

1

কাঠকয়লা , 52 বাইট

≔θζW﹪ζη≧⁺θζζ↙≔⮌Eζ⟦¬﹪×ιθζ¬﹪×ιηζ⟧ζFζ⊞ι⌈ι↓Eζ⭆ι§ .λ←↓RLM

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

≔θζW﹪ζη≧⁺θζ

Rবিভাজ্য এর প্রথম একাধিকটি নিয়ে ইনপুটগুলির এলসিএম গণনা করুন L

ζ↙

LCM মুদ্রণ করুন, যা স্বয়ংক্রিয়ভাবে এর প্রয়োজনীয় সারি আউটপুট করে -। তারপরে ডান থেকে বাম তাল ছাপতে সরান।

≔⮌Eζ⟦¬﹪×ιθζ¬﹪×ιηζ⟧ζ

এলসিএম থেকে 0 পর্যন্ত নীচে নেমে লুপ করুন এবং ডান এবং বাম হাতের बीটকে উপস্থাপন করে এমন তালিকাগুলির একটি অ্যারে তৈরি করুন।

Fζ⊞ι⌈ι

বীটগুলির উপরে লুপ করুন এবং মেটাারিথম যুক্ত করুন।

↓Eζ⭆ι§ .λ

বিপরীত বিটগুলি নীচের দিকে মুদ্রণ করুন, তবে এটি একটি অ্যারে হিসাবে তারা বাম দিকে শেষ হয়।

←↓RLM

শিরোনামটি মুদ্রণ করুন।




1

পাইথ, 49 বাইট

J/*FQiFQjC+c2" RLM    "ms@L" -"!M++0d*Fdm%Ld/LJQJ

ফর্ম ইনপুট আশা করে [r,l]-ট্যাপগুলি প্রদর্শন করতে ব্যবহার করে। এটি এখানে অনলাইনে চেষ্টা করুন , বা এখানে একবারে সমস্ত পরীক্ষার কেস যাচাই করুন

J/*FQiFQjC+c2" RLM    "ms@L" -"!M++0d*Fdm%Ld/LJQJ   Implicit: Q=eval(input())
 /*FQiFQ                                            Compute LCM: (a*b)/(GCD(a,b))
J                                                   Store in J
                                        m       J   Map d in [0-LCM) using:
                                            /LJQ      Get number of beats between taps for each hand
                                         %Ld          Take d mod each of the above
                                                    This gives a pair for each beat, with 0 indicating a tap
                       m                            Map d in the above using:
                                     *Fd              Multiply each pair (effecively an AND)
                                 ++0d                 Prepend 0 and the original pair
                               !M                     NOT each element
                        s@L" -"                       Map [false, true] to [' ', '-'], concatenate strings
                                                    This gives each column of the output
           c2" RLM    "                             [' RLM','    ']
          +                                         Prepend the above to the rest of the output
         C                                          Transpose
        j                                           Join on newlines, implicit print

1

আর , 161 149 146 বাইট

function(a,b){l=numbers::LCM(a,b)
d=c(0,' ')
cat('  ',strrep('-',l),'\nR ',d[(x<-l:1%%a>0)+1],'\nL ',d[(y<-l:1%%b>0)+1],'\nM ',d[(x&y)+1],sep='')}

এটি অনলাইন চেষ্টা করুন!

আমি অবশ্যই এখানে উন্নতির জন্য জায়গা আছে মনে করি, কিন্তু আমি কয়েকটি ভিন্ন পদ্ধতির চেষ্টা করেছি এবং এটিই কেবল আটকে আছে। অভ্যন্তরীণ ফাংশন সংজ্ঞা থেকে মুক্তি পাওয়া আমাকে বেশ আনন্দিত করবে এবং আমি এটি ঘটানোর জন্য বিড়ালের পুনর্গঠনগুলির চেষ্টা করেছি ()। কিছু নয়, পোস্ট করার সাথে সাথে আমি বুঝতে পারি আমি কী করতে পারি। এখনও অবশ্যই কিছু দক্ষতার সঞ্চয় পাওয়া যাবে।

সংক্ষিপ্ত নাম সহ লাইব্রেরিতে অন্যান্য এলসিএম ফাংশন রয়েছে, তবে টিআইওর সংখ্যা রয়েছে এবং আমি এই মুহুর্তে এটিকে আরও মূল্যবান বলে মনে করি।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.