ตัวแก้ช่วงเวลาดนตรี


11

ป้อนคำอธิบายรูปภาพที่นี่

ในทฤษฎีดนตรีช่วงเวลาคือความแตกต่างระหว่างสองครา แต่ละสนามถูกกำหนดโดยจำนวนครึ่งก้าว (ความแตกต่างระหว่าง C และ C #) หรือขั้นตอนทั้งหมด (ความแตกต่างระหว่าง C และ D) ขั้นตอนเดียวทั้งหมดเหมือนกับสองครึ่งก้าว นี่คือรายการของช่วงเวลาเริ่มต้นทั้งหมดและจำนวนครึ่งขั้นตอนที่แสดง:

0     Perfect Unison
2     Major Second
4     Major Third
5     Perfect Fourth
7     Perfect Fifth
9     Major Sixth
11    Major Seventh
12    Perfect Octave

มี 3 รูปแบบในช่วงเริ่มต้นจะมีเล็ก ๆ น้อย ๆ , ลดลงและเติม

  • เล็กน้อยช่วงเป็นหนึ่งในขั้นตอนครึ่งต่ำกว่าช่วงเวลาที่สำคัญ แต่ไม่ได้เป็นช่วงเวลาที่สมบูรณ์แบบ ดังนั้นคุณจึงมีรองที่สอง (1) รองที่สาม (3) รองที่หก (8) และรองที่เจ็ด (10) ไม่มีสิ่งดังกล่าวในฐานะผู้เยาว์ที่สี่, ห้ารอง, พร้อมเพรียงกันเล็ก ๆ น้อย ๆ หรือระดับแปดเสียงรองเพราะสิ่งเหล่านี้เป็นช่วงเวลาที่สมบูรณ์แบบทั้งหมด

  • ลดลงช่วงเป็นหนึ่งในขั้นตอนครึ่งต่ำกว่าเล็กน้อยหรือช่วงเวลาที่สมบูรณ์แบบ มีการลดลงที่สอง (0) ลดลงที่สาม (2) ลดลงที่สี่ (4) ลดลงที่ห้า (6) ลดลงที่หก (7) ลดลงที่เจ็ด (9) ลดลงที่เจ็ด (9) และคู่ลดลง (11)

  • เติมช่วงเวลาที่เป็นหนึ่งในขั้นตอนครึ่งที่สูงขึ้นกว่าช่วงเวลาที่สำคัญหรือที่สมบูรณ์แบบ เรามีความพร้อมเพรียงกันมากขึ้น (1), เพิ่มพูนที่สอง (3), เติมเต็มสาม (5), เติมเต็มสี่ (6), เพิ่มเติมที่ห้า, (8), เพิ่มเติมที่หก (10) และเพิ่มเจ็ด (12)

ความท้าทาย:

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

"5w" == 5 whole steps
"3h" == 3 half steps

หรือเป็นตัวเลขและสตริง / อักขระ

5, "w" == 5 whole steps
3, "h" == 3 half steps.

คุณสามารถสมมติว่าทุกอินพุตจะอยู่ระหว่าง 0 ถึง 12 ครึ่งก้าว

ตาราง IO

นี่คือการแม็พรายการแบบเต็มจำนวนครึ่งขั้นกับเอาต์พุตที่ยอมรับได้ทั้งหมด

0       Perfect unison, Diminished second   
1       Minor second, Augmented unison  
2       Major second, Diminished third  
3       Minor third, Augmented second   
4       Major third, Diminished fourth  
5       Perfect fourth, Augmented third     
6       Diminished fifth, Augmented fourth  
7       Perfect fifth, Diminished sixth 
8       Minor sixth, Augmented fifth        
9       Major sixth, Diminished seventh 
10      Minor seventh, Augmented sixth      
11      Major seventh, Diminished octave    
12      Perfect octave, Augmented seventh   

นี่คือตัวอย่าง I / O บางส่วน:

5w      Minor Seventh
5h      Augmented Third
12h     Perfect Octave
12w     UNDEFINED
1w      Diminished third
2h      Major Second

Dimishedหรือไม่? ....
CalculatorFeline

7
@CatsAreFluffy การสะกดที่แย่ของฉันลดความสามารถในการเขียนความท้าทายที่ดี ಠ_ಠ
James

ยังคงเป็นความท้าทายที่ดีเพียงแก้ไขเพิ่มเติม! : P
Rɪᴋᴇʀ

คำตอบ:


1

Ruby, Rev B 138 ไบต์

->n,s{i=12-n-n*(s<=>?h)
[a='Augmented','Major','Minor',d='Diminished',a,'Perfect',d][i%7]+' '+%w{seventh fifth third unison}[i%7/4+i/7*2]}

5 Augmented/Diminishedไบต์บันทึกไว้โดยไม่ซ้ำ 1 ?hไบต์บันทึกไว้โดยการใช้งานของ

Ruby, Rev A 144 ไบต์

->n,s{i=12-n-n*(s<=>'h')
%w{Augmented Major Minor Diminished Augmented Perfect Diminished}[i%7]+' '+%w{seventh fifth third unison}[i%7/4+i/7*2]}

ความคิดคือการลดจำนวนของช่วงเวลาพื้นฐาน (เจ็ดที่ห้าและพร้อมเพรียงเท่านั้น) และใช้ประโยชน์จากความจริงที่ว่าเจ็ดและห้ามีความสัมพันธ์คล้ายกับที่ระหว่างที่สามและพร้อมเพรียง

มีเจ็ดประเภทที่เจ็ด / สามสี่ประเภทและห้า / สามพร้อมกันดังนั้นตัวแปรดัชนีiถูกตั้งค่าเป็น 12 ลบจำนวนขั้นตอนครึ่งเพื่อให้คำแรกของการแสดงออกที่i%7/4 + i/7*2ถูกต้องจะเลือกประเภทของช่วงเวลาพื้นฐาน

ungolfed ในโปรแกรมทดสอบ

f=->n,s{                 #n = number of steps. s= step size, w or h
  i=12-n-n*(s<=>'h')     # i=12-n. If s is later in the alphabet than 'h' subtract again for whole steps
  %w{Augmented Major Minor Diminished Augmented Perfect Diminished}[i%7]+
  ' '+%w{seventh fifth third unison}[i%7/4+i/7*2]
}

-1.upto(12){|j|
puts f[j,'h']
}  

0.upto(6){|j|
puts f[j,'w']
}

เอาท์พุต

Diminished unison
Perfect unison
Augmented unison
Diminished third
Minor third
Major third
Augmented third
Diminished fifth
Perfect fifth
Augmented fifth
Diminished seventh
Minor seventh
Major seventh
Augmented seventh

Perfect unison
Diminished third
Major third
Diminished fifth
Augmented fifth
Minor seventh
Augmented seventh

อินพุตพฤติกรรมที่ไม่ได้กำหนด: ฟังก์ชันให้คำตอบที่ถูกต้องdiminished unionสำหรับ -1 halfsteps แต่ล้มเหลวในการป้อนข้อมูลมากกว่า 12 ตัวอย่างเช่นฟังก์ชันจะส่งออกperfect unison14 ขั้นตอนครึ่งเนื่องจากอัลกอริทึมจะขึ้นอยู่กับวงจรของ 14 มากกว่า 12


2

Python 2, 149 ไบต์

def f(n,c):n*=1+(c>'h');print(n-6)%13%2*"Diminished"or"Augmented",'octave seventh sixth fifth fourth third second unison'.split()[71056674174>>3*n&7]

ขั้นแรกให้เปลี่ยนทั้งขั้นเป็นครึ่งขั้น

จากนั้นDiminishedvs Augmentedจะถูกพิมพ์ ทางเลือกเหล่านี้สำหรับติดกันnยกเว้นนั้นn=5และn=6ให้เหมือนกันซึ่งทำได้โดยการใส่พวกมันข้ามเขตโมดูโลเป็นจำนวนคี่

ในที่สุดระยะทางจะถูกพิมพ์คำนวณผ่านตารางการค้นหาสามบิต int('6746543230210'[n])นี้จะสั้นกว่าการทำ



1

เรติน่า 153 ไบต์

\ D +
$ *
W (*.) | ชั่วโมง
$ 1 $ 1
^ 1 * $
$ 0.0
^ [02,479] | 11
ลดลง $ 0
^ \ d
เพิ่ม $ 0
10 | 7
ที่หก
11
เสียงคู่แปด
12 | 9
ที่เจ็ด
8
ที่ห้า
4 | 6
ที่สี่
5 | 2
ที่สาม
1
ความพร้อมเพรียงกัน
\ d
ที่สอง

หมายเลขอินพุตจะถูกแปลงเป็น unary ก่อนจากนั้นเพิ่มเป็นสองเท่าหากตามด้วยwและตัวอักษรใด ๆ จะถูกลบออกโดยเหลือเพียงหมายเลข unary หมายเลขนี้จะถูกแปลงกลับเป็นทศนิยม ในที่สุดการค้นหาและแทนที่บางรายการจะใช้เพื่อสร้างผลลัพธ์สุดท้าย

ตัวอย่างการทำงาน:

6w => 111111w => 111111111111 => 12 => เพิ่ม 12 => เพิ่มเจ็ด
7h => 1111111h => 1111111 => 7 => Diminished 7 => Diminished six
3w => 111w => 111111 => 6 => เพิ่ม 6 => เพิ่มที่สี่
0h => h => => 0 => Diminished 0 => Diminished second

ลองออนไลน์!


0

Vitsy , 166 ไบต์

นี่สามารถเล่นกอล์ฟต่อไปได้อย่างแน่นอน

WW2M1+*a+mZ
'dehsinimiD'
'roniM'
'rojaM'
'tcefreP'
'detnemguA'
'dnoces '
'htruof '
'htxis '
'evatco '
6m1m
6m2m
6m3m
6m5m
7m1m
7m4m
7m5m
8m1m
8m2m
8m3m
8m5m
9m1m
9m4m

สิ่งนี้ทำงานได้โดยการกำหนดจำนวนไอเท็มที่น้อยที่สุดเท่าที่จะเป็นไปได้จากนั้นเรียกไอเท็มเหล่านั้นผ่านทางไวยากรณ์เมธอด

ลองออนไลน์!


0

Javascript 189 ไบต์

a=>(n='sutsftfxFvxov'[N=parseInt(a)*(a.slice(-1)>'v'?2:1)])&&((N>5?N+1:N)%2?'Augmented ':'Dimished ')+'unison,second,third,fourth,fifth,sixth,seventh,octave'.split`,`['ustfFxvo'.indexOf(n)]



 F=
  a=>
    (n='sutsftfxFvxov' //using the right side of the possible answers
                       //set n = the letter representing
                       //unison, first, second ...

       //set N to 12 for 12h, but 24 for 12w
       [N=parseInt(a)*(a.slice(-1)>'v'?2:1)])

  &&   //if we were out of range (12w) we'll return undefined


    (
      (N>5?N+1:N)%2?  //get Aug or Dim (right side goes)
                      //DADADAADADADA
                      //     ^^ makes this a pain
       'Augmented ':'Dimished '
     )
     +
            //turn n (which is u for unison, x for sixth, etc
            //into it's full name
       'unison,second,third,fourth,fifth,sixth,seventh,octave'
         .split`,`
     ['ustfFxvo'.indexOf(a)]

0

Java, 225 224 ไบต์

จะต้องมีวิธีที่ดีกว่าในการแพ็คสตริงเหล่านี้ แต่ฉันไม่มีความคิดใด ๆ

(i,s)->{String A="Augmented",M="Major",m="Minor",P="Perfect",D="Diminished",d=" Second",f=" Fourth",a=" Sixth",C=" Octave";String[]o=new String[]{D+d,m+d,M+d,A+d,P+f,A+f,D+a,m+a,M+a,A+a,D+C,P+C};i*=s=='w'?2:1;return o[i-1];}

เยื้อง:

static BiFunction<Integer, Character, String> interval = (i,s) -> {
    String A="Augmented",M="Major",m="Minor",P="Perfect",D="Diminished",
            d=" Second",f=" Fourth",a=" Sixth",C=" Octave";
    String[] o = new String[] {D+d,m+d,M+d,A+d,P+f,A+f,D+a,m+a,M+a,A+a,D+C,P+C};
    i *= s=='w' ? 2 : 1;
    return o[i-1];
};

ฉันเชื่อว่าคุณสามารถย่อให้สั้นลงได้โดยแทนที่if(s=='w')i*=2;ด้วยi*=s=='w'?2:1;
Mr Public

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