Mozart golf - mini“ Rondo”


13

เอาต์พุต "Mozart - Alla Turca" ถึง stdout (ดูตัวอย่างสำหรับ "การใช้งานอ้างอิง")

พยายามหาวิธีที่จะบรรจุทั้งซินธิไซเซอร์และเพลงให้มีขนาดเล็กที่สุด

ที่ต้องการ:

  • รูปแบบที่เหมาะสมสำหรับการป้อนเข้าaplay -f cd(ลงชื่อ endian น้อย 16 บิต 2 ช่อง);
  • ควรเล่นเพลงทั้งหมด (ไม่มีโน้ตหรือชิ้นส่วนที่ถูกข้ามอย่างน้อยที่สุดไม่น้อยกว่าในโปรแกรมตัวอย่าง) ไม่จำเป็นต้องมีรูปหลายเหลี่ยม
  • ไม่สามารถเพียงแค่โทร/usr/bin/timidity, /usr/bin/soxหรือสิ่งที่ต้องการ (เช่นต้องมีการติดตั้งโมดูลเพลงพิเศษ);
  • ไม่สามารถเข้าถึงเครือข่ายหรือสมมติว่าเพลงมีให้ใช้งานในเครื่อง

"การใช้การอ้างอิง" พร้อมคะแนนแบบแยกวิเคราะห์: https://gist.github.com/vi/5478693
(ตัวอย่างโปรแกรม Perl เก่า: https://gist.github.com/vi/5447962 )


คุณมีลิงค์ไปยังแผ่นเพลงหรือไม่?
beary605

ไม่ขณะนี้ฉันกำลังพิมพ์โปรแกรมตัวอย่างโดยการฟังและลองผิดลองถูก กำลังมองหา ...
Vi

ตัวอย่างเช่นนี้
วิ

นอกจากนี้ฉันคิดว่าคุณรู้แล้ว แต่ทุกคนจะใช้คลื่นสี่เหลี่ยม
Peter Taylor

2
หมายเหตุ: การจัดเรียงคะแนนที่เชื่อมโยงนั้นค่อนข้างไร้ประโยชน์สำหรับทุกคนที่พยายามใช้งานด้วยเสียงเดียว ฉันดาวน์โหลดไฟล์ MIDI หลายชนิดแล้วและพวกเขาไม่เห็นด้วยกับบันทึกย่อทั้งหมด - พวกเขาอาจอยู่ในคีย์เดียวกัน แต่ไม่เห็นด้วยกับบางโน้ตด้วย 4 semitones! เพื่อให้เป็นปัญหาที่ระบุไว้อย่างดีจริงๆแล้วมันจำเป็นต้องมีคะแนนมาตรฐานซึ่งเป็นที่ยอมรับ (โดยเฉพาะในรูปแบบการแจงอย่างง่ายดายบางส่วนเพื่อให้ผู้ใช้งานสามารถแปลงเป็นรูปแบบที่สะดวกสำหรับการใช้งาน
Peter Taylor

คำตอบ:


11

โพลีโฟนิค, Haskell, 2826 3177 4719

เอาต์พุตเสียง: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg

คุณสมบัติ:

  • บันทึกทั้งหมด จากทางด้านขวามือ ฉันสามารถเพิ่มมือซ้ายได้แน่นอน (ทำอย่างนั้น)
  • เสียงที่เปล่งออกมาอย่างเหมาะสมของโน้ต staccato เป็นต้น
  • เสียงที่ดีพอสมควรพร้อมการเปลี่ยนแปลง ไม่ใช่เพียงแค่การปรับระดับเสียงอย่างง่าย แต่ปรับเปลี่ยนลักษณะการโจมตีและเนื้อหาเสียงที่เหมาะสมเหมือนที่คุณได้จากเปียโนจริงที่จริงแล้วค่อนข้างมากกว่า ... เฮ้งานชิ้นนี้น่าจะเลียนแบบวง Janissary ของตุรกีใช่ไหม?
  • พัดโบก ไม่ฟังดูยอดเยี่ยมอย่างน่าอัศจรรย์ แต่ก็ไม่ได้แย่เกินไปเช่นกัน
  • การบีบอัดแบบไดนามิก อย่าถาม ...
  • การลดทอนของเอาต์พุต นี่เป็นเรื่องที่ไร้สาระ: ด้วยความละเอียด 16 บิตที่เหมาะสมใคร ๆ ก็แทบจะไม่ได้ยินสิ่งประดิษฐ์ quantisation แต่เพื่อหลีกเลี่ยงการรวมไลบรารีไบนารีฉันใช้ความละเอียด 7 บิตอย่างมีประสิทธิภาพเท่านั้นซึ่งฉันสามารถครอบคลุมด้วยเอาต์พุต ASCII ตัวโก่งเองนั้นค่อนข้างดังไม่มีเสียงรบกวน ...
  • การคำนวณแบบหลายเธรดของคอร์ดโพลีโฟนิค

import Control.Parallel
main=mapM_ (\(d,s)->(\p->p>>p>>p>>p).putChar.toEnum.round.(+d).(*62).min 2.abs$s+1).zip(dθ 1).lim.rev.hgp 9. pl 9e6 (\_->0) . ä
 $[mT%8.1,t2%16.1,t3(∡7)%8,t4%8,t5%16,t3(∡7)%8,mT%8.1,t2%16.1,t3(tev arp8)%8,cdT%99] >>= \e->[e,e]
mM=ä[2-^8,1-^8,0-^8,1-^8,3-^4]
cM=ä[7-^20,8-^20,9.^4,F[(7,0),(6,1)](map((∡2).(.^4))[6,5,6])%0.75]
cMv=ä[10-^2,8.^4,9.^4,hom(.^4)[[24,5],[23,8,12],[22,4],[21,6,9],[22,3],[19,5,8],[20,4],[18,6,9],[17]]#7&(-14)%2.5,tr 2%0.4,1-^9,2-^12,1-^1]%4.5
 ⋎(ä[6-^4,lp(8.^4∡3)%(3/4),sil%2,lp(5.^4∡3)%h,lp(5.^4∡2)%h,1-^1∡7]&(-14)#7#4%5)
mMa f=ä[(1-3*f).^4,lp(5.^4∡(-2-f))%0.75,mMa f%1.5,mMa(f*2)%h,mMa f%1]#7
mTm=ä[mM%1,mM&2%1,mM#4&4%h,mM&7%h,mM&7%1,8.^4,ä[10.^4]%0.2,cM%1,cM%1,cM%0.85,ä[4.^4∡2,5.^2]#6#4%2]#7
mT=p$ä[mTm%8.1⋎(ä[sil%h,mMa 0%4,mMa 1%2.75,2.^4,(-2)-^2]&(-7)%8)]
m2=ä[ä(map((∡2).(.^4))[1,2,3,3]++[es[6,5,4,3]%h]++[0-^2∡2])%2
 ⋎(ä[sil%h,1.^4,8.^4,3.^4,10.^4,5-^2]⊿1.3&(-14)%2)]
t2=p$ä[m2&2%1.8,0-^5,m2&2%2,m2#7%1.8,(-2)-^5,m2#7%2,mT%3.5,cMv]
m3=ä$[3-^4,4-^4,5-^2]++map(-^4)[3,4,5,4,3,2,1,2,3,4,2,0]
m3a=ä[(ä[sil%(1/8),lp(8.^4)%1]:zw(\d n->ä[sil%(d/24),n-^1]⊿cos d)[0..][1,3,5],s),m3a%1]
m3ra=(map((%1). \[a,b,c]->es[a,c,b,c,a,c,b,c])[[1,3,5],[1,4,6],[-2,0,5]]!!)
t3 o=ä[ä[o$ḋ[m3%4,m3%2.5,1-^4,4-^4,2-^4,0-^4]&(-2)%7.5,1-^2∡7]%8
 ⋎(ḋ[sil%(3/8),m3a&4%2,m3a%h,m3a#4%h,m3a&1%1,m3a&4%2,m3a%h,m3a&1%(5/8),5-^2]&(-18)%8)]
mQ=es[2,1,0,2]
m4=mM⇆4
i4 e=ḋ[m4⇅11%h,m4⇅9%h,mQ⇆4⇅8%h,F[(5,e),(4,1)][mQ⇅7%h,mQ⇅5%h,m4&5%h,m4&7%h]%2,es[10,9,10,9]#2%h ]
mla[b,c,d]=ä[b-^4,lp(c-^4⋎(d-^4))%1]%1
i4a=ḋ[sil%h,ä(map mla[[1,3,5],[2,4,5],[1,3,5],[0,2,5]])#5%4,ä(map mla[[1,3,5],[2,5,7],[2,6,8]])#4%3,5-^2⋎(7-^2)]
t4=p$ä[ḋ[i4 1%4,i4 0%2.5,ä[mQ⇅6%h,mQ⇅4%h]#4#2%1,3-^2]%8⋎(i4a&(-9)%8)]
mlaa=mla[1,3,5]
m5=ä$map(-^8)[1..4]
i5=ḋ[m5⇅6%h,m5%h,m5&4%h,m5⇅9%h]
i5d=hom(-^4)[[2],[4,5],[0],[4,5]]%1
i5a=ḋ[sil%h,mlaa,i5d,mlaa,mla[-2,0,4],mlaa,i5d,sq 4[1,-1,-3,-2,-6,1]%2]&(-7)
t5=ḋ[ḋ[i5%2,i5%1.5,ä[8-^4,9-^4]#1%h,i5%2,ḋ[es[5,4,3,2,3,5,1,3,2,4,0,2]%2]%1.5,1-^2]%8⋎(i5a%8)
 ,p(ä[ä[i4 1%4,es[3,2,3,1,4,3,4,3,4,3,4,3]#2#1&7%1.5,m5⇅13%h,mQ⇅8%h,m5&7%(3/8),6-^8,mQ⇅7#5%h,6-^2]%8
 ⋎(ä[i4a%3.5,F[(1,-1),(7,0),(6,1)][hom(-^4)[[-2],[3,5],[2,5],[1,5]]%1]%1,mla[-3,1,4],mla[-3,2,4],hom(-^4)[[-2],[1,3],[-2],[2,4],[1,3]]%1.5]&(-9)%8)])%8]⊿0.8
am d=3-^d∡2∡5
amf=1-^υ∡2⋎(5-^1∡3)
vh v(c,d)=lp(ä[v-^12]:map(\t->ä[t⊿0%0.04,t%d])c,d)
aam=vh 11.am
aar=ä[1-^10,4-^10,6-^1]&4
eam=vh 10.em
dm=6-^1∡2⋎(11-^1)
em d=5-^d∡2⋎(9-^1)
cdM=ḋ[4-^8,3-^8,2.^8,3.^8,cdM%1]
cdT=ḋ[ä[3-^(8/3)∡7,10-^6,am 1,am 1,cdM&7%1,dm,aam 4.05%1,em(4/3),12-^4,am 1,am 1,cdM&7%1,dm,aam 1%1,eam 4%1]%12.5⋎(ä(sil%(11/24) : map((%1).(m3a&))[4,4,4,0,4,1,4,4,4,0,4,1])&(-18)%13.1)
 ,p(ä[ä[ä[8-^2]⊿2%h,aar%(3/8),10-^8,aar%1,aar%1,cdM&7%1,11-^1,vh 11(10-^4)%1,9-^(4/3)]%7⋎(ä(map m3ra[0,0,0,0,1,0,2])&(-7)%7)])%6.75
 ,ä[p(ä[12-^4])%(1/4),am 1,am 1,cdM&7%1,dm,aam 1%1,eam 4%1,amf,ä[3-^4,1-^υ,5-^4,1-^υ,3-^4,1-^4,3-^4,1-^4,5-^4,1-^2]%3.75∡7,ä[amf∡(-14)]%0.56,ä[amf∡(-14)]⊿0.8%1]%12⋎(ä(sil%(1/8):map((%1).(m3a&))[4,4,4,0,4,1,4,4,4]++[m3a&4%h,m3a&4%h,5-^(8/5)])&(-18)%12)]
type D=Double
data F=N Int D|F[(Int,D)][([F],D)]
φ⇸F a fs=F a$map(\(f,d)->(map φ f,d))fs
_⇸N i d=N i d
i##c
 |i<1=(i+7)##c/2
 |i>7=(i-7)##c*2
 |1>0=1.06**(c i+case i of{1->0;3->3;4->5;5->7;6->8;7->10;_->fri i})
pl dur acc(N n v)=(\ω η->map(sin.(\x->x+τ x^2/η). \i->v*exp(-i*η/s)*τ(i*v)*(0.8-τ((i-dur)/90))*sin(i*ω))[1..dur])(n##acc/15.5).exp$fri n/9
pl dur acc(F accm fs)=pl' dur (foldr(\(q,m)f i->if q==i then m else f i)acc accm) fs
pl' dur _ _|dur<=0 = []
pl' dur _ []=map(\_->0)[1..dur]
pl' dur acc((f,dr):fs)|n<-min dr dur=trans(round n)(foldr1(\a b->sum a`par`sum b`pseq`zw(+)a b)(map(pl(n+99)acc)f))$pl'(dur-dr)acc fs
trans n a b|(f,ol)<-splitAt n a,(or,l)<-splitAt 99 b=f++zw(+)ol or++l
fri=fromIntegral
F a fs#q=F((q,1):a)fs
N i d&n=N(n+i)d
f&n=(&n)⇸f
N i d⇅n=N(n-i)d
f⇅n=(⇅n)⇸f
N i d⇆_=N i d
F a fs⇆n=F a.reverse$take n fs
N i d⊿v=N i$d*v
f⊿v=(⊿v)⇸f
p=(⊿0.3)
n.^q=([F[][([N n 1],s/2/q)]],s/q)
n-^q=([N n 1],s/q)
(l,d)⋎(r,_)=(l++r,d)
(l,d)∡j=(l++map(\h->ä[h⊿0%0.01,h&j%100])l,d)
f%t=([f],s*t)
tr n=F[]$cycle[n-^15,(n+1)-^20]
ä=F[];ḋ=F$zip[6,3,7][1,1,1]
lp=ä.repeat
sil=N 0 0
tev f(l,d)=(map f l,d)
h=1/2
υ=4/3
s=4e+4
sq d=ä.map(-^d)
es=sq 8 
arp8 n@(N i v)=F[][([n,ä[n⊿0%(1/8),n&7⊿(v/υ)%100]],s)]
arp8 f=arp8⇸f
hom q=ä.map(foldr((⋎).q)$sil%1)
dθ l=2*asin l/pi:dθ(abs.sin$l*1e+9)
rev ls=(\z->z id(foldr(\m sg->(\v->z(*v)(map(*0)[0..m*14349]++sg)sg)$abs(cos$(m*3)^2)-0.6)ls.take 9$dθ 1)ls)$(.lwp 3 0).zw.((+).)
lwp ω c(x:l)=c:lwp ω((x+c*ω)/(ω+1))l
lwp _ _ _=[]
hgp ω l=zw(-)l$lwp ω 0 l
lime e(x:l)
 |abs(e*x)>1,e'<-((e*8+abs(1/x))/9)=e':lime e' l
 |1>0=e:lime((e*49999+1)/5e4)l
lime _[]=[]
lim ls=zw(\a u->τ$a/9+max(-2)(min 2$a*u)/6)(map(*0)[0..500]++ls).lwp 9 0.lime 1$hgp 9 ls
zw=zipWith
τ=tanh

$ make
ghc -o bin / def0-hs def0.hs -O2 -fllvm - เธรด
[1 จาก 1] คอมไพล์หน้าหลัก (def0.hs, def0.o) การ
เชื่อมโยง bin / def0-hs ...
เวลา sh -c 'bin / def0-HS + RTS -N4> hsoutp.pcm'
189.39user 138.41system 2: 06.62elapsed 258% CPU (0avgtext + 0avgdata 6440240maxresident) k
0inputs + 0outputs (0major + 403037minor) pagefaults 0swaps
ffmpeg -loglevel ตกใจ -y -f s16le -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


นี่เป็นรุ่น ungolfed บางส่วนและการแสดงความคิดเห็น: https://gist.github.com/leftaroundabout/5517198


พยายามได้ดี. 2970 UTF-8 ไบต์, 2826 รหัสจุด เนื่องจากไม่ใช่คู่แข่งสำหรับเวอร์ชัน <600 python จึงน่าจะเหมาะกับรุ่นที่ดีกว่าของ sound / polyphony (ทำให้มีขนาดต่ำกว่า 5,000 ไบต์)
วิ

1
@Vi หากคุณพิจารณาว่า "ความยาวของโปรแกรม" จำนวนไบต์เมื่อเข้ารหัส UTF-8 แล้วฉันคิดว่าคุณควรระบุไว้ในคำถาม เพียงเพื่อให้ชัดเจนตั้งแต่บางคนไม่ได้ใช้คำนิยามนี้ (เช่นโปรแกรมเมอร์ทุก APL ... )
Bakuriu

@Bakuriu ใช่ใช่ฮ่า ๆ
Soham Chowdhury

นั่นเป็นบ้า! ฉันชอบที่จะได้รับความคิดว่าโปรแกรมนี้ทำงานอย่างไร
shiona

@shiona: จริงๆแล้วมันไม่ได้ทำให้งงงวยกับลายเซ็นประเภทมันควรจะง่ายพอที่จะเข้าใจสำหรับทุกคนที่คุ้นเคยกับ Haskell และ DSP พื้นฐาน
หยุดที่จะหมุนกลับใน

7

Python, 331 + 286 = 617 (0.548 ไบต์ต่อโน้ต)

โซลูชันของฉันใช้ไฟล์ข้อมูลและสคริปต์หลาม ไฟล์ข้อมูลควรใช้เป็นอินพุตไปยังสคริปต์ ฉันไม่ได้เล่น aplay แต่จะทำงานเมื่อฉันนำเข้าเป็นข้อมูลดิบในAudacityด้วย PCM 16 บิตที่ได้รับการลงนามเล็ก ๆ น้อย ๆ และ 2 ช่อง

ไฟล์ข้อมูลคือ 331 ไบต์ นี่คือสคริปต์ python ที่ให้ผลลัพธ์:

import sys
sys.stdout.write('\x08\x1c\x9d\xb9"\xc7\xea\xf0\xb7)\xc0D!u\x0bB~\'\x91S\xb2\x0c\xe9\xf8T;\xfd\xc13\xcf\xb9\xa6r>\xbc\xc5\xb4\xbb\xf8\xa4\x9a\x05H\xa0\x1d\x0eIq\t\\+\t\xdbn\x03\xc3&\x98\xa0\x11\xc5\xaa\xef\xbcSR^\x13\xe7\xc7\x0e\xc0\xa9^\x91Z\xfc\x02\x11\xb9\x1bE\xfc/=\xb8\xaf5<\x12\xa2\xc4\x02\xec\xdcO\xc2a\x04<Q\xfd\xe9L\xbc\xab%\xf5wX1F\xa6\x88\xddP\xfec(_#\xb4\x0bN\xba&m\xe3\xa4\x08Q\xdb\xd9\xf3<Q\xc6\xf6\x0e\xd7\xacd\x1f"g\xce\xae.\xb0\x90{|\x04\xc5X\xe6x>\xefE\xc8\xb0\xd2?N\x83?\x04\x86"a\xcc\x9b\x8fq\x9c\xce\xa2\xb6f\x9ab\x92\x9e:\xc0S\xcd\th\xb1\x87\xecT\x9d\xf4\n\xaf\xc9$`E5\xcc\xc5\xa0m\xcc\n8\xf8:\x03\xf5\x02H\xf3k\xe5\x86\xa64\x90\xa2\xc2w\xfa\xb7\xc0\x1e*2\x93\xca\x12\xe3^!\xd5yQ,LXW\xb4\x96D\x8dB\x9c`\xbf\x96`s;\xb7}\xeb\x8c\xebI\xa0o\x00\x08\xfe\xf1\xd2M3}\x8e\xd0\xda\x97\'\xca\x83-\x14\xda\xa1ET\n\xe8\xc7@\x1c\xa2a\xbb\xa7\x1b\x014\xdcz\xc7\xa6\xc4\x1d\x18\x04\r\xb1\x9e\xe3\xd0\x18<\x98`N?a\xe4\x8e\x9d\xd5\r\xe7Z[\xf4\xed\xf1PQ')

นี่คือสคริปต์หลาม:

import sys
k=0
m=185
p=[]
q=[]
for c in sys.stdin.read():k=k*256+ord(c)
while k:
    v=k%m;k/=m
    if v<184:q+=[v]
    elif v-m+1:q+=p[v-184]
    else:m+=1;p+=[q];q=[]
for n in q:r=[1,2,3,4,6,8,12,15,16][n%9]*2000;sys.stdout.write(''.join(chr(int(i*1.06**(n/9)/4.3)%99)for i in range(r*3))+'\0'*r)

หมายเหตุ: หากคุณใช้ Windows ให้ใช้-uสวิตช์สำหรับทั้งสคริปต์เนื่องจาก stdin และ stdout กำลังจัดการกับข้อมูลไบนารี


ทำได้ดีมาก พิจารณา 331 + 286 + 10 (สำหรับการรวมไฟล์และสคริปต์) == 627.
Vi

คุณสามารถร่นบิตใช้แทนos.read/write sys.stdin/stdout
Bakuriu

+50 สำหรับรูปแบบการบีบอัดที่สวยงาม การใช้วิธีการที่อิงกับไวยากรณ์โดยไม่ต้องเข้ารหัสเอนโทรปีฉันไม่สามารถรับค่าย่อนั้นได้โดยไม่คำนึงถึงความยาว
Peter Taylor

คุณอธิบายวิธีบีบอัดข้อมูลได้อย่างไร ฉันสนใจที่จะรู้ว่าคุณมีขนาดเล็กแค่ไหน
Sir_Lagsalot

1
@Sir_Lagsalot: โดยทั่วไปแล้วมันเป็นพจนานุกรมซ้อน / เรียกซ้ำคือคุณมีลวดลายที่ประกอบด้วยโน้ต (ระยะห่างและความยาวที่เข้ารหัสเป็นตัวเลข) จากนั้นคุณมีธีมที่มีลวดลายเหล่านี้และ / หรือโน้ตเดี่ยวจากนั้นส่วนที่ประกอบด้วยธีม ฯลฯ โปรแกรมของฉันใช้หลักการเดียวกันเป็นหลัก (ขยายโดย transpositions, inversions และอื่น ๆ ) เพียงแค่ไม่บีบอัดลงในไฟล์ไบนารีที่แน่นเกินไป ฉันทำคำจำกัดความตัวแปรระดับบนสุดทุกอย่างแทน
หยุดหมุนทวนเข็มนาฬิกา

4

GolfScript (129 + 369 = 498 ไบต์)

ทั้งไฟล์โปรแกรมและข้อมูลมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นฉันจะให้การแทน Base64 และ xxd

โปรแกรม (129 ไบต์):

MjU2YmFzZSA2OWJhc2VbMDpOXS8oNDMse1xbMSQpXS9cMiQ9Kn0vXCwpey19KyUuLDIvL3ppcHt+
TisyNSU6Tid7goqSm6SuuMPP2+j2/0FFSU1SV1xcYWdtdCc9OmY7MTc2MCosey41MD4qZioxNy8u
Li59JScnOm4rcHV0c30v

0000000: 3235 3662 6173 6520 3639 6261 7365 5b30  256base 69base[0
0000010: 3a4e 5d2f 2834 332c 7b5c 5b31 2429 5d2f  :N]/(43,{\[1$)]/
0000020: 5c32 243d 2a7d 2f5c 2c29 7b2d 7d2b 252e  \2$=*}/\,){-}+%.
0000030: 2c32 2f2f 7a69 707b 7e4e 2b32 3525 3a4e  ,2//zip{~N+25%:N
0000040: 277b 828a 929b a4ae b8c3 cfdb e8f6 ff41  '{.............A
0000050: 4549 4d52 575c 5c61 676d 7427 3d3a 663b  EIMRW\\agmt'=:f;
0000060: 3137 3630 2a2c 7b2e 3530 3e2a 662a 3137  1760*,{.50>*f*17
0000070: 2f2e 2e2e 7d25 2727 3a6e 2b70 7574 737d  /...}%'':n+puts}
0000080: 2f                                       /

ข้อมูล (369 ไบต์):

LoDJFvCRQqNdL7+JDvjtSkX4HBS2FwgvjfdxAHrF1/DcMIBtG/g7QZBLLYHpzgaWaM1TaHwbtxG+
l1lqsL3A8nuprtpPI20YbHm3lf7NxmYNdEIMTlhwTG+TlSn802DzN3YgIwbcKbtty9gWmF2nVS55
iJHQZd4HCcokoLRwH1g2XqP8Yo5xj5/YQm9DH85obUv47mii5n+PwsoJZ6yaz4eSpGps6dQMl+Pa
YP/WC6cVDBBGs3vq5cGe51H2u7oVArFuHrsI2sHkGNYHlhWudKn5RRvJhe3sxfrtQE/MekKRuZBt
f4B9qdyss66vFipSi1zf2MXF9A/CzwvMQ/t9PEtxw8kzxxikp2Ek3kc9TiamLl+iG2vjdWp84JzY
Mg6cE+3bFI4kVdn+d1NEnBR/S9HMnksgEc9sdAcyWsbSaGjwetwGTr7UXkpKO9aHF01D2i5pCO40
/keR0+a+NsBEOXZfatpXav44AJjalywtLeWu

0000000: 2e80 c916 f091 42a3 5d2f bf89 0ef8 ed4a  ......B.]/.....J
0000010: 45f8 1c14 b617 082f 8df7 7100 7ac5 d7f0  E....../..q.z...
0000020: dc30 806d 1bf8 3b41 904b 2d81 e9ce 0696  .0.m..;A.K-.....
0000030: 68cd 5368 7c1b b711 be97 596a b0bd c0f2  h.Sh|.....Yj....
0000040: 7ba9 aeda 4f23 6d18 6c79 b795 fecd c666  {...O#m.ly.....f
0000050: 0d74 420c 4e58 704c 6f93 9529 fcd3 60f3  .tB.NXpLo..)..`.
0000060: 3776 2023 06dc 29bb 6dcb d816 985d a755  7v #..).m....].U
0000070: 2e79 8891 d065 de07 09ca 24a0 b470 1f58  .y...e....$..p.X
0000080: 365e a3fc 628e 718f 9fd8 426f 431f ce68  6^..b.q...BoC..h
0000090: 6d4b f8ee 68a2 e67f 8fc2 ca09 67ac 9acf  mK..h.......g...
00000a0: 8792 a46a 6ce9 d40c 97e3 da60 ffd6 0ba7  ...jl......`....
00000b0: 150c 1046 b37b eae5 c19e e751 f6bb ba15  ...F.{.....Q....
00000c0: 02b1 6e1e bb08 dac1 e418 d607 9615 ae74  ..n............t
00000d0: a9f9 451b c985 edec c5fa ed40 4fcc 7a42  ..E........@O.zB
00000e0: 91b9 906d 7f80 7da9 dcac b3ae af16 2a52  ...m..}.......*R
00000f0: 8b5c dfd8 c5c5 f40f c2cf 0bcc 43fb 7d3c  .\..........C.}<
0000100: 4b71 c3c9 33c7 18a4 a761 24de 473d 4e26  Kq..3....a$.G=N&
0000110: a62e 5fa2 1b6b e375 6a7c e09c d832 0e9c  .._..k.uj|...2..
0000120: 13ed db14 8e24 55d9 fe77 5344 9c14 7f4b  .....$U..wSD...K
0000130: d1cc 9e4b 2011 cf6c 7407 325a c6d2 6868  ...K ..lt.2Z..hh
0000140: f07a dc06 4ebe d45e 4a4a 3bd6 8717 4d43  .z..N..^JJ;...MC
0000150: da2e 6908 ee34 fe47 91d3 e6be 36c0 4439  ..i..4.G....6.D9
0000160: 765f 6ada 576a fe38 0098 da97 2c2d 2de5  v_j.Wj.8....,--.
0000170: ae                                       .

คำอธิบาย

ฉันได้รวบรวมคะแนน (ที่อัปเดต) ที่ให้ไว้ (เพิ่มเติมในภายหลัง) เป็นสตริงเดียวที่มีไบต์ที่มีค่าตั้งแต่ 0 ถึง 24 ความยาวโน้ตมาก่อน จากนั้นค่าบันทึกย่อแสดง mod 25 และการเข้ารหัสที่แตกต่าง เหตุผลของการเข้ารหัสที่แตกต่างคือข้อความที่ถูกทำซ้ำในการขนย้ายจะลดลงในลำดับเดียวกันและสามารถบีบอัดได้

จากนั้นฉันก็ดำเนินการผ่านโปรแกรมบีบอัดแบบสตริงถึง GolfScript ซึ่งฉันได้กล่าวถึงก่อนหน้านี้ (และสิ่งที่ฉันปรับปรุงเพื่อให้สามารถแข่งขันในกอล์ฟนี้ได้) เพื่อรับไฟล์ข้อมูลซึ่งถูกคลายโดยส่วนแรกของโปรแกรม:

256base 69base[0:N]/(43,{\[1$)]/\2$=*}/\,){-}+%

มันเป็นขยายตัวง่ายไวยากรณ์ประเภทที่เป็นที่คุ้นเคยกับทุกคนที่มองไปที่คำถามมากมายที่ติดแท็กKolmogorov

จากนั้นฉันก็แบ่งสตริงนี้ออกเป็นคู่ ๆ[length note]แล้ววนซ้ำทั้งคู่ อักขระที่ไม่สามารถพิมพ์ได้มาจากสตริงมายากลซึ่งมีพารามิเตอร์ความถี่สำหรับบันทึกย่อ: ฉันกำลังใช้ truncation ปริยายปริพันธ์ 256 ของ GolfScript ซึ่งถูกแปลงเป็นสตริงเพื่อสร้างคลื่นสามเหลี่ยม * ดังนั้นความถี่พื้นฐานคือ 22050/256 เฮิร์ตซ์ ฉันเขียนโปรแกรมเพื่อค้นหาอัตราส่วนจำนวนเต็มซึ่งให้การจูนที่ดี สายเวทย์นั้นมีตัวเศษและส่วน 17 จะเหมือนกันสำหรับโน้ตทุกตัว ข้อผิดพลาดในการปรับโดยเฉลี่ยอยู่ที่ประมาณ 3.4 เซ็นต์

ความยาวบันทึกย่อแสดงตามที่เป็นอยู่และมีความเป็นไปได้มากขึ้นกว่าคะแนนรุ่นก่อนหน้า อย่างที่ฉันสงสัยการปัดเศษเพิ่มความซ้ำซ้อนในสตริงและทำให้ไฟล์ข้อมูลที่ถูกบีบอัดสั้นลง 30 ไบต์ไม่ต้องพูดถึงการบันทึกอาร์เรย์การค้นหา อย่างไรก็ตามยังมีบางตอนที่ฉันคิดว่าน่าสงสัย:

72 13

หรือ

71 9
69 2
71 2

ให้บาร์ซึ่งเป็นหนึ่งในหกของโครเชต์นานกว่าส่วนที่เหลือของบาร์ในคะแนนและ

85 9
85 4
85 24
85 23

หรือ

83 18
88 7
85 24
85 23

มีบาร์จำนวนหนึ่ง แต่มีการหักล้างบางอย่างที่น่าสงสัย

โปรแกรมอาจสั้นลงเล็กน้อย ฉันได้เลือกที่จะทำการค้าโดยสังเขปเพื่อทำการประหารชีวิต ด้วยการปรับปรุงความเร็วของล่าม GolfScript ที่ฉันส่งไปยัง Darren Smith และฉันเชื่อว่าเขาวางแผนที่จะเผยแพร่ในบางจุดเวอร์ชันปัจจุบันจะทำงานในเวลาน้อยกว่า 15 นาทีบนคอมพิวเตอร์ของฉัน ถ้าฉันไม่putsแต่ละโน้ตหลังจากสร้างมันก็จะทำงานช้าลงมาก

* ฉันขอสารภาพว่าความคิดเห็นของฉันเกี่ยวกับทุกคนที่ใช้คลื่นสี่เหลี่ยมผิด


วิธีการเรียกใช้ GolfScript อย่างถูกต้อง? ฉันลองbase64 -d <<< 'MjU2Y.....9Lw==' | golfscriptและมันบอกว่าgolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(เหมือนกันถ้าฉันบันทึกโปรแกรมไว้ในไฟล์แน่นอน)
Vi

ความยาวของข้อความถูกดึงออกมาจากไฟล์ MIDI โดยใช้อัลกอริทึมแบบหยาบ (ดูความคิดเห็นที่ play.pl) ฉันจะแก้ไขความยาวของโน้ตให้มีสติ
วิ

อัปเดตส่วนสำคัญ ตอนนี้ความยาวของโน้ตน้อยที่สุดคือ 1
Vi

ถ้าฉันพยายามเรียกใช้โดยใช้ล่ามออนไลน์ (รหัสที่แทรกดูเหมือน㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/) ฉันได้รับundefined method class_id 'สำหรับ nil: NilClass`
Vi

1
และไม่มีทางที่มันจะทำงานในล่ามออนไลน์ - นั่นจะเป็นการหมดเวลา
Peter Taylor

2

x86 รหัสเครื่อง - 513 ไบต์

สิ่งนี้ไม่สามารถตอบสนองความท้าทายได้อย่างสมบูรณ์เนื่องจากแทนที่จะส่งออกในรูปแบบที่เหมาะสมสำหรับป้อนเข้าสู่ aplay มันจะเล่น midi

ไฟล์. COM ที่ทำงานได้และซอร์สโค้ด asm - อาจใช้เวลาถึง 14 วินาทีก่อนที่เพลงจะเริ่มต้น มันจะเล่นช้าด้วยเนื่องจากความละเอียดของตัวจับเวลาอยู่ที่ 1/18 ของวินาที

เพลงถูกเข้ารหัสใน 375 ไบต์โดยใช้การเข้ารหัส Fibonacciและพจนานุกรมที่ประกอบด้วยเพลงที่ถอดรหัสก่อนหน้านี้

อัลกอริทึมการถอดรหัส Pseudocode:

store_pos=0;
if ( !readBit() ){
    note = FibonacciDecode() + 63;
    time = FibonacciDecode();
    store(note, time);
    store_pos++;
} else {
    pos = FibonacciDecode();
    run = FibonacciDecode();
    copy(store_pos-pos,store_pos,run);
    store_pos+=run;
}

เมื่อถอดรหัสเพลงแล้วมันเป็นเรื่องง่าย ๆ ในการส่งสัญญาณออกไปยังพอร์ต Midi


1
มันอาศัยซินธิไซเซอร์ที่มีอยู่ (MIDI ภายในการ์ดเสียงในกรณีนี้) แทนที่จะเป็นของตัวเอง
วิ

คุณสามารถแฮ็กอัพซินธิไซเซอร์และส่งออกตัวอย่างไปยังพอร์ตที่เกี่ยวข้องหรือไปที่ stdout / ไฟล์ (โดยใช้ DOS หรือ Linux syscalls) ในฐานะที่เป็นความท้าทายที่แยกจากกันคุณสามารถสร้างเวอร์ชันที่มีโพลีโฟนิคเต็มเปี่ยม MIDI (ยังคงมีการบีบอัดเป็นไฟล์ COM เดียว)
วิ

ฉันแค่สนใจในส่วนของ 'Mozart music compact' ของความท้าทายไม่ใช่ตัวสังเคราะห์ ฉันโพสต์สิ่งนี้เพราะมันสนุกและน่าสนใจสำหรับคนอื่นมากกว่าที่จะชนะการท้าทาย
Sir_Lagsalot

ตกลง. กำลังรอรุ่น Arduino ...
Vi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.