ช่วยฉันด้วย polyrhythms ของฉัน


17

ฉันเป็นนักดนตรีและฉันต้องการ polyrhythms มากขึ้นในชีวิตของฉัน!

Polyrhythm เกิดขึ้นในดนตรี (และโดยธรรมชาติ) เมื่อมีเหตุการณ์สองเหตุการณ์ (ตบมือ, โน้ต, หิ่งห้อยที่กระพริบ ฯลฯ ) กำลังเกิดขึ้นในสองช่วงเวลาที่แตกต่างกัน เหตุการณ์สองชนิดนั้นเกิดขึ้นหลายครั้งในช่วงเวลาเดียวกัน

หากฉันแตะด้วยมือซ้ายสองครั้งและด้วยมือขวาของฉัน 3 ครั้งในเวลาเดียวกันดูเหมือนเล็กน้อยดังนี้

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

ยัติภังค์ที่ด้านบนแสดงถึงความยาวของรูปแบบ polyrthmic ซึ่งเป็นพหุคูณสามัญที่ต่ำที่สุดหรือ 2 และ 3 ซึ่งสามารถเข้าใจได้ว่าเป็นจุดที่รูปแบบซ้ำ

นอกจากนี้ยังมี 'metarhythm' ซึ่งเป็นรูปแบบที่เกิดขึ้นเมื่อมือทั้งสองแตะที่:

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

นี่คือ polyrhythm ธรรมดาและเรียบง่ายมากที่มีอัตราส่วน 3: 2

สมมติว่าฉันไม่ต้องการทำโพลีจังหวะที่เรียบง่ายที่ฉันสามารถออกกำลังกายในหัวของฉันได้ดังนั้นฉันจึงต้องการบางสิ่งบางอย่างเพื่อทำงานให้ฉัน ฉันทำแบบยาวบนกระดาษหรือ ...


กฎ:

  • เขียนโค้ดเพื่อสร้างและแสดงไดอะแกรม polyrhythm ดังที่อธิบายไว้ข้างต้น
  • ภาษาเก่าใด ๆ ลองใช้จำนวนไบต์ที่น้อยที่สุด
  • รหัสของคุณใช้เวลาสองข้อโต้แย้ง:
    • จำนวนก๊อกด้วยมือซ้าย (จำนวนเต็มบวก)
    • จำนวนก๊อกด้วยมือขวา (จำนวนเต็มบวก)
  • มันจะหาระยะความยาวซึ่งเป็นพหุคูณที่ต่ำที่สุดสำหรับอาร์กิวเมนต์สองตัว
  • บรรทัดบนสุดจะประกอบด้วยอักขระช่องว่างสองตัวตามด้วยเครื่องหมายขีดกลางที่แสดงความยาว (ความยาว * '-')
  • บรรทัดที่สองและสามจะแสดงรูปแบบสำหรับมือขวาและมือซ้าย:
    • มันจะเริ่มต้นด้วย R หรือ L อย่าแสดงว่าเป็นมือใดตามด้วยช่องว่าง
    • ช่วงเวลาสำหรับมือนั้นคือความยาวหารด้วยอาร์กิวเมนต์ของมัน
    • ดอกต๊าปจะเริ่มที่ตัวอักษรตัวที่สามซึ่งแสดงโดยตัวละครที่คุณเลือก จากนั้นมันจะแสดงตัวละคร 'ช่วงเวลา' ตัวละครเดียวกันออกจากกัน
    • มันจะต้องไม่ยาวกว่าเส้นความยาว
  • บรรทัดที่สี่คือ metarhythm:
    • มันจะเริ่มต้นด้วยตัวพิมพ์ใหญ่ M ตามด้วยช่องว่าง
    • จากตัวละครตัวที่สามเป็นต้นไปมันจะแสดงตัวละคร (ตัวละครที่คุณเลือก) ในทุกตำแหน่งที่มีการแตะที่ด้านขวาหรือด้านซ้ายมือ
  • ช่องว่างต่อท้ายไม่เกี่ยวข้อง

กรณีทดสอบ:

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 ........

มีความสุขในการเล่นกอล์ฟ!


กรณีทดสอบของคุณมีช่องว่างต่อท้ายจำนวนมากเราสามารถตัดออก / เพิ่มมากขึ้นได้ไหม
กำจัด

เราต้องยอมรับrและlแยกเป็นสองค่าหรือไม่? เราสามารถยอมรับอาร์เรย์สององค์ประกอบแทนได้หรือไม่ วิธีการเกี่ยวกับการสั่งซื้อของพวกเขาที่rตามมาอย่างเคร่งครัดl?
Sok

@Sok นั้นเป็นที่ยอมรับในฐานะการตีความ 'สองอาร์กิวเมนต์'
AJFaraday

จำเป็นต้องพิมพ์ไดอะแกรมจริง ๆ หรือไม่หรือสามารถคืนได้หรือไม่
Reinstate Monica - notmaynard

@iamnotmaynard การกลับมาเป็นเรื่องปกติ
AJFaraday

คำตอบ:


6

JavaScript (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)

ลองออนไลน์!

อย่างไร?

เราใช้ฟังก์ชันผู้ช่วยเดียวกันเพื่อวัตถุประสงค์ที่แตกต่างกันสองประการก.()

ก.()0k=LCM(ล.,R)

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

s

ก.()1n3xs0

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

4

Java 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);}

ชนิดของความยาว Java แย่เกินไปไม่มีlcm()ฟังก์ชั่น ลองออนไลน์ได้ที่นี่ (TIO ยังไม่มี Java 11 ดังนั้นนี่ใช้วิธีช่วยเหลือแทนString.repeat())

รุ่นเริ่มต้นของฉันใช้ช่วงเวลาระหว่างก๊อกแทนจำนวนก๊อก แก้ไขแล้ว ขอบคุณKevin Cruijssenสำหรับการเล่นกอล์ฟ 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
Kevin Cruijssen

@KevinCruijssen ทุก ๆ ไบต์มีค่าเป็น :-) ขอบคุณ!
OOBalance

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))

ลองออนไลน์!


ที่บันทึกไว้:

  • -2 ไบต์ขอบคุณ Jonathan Frech

[i%(w/y)and i%(w/z)>0][i%(w/y)!=0<i%(w/z)]อาจจะเป็น
Jonathan Frech



3

Python 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

@Tfeld r=4, l=8ทำงานได้ดีสำหรับฉัน
sonrad10

ความยาวควรจะเป็นตัวคูณร่วมน้อย ด้วย r = 4, l = 8, ที่ควรจะเป็น 8 แต่ดูเหมือนว่าเอาต์พุตของคุณจะยาวกว่ามาก (8 * 4?)
OOBalance

1
ที่ยังไม่ให้ LCM; เช่นการ15,25จะให้แต่มันควรจะเป็น375 75
OOBalance

1
i%r+i%l+0**i<1ผมเชื่อว่าการตรวจสอบที่ผ่านมาจะถูกแทนที่ด้วย นอกจากนี้คุณสามารถลบรหัสรุ่นก่อนหน้าเนื่องจากจะถูกเก็บรักษาไว้ในประวัติการแก้ไขของคุณที่ใครก็ตามที่ต้องการเห็นพวกเขา
Jo King

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

C (gcc) 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);}

ท่าเรือ Java ของฉันคำตอบ f(number_of_right_hand_taps, number_of_left_hand_taps)โทรหา ลองออนไลน์ได้ที่นี่



1

Pyth, 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

C # (Visual C # Interactive คอมไพเลอร์) , 254 ไบต์


Golfed ลองออนไลน์!

(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

Charcoalขนาด 52 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔θζW﹪ζη≧⁺θζ

คำนวณ LCM ของปัจจัยการผลิตโดยการหลายแรกของที่หารด้วยRL

ζ↙

พิมพ์ LCM ซึ่งโดยอัตโนมัติ outputs แถวที่จำเป็นของ-s จากนั้นเลื่อนเพื่อพิมพ์จังหวะจากขวาไปซ้าย

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

วนรอบตัวเลขจาก LCM ลงไปที่ 0 และสร้างอาร์เรย์ของรายการที่แสดงจังหวะของมือขวาและมือซ้าย

Fζ⊞ι⌈ι

วนรอบจังหวะและเพิ่ม metarhythm

↓Eζ⭆ι§ .λ

พิมพ์จังหวะที่กลับด้านลง แต่เนื่องจากนี่เป็นอาร์เรย์

←↓RLM

พิมพ์ส่วนหัว




1

Pyth, 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

R , 161 149 146 bytes

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

ลองออนไลน์!

ฉันรู้สึกเหมือนว่ามีห้องพักสำหรับการปรับปรุงที่นี่ แต่ฉันลองวิธีการที่แตกต่างกันไม่กี่และนี่เป็นวิธีเดียวที่ติดอยู่ การกำจัดคำจำกัดความของฟังก์ชั่นภายในจะทำให้ฉันมีความสุขมากและฉันก็ลองปรับโครงสร้างของแมว () เพื่อทำให้มันเกิดขึ้น ไม่เป็นไรทันทีที่ฉันโพสต์ฉันก็ตระหนักว่าฉันสามารถทำอะไรได้บ้าง ยังคงพบการประหยัดประสิทธิภาพอย่างแน่นอน

มีฟังก์ชั่น LCM อื่น ๆ ในห้องสมุดที่มีชื่อที่สั้นกว่า แต่ TIO มีตัวเลขและฉันคิดว่ามีคุณค่ามากขึ้น ณ จุดนี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.