Attack, Decay, Sustain, Release


47

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

  • Attack time (A) : เวลาที่ซองจดหมายถึงระดับสูงสุดโดยเริ่มจากศูนย์เมื่อกดปุ่มครั้งแรก
  • Decay time (D) : เวลาที่ซองจดหมายถึงระดับความยั่งยืนที่ระบุ
  • ระดับยั่งยืน (S) : ระดับที่ได้รับการบำรุงรักษาหลังจากการโจมตีและการสลายตัวเริ่มต้นตราบใดที่มีการกดปุ่ม
  • Release time (R) : เวลาที่ซองจดหมายจะถึงศูนย์เมื่อปล่อยกุญแจ

ป้อนคำอธิบายรูปภาพที่นี่

ความท้าทาย

ป้อนข้อมูลพารามิเตอร์สี่ A, D, S, R และพล็อตซองจดหมาย

พารามิเตอร์จะเป็นจำนวนเต็มค่า 0-127

ระดับสูงสุด (ถึงตอนท้ายของระยะโจมตี) จะถือว่าเป็น127

ส่วนแนวนอนที่ระดับการค้ำจุนจะถือว่ามีระยะเวลา 64 (ในเสียงจริงระยะเวลานี้จะไม่คงที่ แต่จะถูกกำหนดโดยระยะเวลาที่ถือกุญแจ)

รูปแบบและรายละเอียดเพิ่มเติม

ผลลัพธ์ควรเป็นภาพในรูปแบบแรสเตอร์หรือเวกเตอร์ หากเป็นภาพแรสเตอร์เส้นรูปหลายเหลี่ยมควรมีขนาดอย่างน้อย 50 พิกเซลในแนวตั้งในแนวนอน

ภาพสามารถแสดงหรือสร้างเป็นไฟล์ในรูปแบบภาพมาตรฐานได้ ไฟล์สามารถเขียนลงดิสก์หรือเนื้อหาที่แน่นอนสามารถส่งออกไปยัง STDERR หรือเป็นอาร์กิวเมนต์กลับฟังก์ชั่น

กราฟต้องการเพียงแค่มีเส้นรูปหลายเหลี่ยมที่กำหนดซองจดหมาย สามารถเลือกขนาดของแต่ละแกนได้อย่างอิสระ องค์ประกอบอื่น ๆ เช่นเส้นแกนป้ายกำกับตัวเลขหรือสีของเส้นเป็นตัวเลือก

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

[A D S R]การป้อนข้อมูลที่อยู่ในรูปแบบ โปรดทราบว่าสเกลนั้นแตกต่างกันในแต่ละร่าง (ตามกฎที่เลือกได้อย่างอิสระ)

[15 30 70 40]

ป้อนคำอธิบายรูปภาพที่นี่

[64 64 64 64]

ป้อนคำอธิบายรูปภาพที่นี่

[0 10 50 80]

ป้อนคำอธิบายรูปภาพที่นี่

[0 0 90 80]

ป้อนคำอธิบายรูปภาพที่นี่

[5 50 0 0]

ป้อนคำอธิบายรูปภาพที่นี่

[5 50 0 80]

ป้อนคำอธิบายรูปภาพที่นี่

[24 32 127 48]

ป้อนคำอธิบายรูปภาพที่นี่



@Ben การอ้างอิงนั้นตั้งใจเช่นกัน :-) ฉันรักการกีดกันการนอนหลับ !
Luis Mendo เมื่อ

คำตอบ:


7

MATL, 31 22 ไบต์

Oii64ivYsO127itO5$h&XG

ยอมรับปัจจัยสี่แยกต่างหากสั่งA, D, R,S

ลองใช้งานที่MATL Online

คำอธิบาย

0   % Push a literal 0 to the stack
ii  % Grab the first two inputs
64  % Push the number literal 64 to the stack
i   % Grab the third input
v   % Vertically concatenate all values
Ys  % Compute the cumulative sum
0   % Push the number literal 0 to the stack
127 % Push the number literal 127 to the stack
i   % Grab the fourth input
t   % Duplicate the fourth input
O   % Push the number literal 0 to the stack
5$h % Concatenate the last 5 elements on the stack
&XG % Plot the result using the first array as x and second array as y

ป้อนคำอธิบายรูปภาพที่นี่


43

TikZ, 195 193 181 177 172 167 163 160 159 ไบต์

ขอบคุณ David Carlisle สำหรับคำตอบที่เป็นประโยชน์ของเขาที่นี่

\documentclass[tikz]{standalone}\begin{document}\tikz\def~#1{\typein[#1];}~\a~\s~\d~\r\def\u{)--(\a+\d}\draw(,)--(\a,127\u,\s\u+64,\s\u+\r+64,);\end{document}

ใช่คุณได้ยินขวาTikZ

คำอธิบาย

นี่ใช้เทคนิคสองสามอย่างเพื่อให้บรรลุเป้าหมาย สิ่งแรกคือการป้อนข้อมูล คนส่วนใหญ่อาจไม่รู้ว่า L A T E X สามารถรับข้อมูลได้ ก็สามารถ \typeinนี่คือความสำเร็จที่มีคำสั่ง สิ่งนี้จะหยุดคอมไพเลอร์และร้องขออินพุตจากผู้ใช้ตามที่กำหนดให้กับตัวแปร

เทคนิคหลักอื่น ๆ \defคือการใช้ \defใน Tikz นั้นมีพลังอย่างไร้เหตุผล มันเป็นตัวกำหนดส่วนหนึ่งของรหัสและวางมันทุกที่ที่คุณเรียกตัวแปร ในรหัสนี้เรากำหนดสองสิ่ง\typein[#1]{}เพื่อให้เราสามารถกำหนดตัวแปรของเราได้อย่างคล่องแคล่วและ)--(\a+\dเนื่องจากรหัสนี้แสดงให้เห็นหลายครั้งในเวอร์ชั่นที่ไม่ได้เป็นกอล์ฟ

นี่คือรหัสสองรุ่น (ไม่มีตัวห่อ):

แข็งแรงเล่นกอล์ฟ:

\documentclass[tikz]{standalone}\begin{document}\tikz\def~#1{\typein[#1];}~\a~\s~\d~\r\def\u{)--(\a+\d}\draw(,)--(\a,127\u,\s\u+64,\s\u+\r+64,);\end{document}

Ungolfed:

\typein[\a]{}\typein[\s]{}\typein[\d]{}\typein[\r]{}\draw(0,0)--(\a,127)--(\a+\d,)--(\a+\d+64,)--(\a+\d+\r+64,0);

ภาพ:

เนื่องจากฉันไม่สามารถอัปโหลดภาพ pdf ได้โดยตรงและการแปลงเป็นรูปแบบอื่น ๆ ดูเหมือนจะทำให้เส้นหายไปโดยสิ้นเชิงนี่คือภาพที่อาจมีลักษณะเหมือนเมื่อเปิดในหน้าตัวอย่าง (อินพุตสำหรับภาพนี้คือ[64 64 64 64]):

ดูตัวอย่างรูปภาพ

อย่างที่คุณเห็นมันบางมาก อย่างไรก็ตามเนื่องจากเป็นรูปภาพ PDF และไม่ใช่ภาพแรสเตอร์จึงไม่จำเป็นต้องปฏิบัติตามข้อกำหนดด้านความหนา


12
ฉันชื่นชมความจริงที่ว่าคุณรู้จัก TikZ ดีมากมันเป็นทางออกแรกที่เข้ามาในใจคุณ (และถ้าไม่ใช่นั่นก็เป็นสิ่งที่ตำนานจะจดจำ)
Right Leg

1
ใช้งานไม่ได้input tikz\begin{document}?
ลดขนาด

5
แล้วรูปภาพล่ะ 😉
Sarge Borsch

คุณจะทำให้สิ่งนี้เป็นจริงได้อย่างไร? pdflatex adsr.texดูเหมือนจะไม่ทำงาน - โอ้รอมันใช้งานได้ฉันไม่คิดว่ามันจะขออินพุทแบบโต้ตอบ!
หยุดที่จะเปลี่ยนรหัสลับเมื่อ

@WheatWizard ImageMagick สามารถแปลงไฟล์ PDF ได้ดีพอสมควรถ้าคุณทำมันขวา
หลี Borsch

20

Python 2, 83 80 79 ไบต์

from turtle import*
def f(A,D,S,R):X=A+D+64;map(goto,[A,A+D,X,X+R],[127,S,S,0])

ลองใช้ออนไลน์ (รุ่น 83- ไบต์เพราะทำงานออนไลน์)

โปรดทราบว่าผลลัพธ์บางอย่างอาจไม่สามารถมองเห็นได้อย่างสมบูรณ์โดยใช้ Trinket เนื่องจากวิธีการทำงานของ Canvas คุณจะต้องดาวน์โหลดและติดตั้ง Python ถ้าคุณต้องการให้ทำงานได้ดีขึ้น

Ungolfed:

from turtle import*
A,D,S,R=input()
goto(A,127)
goto(A+D,S)
goto(A+D+64,S)
goto(A+D+64+R,0)

รุ่นนี้ไม่ทำงานใน Trinket เนื่องจาก Trinket ไม่รองรับค่าการเปิดออก


คุณสามารถใช้งานmapใน Python 2:lambda A,D,S,R:map(goto,[A,A+D,A+D+64,A+D+R+64],[127,S,S,0])
xnor

@ xnor ฉันSuspensionError: Cannot call a function that blocks or suspends here on line undefined in main.pyไปที่ Trinket คุณยืนยันว่าใช้งานได้จริงหรือ ฉันไม่แน่ใจว่าข้อผิดพลาดเฉพาะกับ Trinket หรือไม่
mbomb007

ได้ผลสำหรับฉันใน 2.7.12
xnor

@xnor Mmk ขอบคุณ อาจเป็นข้อ จำกัด ใน Skulpt
mbomb007

ฉันส่งเวอร์ชันที่เรียบง่ายของโปรแกรมนี้เป็นตัวอย่างให้กับ repo Skulpt github และพวกเขาคิดว่ามันเป็นการค้นหาที่ดี หวังว่าพวกเขาจะสามารถแก้ไขได้ แต่จังหวะของ "การวิ่งเต่า" ของพวกเขาดูเหมือนจะเป็นการเดินมากขึ้น
mbomb007

17

Mathematica, 61 58 ไบต์

ListLinePlot[{Accumulate@{0,##3,64,#2},{0,127,#,#,0}}]&

เป็นโอเปอเรเตอร์สำหรับTransposeและแสดงผลเป็นตัวยกTโดย Mathematica

รับอาร์กิวเมนต์ตามลำดับS, R, A, Dและส่งคืนวัตถุกราฟิกแบบเวกเตอร์

ผลลัพธ์สำหรับทั้งเจ็ดกรณีทดสอบ:

ป้อนคำอธิบายรูปภาพที่นี่ คลิกเพื่อดูรุ่นที่ใหญ่กว่า


มันเร็วมาก!
Luis Mendo

+1 สำหรับการสอนฉันListLinePlot:) และก็มีListStepPlotเช่นกัน - มีประโยชน์มาก!
เกร็กมาร์ติน

12

R, 66 63 ไบต์

function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")

แสดงภาพโดยมีแล็บแกนอยู่cumsum(c(0,A,D,64,R))และc(0,127,S,S,0)รวมถึงเส้นแกนและป้ายกำกับตัวเลข

ขอบคุณ @Zahiro Mor สำหรับการกำจัด3 ไบต์ !

คำตอบก่อนหน้า:

function(A,D,S,R)plot(c(0,A,A+D,b<-A+D+64,b+R),c(0,127,S,S,0),"l")

2
คุณสามารถใช้cumsum(c(0,A,D,64,R)) เพื่อแทนที่คำแรกในพล็อต กับ cumsum คุณจะไม่ต้องเคล็ดลับขและยังคงโกน 3 ไบต์ :) function(A,D,S,R)plot(cumsum(c(0,A,D,64,R)),c(0,127,S,S,0),"l")
Zahiro Mor

11

Matlab, 50 ไบต์

@(A,D,S,R)plot(cumsum([0,A,D,64,R]),[0,127,S,S,0])

สิ่งนี้ให้ผลตอบแทนฟังก์ชั่นที่ไม่ระบุชื่อ "ans" ที่จะต้องมีการเรียกว่าเป็น ans (A, D, S, R)



9

JavaScript (ES6), 114 111 ไบต์

f=(a,d,s,r)=>`<svg width=446 height=128><path stroke=red fill=none d=M0,127L${a},0l${d},${127-s}h64l${r},${s}>`
<div oninput=o.innerHTML=f(a.value,d.value,s.value,r.value)><input type=number value=0 min=0 max=127 id=a><input type=number value=63 min=0 max=127 id=d><input type=number value=127 min=0 max=127 id=s><input type=number value=0 min=0 max=127 id=r><div id=o><svg width=446 height=128><path stroke=red fill=none d=M0,127L0,0l63,0h64l0,127 /></svg>

ส่งคืนภาพ SVG innerHTMLเหมาะสำหรับ เพิ่ม 18 ไบต์สำหรับ XML ที่ถูกต้อง


มันยอดเยี่ยมมากที่รูปได้รับการปรับปรุงแบบเรียลไทม์!
Luis Mendo เมื่อ

นี่เยี่ยมมากฉันควรเรียนรู้ไวยากรณ์ SVG บางครั้ง อาจเพิ่มค่าเริ่มต้นให้กับ<input>s?
ETHproductions

@ETHproductions คุณมีค่าเริ่มต้นที่เฉพาะเจาะจงหรือไม่ (เนื่องจากการตั้งค่าเริ่มต้นนั้นจะไม่ทำให้กราฟเริ่มต้นทำงานจริง ... )
Neil

64,64,64,64ผมคิดว่าอาจจะเป็นเพียงแค่ ปกติฉันจะ hardcode ผลลัพธ์ที่ถูกต้องสำหรับการป้อนค่าเริ่มต้น แต่ฉันเห็นว่ามันจะยากที่นี่ ...
ETHproductions

8

Haskell, 112 110 ไบต์

import Graphics.Gloss
(a#d)s r=display(InWindow""(600,300)(0,0))red$line$zip(scanl(+)0[a,d,64,r])[0,127,s,s,0]

ตัวอย่างการใช้: (0#10) 50 80.

ซองจดหมาย adsr

สิ่งนี้ใช้Glossห้องสมุด displayฟังก์ชั่นคาดว่าหน้าต่างเพื่อพล็อตใน (ที่นี่: หน้าต่างไม่มีชื่อ ( "") ขนาด 600x300 ตำแหน่ง(0,0)บนเดสก์ทอป) สีพื้นหลัง ( red) และแม่มดภาพเป็นสายไปตามเส้นทางที่ทำโดยซิปผลรวมสะสมของ[0,a,d,64,r]= [0,a,a+d,a+d+64,a+d+64+r]เป็น พิกัด x และ[0,127,s,s,0]เป็นพิกัด y

แก้ไข: ขอบคุณ @xnor สำหรับ 2 ไบต์!


ควรสั้นกว่าการเขียนscanl(+)0[a,d,64,r]
xnor

5

กำลังดำเนินการ, 134 108 +14 (เรียกใช้size) = 148 122 ไบต์

ก่อนอื่นเราต้องมีการเรียกไปยังที่sizeใดที่หนึ่งในโปรแกรมเพื่อที่ผลลัพธ์จะพอดีกับหน้าต่าง (ค่าเริ่มต้นคือ 100x100)

size(400,400);

และนี่คือฟังก์ชันจริง:

void g(int a,int b,int c,int d){line(0,127,a,0);line(a,0,b+=a,c=127-c);line(b,c,b+=64,c);line(b,c,b+d,127);}

เรียกว่าชอบ f(15,20,70,40);

ภาพหน้าจอ

15, 20, 70, 40

ภาพ


คำตอบที่ใหม่กว่าของฉันนั้นตรงไปตรงมามากกว่าคำตอบที่เก่ากว่า แต่ฉันชอบคำตอบที่เก่ากว่ามากกว่า (แม้ว่าจะใหญ่กว่า)

คำตอบเก่า (148 ไบต์)

size(400,400);

และทั้งสองฟังก์ชั่น

void f(int[]v){translate(0,127);l(v[0],-127);l(v[1],127-v[2]);l(64,0);l(v[3],v[2]);}void l(int x,int y){line(0,0,x,y);translate(x,y);}

เรียกว่าเหมือนf(int_array_containing_values);และผลลัพธ์จะมีลักษณะดังนี้:f(new int[]{15,20,70,40});



4

PHP, 149 130 ไบต์

[,$a,$d,$s,$r]=$argv;imagepolygon($i=imagecreatetruecolor(446,127),[0,127,$a,0,$d+=$a,$s,$d+=64,$s,$d+$r,127],5,999);imagepng($i);

ใช้อินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่งเขียนอิมเมจ (PNG ด้วยกราฟสีฟ้าบนสีดำ) ไปยัง stdout ต้องการ PHP 7.1 หรือใหม่กว่า

การใช้งานเช่น

# any OS with ImageMagick:
php -r '<code>' <parameters> | display

# linux with feh:
php -r '<code>' <parameters> | feh

4 ไบต์สำหรับเก่า PHP: แทนที่ด้วย[,$a,$d,$s,$r]list(,$a,$d,$s,$r)


มีแฮ็กขนาดเล็กอยู่ในนั้น: แทนที่จะใช้ imageopenpolygonเพื่อซ่อนเส้นฐานเส้นรูปหลายเหลี่ยมที่เสร็จสิ้นจะถูกวาดภายนอกผ้าใบ (y = 127 จะแสดงเฉพาะภาพที่มีความสูง> = 128 เท่านั้น)

ฉันสามารถประหยัดได้มากขึ้นด้วยสี 99 หรือ 9 แทน 999; แต่มันก็ยากที่จะเห็นบนพื้นดำ :)


3

Bash + ปลอดหนี้ 70 ไบต์

t=$[$1+$2]
echo "0 0
$1 127
$t $3
$[t+64] $3
$[t+64+$4] 0">f
xmgrace f

สคริปต์เขียนไปยังไฟล์fพิกัดของแต่ละจุดและ xmgrace (เวอร์ชัน GUI) อ่านไฟล์และแสดงโครงร่างโดยใช้บรรทัดตามค่าเริ่มต้น

วิ่ง :

./plot_ADSR.sh 15 30 70 40

เอาท์พุท: (หน้าจอพิมพ์)

15 30 70 40

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

คำอธิบาย:

t=$[$1+$2]          # store the value of (A+D) for later usage
echo "0 0           # start writing the coordinates to file "f", first the origin
$1 127              # then (A, 127)
$t $3               # then (A + D, S)
$[t+64] $3          # then (A + D + 64, S)
$[t+64+$4] 0">f     # then (A + D + 64 + R, 0)
xmgrace f           # call xmgrace to plot the generated XY file

2

ไป, 947 915 506 ไบต์

สิ่งนี้อยู่ไกลจากการปรับให้เหมาะสมพยายามเรียนรู้ภาษาขณะที่เข้าร่วมตอบคำถาม อย่าลังเลที่จะชี้ให้เห็นสิ่งที่ฉันสามารถทำได้

ภาพคงที่

ย่อ:

package main;import (."os";."image";k"image/png";c"image/color";."strconv";."math");func main(){g:=NewRGBA(Rect(0,0,127*4,127));a,_:=ParseFloat(Args[1],4);d,_:=ParseFloat(Args[2],4);s,_:=ParseFloat(Args[3],4);r,_:=ParseFloat(Args[4],4);z:=[5][]float64{{0,0},{a,127},{a+d,s},{a+d+64,s},{a+d+64+r,0}};for i:=1;i<len(z);i++{v,w,x,y:=z[i-1][0],z[i-1][1],z[i][0],z[i][1];m:=(y-w)/(x-v);t:=y-m*x;for v<=x{g.Set(int(Ceil(v)),127-int(Ceil(w)),c.RGBA{0,0,0,255});v+=.01;w=m*v+t}};f,_:=Create("o.png");k.Encode(f,g)}

Uncondenced:

package main

import (
    ."os"
    ."image"
    k"image/png"
    c"image/color"
    ."strconv"
    ."math"
    "fmt"
)

func main(){
    g := NewRGBA(Rect(0, 0, 127*4, 127))

    a, _ := ParseFloat(Args[1], 4)
    d, _ := ParseFloat(Args[2], 4)
    s, _ := ParseFloat(Args[3], 4)
    r, _ := ParseFloat(Args[4], 4)

    z := [5][]float64{{0,0},{a,127},{a+d,s},{a+d+64,s},{a+d+64+r,0}}
    for i:=1;i<len(z);i++{
        v,w,x,y:=z[i-1][0],z[i-1][1],z[i][0],z[i][1]
        m:=(y-w)/(x-v)
        t:=y-m*x
        for v<=x{
            g.Set(int(Ceil(v)),127-int(Ceil(w)), c.RGBA{0,0,0,255})
            v+=.01
            w=m*v+t
        }
    }
    f,_:=Create("o.png")
    k.Encode(f,g)
}

@ LuisMendo มันเป็น โดยค่าเริ่มต้น 0,0 คือด้านบนซ้าย ป่วยทุกอย่างทันทีที่ฉันทำได้
kemicofa

1
ฉันไม่เคยเขียนรหัสในระหว่างการเดินทางดังนั้นฉันไม่รู้ ผู้ใช้ที่นี่ใส่รหัสด้วยตนเองเนื่องจากสามารถบันทึกไบต์ได้มากกว่าเครื่องบดย่อยทั่วไป ยินดีต้อนรับที่นี่ ตัวอย่างเช่นจะไม่แทนที่วัตถุ struct ด้วยตัวแปร (เช่น l1x, l1y, l1X, l1Y) เป็นนักกอล์ฟหรือเปล่า?
seshoumara

1
@rugdealer สิ่งนี้อาจช่วยได้ในกรณีที่คุณไม่ได้เห็น
Luis Mendo

1
สูญเสียเกือบ 400 ไบต์ด้วยลิงก์ของคุณ @LuisMendo
kemicofa

1
@ rugdealer ว้าวนั่นเป็นจำนวนมาก \ o /
Luis Mendo

1

dc, 120 ไบต์

ตอนแรกฉันคิดว่าฉันไม่สามารถตอบได้ใน dc แต่ฉันเห็นว่าการพิมพ์ไวยากรณ์ของภาพเวกเตอร์ได้รับอนุญาต

?sR127r-sS[<svg><path d="M0 127 L]nrdn[ 0 L]n+dn32PlSn[ L]n64+dn32PlSn[ L]nlR+n[ 127" fill="none" stroke="red"/></svg>]p

รหัสจะคำนวณพิกัดที่แปลของแต่ละจุดและสร้างไวยากรณ์ SVG สำหรับพล็อต เนื่องจากโปรแกรมแก้ไขรูปภาพมีจุดกำเนิดที่มุมบนซ้ายฉันต้องลบyค่าจากheight127 ในกรณีนี้เพื่อให้รูปภาพปรากฏราวกับว่าจุดเริ่มต้นอยู่ที่มุมซ้ายล่าง

เรียกใช้ตัวอย่าง:หรือลองออนไลน์!

dc -f plot_ADSR.dc <<< "15 30 70 40"

เอาท์พุท:

<svg><path d="M0 127 L15 0 L45 57 L109 57 L149 127" fill="none" stroke="red"/></svg>

ในการแสดงพล็อตอิมเมจให้บันทึกเอาท์พุทที่แน่นอนไปยังไฟล์และเปิดด้วย Gimp ตัวอย่างเช่นหรือป้อนข้อความในหน้า html ตามที่ฉันทำข้างต้น

คำอธิบาย: dcเป็นภาษาสแต็ก alculator reverse esk c d - esk

สคริปต์เป็นการต่อเชื่อมแบบยาวของสตริงไวยากรณ์ SVG คำหลักMยืนสำหรับการย้ายในการประสานงานและLย่อมาจากเส้นวาดจากตำแหน่งปัจจุบันไปยังได้รับการประสานงาน

?                           # read input (in reverse order by default). Stack: RSDA
sR                          # pop top value, store it in register 'R'. Stack: SDA
127r-sS                     # push 127, swap top 2 values, pop them and push
                            #subtracting result, save it to 'S', pop it. Stack: DA
[<svg><path d="M0 127 L]n   # [..]n print string (push then pop). Stack: unchanged
rdn                         # swap, duplicate top, print (A) and pop it. Stack: AD
[ 0 L]n                     # printing
+dn                         # pop top 2 values, push addition result, duplicate it,
                            #print and pop it. Stack: (A+D)
32P                         # print a space
lSn                         # push value from register 'S', print and pop it.
                            #Stack: unchanged
[ L]n                       # printing
64+dn                       # push 64, pop top 2 values, push addition result,
                            #duplicate it, print and pop it. Stack: (A+D+64)
32PlSn[ L]n                 # print space, print register 'S', more printing
lR+n                        #push value from register 'R', pop top 2 values, push
                            #addition result, print it and pop it. Stack: empty
[ 127" fill="none" stroke="red"/></svg>]p   # printing
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.