Có 88 phím trên đàn piano tiêu chuẩn và 95 ký tự ascii có thể in được (mã hex 20 đến 7E):
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
('Ký tự' đề cập đến bất kỳ ký tự ASCII có thể in nào từ đây về sau)
Trong JSFiddle này, tôi đã tận dụng điều đó và tạo một cú pháp đơn giản để tạo ra các giai điệu piano bằng AudioSynth . (Nếu bất cứ ai có thể hướng tôi đến một tập hợp các âm thanh ghi chú piano thực sự có thể liên kết, tôi sẽ rất biết ơn.)
Mỗi ký tự trong chuỗi đầu vào bên cạnh () 01+-
tương ứng với một phím đàn piano:
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
Vì vậy, hãy RPNPRRR
chơi 7 nốt đầu tiên của Mary Had a Little Lamb bằng cách sử dụng các tham số thời gian định sẵn mà bạn có thể thấy trong JSFiddle.
Space ( ) đại diện cho phần còn lại âm nhạc kéo dài trong một khoảng thời gian ghi chú. Vì vậy,
RPNPRRR PPP RUU
chơi 13 nốt đầu tiên của Mary Had a Little Lamb với phần còn lại ở những nơi thích hợp.
Nếu bất kỳ ký tự nào bên cạnh ()01
được tiền tố bởi một chuỗi 0
'và 1
(regex [01]+
), thì chuỗi đó được đọc dưới dạng số nhị phân b và ký tự được thay thế bằng b bản sao của chính nó. Vì vậy, 101A11 10+1-0B01C
trở thành AAAAA ++-C
bởi vì 101
= 5, 11
= 3, v.v. (Một chuỗi 0
's và 1
' ở cuối chuỗi không có hiệu lực.)
Các dấu ngoặc đơn ( ()
) phục vụ hai mục đích:
- Nếu nội dung của chúng không kết thúc bằng một chuỗi
0
's và1
', tất cả các nốt được phát cùng lúc với một hợp âm (nếu không thì không khác gì một nốt). Vì vậy,(NQU)
một hợp âm C nhỏ trên quãng tám 4.
Nếu có các nốt trùng lặp, âm thanh của chúng cũng bị trùng lặp. Vì vậy(NN)
và(NNN)
âm thanh khác nhau. - Nếu nội dung của họ không kết thúc với một chuỗi các
0
's và1
' s, chuỗi được đọc như một số nhị phân b , và các dấu ngoặc đơn và nội dung của họ được thay thế bằng b bản sao của nội dung. Vì vậy,(NQU11)
trở thành 9 ghi chú cá nhân :NQUNQUNQU
.
Chi tiết dấu ngoặc đơn:
- Các dấu ngoặc lặp lồng nhau (mục đích 2) là tốt:
(N(QU10)11)
→(NQUQU11)
→NQUQUNQUQUNQUQU
. - Các dấu ngoặc đơn không sao chép lồng nhau (mục đích 1) là tốt nhưng không có tác dụng:
(A((+)C))
giống như(A+C)
. - Bạn cũng có thể kết hợp cả hai:
((N(QU10))11)
→(NQUQU)(NQUQU)(NQUQU)
. - Một chuỗi
0
's và1
' s trước không sao chép ngoặc lặp đi lặp lại chúng trong cùng một cách nhân vật cá nhân được lặp đi lặp lại. Vì vậy,10(NQU)
trở thành(NQU)(NQU)
. - Một chuỗi các
0
dấu và1
trước khi sao chép dấu ngoặc đơn không có hiệu lực. (
phải luôn có kết quả khớp)
, nhưng không phải ngược lại: vdN)
là hợp lệ.
Cộng ( +
) và trừ ( -
) tương ứng tăng và giảm thời lượng của ghi chú hoặc khoảng thời gian giữa các ghi chú, tùy thuộc vào ngữ cảnh của chúng:
- Khi bên trong dấu ngoặc đơn không sao chép, chúng ngay lập tức tăng hoặc giảm biến thời lượng ghi chú theo một số mili giây đặt trước (xem JSFiddle ). Vì vậy,
(++)N
sẽ chơiN
với thời gian dài hơn bình thường. - Khi bên ngoài dấu ngoặc đơn không sao chép, chúng tăng hoặc giảm khoảng giữa thời điểm bắt đầu của ghi chú tiếp theo và ghi chú sau nó (và mỗi khoảng tiếp theo) theo một số mili giây đặt trước. Vì vậy, trong
++NP
khoảng giữaN
vàP
dài hơn bình thường.
Thời lượng của ghi chú và khoảng thời gian giữa chúng không thể giảm xuống dưới 0.
Thử thách
Tôi cố tình chọn () 01+-
trở thành 7 nhân vật đặc biệt bởi vì chúng có thể được đặt một cách vô hại trong nhiều bối cảnh trong nhiều ngôn ngữ lập trình.
Nhiệm vụ của bạn là viết một quine trong 512 byte hoặc ít hơn để tạo ra giai điệu âm thanh tốt nhất khi chính mã được sử dụng làm chuỗi đầu vào trong JSFiddle .
Bạn có thể chọn bất kỳ giá trị ban đầu nào (số nguyên không âm) cho 4 tham số khoảng thời gian / thời lượng, nhưng giai điệu của bạn không được kéo dài quá 10 phút. Bạn cũng nên cho chúng tôi biết nếu giai điệu của bạn nghe tốt nhất trong một nhạc cụ cụ thể.
Quy tắc
- Chỉ các tab, dòng mới và có thể in-ASCII được cho phép trong mã của bạn. Tất cả ASCII không thể in được bỏ qua bởi người tạo giai điệu.
- Đầu ra có thể đi đến một tệp hoặc thiết bị xuất chuẩn hoặc thay thế gần nhất (ví dụ: cảnh báo JS). Không có đầu vào.
- Không đọc mã nguồn. Nó phải là một quine thực sự.
- Việc loại bỏ 3 ký tự nguồn liền kề phải làm cho chương trình không còn hoạt động như một quine. Điều này là để đảm bảo mọi người không viết một bài hát hay trong một chuỗi sau đó có một phần nhỏ để tạo ra nó.
- Vì vậy, nếu chương trình của bạn là
MYCODE
sau đóMYC
,MYE
,MDE
, vàODE
nên tất cả không quines (họ có thể lỗi hoặc đầu ra cái gì khác).
- Vì vậy, nếu chương trình của bạn là
Đây là một cuộc thi phổ biến, câu trả lời được bình chọn cao nhất chiến thắng.
Cập nhật: Thư giãn quy tắc cuối cùng.