Dịch cặp số sang ghi chú guitar


18

Một sơ đồ cần đàn guitar trông như thế này:

  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

Như bạn có thể thấy, chuỗi đầu tiên (từ trên cùng) mở là một E. Băn khoăn đầu tiên trên chuỗi đầu tiên là một F. Băn khoăn thứ tư trên chuỗi thứ ba là a B. Lưu ý rằng ghi chú đầu tiên là băn khoăn zeroth, không phải đầu tiên.

Điều này có thể được viết với các số trên định dạng string, fret. Các chuỗi được đánh số từ 1 đến 6 từ trên xuống dưới. Các phím đàn được đánh số từ 0 đến 12 từ trái sang phải. Đầu tiên Elà do đó 1, 0. Một số ví dụ khác:

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

Thử thách:

Lấy Ncác cặp số ( sf) và xuất ra một chuỗi ghi chú phân cách.

  • Các đầu vào có thể là trên bất kỳ định dạng phù hợp. bộ dữ liệu, ma trận 2D, hai danh sách riêng biệt, một danh sách đan xen (chuỗi, băn khoăn, chuỗi, băn khoăn ...), v.v.
  • Âm đầu ra phải được tách riêng, nhưng dấu phân cách là tùy chọn (dấu phẩy, dấu cách, dấu gạch ngang ...). Đầu ra có thể ở dạng chữ hoa hoặc chữ thường.
  • s(đối với chuỗi) sẽ nằm trong phạm vi [1, 6](bạn có thể chọn để có 0 chỉ mục)
  • f (đối với băn khoăn) sẽ nằm trong phạm vi [0, 12]

Các trường hợp thử nghiệm và ví dụ:

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     

Chúc may mắn và chơi golf vui vẻ!


Không phải là một tay guitar (thực sự thậm chí không phải là một nhạc sĩ đàng hoàng), nhưng không có thiếu sót đáng kể nào ở đây, nếu bạn mong đợi đầu ra là những giai điệu dễ nhận biết? Đó là, thời lượng ghi chú - toàn bộ, một nửa, ghi chú quý, & c.
jamesqf

1
@jamesqf Không, nó hoàn toàn tốt miễn là bạn biết bài hát. Đây hiện là bài hát phổ biến nhất trên trang Ultimate-g Ức.com . Có một cái nhìn vào phần giới thiệu.
Stewie Griffin

Câu trả lời:


4

05AB1E , 48 47 43 40 byte

Sử dụng mã hóa CP-1252 .

Cả chuỗi và phím đàn đều dựa trên 0.

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

Giải trình

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

Hãy thử trực tuyến!

Đã lưu 7 byte nhờ Adnan


1
Khai thác lỗi là rất nhiều golf! .-)
Luis Mendo

"AA#BCC#DD#EFF#GG#"•7V3•3BS£thay vì "A A# B C C# D D# E F F# G G#"#là một vài byte ngắn hơn :).
Ad Nam

@Adnan: Ooh, thay đổi cơ sở tốt đẹp :)
Emigna

Ngoài ra, một phiên bản nén của "AA#BCC#DD#EFF#GG#"chuỗi: •™ÎÚ,Ülu•žh'#A«‡(vì chữ thường được cho phép: p).
Ad Nam

9

JavaScript (ES6), 79 70 byte

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

Yêu cầu chuỗi dựa trên 1. Chỉnh sửa: Đã lưu 9 byte bằng cách tính trực tiếp chuỗi để băn khoăn chuyển đổi, dựa trên câu trả lời cũ của @ nimi.


@Arnauld Cảm ơn nhưng cuối cùng tôi đã chiếm đoạt câu trả lời của @ nimi.
Neil

Thực sự hiệu quả hơn nhiều;)
Arnauld

Tài giỏi. câu trả lời rất lén lút
Rohan Jhunjhunwala

7

Mathicala, 62 byte (không cạnh tranh)

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

Các {24,19,15,10,5,0}E2đại diện cho các giai điệu chuỗi mở của sáu dây đàn guitar (ví dụ, chuỗi trên cùng là 24 nửa cung trên ghi chú E2). Không cạnh tranh vì nó không in tên của các ghi chú. Nó chơi chuỗi các ghi chú! (chỉ khi bạn có Mathicala, thật không may) Ví dụ:

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

chơi 4 thanh mở đầu từ Canon của Pachelbel. (tương đương với Canon của Pachelbel như tôi có thể chịu được)


7

MATL , 48 47 45 byte

Cảm ơn @Emigna đã sửa lỗi về định dạng đầu vào.

Guitar và mã golf ... Tôi phải trả lời bài này!

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

Định dạng đầu vào là: một mảng của chuỗi (dựa trên 1), sau đó là một mảng các phím (dựa trên 0).

Hãy thử trực tuyến!

Giải trình

Một số tính năng ngôn ngữ được sử dụng trong câu trả lời này:

  • Một chuỗi được tự động chuyển đổi thành một mảng số điểm mã ASCII khi một số phép toán số học được áp dụng cho chuỗi đó.
  • Các hoạt động số học làm việc yếu tố khôn ngoan , tức là véc tơ. Vì vậy, phép trừ của một chuỗi và một mảng số có cùng kích thước sẽ tạo ra một mảng với phép trừ của các mục tương ứng.
  • Lập chỉ mục là dựa trên 1 và mô-đun .
  • Một mảng ô giống như một danh sách trong các ngôn ngữ khác. Nó có thể chứa các yếu tố tùy ý, có thể là các mảng có kích cỡ hoặc kích cỡ khác nhau. Ở đây, một mảng ô sẽ được sử dụng để lưu trữ các chuỗi có độ dài khác nhau (tên của ghi chú).

Mã nhận xét:

'$)-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
Tôi biết rằng tôi sẽ tìm thấy câu trả lời từ bạn ngay khi tôi thấy từ "Guitar"
Suever

1
@LuisMendo Rất đẹp! Tôi thích thủ thuật chỉ số 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;}

Ung dung:

  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 byte

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

Lấy số là string fretcặp trên stdin và xuất ghi chú sau mỗi cặp. Ví dụ:

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

3

Ruby, 63 byte

lấy một mảng các mảng 2 phần tử, theo thứ tự [string,fret].

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

Giải trình

Trong điều chỉnh tiêu chuẩn, guitar là một trong số ít các nhạc cụ có dây (cúi hoặc băn khoăn) có khoảng cách không nhất quán giữa các dây của nó. Hầu hết đều có khoảng cách 5 nửa cung nhất quán giữa tất cả các cặp chuỗi liền kề ("thứ tư") hoặc khoảng 7 nửa cung nhất quán giữa tất cả các cặp chuỗi liền kề ("thứ năm") Chúng tương ứng với tỷ lệ tần số 3: 4 và 2: 3 tương ứng, và chỉ quan trọng thứ hai sau "quãng tám" với tỷ lệ tần số 1: 2.

Đàn guitar có khoảng thời gian chủ yếu là 5 nửa cung. Nếu nó có 5 trong số này thì nó sẽ có sự khác biệt 25 nửa cung giữa chuỗi thứ 1 và thứ 6. Thay vào đó, khoảng thời gian giữa chuỗi thứ 2 và thứ 3 giảm xuống còn 4 nửa cung, tạo ra sự khác biệt 24 nửa cung (2 quãng tám) sẽ tốt hơn khi chơi hợp âm.

Điều này gây bất tiện cho chương trình, vì vậy chúng tôi bắt đầu bằng cách thay đổi ngữ điệu ghi-ta 1 chỉ số thành ngữ điệu 5-bass-bass 0 được lập chỉ mục, có tất cả các khoảng 5 nửa cung:

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

Tiếp theo, chúng tôi thêm 2 và điều chỉnh âm trầm 12 chuỗi hư cấu, với ngữ điệu của các chuỗi mở như sau, và tất cả các khoảng là 5 nửa âm (12 "bass" đều tồn tại nhưng tôi không chắc có nhiều âm với chính xác điều này điều chỉnh.)

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

Có thể thấy, tất cả các vật sắc nhọn được nhóm lại với nhau. Mô hình này có thể được lặp đi lặp lại quảng cáo vô hạn. Nó được gọi là "vòng tròn thứ năm" và là nền tảng của thang âm nhạc phương Tây (với một chút điều chỉnh điều chỉnh, vòng tròn có thể bị đóng do thực tế là (3/2)**122**7là những con số rất giống nhau.

Bây giờ chúng ta đối phó với tham số băn khoăn. Không giống như nhiều câu trả lời khác ở đây, dịch tham số chuỗi thành một số phím, tôi dịch tham số băn khoăn thành một số chuỗi. Trong bảng trên có thể thấy rằng việc thêm 7 vào số chuỗi sẽ đặt chúng ta vào một chuỗi có tên ghi chú cao hơn một nửa. (Đó là trong một quãng tám hoàn toàn khác nhưng điều đó không quan trọng.) Vì vậy, chúng tôi thêm i[1]*7vào số chuỗi và lấy nó theo modulo 12:

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

Chúng tôi trừ số này từ 6 để lấy một số trong phạm vi 6 đến -5 và tìm kiếm chữ cái trong BEADGCF(Ruby cho phép các chỉ số phủ định bao quanh trở lại đến cuối mảng.) Nếu n>=7chúng ta cần thêm một #biểu tượng để hoàn thành đầu ra .

Chương trình kiểm tra

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]

Đầu ra

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

3

C #, 131 byte

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

Nhập hai danh sách riêng biệt, chuỗi là 1 dựa.


1
Chào mừng đến với trang web! Câu trả lời đầu tiên tốt đẹp.
DJMcMayhem

@DJMcMayhem: Cảm ơn bạn :-)
Taco

1

Clora , 55 byte

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

Giải trình

@ chế độ số (đọc đầu vào dưới dạng số)

T[0,7,2,10,5,0,7] Chuyển đổi đầu vào bằng cách sử dụng mảng, mảng cũ [Đầu vào]

+N Thêm N (Giá trị đầu vào tiếp theo) vào Đầu vào hiện tại

%12 Modulo 12 giá trị đầu vào hiện tại

@ Tắt cờ chế độ số

T[,A,A#,B,C#,D,D#,E,F,F#,G,G#] Dịch đầu vào thành một mảng

! Sử dụng đầu vào làm giá trị đầu ra


1

Java 7 197, 163 byte

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

Ung dung

  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 byte

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]

Có lẽ có một số cải tiến rõ ràng được thực hiện. Đầu vào là danh sách các cặp và các chuỗi được lập chỉ mục 0, ví dụ:

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

0

Haskell, 83 82 byte

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

Đưa ra một danh sách các chuỗi và một danh sách các phím, cả hai được lập chỉ mục 0. Ví dụ sử dụng:

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"]

Từ danh sách vô hạn các ghi chú bắt đầu bằng A#, bỏ số lượng ghi chú được đưa ra bởi danh sách [6,1,9,4,11,6]tại chỉ mục của chuỗi và chọn ghi chú tại chỉ mục của băn khoăn từ danh sách còn lại.


Thật không may, các khoảng giữa các chuỗi không phải là tất cả bằng nhau.
Neil

@Neil: ... đã sửa.
nimi

Nó hóa ra là một sửa chữa đơn giản trong JavaScript - (s*7)+(s>2)- vì vậy bây giờ tôi đang sử dụng nó trong câu trả lời của mình.
Neil

@Neil: ... cũng đang làm việc đó.
nimi

0

JavaScript (ES6), 82 81 byte

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

Tôi muốn thử một câu trả lời toán học, nhưng nó hơi dài. Có lẽ có một cách để chơi golf ...

Kiểm tra đoạn


Tôi muốn sử dụng toString(17)nhưng đấu tranh để có được nó trong một số lượng byte hợp lý.
Neil

0

PHP, 102 byte

<?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]._;

Nhập dưới dạng nhiều mảng cả 0 dựa trên ví dụ '[[2,0], [5,3], [2,12], [3,8], [0,3]]'

Đẹp thay thế 106 Byte để đặt # dựa trên mod 7 đồng dư

<?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]._;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.