Memasukkan
Simbol dari setiap akord triadik (lihat http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Keluaran
Nada-nada itu merupakan akor yang diberikan.
Contohnya
Input: AM
Keluaran:A C# E
Input: C#m
Keluaran:C# E G#
Input: Db+
Keluaran:C# F A
Input: C0
Keluaran:C D# F#
Bonus
-50 jika Anda juga bisa menangani akord ketujuh
-150 untuk benar-benar memainkan suara akord
-150 untuk menggunakan karakter yang dapat dicetak untuk menunjukkan cara memainkan akor pada piano; contoh untuk AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 untuk menggunakan karakter yang dapat dicetak untuk menunjukkan cara memainkan chord pada gitar; contoh untuk AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(lihat https://en.wikipedia.org/wiki/Box-drawing_character )
Aturan
Hasilnya harus berupa program atau skrip baris perintah.
Input dan output dapat dalam bentuk apa saja, asalkan mengikuti standar notasi musik.
Representasi gitar atau piano dianggap valid jika dan hanya jika itu berisi tiga (triadik) atau empat (ketujuh) catatan yang diperlukan dan tidak ada yang lain. Catatan yang sama dapat ditampilkan beberapa kali dalam chord.
Pustaka eksternal tidak diperbolehkan, kecuali untuk generasi suara (dalam hal ini
#include
,import
... arahan tidak ditambahkan ke jumlah karakter).Ini golf kode, kode terpendek menang!
Sedikit teori musik ...
Dalam musik nada barat modern, setiap oktaf dibuat dari dua belas not berturut-turut, sering dicatat:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
Atau:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
Dalam sistem ini, kami menganggap bahwa dua not berurutan (misalnya A
dan A#
, atau E
dan F
) dipisahkan oleh satu semiton. Juga, catatan-catatan itu semacam "perulangan": yang segera menyusul G#
adalah A
.
Sebuah akor dibentuk oleh beberapa (2, 3, 4, kadang-kadang lebih) catatan bahwa "terdengar bagus bersama". Misalnya, akord triadik berisi tiga not yang berbeda, dan akord ketujuh berisi empat not yang berbeda.
Mari kita mendefinisikan empat akord triadik sebagai:
Triad utama : berisi akar akor (dalam pertanyaan ini, catatan diberikan sebagai input), sepertiga utama untuk root (4 semitones lebih tinggi dari root), dan kelima sempurna untuk root (7 semitones lebih tinggi dari root ); ini bisa dilambangkan 0-4-7
Triad kecil , dilambangkan 0-3-7
Triad augmented , disimbolkan 0-4-8
Triad berkurang , disimbolkan 0-3-6
Jadi misalnya, jika Anda ingin membuat C triad utama , mencatat C
, CM
, Cmaj
, Anda akan membutuhkan tiga mencatat:
- 0: root , dalam hal ini a
C
- 4: sepertiga minor , 4 semiton lebih tinggi dari root; itu sebuah
E
- 7: kelima sempurna , 7 semiton lebih tinggi dari root: a
G
Ini adalah apa yang 0-4-7
, 0-3-7
, 0-4-8
dan 0-3-6
notasi yang digunakan di atas rata-rata! Untuk akord ketujuh, gunakan pola berikut:
Itu untuk hari ini! Sekarang, buat saya takjub dengan kode luar biasa ... Jika Anda memiliki pertanyaan, tambahkan beberapa komentar di bawah.
Db+
apakahDb F A
tidak ada D # atau G di sana. Itu mungkin sedikit lebih banyak teori daripada yang diperlukan, formula adalah bagian penting. Jika Anda benar-benar ingin memasukkan semua delapan dari chord ketujuh yang terdaftar di wikipedia Anda harus menentukan input. Saya menganggap output ascii-art dari piano dan gitar fleksibel.Jawaban:
BBC BASIC
Emulator di bbcbasic.co.uk
Rev 1, 340 - 150 keyboard - 150 bermain = 40
Ini versi terbaru, di mana saya berhasil memasukkan perangkat tambahan berikut sambil memperpanjang hanya dengan beberapa karakter.
Input dapat diedit dengan nyaman di layar sebelum menekan kembali (saya menggunakan GET $ sebelum untuk mendapatkan penekanan tombol tunggal, karena BBC Basic tidak membiarkan Anda mengakses satu karakter dari string seolah-olah string itu array. Sekarang saya menggunakan yang agak fungsi MID $ besar untuk mengekstraksi string satu karakter dari dalam string.
Kedua sisi keyboard ditampilkan serta garis penuh antara E dan F.
Untuk mengimbangi karakter yang ditambahkan oleh di atas, saya menata ulang program untuk menghilangkan pernyataan cetak yang tidak perlu, dan menghapus beberapa ruang putih yang pada pandangan pertama sepertinya tidak bisa dihapus. DI BBC Basic semua fungsi bawaan adalah kata-kata yang dicadangkan, dan Anda dapat meletakkan nama variabel tepat di depannya tanpa ada spasi di antaranya. Nama variabel tidak diizinkan untuk memulai dengan kata yang dipesan. Untuk membuat program kurang membingungkan untuk dibaca, saya mengubah semua variabel menjadi huruf kecil.
Meskipun presentasi terlihat jauh lebih baik, program berikut ini sebenarnya
sudah sepenuhnya golf.(Lihat koreksi di bawah.) Umumnya baris baru dan titik dua dapat dipertukarkan, kecuali ketika pernyataan IF digunakan. Dalam hal ini semua pernyataan pada baris yang sama (dipisahkan oleh titik dua) dengan dijalankan secara kondisional. Pernyataan setelah baris baru tidak dikendalikan oleh IF dan akan selalu dieksekusi.Program rev 1 340 karakter
KOREKSI: BBC BASIC dari RT Russell memungkinkan Anda untuk menghilangkan beberapa baris baru dan titik dua, sehingga totalnya menjadi 327, lihat di bawah. Itu juga menandai kata kunci menjadi karakter tunggal sebelum menyimpan, membawanya ke 279.
Output rev 1
Rev 0, 337 - 150 keyboard - 150 bermain = 37Ini adalah konsep yang mirip dengan jawaban Arduino saya, tetapi saya selalu tahu saya bisa mengalahkan jumlah byte itu dengan dasar BBC. Hanya mengenali benda tajam, tetapi menganggap B # tidak valid, Anda harus meletakkan C. Ini bisa diperbaiki jika itu benar-benar dianggap penting.
Saya meninggalkan ide gitar dan berkonsentrasi pada peningkatan keyboard. Sekarang berjalan dari C ke B, dan saya telah menambahkan di sisi kiri keyboard dan garis antara E dan F. Itu harganya 28 karakter. Sisi kanan tidak akan lebih.
Inilah beberapa contoh output, akor A # yang berkurang (yang memiliki suara yang cukup aneh dalam inversi ini) dan akord B besar. Perhatikan bahwa input tidak digaungkan ke layar. Sesuai jawaban Arduino, putar layar berlawanan arah jarum jam untuk melihat.
Versi tidak disatukan
sumber
Seperti yang Anda tahu, saya tidak mencoba bermain golf sama sekali. Saya seorang pecandu musik, dan kesayangan saya adalah ketika orang-orang menulis sesuatu menggunakan enharmonics yang salah (mis. Mengatakan bahwa akor C yang berkurang adalah CD # F # daripada C Eb Gb), jadi saya menulis program ini yang mendapatkan enharmonics kanan. Itu melakukannya dengan mewakili setiap nada sebagai jumlah perlima sempurna di atas F.
Untuk apa nilainya, jika Anda ingin membedakan enharmonics, setiap interval musik dapat diwakili dengan baik dalam program komputer sebagai sejumlah perlima sempurna dan sejumlah oktaf. Sebagai tambahan keempat, misalnya, adalah 6 perlima sempurna dan -3 oktaf, dan kelima berkurang adalah -6 perlima sempurna dan 4 oktaf.
Haskell, 441 karakter
Beberapa contoh doa:
sumber
Arduino
Input / output dikirim ke / diterima dari Arduino melalui port COM. Seorang pengguna dapat berinteraksi dengan ini melalui terminal, atau monitor serial di Arduino IDE. Seperti yang mungkin sudah Anda tebak dari platform pilihan saya, saya berencana untuk memasukkan permainan akor yang sebenarnya (meskipun saya belum melakukannya.)
Saya telah menangani bonus keyboard dengan sukses, dan saya telah mencoba untuk menangani gitar, dengan keberhasilan yang terbatas.
Kotak akor masuk pada 130 byte, yang terlalu lama untuk sia-sia. Karena itu saya telah mencoba cara lain, hanya mencetak nomor fret Tab style. Saat ini 81 byte untuk bonus 81-100 = -19. Jika pendekatan ini dianggap valid, saya dapat mencoba dan memperbaikinya.
Akor yang digunakan adalah semua bentuk tipe-D dengan akar pada string ke-2, kelima pada string ke-3, dan ketiga pada string ke-1 dan ke-4. Senar ke-5 dan ke-6 tidak digunakan dan saya menandainya dengan tanda X di sebelah kanan kotak akor (sebelah kiri akan lebih biasa, tetapi contoh yang ditandai di sebelah kanan dapat ditemukan.)
Karena program menganggap F sebagai not terendah (untuk kompatibilitas dengan keyboard sambil menghindari fret yang terlalu tinggi dengan bentuk chord ini) chord tertinggi adalah E (dengan root pada fret ke-17.) Lihat contoh output.
Keyboard lebih sukses dalam hal bermain golf. Ini berjalan dari FE daripada CB untuk alasan yang dijelaskan di atas. Ini harus dilihat dengan memutar layar 90% berlawanan arah jarum jam, ketika Anda dapat dengan jelas melihat garis besar catatan hitam, dan demarkasi antara catatan putih dengan
---
. Garis antara B dan C dapat diperpanjang dengan beberapa____
untuk beberapa byte lagi.Saya akan mencoba memainkan not selanjutnya. Ini akan menarik karena, walaupun saya percaya Arduino Uno memiliki 3 timer internal, hanya satu not pada satu waktu dapat dimainkan menggunakan perintah nada bawaan. Ada fungsi perpustakaan eksternal yang menggunakan semua pengatur waktu perangkat keras (yang akan mengacaukan serial, tetapi toh itu tidak diperlukan pada tahap itu.) Atau saya dapat mencoba menghasilkan nada dalam softare.
Jika saya berhasil dengan itu, saya akan menurunkannya tetapi saya tidak berpikir itu akan menjadi pemenang secara keseluruhan.
Kode tidak dikunci
Output sampel Semakin rendah jarak antar baris teks, semakin baik tampilannya. Oleh karena itu terlihat hebat ketika saya benar-benar mengedit posting, tetapi mengerikan di kotak abu-abu setelah posting. Alih-alih, saya telah memasang tangkapan layar monitor serial Arduino yang merupakan penspasian garis menengah (dan karenanya kualitas tampilan.)
sumber
Python3 - 315 char
Pertama kali dalam codegolf! Hanya mendukung akord minor, mayor, diperkecil, dan ditambah saat ini.
sumber
'C C# D D# E F F# G G# A A# B'.split(' ')
alih-alih array literal Anda untuk menyimpan beberapa byte.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 karakter lebih sedikit untuk setiap pernyataan. Mengubahy
kerange()
ekspresi juga menghemat sesuatu. Selamat datang! (dan ingat bahwa baris baru juga termasuk;))'C C# D D# E F F# G G# A A# B'.split()
;)y
to store[1,2,4,5,6]
, mengapa Anda tidak langsung melewatiy
dan mengganti baris 4 denganfor i in[1,2,4,5,6]:
? Bagaimanapun, selamat datang di codegolf dan saya harap Anda bersenang-senang di sini.Python 506 (unicode as 1 char) -150 (sound) -150 (keyboard) = 206
Untuk memutar suara, ia menggunakan
pygame.midi
. Perhatikan bahwapygame.midi.get_default_output_id()
metode ini tidak berfungsi dengan baik. Jadi Anda dapat mencoba mengubah bariso=Output(get_default_output_id())
untuko=Output(1)
,o=Output(2)
, dll Biasanya nilai yang benar adalah antara 0 dan 5.Hasil
sumber
J - 82 char
Mandiri, dibaca dari input konsol. Jika Anda memerlukan stdin, ubah final
1
menjadi a3
. Tidak mengklaim bonus, dan hanya mencakup triad.Alih-alih nada tajam misalnya
C#
Anda harus menggunakan nama datar yang setaraDb
. (Memperbaiki untuk ini akan mengembang kode lebih dari sedikit.) Keempat jenis akor adalah0
untuk mengurangi,m
untuk minor,M
untuk mayor, dan+
untuk ditambah.Logikanya adalah sebagai berikut: kami menggunakan karakter terakhir untuk menambahkan offset ke basis 0-3-6, yang memilih jenis ketiga dan kelima. Sementara itu, kami menggunakan catatan untuk menemukan di mana dalam skala untuk menarik catatan. The
;:
baik membuat catatan kompatibel dengan pengindeksan ke skala di awal, dan kemudian (oleh&.
) ternyata catatan ditarik ke ruang string dipisahkan.Contoh penggunaan:
sumber
Javascript, 224 char
Ini golf kode pertamaku. Saya pikir ini bisa lebih pendek, tetapi saya tidak dapat menemukan byte untuk disimpan.
Mendukung besar,
m
untuk minor,0
untuk berkurang,+
untuk ditambah, atau 37 lebih byte untukdim
,aug
.sumber
n[m]==0
bisa dengan sederhana!n[m]
. Hal yang sama berlaku di tempat lain. Total Anda dapat memotong 6 karakter dengan mudah .n
adalah string,n[m]==0
akan dilemparkan0
ke"0"
, sehingga sama dengann[m]=="0"
."0" == 0
itu benar, tetapi!"0"
salah.AM
. Saya mungkin salah juga.Python (
143134 karakter)Tantangan golf pertama saya :), tidak tahu apakah beberapa byte lagi dapat dicukur.
Notasi yang digunakan di sini adalah * aug / + maj /, min / - redup
Saya layak mendapat poin bonus karena memiliki konstanta 42 dalam kode: P
sumber
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Python 3: 257 - 150 = 107
Hanya 25 karakter terlalu lama untuk mengalahkan solusi J! Baiklah. Ada beberapa ide bagus di sini, saya pikir.
Input seperti contoh, meskipun Anda harus menggunakan nama yang tajam dan bukan nama datar. (mis. Gb harus F #)
Keluaran adalah satu oktaf piano, terlihat dari atas dan ke kiri, dengan nama nada ditumpangkan. Seharusnya hanya hamparan kecil imajinasi.
sumber
CM
, kita harus bisa membacaC E G
...bool(R)
denganR|0
?bool(R)
1 (benar) jika tidak kosong, dan 0 (salah) jika kosong. The|
Operator tidak bekerja dengan daftar ...Scala 537 karakter - 50
sumber
Haskell, 273 karakter
Hasil
sumber