Standart bir piyanoda 88 tuş ve 95 basılabilir ascii karakter vardır (onaltılık kodlar 20 ila 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('karakter' bundan sonra yazdırılabilir ASCII karakterini ifade eder)
Gelen bu JSFiddle bunu yararlandı ve kullanma piyano melodileri üretir basit bir sözdizimi yaptık AudioSynth . (Biri beni bağlanabilir bir gerçek piyano nota sesleri grubuna yönlendirebilirse minnettar olacağım.)
Ayrıca giriş dizesindeki her karakter () 01+-
bir piyano tuşuna karşılık gelir:
CHARACTER: ! " # $ % & ' * , . / 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
KEY NUMBER: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
NOTE: A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C C# D D# E F F# G G# A A# B C
OCTAVE: 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 8
Bu yüzden , JSFiddle'da görebileceğiniz önceden ayarlanmış zamanlama parametrelerini kullanarak Mary Had'in Küçük Bir KuzuRPNPRRR
ilk 7 notunu çalar.
Boşluk ( ), bir nota aralığına dayanan müzikal dinlenmeyi temsil eder. Böylece
RPNPRRR PPP RUU
, Mary'nin Küçük Bir Kuzinin ilk 13 notasını çalıyor ve uygun yerlerde duruyor.
Herhangi bir karakter yanı sıra halinde ()01
bir dizi öneki 0
'in ve 1
' nin (normal ifade [01]+
), bu dizi, bir ikili sayı olarak okunur b ve karakter ile değiştirilir b kendisinin bir kopya. Böylece 101A11 10+1-0B01C
olur AAAAA ++-C
çünkü 101
= 5, 11
= 3, vs. ( dizgenin sonundaki ' 0
ve 1
' dizilerinin etkisi yoktur.)
Eşleşen parantezler ( ()
) iki amaca hizmet eder:
- İçerik varsa gelmez bir dizi ile sona
0
'ler ve1
' ler, bütün notları (Aksi bir not farksız) bir akor ile aynı anda oynanır. Öyleyse oktav 4'teki(NQU)
bir C küçük akor var
. Yani(NN)
ve(NNN)
farklı geliyor. - İçerik ise yapar bir dizisi ile son
0
sitesindeki ve1
sitesindeki, bu dizi, bir ikili sayı olarak okunur b ve parantez ve içeriği ile değiştirilir b içeriği kopya. Yani(NQU11)
9 ayrı notlar haline gelir:NQUNQUNQU
.
Parantez Detayları:
- Yuvalama çoğaltma parantezleri (amaç 2) gayet iyi:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Yinelenmeyen parantezlerin iç içe geçmesi (amaç 1) gayet iyi ancak etkisiz:
(A((+)C))
aynı(A+C)
. - İkisini de birleştirebilirsiniz:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Yinelenmeyen parantezlerden önceki
0
's ve1
s ' dizileri, ayrı ayrı karakterlerin tekrarlandığı şekilde onları tekrar eder. Böylece10(NQU)
olur(NQU)(NQU)
. - Dizisi
0
'nin ve1
parantez replike etkisizdir önce' s. (
her zaman bir eşleşmeye sahip olmalı)
, ancak tersi olmamalıdır: örneğinN)
geçerlidir.
Artı ( +
) ve eksi ( -
) sırasıyla içeriğine bağlı olarak notların süresini veya notlar arasındaki zaman aralığını artırır ve azaltır :
- Zaman içinde parantez replike olmayan, hemen artırmak veya milisaniye (bakınız, bazı önceden belirlenmiş sayısına göre nota değişken azaltmak JSFiddle ). Bu yüzden normalden daha uzun bir süre
(++)N
oynayacakN
. - Zaman dış parantez replike olmayan, artırmak veya milisaniye önceden belirlenmiş bazı sayısına göre (ve her bir takip eden zaman aralığında) sonraki not başlangıcı ve not arasındaki aralığı azaltmaktadır. Yani içinde
++NP
arasındaki aralıkN
veP
her zamankinden daha uzundur.
Notların süresi ve aralarındaki zaman aralığı 0'ın altına düşemez.
Meydan okuma
Kasten () 01+-
7 özel karakter olmayı seçtim çünkü birçok bağlamda birçok programlama dilinde masumca yerleştirilebilirler.
Göreviniz, kod JSFiddle'da giriş dizesi olarak kullanıldığında en iyi sondaj ayarını üreten 512 bayt veya daha kısa bir yazı yazmaktır .
4 aralık / süre parametresi için herhangi bir başlangıç değerini (negatif tamsayı olmayan) seçebilirsiniz, ancak ayarınız 10 dakikadan fazla sürmemelidir. Ayrıca, ayarınızın belirli bir enstrümanda en iyi şekilde ses çıkardığını bize bildirmelisiniz.
kurallar
- Kodunuzda yalnızca sekmelere, yeni satırlara ve yazdırılabilir ASCII'ye izin verilir. Yazdırılamayan tüm ASCII, ayar oluşturucu tarafından dikkate alınmaz.
- Çıktı bir dosyaya veya stdout'a veya en yakın alternatife gidebilir (örn. JS uyarısı). Giriş yok.
- Kaynak kodu okunmadı. Gerçek bir yüzgeç olmalı.
- Bitişik 3 kaynak karakterin herhangi birinin kaldırılması , programın artık görevsiz kalmasını sağlamalıdır. Bu, insanların bir dizgede iyi bir şarkı yazmamasını sağlamak ve daha sonra çıktısını almak için küçük bir kuyruk kısmına sahip olmasını sağlamaktır.
- Programınız olsaydı Yani
MYCODE
o zamanMYC
,MYE
,MDE
veODE
tüm quines olmamalı (bunlar hata ya da başka bir çıktı üretir olabilir).
- Programınız olsaydı Yani
Bu bir popülerlik yarışması, en yüksek oyu alan cevap kazandı.
Güncelleme: Rahat son kural.