Terkait: Musik: ada apa di chord ini? , Catatan untuk Tablature , Membuat tab gitar? , Terjemahkan pasangan nomor ke catatan gitar
Diberi fingering gitar, mengeluarkan akor yang diwakilinya. Anda dapat menggunakan input dan output standar, atau menulis fungsi yang mengembalikan string.
Masukan jari akan dapat diklasifikasikan sebagai salah satu akord berikut, untuk dinyatakan sebagai berikut (jika catatan root adalah C):
- triad utama:
C
- triad kecil:
Cm
- (dominan) ketujuh:
C7
- ketujuh minor:
Cm7
Chord mungkin terbalik, jadi Anda tidak bisa mengandalkan nada terendah sebagai root. Anda juga tidak dapat mengandalkan ini sebagai penjarian yang mudah atau umum di dunia nyata. Secara umum, output program Anda harus mengabaikan oktaf nada, dan memperlakukan semua nada yang sesuai dengan not musik yang sama (yaitu, A
) sama.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Masukkan format
Input adalah serangkaian 6 nilai yang menunjukkan, untuk setiap string gitar 6-string dalam penyetelan standar (EADGBE), yang membuat fret string itu dimainkan. Bisa juga menunjukkan bahwa string tidak dimainkan sama sekali. Fret "nol" juga dikenal sebagai posisi terbuka, dan nomor fret dihitung dari sana. Asumsikan gitar memiliki 21 posisi fret, sehingga posisi fret tertinggi adalah angka 20.
Misalnya, input X 3 2 0 1 0
berarti menempatkan jari pada posisi berikut di bagian atas leher gitar:
(6th) |---|---|---|---|---
|-X-|---|---|---|---
|---|---|---|---|---
|---|-X-|---|---|---
|---|---|-X-|---|---
(1st) |---|---|---|---|---
dan memetik senar ke-2 sampai ke-6. Itu sesuai dengan tab ASCII ini :
e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|
Anda memiliki fleksibilitas dalam memilih jenis input yang Anda inginkan: setiap posisi fret dapat dinyatakan sebagai string, atau angka. Senar gitar yang tidak dimainkan biasanya ditandai dengan huruf X
, tetapi Anda dapat memilih nilai sentinel yang berbeda jika itu memudahkan Anda (seperti -1
jika Anda menggunakan angka). Rangkaian 6 posisi fret dapat dimasukkan sebagai daftar, larik, atau jenis urutan apa pun, string berpisah satu ruang, atau sebagai input standar — sekali lagi, pilihan Anda.
Anda dapat mengandalkan input yang sesuai dengan salah satu dari 4 jenis akor yang disebutkan di atas.
Tolong jelaskan dalam posting Anda bentuk input apa yang diambil oleh solusi Anda.
Format output
Anda harus kembali atau mencetak ke output standar string yang menggambarkan akord untuk fingering. Tali ini terdiri dari dua bagian yang disatukan. Huruf besar penting. Trailing whitespace diizinkan.
Bagian pertama menunjukkan catatan akar , salah A
, A#
/ Bb
, B
, C
, C#
/ Db
, D
, D#
/ Eb
, E
, F
, F#
/ Gb
, G
atau G#
/ Ab
. (Saya menggunakan #
bukan ♯
, dan b
bukan ♭
, untuk menghindari membutuhkan Unicode.) Catatan akar yang dapat dinyatakan tanpa tajam atau datar harus dinyatakan tanpa mereka (tidak pernah keluaran B#
, Fb
atau Dbb
); mereka yang tidak dapat harus diekspresikan dengan simbol tunggal tajam atau datar (yaitu salah satu C#
atau Db
, tetapi tidak pernah B##
). Dengan kata lain, Anda harus meminimalkan jumlah kecelakaan (benda tajam atau flat) dalam nama catatan itu.
Bagian kedua menunjukkan jenis akord, baik kosong untuk triad utama, m
untuk triad kecil, 7
untuk ketujuh yang dominan, atau m7
untuk ketujuh kecil. Jadi G mayor adalah keluaran hanya sebagai G
, sedangkan D♯ minor ketujuh bisa keluaran sebagai salah satu D#m7
atau Ebm7
. Lebih banyak contoh dapat ditemukan dalam kasus uji di akhir.
Teori & petunjuk
Not balok
Skala berwarna memiliki 12 nada per oktaf. Ketika disetel ke temperamen yang sama, masing-masing nada ini sama-sama jauh dari tetangganya 1 . Pitch dengan jarak 12 semitone (satu oktaf) dianggap not musik yang sama. Ini berarti kita dapat memperlakukan catatan seperti bilangan bulat modulo 12, dari 0 hingga 11. Tujuh di antaranya diberi nama huruf 2 dari A hingga G. Ini tidak cukup untuk memberi nama semua 12 nada, tetapi menambahkan perbaikan tidak disengaja itu: menambahkan ♯ ( tajam) ke not membuatnya semitone lebih tinggi, dan menambahkan ♭ (flat) menjadikannya semitone lebih rendah.
Akord
Chord adalah 2 atau lebih not yang dimainkan bersama. Jenis akor tergantung pada hubungan antar not, yang dapat ditentukan oleh jarak antara not. Akor memiliki catatan root, seperti yang disebutkan sebelumnya. Kami akan memperlakukan catatan root sebagai 0 dalam contoh-contoh ini, tetapi ini arbitrer, dan yang terpenting dalam tantangan ini adalah jarak antara catatan dalam modulo aritmatika. Akan selalu ada satu jenis akor unik untuk jawabannya, baik akor triad atau ketujuh . Catatan root tidak akan selalu menjadi nada dengan frekuensi terendah; pilih catatan root sedemikian rupa sehingga Anda dapat menggambarkan akor sebagai salah satu dari empat jenis akor berikut:
- Sebuah triad utama adalah akord dengan catatan
0 4 7
. - Sebuah triad minor adalah akord dengan catatan
0 3 7
. - Sebuah ketujuh dominan (atau besar / kecil) chord memiliki catatan
0 4 7 10
. - Sebuah minor (atau minor / minor) ketujuh chord memiliki catatan
0 3 7 10
. 3
Tuning gitar
Penyeteman standar pada gitar 6 senar dimulai dengan E pada senar terendah, dan kemudian mengenai nada pada interval 5, 5, 5, 4, kemudian 5 semitone menaiki senar. Mengambil E terendah sebagai 0, ini berarti memetik semua senar gitar memberi Anda nada bernomor 0 5 10 15 19 24
, yang modulo 12 setara dengan 0 5 10 3 7 0
, atau not E A D G B E
.
Contoh yang berhasil
Jika input Anda 0 2 2 0 0 0
, ini sesuai dengan catatan E B E G B E
, jadi hanya E, B, dan G. Ini membentuk akord Em
, yang dapat dilihat dengan memberi nomor dengan root sebagai E, memberi kami 0 3 7
. (Hasilnya akan sama untuk X 2 X 0 X 0
, atau 12 14 14 12 12 12
.)
Jika input Anda 4 4 6 4 6 4
, beri nomor dengan akar C♯ berikan 7 0 7 10 4 7
, atau 0 4 7 10
, jadi jawabannya adalah C#7
(atau Db7
). Jika sebaliknya 4 4 6 4 5 4
, penomoran akan memberi 7 0 7 10 3 7
, atau 0 3 7 10
, yang C#m7
(atau Dbm7
).
Uji kasus
X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)
0 2 2 1 0 0 ---> E
0 0 2 2 2 0 ---> A
X X 4 3 2 2 ---> F# (or Gb)
3 2 0 0 0 1 ---> G7
X X 0 2 1 1 ---> Dm7
3 3 5 5 5 3 ---> C
4 6 6 5 4 4 ---> G# (or Ab)
2 2 4 4 4 5 ---> B7
0 7 5 5 5 5 ---> Am7
7 6 4 4 X X ---> B
8 6 1 X 1 3 ---> Cm
8 8 10 10 9 8 --> Fm
0 19 5 16 8 7 --> Em
6 20 0 3 11 6 --> A# (or Bb)
X 14 9 1 16 X --> G#m (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20 --> Cm7
X 13 18 10 11 10 --> A#7 (or Bb7)
1 oleh logaritma frekuensi mereka
2 atau, dalam solfège , nama seperti do, re, mi . Dalam tantangan ini, gunakan nama surat.
3 Ini juga bisa disebut akor keenam utama, dengan pilihan catatan root yang berbeda. Dalam tantangan ini, sebut saja dengan nama ketujuh minor.
Jawaban:
MATL ,
115114 byteFormat input adalah
[N 3 2 0 1 0]
, di manaN
menunjukkan string yang tidak digunakan.String output selalu digunakan
#
, bukanb
.Cobalah online! Atau verifikasi semua kasus uji, dalam dua bagian untuk menghindari penghentian waktu kompilator online:
Penjelasan
sumber
File MS-DOS .COM (179 byte)
File (di sini ditampilkan sebagai HEX):
Input diberikan melalui baris perintah. Masukan yang tidak valid akan menyebabkan perilaku program tidak valid!
Kode assembler terlihat seperti ini:
Saya sudah melihat dua pemain piano bermain bersama "empat tangan" di atas piano.
Test case ini adalah pertama kali saya membaca tentang pemain gitar melakukan ini!
Bahkan dengan mengetuk tangan kanan Anda tidak dapat memainkan tali seperti ini!
sumber
Ruby, 129 byte
Sebagai versi sebelumnya tetapi menggunakan loop tunggal, dengan operator ternary untuk mengurutkan antara langkah parsing dan langkah output. Beberapa modifikasi kecil lainnya diperlukan untuk membuat pekerjaan ini.
Ruby, 136 byte
Fungsi Llamda menerima array 6 angka sebagai argumen dan output ke stdout. String yang tidak digunakan diwakili oleh nilai falsy (satu-satunya nilai falsy di ruby adalah
nil
danfalse
.)Penjelasan
Saya menggunakan representasi dari 12 nada berdasarkan lingkaran perlima . Ini berarti setiap nada diikuti oleh nada 7 semitone lebih tinggi (atau 5 semitone lebih rendah) memberikan urutan
F C G D A E B F# C# G# D# A#
. Ada 2 keuntungan untuk ini. Salah satunya adalah bahwa semua benda tajam muncul bersama. Yang lainnya adalah not senar terbuka dari senar bass 5 muncul bersamaan: GDAEB (gitarnya terkait tetapi sedikit lebih rumit, lihat di bawah).Loop pertama berjalan 6 kali. Ekspresi
6--~j%5
(ekuivalen6-(j+1)%5
) memberikan nilai-nilai catatan untuk senar terbuka:E=5 A=4 D=3 G=2 B=6 E=5
. Untuk ini kita menambahkan nomor fret dikalikan dengan 7 (seperti dapat dilihat di atas, menambahkan satu semitone menggerakkan kita 7 tempat ke depan dalam urutan.) Kemudian kita mengambil semuanya modulo 12 dan membuat bitmap dari catatan yang hadir (kita gunakan4097<<note value
untuk memberi 2 oktaf berturut-turut.)Setelah menyusun bitmap, kami siap mencari chord dan mengeluarkannya.
Kami tertarik pada catatan berikut:
Dimulai dengan memeriksa chord F, kami menguji untuk melihat apakah root dan kelima ada: bits 0 dan 1 (menghitung dari paling tidak signifikan: bit 1 dan 2). Untuk menolak chord keenam kita juga perlu memeriksa bahwa keenam tidak ada: bit 3 (bit 8.) jadi kami memeriksa itu
r&&11==3
dan jika demikian kami mencetak chord.Kami mengabaikan sepertiga utama, dan bergantung sepenuhnya pada bit 9 (minor ketiga) dan bit 10 (minor 7) untuk menentukan tipe chord. Ekspresi
r>>9&3
digunakan untuk memilih tipe akor yang benar dari array.Pada akhir loop, kita menggeser bitmap yang tepat bit
r/=2
untuk menguji akar akord mungkin dalam urutan:F C G D A E B F# C# G# D# A#
.Tidak terkurung dalam program uji
sumber
Javascript (ES6),
335333 byteSuka tantangan ini dan PPCG SE! Ini adalah golf pertama saya - saran diterima karena saya yakin itu bisa ditingkatkan banyak. (menjatuhkan 2 byte seperti yang saya sertakan f = dalam hitungan)
Function
f
mengambil array string, mewakili angka dan 'X', sepertif(['X','3','2','0','1','0'])
dan mengembalikan chord (alami atau tajam) sepertiE#m7
. Baris baru ditambahkan untuk kejelasan (tidak termasuk dalam jumlah byte)Contoh penggunaan:
Untuk menjalankan test case:
Versi tidak dikoleksi dengan penjelasan:
sumber