แปลคู่หมายเลขเป็นกีตาร์โน้ต


18

แผนภาพกีตาร์ fretboard มีลักษณะดังนี้:

  0  1  2  3  4  5  6  7  8  9 10 11 12   <- Fret number (0 means it's open)
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
|-B--C--C#-D--D#-E--F--F#-G--G#-A--A#-B 
|-G--G#-A--A#-B--C--C#-D--D#-E--F--F#-G
|-D--D#-E--F--F#-G--G#-A--A#-B--C--C#-D
|-A--A#-B--C--C#-D--D#-E--F--F#-G--G#-A
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E

ในขณะที่คุณสามารถดูสายแรก (จากด้านบน) Eเปิดเป็น Fทำให้ไม่สบายใจเป็นครั้งแรกในสายแรกเป็น Bทำให้ไม่สบายใจสี่สายที่สามคือ โปรดทราบว่าบันทึกแรกคือหงุดหงิด zeroth ไม่ใช่คนแรก

string, fretนี้สามารถเขียนด้วยตัวเลขในรูปแบบ สตริงมีหมายเลขตั้งแต่ 1 ถึง 6 จากบนลงล่าง เฟร็ตมีหมายเลขตั้งแต่ 0 ถึง 12 จากซ้ายไปขวา ครั้งแรกจึงเป็นE 1, 0ตัวอย่างอื่น ๆ :

1, 0 --> E
1, 1 --> F
3, 5 --> C
5, 1 --> A# 
6, 6 --> A#

ท้าทาย:

จดNตัวเลข ( sและf) แล้วเอาออกคั่นโน้ตที่มีการคั่น

  • อินพุตอาจอยู่ในรูปแบบที่เหมาะสม tuples, 2D-matrix, สองรายการแยกกัน, รายการแบบผสมผสาน (สตริง, fret, สตริง, fret ... ) เป็นต้น
  • ควรแยกโทนเอาท์พุท แต่ตัวคั่นเป็นตัวเลือก (จุลภาคเว้นวรรคเส้นประ ... ) เอาต์พุตสามารถเป็นได้ทั้งตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก
  • s(สำหรับสตริง) จะอยู่ในช่วง[1, 6](คุณอาจเลือกที่จะให้ฉันดัชนี 0)
  • f (สำหรับหงุดหงิด) จะอยู่ในช่วง [0, 12]

กรณีทดสอบและตัวอย่าง:

1 4 5 2 1 3   <- String
4 2 6 3 5 1   <- Fret
G# E D# D A G#

6 2 3 1 4 2 3 2 2 2 6 5 2
0 1 2 3 4 5 6 7 8 9 10 11 12
E C A G F# E C# F# G G# D G# B  

3 3 3 3 3 3 3 3 3 3 3 3 3   <- String
0 3 5 0 3 6 5 0 3 5 3 0 0   <- Fret
G A# C G A# C# C G A# C A# G G     

// The same test case, but different input and output format:
(3,0)(3,3)(3,5)(3,3)(3,6)(3,5)(3,0)(3,3)(3,5)(3,3)(3,0)(3,0)    
G,A#,C,G,A#,C#,C,G,A#,C,A#,G,G     

ขอให้โชคดีและเล่นกอล์ฟอย่างมีความสุข!


ไม่ใช่นักกีต้าร์ (หรือแม้แต่นักดนตรีที่เก่ง) จริง ๆ แต่ไม่มีการละเว้นที่สำคัญที่นี่ถ้าคุณคาดหวังว่าเพลงจะเป็นที่รู้จัก นั่นคือช่วงเวลาบันทึกย่อ - ทั้งครึ่งครึ่งบันทึกไตรมาส & c
jamesqf

1
@jamesqf ไม่ไม่เป็นไรอย่างสมบูรณ์แบบตราบใดที่คุณรู้ว่าเพลง ขณะนี้เป็นเพลงที่นิยมมากที่สุดในultimate-guitar.com ดูที่คำนำ
Stewie Griffin

คำตอบ:


4

05AB1E , 48 47 43 40 ไบต์

ใช้การเข้ารหัสCP-1252

ทั้งสตริงและเฟร็ตเป็น 0

v7YT5¾7)y`Šè+•™ÎÚ,Ülu•žh'#A«‡•7V3•3BS£è,

คำอธิบาย

v                                # for each pair in input
 7YT5¾7)                         # the list [7,2,10,5,0,7]
 y`                              # flatten the pair [string, fret] and places on stack
 Šè                              # index into the list above using the string
 +                               # add the fret
 •™ÎÚ,Ülu•žh'#A«‡•7V3•3BS£       # list of accords
 è                               # index into the string using the number calculated above
 ,                               # print

ลองออนไลน์!

บันทึกแล้ว 7 ไบต์ขอบคุณAdnan


1
การใช้ประโยชน์จากข้อบกพร่องเป็นกอล์ฟมาก! .-)
Luis Mendo

"AA#BCC#DD#EFF#GG#"•7V3•3BS£แทนที่จะ"A A# B C C# D D# E F F# G G#"#สั้นลงสักสองสามไบต์ :)
Adnan

@Adnan: Ooh การเปลี่ยนแปลงที่ดี :)
Emigna

รุ่นที่บีบอัดของ"AA#BCC#DD#EFF#GG#"สตริง: •™ÎÚ,Ülu•žh'#A«‡(เนื่องจากอนุญาตให้ใช้ตัวพิมพ์เล็ก: p)
Adnan

9

JavaScript (ES6), 79 70 ไบต์

a=>a.map(([s,f])=>"AA#BCC#DD#EFF#GG#".match(/.#?/g)[(s*7+(s>2)+f)%12])

ต้องใช้สตริงที่ใช้ 1 แก้ไข: บันทึก 9 ไบต์โดยการคำนวณสตริงโดยตรงกับการแปลงที่ไม่สบายใจตามคำตอบเก่าของ @ nimi


@Arnauld ขอบคุณ แต่ฉันได้คำตอบที่เหมาะสมของ @ nimi แทน
Neil

มีประสิทธิภาพมากขึ้นแน่นอน;)
Arnauld

ฉลาด. คำตอบลับๆล่อๆมาก
Rohan Jhunjhunwala

7

Mathematica, 62 ไบต์ (ไม่แข่งขัน)

<<Music`;MusicScale[100(#2+{24,19,15,10,5,0}[[#]])&@@@#,E2,9]&

{24,19,15,10,5,0}และE2เป็นตัวแทนของเสียงเปิดสายของสายกีตาร์หก (เช่นสตริงด้านบนเป็น 24 semitones ข้างต้นทราบ E2) ไม่แข่งขันเพราะไม่พิมพ์ชื่อของโน้ต - เล่นตามลำดับของโน้ต! (เฉพาะในกรณีที่คุณมี Mathematica น่าเสียดาย) ตัวอย่างเช่น

<<Music`;MusicScale[100(#2+{24,19,15,10,5,0}[[#]])&@@@#,E2,9]&@
 {{4,0},{3,2},{2,3},{1,2},{5,0},{4,2},{3,2},{2,2},
  {5,2},{4,4},{2,0},{2,3},{6,2},{4,4},{3,2},{2,2},
  {6,3},{4,0},{3,0},{2,0},{4,0},{4,4},{3,2},{2,3},
  {6,3},{3,0},{2,0},{2,3},{5,0},{4,2},{3,2},{2,2},{4,0}}

เล่นการเปิด 4 บาร์หรือมากกว่านั้นจาก Canon ของ Pachelbel (ซึ่งเป็นเรื่องเกี่ยวกับ Canon ของ Pachelbel เท่าที่ฉันจะยืนได้)


7

MATL , 48 47 45 ไบต์

ขอบคุณ @Emigna สำหรับการแก้ไขเกี่ยวกับรูปแบบการป้อนข้อมูล

กีตาร์และรหัสกอล์ฟ ... ฉันต้องตอบคำถามนี้!

'$)-27<'i)-'F F# G G# A A# B C C# D D#

รูปแบบอินพุตคือ: อาร์เรย์ของสตริง (อิง 1) จากนั้นอาร์เรย์ของ (0 อิง) เฟร็ต

ลองออนไลน์!

คำอธิบาย

คุณสมบัติภาษาบางอย่างที่ใช้ในคำตอบนี้:

  • สตริงจะถูกแปลงเป็นอาร์เรย์ของตัวเลขรหัส ASCII โดยอัตโนมัติเมื่อการดำเนินการทางคณิตศาสตร์บางอย่างถูกนำไปใช้กับมัน
  • การดำเนินงานเกี่ยวกับคณิตศาสตร์เป็นองค์ประกอบของการทำงานที่ชาญฉลาดเช่น vectorized ดังนั้นการลบสตริงและอาร์เรย์ตัวเลขที่มีขนาดเท่ากันจะทำให้อาร์เรย์มีการลบรายการที่สอดคล้องกัน
  • การจัดทำดัชนี 1-based และแบบแยกส่วน
  • อาร์เรย์เซลล์เป็นเหมือนรายการในภาษาอื่น ๆ มันสามารถมีองค์ประกอบโดยพลการอาจมีอาร์เรย์ประเภทหรือขนาดแตกต่างกัน ที่นี่อาร์เรย์เซลล์จะใช้ในการจัดเก็บสตริงที่มีความยาวแตกต่างกัน (ชื่อบันทึกย่อ)

รหัสความคิดเห็น:

'$)-27<'                       % Push this string
i                              % Take first input (array of guitar strings)
)                              % Index into the string. For example, input [1 3] gives
                               % the string '$-' (indexing is 1-based)
-                              % Implicitly take second input (array of guitar frets).
                               % Subtract element-wise. This automatically converts the
                               % previous string into an array of ASCII codes. For
                               % example, second input [1 5] gives a result [-35 -40],
                               % which is [1 5] minus [36 45], where 36 and 45 are the
                               % ASCII codes of '$-' 
'F F# G G# A A# B C C# D D# E' % Push this string
Yb                             % Split at spaces. Gives a cell array of 12 (sub)strings:
                               % {'F', 'F#', 'G', ..., 'E'}
w)                             % Swap and index into the cell array of strings.
                               % Indexing is 1-based and modular. In the example, since
                               % the cell array has 12 elements, the indexing array
                               % [-35 -40] is the same [1 8], and thus it gives a 
                               % (sub-)array formed by the first and eighth cells: 
                               % {'F', 'C'}. This is displayed as the cells' contents,
                               % one per line

1
ฉันรู้ว่าฉันกำลังจะหาคำตอบจากคุณทันทีที่ฉันเห็นคำว่า "กีตาร์"
Suever

1
@LuisMendo ดีมาก! ฉันชอบเคล็ดลับดัชนี ascii-char :)
Emigna

4

Java, 174

String f(int[]s,int[]f){String o="";for(int i=0;i<s.length;++i){int n =(7*s[i]-7+f[i]+(s[i]>2?1:0))%12*2;o+="E F F#G G#A A#B C C#D D#".substring(n,n+2).trim()+" ";}return o;}

Ungolfed:

  String f(int[] s, int[] f) {
    String o = "";
    for (int i = 0; i < s.length; ++i) {
      int n = (7 * s[i] - 7 + f[i] + (s[i] > 2 ? 1 : 0)) % 12 * 2;
      o += "E F F#G G#A A#B C C#D D#".substring(n, n + 2).trim() + " ";
    }
    return o;
  }

3

C, 104 103 ไบต์

main(s,f){for(;~scanf("%d%d",&s,&f);printf("%.2s\n",
"E F F#G G#A A#B C C#D D#"+(f+7*~-s+(s>2))%12*2));}

ใช้ตัวเลขเป็นstring fretคู่บน stdin และส่งออกบันทึกหลังจากทุกคู่ เช่น:

1 4
G#
4 2
E 
5 6
D#
2 3
D 

3

ทับทิม, 63 ไบต์

ใช้เวลาอาร์เรย์ของอาร์เรย์ 2 [string,fret]องค์ประกอบในการสั่งซื้อ

->x{x.map{|i|"BEADGCF"[6-n=((i[0]-3)%5+2+i[1]*7)%12]+?#*(n/7)}}

คำอธิบาย

ในการปรับแต่งมาตรฐานกีตาร์เป็นหนึ่งในไม่กี่เครื่องสาย (โค้งหรือ fretted) ที่มีช่วงเวลาที่ไม่สอดคล้องกันระหว่างสายของมัน ส่วนใหญ่มีช่วงเวลา 5 semitone ที่สอดคล้องกันระหว่างคู่ของสตริงที่อยู่ติดกัน ("สี่") หรือช่วง 7-semitone ที่สอดคล้องกันระหว่างทุกคู่ของสตริงที่อยู่ติดกัน ("ห้า") เหล่านี้สอดคล้องกับอัตราส่วนความถี่ 3: 4 และ 2: 3 ตามลำดับและมีความสำคัญรองจาก "อ็อกเทฟ" ที่มีอัตราส่วนความถี่ 1: 2

กีตาร์ส่วนใหญ่มีช่วงเวลา 5 semitone หากมี 5 สิ่งเหล่านี้จะมีความแตกต่างของ 25 semitones ระหว่างสตริงที่ 1 และ 6 แต่ช่วงเวลาระหว่างสตริงที่ 2 และ 3 จะลดลงเป็น 4 semitones ซึ่งให้ความแตกต่างของ 24 semitones (2 octaves) ซึ่งดีกว่าสำหรับการเล่นคอร์ด

สิ่งนี้ไม่สะดวกสำหรับโปรแกรมดังนั้นเราจึงเริ่มต้นด้วยการเปลี่ยนอินทราเนชันกีตาร์ที่มีการจัดทำดัชนี 1 อันเป็นเสียงสูง 5-string-bass 0 ดัชนีซึ่งมีช่วง 5 semitones ทั้งหมด:

formula (i[0]-3)%5
Before                            After
String      6 5 4 3 2 1           String 4 3 2 1 0
Note        E A D G B E           Note   B E A D G

ต่อไปเราจะเพิ่ม 2 และให้การปรับแต่งของเบสสตริง 12 ที่สมมติขึ้นมาพร้อมกับน้ำเสียงของสตริงที่เปิดดังต่อไปนี้และช่วงเวลาทั้งหมดเป็น 5 semitones (12 สตริง "basses" มีอยู่ แต่ฉันไม่แน่ใจว่ามีหลายอย่างแน่นอน จูน.)

String       11 10 9  8  7  6  5  4  3  2  1  0 
Note         A# D# G# C# F# B  E  A  D  G  C  F

อย่างที่เห็นได้ว่าแม่นทั้งหมดจะถูกจัดกลุ่มเข้าด้วยกัน รูปแบบนี้สามารถโฆษณาซ้ำได้ไม่ จำกัด มันเป็นที่รู้จักกันในชื่อ "วงเวียนที่ห้า" และเป็นพื้นฐานของดนตรีตะวันตก (ด้วยการปรับแต่งเล็กน้อยวงกลมสามารถปิดได้เนื่องจากความจริงที่ว่า(3/2)**12และ2**7มีตัวเลขที่คล้ายกันมาก

ตอนนี้เราจัดการกับพารามิเตอร์ทำให้ไม่สบายใจ ต่างจากคำตอบอื่น ๆ อีกมากมายตรงนี้ซึ่งแปลพารามิเตอร์สตริงเป็นจำนวนเฟล็ตฉันจะแปลพารามิเตอร์เฟร็ทเป็นสตริงจำนวนหนึ่ง ในตารางด้านบนจะเห็นได้ว่าการเพิ่ม 7 ให้กับหมายเลขสตริงทำให้เราอยู่ในสตริงที่มีชื่อโน้ตเป็นหนึ่ง semitone ที่สูงกว่า (มันอยู่ในระดับแปดเสียงที่แตกต่างกันอย่างสิ้นเชิง แต่มันไม่สำคัญ) ดังนั้นเราจึงเพิ่มi[1]*7หมายเลขสตริงและนำโมดูโล 12:

n=(i[0]-3)%5+2+i[1]*7)%12

เราลบสิ่งนี้จาก 6 เพื่อรับตัวเลขในช่วง 6 ถึง -5 และค้นหาตัวอักษรในBEADGCF(Ruby อนุญาตให้ดัชนีลบล้อมรอบกลับไปยังจุดสิ้นสุดของอาร์เรย์) หากn>=7เราต้องการเพิ่ม#สัญลักษณ์เพื่อทำให้เอาต์พุตสมบูรณ์ .

โปรแกรมทดสอบ

f=->x{x.map{|i|"BEADGCF"[6-n=((i[0]-3)%5+2+i[1]*7)%12]+?#*(n/7)}}

z=[[6, 2, 3, 1, 4, 2, 3, 2, 2, 2, 6,5,2],[0, 1, 2, 3, 4 ,5 ,6 ,7, 8, 9, 10, 11, 12]].transpose

puts f[z]

เอาท์พุต

E
C
A
G
F#
E
C#
F#
G
G#
D
G#
B

3

C #, 131 ไบต์

string n(int[]s,int[]f){return string.Join(" ",s.Zip(f,(x,y)=>"E,F,F#,G,G#,A,A#,B,C,C#,D,D#".Split(',')[(7*x-7+y+(x<3?0:1))%12]));}

ป้อนข้อมูลสองรายการแยกกันสตริงจะขึ้นอยู่กับ 1


1
ยินดีต้อนรับสู่เว็บไซต์! คำตอบแรกที่ดี
DJMcMayhem

@DJMcMayhem: ขอบคุณ :-)
Taco

1

Clora , 55 ไบต์

@T[0,7,2,10,5,0,7]+N%12@T[,A,A#,B,C#,D,D#,E,F,F#,G,G#]!

คำอธิบาย

@ โหมดตัวเลข (อ่านอินพุตเป็นตัวเลข)

T[0,7,2,10,5,0,7] แปลงอินพุตโดยใช้อาร์เรย์, อาร์เรย์อดีต [อินพุต]

+N เพิ่ม N (ค่าอินพุตถัดไป) ไปยังอินพุตปัจจุบัน

%12 Modulo 12 ค่าอินพุตปัจจุบัน

@ ตั้งค่าสถานะโหมดตัวเลขออก

T[,A,A#,B,C#,D,D#,E,F,F#,G,G#] แปลอินพุตเป็นอาเรย์

! ใช้อินพุตเป็นค่าเอาต์พุต


1

Java 7 197, 163 ไบต์

void f(int[]s,int[]f){String[]l={"A","A#","B","C","C#","D","D#","E","F","F#","G","G#"};int[]d={0,7,2,10,5,0,7};int j=0;for(int i:s)out.print(l[(d[i]+f[j++])%12]);}

Ungolfed

  void f(int[]s,int[]f){
 String[]l={"A","A#","B","C","C#","D","D#","E","F","F#","G","G#"};
int[]d={0,7,2,10,5,0,7};
    int j=0;
    for(int i:s)
        out.print(l[(d[i]+f[j++])%12]);



}

0

Python 2, 94, 91 , 88 ไบต์

for s,f in input():print"A A# B C C# D D# E F F# G G#".split()[([7,2,10,5,0,7][s]+f)%12]

อาจมีการปรับปรุงที่ชัดเจนที่ต้องทำ อินพุตเป็นรายการของคู่และสตริงเป็น 0 ดัชนีเช่น:

[0, 4], [3, 2], [4, 6]...

0

Haskell, 83 82 ไบต์

zipWith$(!!).(`drop`cycle(words"A# B C C# D D# E F F# G G# A")).([6,1,9,4,11,6]!!)

รับรายการสตริงและรายการเฟร็ตทั้ง 0 ดัชนี ตัวอย่างการใช้งาน:

Prelude >  ( zipWith$(!!).(`drop`cycle$words"A# B C C# D D# E F F# G G# A").([6,1,9,4,11,6]!!) ) [0,1,2,3,4,5] [0,0,0,0,0,0]
["E","B","G","D","A","E"]

จากรายการที่ไม่มีที่สิ้นสุดของโน้ตที่ขึ้นต้นด้วยA#ให้ลดจำนวนโน้ตที่กำหนดโดยรายการ[6,1,9,4,11,6]ที่ดัชนีของสตริงและเลือกบันทึกที่ดัชนีของเฟร็ทจากรายการที่เหลือ


น่าเสียดายที่ช่วงเวลาระหว่างสตริงไม่เท่ากันทั้งหมด
Neil

@Neil: ... ได้รับการแก้ไข
nimi

มันกลายเป็นการแก้ไขง่ายๆใน JavaScript (s*7)+(s>2)- ดังนั้นตอนนี้ฉันก็ใช้มันในคำตอบของฉัน
Neil

@Neil: ... ทำงานกับมันด้วย
nimi

0

JavaScript (ES6), 82 81 ไบต์

a=>a.map(b=>(q=(b[0]+.3+b[1]*7.3|0)%12/1.7+10.3).toString(17)[0]+(q%1>.5?"#":""))

ฉันต้องการลองตอบคำถามคณิตศาสตร์ทั้งหมด แต่มันกลับกลายมาเป็นเวลานาน อาจจะมีวิธีในการเล่นกอล์ฟ ...

ตัวอย่างการทดสอบ


ฉันต้องการใช้toString(17)แต่พยายามดิ้นรนเพื่อให้ได้จำนวนไบต์ที่สมเหตุสมผล
Neil

0

PHP, 102 ไบต์

<?foreach($_GET[i]as$t)echo[E,F,"F#",G,"G#",A,"A#",B,C,"C#",D,"D#"][[0,7,3,10,5][$t[0]%5]+$t[1]%12]._;

อินพุตเป็นหลายอาร์เรย์ทั้ง 0 ขึ้นอยู่กับตัวอย่างเช่น '[[2,0], [5,3], [2,12], [3,8], [0,3]]'

ทางเลือกที่ดี 106 ไบต์เพื่อตั้งค่า # ตามmod 7 สอดคล้องกัน

<?foreach($_GET[i]as$t)echo EFFGGAABCCDD[$d=[0,7,3,10,5][$t[0]%5]+$t[1]%12].["","#"][$d%7?$d%7%2?0:1:0]._;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.