The Dichotomy Major-Minor


15

Đưa ra một danh sách các hợp âm gắn nhãn chúng là 'Major' hoặc 'Minor'.

Đầu vào

Đầu vào sẽ là một danh sách các hợp âm, mỗi hợp âm trên một dòng, được tạo thành từ 3 nốt nhạc cách nhau bởi một khoảng trắng. Mỗi ghi chú sẽ bao gồm tên ghi chú bằng chữ hoa ( A- G) và một sự tình cờ tùy chọn ( #hoặc b). Hợp âm có thể trong bất kỳ đảo ngược (tức là các ghi chú có thể theo thứ tự bất kỳ).

Đầu ra

Nếu hợp âm là chính, hãy xuất 'Major'. Nếu hợp âm là nhỏ, hãy xuất 'Minor'. Nếu hợp âm không phải là chính cũng không phải phụ, hãy xuất một dòng trống.

Thí dụ

Đầu vào

C E G
F Ab C
C Eb Gb
E G B
Db F Ab
Bb G D
D A Gb

Đầu ra

Major
Minor

Minor
Major
Minor
Major

Kiểm tra kịch bản

Như trong một số câu hỏi trước đây của tôi, một lần nữa tôi đã tìm hiểu một số tập lệnh kiểm tra do JoeyVentero tạo ra để cung cấp một số trường hợp kiểm tra cho câu hỏi này:

Sử dụng: ./test [your program and its arguments]

Phần thưởng

Mỗi mục mà tôi có thể xác minh đáp ứng thông số kỹ thuật, vượt qua các bài kiểm tra và rõ ràng đã có một số nỗ lực chơi gôn sẽ nhận được một upvote từ tôi (vì vậy vui lòng cung cấp hướng dẫn sử dụng với câu trả lời của bạn). Giải pháp ngắn nhất vào cuối ngày 13/10/2012 sẽ được chấp nhận là người chiến thắng.

Một chút lý thuyết

Đối với những bạn không có kiến ​​thức về lý thuyết âm nhạc, đây là thông tin đủ để bạn có thể cạnh tranh.

Một hợp âm chính hoặc phụ được tạo thành từ ba nốt được phân tách bằng một mẫu bán kết cụ thể. Nếu chúng ta coi gốc (nốt dưới) của hợp âm là 0, thì hợp âm chính là mẫu 0-4-7 và hợp âm phụ là mẫu 0-3-7. Mọi thứ trở nên khó xử hơn bởi thực tế là một số ghi chú cách nhau một nửa và một số khác cách nhau. Sự lan truyền của semitones từ Ab- G#như sau:

G#/Ab A A#/Bb B/Cb B#/C C#/Db D D#/Eb E/Fb E#/F F#/Gb G G#/Ab
  0   1   2    3     4    5   6   7    8     9    10  11  12

G#/Abcó nghĩa đó G#là cùng một lưu ý như Ab. Từ đó chúng ta có thể thấy rằng hợp âm Ab C Eblà một hợp âm chính, và đó Ab Cb Eblà thứ yếu.

Làm phức tạp vấn đề hơn nữa, các hợp âm Eb Cb Abđược coi là giống như Ab Cb Eb, Cb Eb AbCb Ab Ebvân vân. Mỗi một trong những biến thể này vẫn là một hợp âm nhỏ.


2
Tôi nghĩ rằng người kiểm tra bash của bạn cần đầu vào và câu trả lời mong đợi được hoán đổi.
flodel

@flodel Vâng, bạn nói đúng. Xin lỗi về điều đó, tôi đã sửa nó ngay bây giờ. Tôi sẽ cần kiểm tra xem tập lệnh kiểm tra Powershell cũng không có vấn đề tương tự.
Gareth

Câu trả lời:


3

GolfScript, 83 ký tự

n%{' '%{1\{'A#BC D EF G'?+}/.}%$(+2/{~- 12%}%.(+.(+]$0=.$]10,7>?'MMaijnoorr

'>2%}%

Đây là một giải pháp đầu tiên nhanh chóng; Tôi chắc chắn rằng điều này có thể được chơi golf hơn nữa. Vượt qua bộ kiểm tra bash, sau khi sửa lỗi được chỉ ra bởi flodel trong các bình luận.

Chỉnh sửa 1: Đã lưu 5 ký tự với cách ngắn hơn để nhận ra các mẫu hợp âm chính và phụ được hợp quy hóa.

Chỉnh sửa 2: Đã lưu thêm 2 ký tự với mã hóa đầu ra nhỏ gọn hơn lấy cảm hứng từ giải pháp của grc. (Cảm ơn!) Là một hiệu ứng phụ, mã hiện in thêm một dòng trống sau đầu ra, nhưng khai thác thử nghiệm dường như chấp nhận điều đó, vì vậy tôi đoán nó ổn. :)

Đây là cách nó hoạt động:

  • Vòng lặp bên ngoài n%{ }%n*chỉ phân chia đầu vào thành các dòng, chạy mã bên trong dấu ngoặc cho mỗi dòng và nối các kết quả với dòng mới.

  • ' '%chia mỗi dòng thành một mảng các ghi chú. Đối với mỗi ghi chú 1\{'A#BC D EF G'?+}/đó , sau đó chuyển đổi ghi chú đó thành số nửa cung bằng cách tìm kiếm từng ký tự của nó trong chuỗi 'A#BC D EF G'và thêm các vị trí (sẽ là -1 cho bất kỳ ký tự nào không tìm thấy trong chuỗi, đáng chú ý bao gồm b). (Tôi chắc chắn tôi đã thấy thủ thuật này được sử dụng trước đây.) Cuối cùng, các .bản sao của mỗi số, do đó, ở cuối vòng lặp, ví dụ: đầu vào F Ab Cđã được chuyển thành [9 9 0 0 4 4].

  • Sau đó, chúng tôi sắp xếp các ghi chú với $, di chuyển ghi chú đầu tiên đến cuối cùng (+và chia mảng thành các cặp với nhau 2/, để bây giờ nó trông giống như [[9 0] [0 4] [4 9]]. Sau đó {~- 12%}%ánh xạ từng cặp ghi chú vào modulo 12 khác biệt của nó, biến mảng ví dụ của chúng ta thành [9 8 7].

  • Tiếp theo, .(+tạo một bản sao của mảng và xoay các phần tử của nó còn lại bởi một vị trí. Chúng tôi làm điều này hai lần và thu thập các bản sao thành một mảng ], để ví dụ của chúng tôi bây giờ trông như thế [[9 8 7] [8 7 9] [7 9 8]].

  • Sau đó, chúng tôi sắp xếp mảng mảng này với $và lấy phần tử đầu tiên - trong trường hợp này [7 9 8]- với 0=. Sau đó, chúng tôi tạo một bản sao của mảng này ( .), sắp xếp nó ( $), thu thập cả mảng chưa được sắp xếp và mảng chưa được sắp xếp vào một mảng khác của mảng ( ]) và tìm kiếm sự xuất hiện đầu tiên của mảng [7 8 9](được viết là 10,7>để lưu hai ký tự ) trong đó.

  • Điều này mang lại cho chúng ta 0(nếu mảng chưa được sắp xếp là [7 8 9], và do đó hợp âm là chính), 1(nếu mảng chưa được sắp xếp là một hoán vị [7 8 9], trong đó, cho rằng phần tử đầu tiên của nó phải nhỏ nhất, chỉ có thể là [7 9 8], làm cho hợp âm phụ) hoặc -1(nếu ngay cả mảng được sắp xếp không bằng nhau [7 8 9]).

  • Số này sau đó được sử dụng làm chỉ mục bắt đầu vào chuỗi "MMaijnoorr\n\n"(trong đó \ns được đưa ra dưới dạng dòng thực tế trong mã), từ đó chúng ta lấy ký tự đó và mỗi giây tiếp theo làm đầu ra. Nếu chỉ số là -1, chúng ta bắt đầu từ ký tự cuối cùng của chuỗi, đây chỉ là một nguồn cấp dữ liệu.


Giải thích tốt đẹp. Tôi gặp khó khăn tương tự mà tôi luôn gặp phải với GolfScript - Tôi có thể gọi nó một dòng tại một thời điểm để kiểm tra echo "G# B# Eb" | ruby golfscript.rb ilmari.gsnhưng làm cách nào để chạy tập lệnh thử nghiệm trên nó? Tôi đã thử ./test ruby golfscript.rb ilmari.gsnhưng nó không có cái nào cả. (Tôi đã cho bạn +1 vì rõ ràng nó hoạt động, nhưng tôi chỉ tò mò)
Gareth

1
@Gareth: Có vẻ như đó là một lỗi trong tập lệnh bash test - nó không xử lý nhiều đối số đúng. Để khắc phục, thay thế args="$@"bằng args=("$@")got=$("$cmd" "$args")bằnggot=$("$cmd" "${args[@]}") . (Hoặc chỉ thực hiện golfscript.rbvà chạy nó như ./test ./golfscript.rb chords.gs.)
Ilmari Karonen

4

Con trăn, 160

f='A#BC D EF G3453543'.find
try:
 while 1:x,y,z=sorted(map(lambda x:f(x[0])+f(x[1:])+1,raw_input().split()));print'MMianjoorrr'[f(`y-x`+`z-y`)/14:-1:2]
except: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.