मेरे पोली लय के साथ मेरी मदद करो


17

मैं एक संगीतकार हूँ, और मुझे अपने जीवन में और अधिक लय चाहिए!

संगीत में एक प्रकृति (और प्रकृति में) तब होती है जब दो घटनाएं (क्लैप्स, नोट्स, फायरफ्लाइज़ चमकती आदि) दो अलग-अलग नियमित अंतरालों पर होती हैं। दो प्रकार की घटना एक ही अंतराल में कई बार होती है।

यदि मैं अपने बाएं हाथ से दो बार टैप करता हूं, और मेरे दाहिने हाथ से 3 बार, उसी स्थान पर, यह थोड़ा सा दिखता है:

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

शीर्ष पर हाइफ़न पॉलीथमिक पैटर्न की लंबाई को दर्शाता है, जो कि सबसे सामान्य बहु या 2 है और 3. यह उस बिंदु के रूप में समझा जा सकता है जिस पर पैटर्न दोहराता है।

एक 'मेटेरियथम' भी है, जो तब निर्मित होता है जब दोनों हाथ से दोहन होता है:

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

यह 3: 2 के अनुपात के साथ एक सरल और बहुत ही सामान्य पोली लय है।

आइए हम कहते हैं कि मैं एक साधारण पोलिअर नहीं करना चाहता, जिसे मैं अपने दिमाग में काम कर सकूं, इसलिए मुझे इसके लिए काम करने की जरूरत है। मैं इसे कागज पर लंबे रूप में कर सकता था, या ...


नियम:

  • जैसा कि ऊपर वर्णित है, एक पॉली लय चित्र बनाने और प्रदर्शित करने के लिए कुछ कोड लिखें।
  • कोई भी पुरानी भाषा, सबसे कम बाइट्स के लिए प्रयास करें।
  • आपका कोड दो तर्क लेता है:
    • बाएं हाथ से नल की संख्या (धनात्मक पूर्णांक)
    • दाहिने हाथ से नल की संख्या (धनात्मक पूर्णांक)
  • यह लंबाई को पूरा करेगा, जो कि दो तर्कों के लिए सबसे सामान्य बहु है।
  • शीर्ष पंक्ति में दो व्हाट्सएप अक्षर शामिल होंगे जिसके बाद हाइफ़न लंबाई (लंबाई * '-') प्रदर्शित होगी
  • दूसरी और तीसरी पंक्ति दाएं और बाएं हाथों के लिए पैटर्न दिखाएगी:
    • यह एक आर या एल के साथ शुरू होगा, यह दर्शाता है कि यह कौन सा हाथ है, इसके बाद एक स्थान है।
    • उस हाथ के लिए अंतराल तर्क द्वारा विभाजित लंबाई है।
    • आपके द्वारा चुने गए किसी भी चरित्र द्वारा निरूपित, तीसरे चरित्र पर नल शुरू हो जाएंगे। तब से यह एक ही चरित्र 'अंतराल' के पात्रों को अलग प्रदर्शित करेगा।
    • यह लंबाई रेखा से अधिक लंबी नहीं होगी।
  • चौथी पंक्ति मेथर्थम है:
    • यह एक ऊपरी मामले M के साथ शुरू होगा, उसके बाद एक स्थान होगा।
    • तीसरे चरित्र से, यह हर स्थिति में एक चरित्र (आपके द्वारा चुने गए किसी भी चरित्र) को दिखाएगा जहां दाहिने या बाएं हाथ पर एक नल है।
  • अनुगामी व्हाट्सएप अप्रासंगिक है।

परीक्षण के मामलों:

आर = 3, एल = 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 .   .  ..   . . .   ..  .

आर = 4, एल = 8

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

हैप्पी गोल्फिंग!


आपके परीक्षण के मामलों में बहुत सारे अनुगामी व्हाट्सएप शामिल हैं, क्या हम उन्हें छोड़ सकते हैं / और जोड़ सकते हैं?
11

क्या हमें स्वीकार करना होगा rऔर lदो अलग-अलग मूल्यों के रूप में? क्या हम इसके बजाय दो-तत्व सरणी को स्वीकार कर सकते हैं? उनके आदेश के बारे में कैसे, कि सख्ती से rपालन ​​किया जाता है l?
सोक

@Sok 'दो तर्कों' की व्याख्या के रूप में स्वीकार्य है
AJFaraday

क्या यह वास्तव में आरेख को प्रिंट करने की आवश्यकता है, या क्या इसे बस वापस कर सकते हैं?
मोनिका को बहाल करें - notmaynard

@iamnotmaynard लौटना ठीक है।
AJFaraday

जवाबों:


6

जावास्क्रिप्ट (ईएस 6), 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)

इसे ऑनलाइन आज़माएं!

कैसे?

g()

g()0k=lcm(l,r)

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

s

g()1n3xs0

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()फ़ंक्शन नहीं है । इसे यहाँ ऑनलाइन आज़माएं (TIO में अभी जावा 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
केविन क्रूज़सेन

@ केविनक्रूजसेन हर बाइट मायने रखता है :-) धन्यवाद!
OOBalance

4

अजगर २ , 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))

इसे ऑनलाइन आज़माएं!


बचाया:

  • -2 बाइट्स, धन्यवाद जोनाथन फ्रेच को

[i%(w/y)and i%(w/z)>0]हो सकता है [i%(w/y)!=0<i%(w/z)]
जोनाथन फ्रेच

@JonathanFrech धन्यवाद :)
6


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)

इसे ऑनलाइन आज़माएं!


मैंने अभी इसे TIO में कॉपी-पेस्ट किया है और वहां से उत्पन्न प्रारूप को लिया है। आपके विचार से कम बाइट्स में यह हो गया है;)
AJFaraday

@ टेडफील्ड r=4, l=8मेरे लिए ठीक काम करती है
sonrad10

लंबाई को सबसे सामान्य बहु माना जाता है। R = 4, l = 8 के साथ, जो कि 8 होना चाहिए, लेकिन ऐसा प्रतीत होता है कि आपका आउटपुट बहुत लंबा है (8 * 4?)।
OOBalance

1
वह अभी भी एलसीएम नहीं देता है; उदाहरण के लिए 15,25, यह देता है 375, लेकिन यह होना चाहिए 75
19-3 बजे OOBalance

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

ζ↙

एलसीएम प्रिंट करें, जो स्वचालित रूप से -एस की आवश्यक पंक्ति को आउटपुट करता है । फिर दाएं से बाएं ताल को प्रिंट करने के लिए आगे बढ़ें।

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

LCM से 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='')}

इसे ऑनलाइन आज़माएं!

मुझे निश्चित रूप से ऐसा लगता है कि यहां सुधार के लिए जगह है, लेकिन मैंने कुछ अलग दृष्टिकोणों की कोशिश की और यह केवल एक है जो अटक गया। आंतरिक फ़ंक्शन परिभाषा से छुटकारा पाने से मुझे काफी खुशी होगी, और मैंने ऐसा करने के लिए बिल्ली () के पुनर्गठन का एक गुच्छा लेने की कोशिश की। कोई बात नहीं, जैसे ही मैंने पोस्ट किया मुझे एहसास हुआ कि मैं क्या कर सकता हूं। अभी भी निश्चित रूप से कुछ दक्षता बचत मिल सकती है।

छोटे नामों के साथ पुस्तकालयों में अन्य एलसीएम फ़ंक्शन हैं, लेकिन टीआईओ में संख्याएं हैं और मैंने इस बिंदु पर अधिक मूल्यवान माना।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.