Tấn công, phân rã, bền vững, phát hành


47

Bộ tổng hợp âm thanh sử dụng bộ tạo phong bì để kiểm soát các thông số nhất định của âm thanh (như độ ồn tổng thể) thay đổi theo thời gian. Trong nhiều tổng hợp, một phong bì được xác định bởi bốn tham số, như được biểu thị trong hình dưới đây từ Wikipedia :

  • Thời gian tấn công (A) : thời gian để phong bì đạt mức tối đa, bắt đầu từ số 0, khi nhấn phím lần đầu tiên.
  • Thời gian phân rã (D) : thời gian để phong bì đạt đến mức duy trì được chỉ định.
  • Cấp độ bền vững (S) : cấp độ được duy trì, sau khi tấn công và phân rã ban đầu, miễn là phím được nhấn.
  • Thời gian phát hành (R) : thời gian thực hiện để phong bì đạt đến 0 khi khóa được giải phóng.

nhập mô tả hình ảnh ở đây

Các thách thức

Nhập bốn tham số A, D, S, R và vẽ đường bao .

Các tham số sẽ là các giá trị nguyên từ 0 đến 127 .

Mức tối đa (đạt được ở cuối giai đoạn tấn công) sẽ được giả định là 127 .

Đoạn ngang ở mức duy trì sẽ được giả định là có thời lượng 64 (trong âm thanh thực tế thời lượng này không cố định, nhưng được xác định bởi lượng thời gian mà phím được giữ).

Định dạng và thông tin chi tiết

Đầu ra phải là một hình ảnh ở định dạng raster hoặc vector. Nếu đó là raster, đường đa giác sẽ chiếm ít nhất 50 pixel theo chiều ngang.

Hình ảnh có thể được hiển thị hoặc sản xuất dưới dạng tệp ở định dạng hình ảnh tiêu chuẩn. Tệp có thể được ghi vào đĩa hoặc nội dung chính xác của nó có thể được xuất ra, theo STDERR hoặc làm đối số trả về hàm.

Biểu đồ chỉ cần chứa đường đa giác xác định đường bao. Tỷ lệ của mỗi trục có thể được tự do lựa chọn. Các yếu tố khác như đường trục, nhãn số hoặc màu đường là tùy chọn.

Phương tiện và định dạng đầu vào là linh hoạt như bình thường. Ví dụ: bạn có thể lấy bốn số theo bất kỳ thứ tự nào hoặc một mảng chứa chúng. Một chương trình hoặc một chức năng có thể được cung cấp. Sơ hở tiêu chuẩn bị cấm.

Mã ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

Đầu vào là ở định dạng [A D S R]. Lưu ý rằng tỷ lệ là khác nhau trong mỗi hình (theo quy tắc rằng quy mô có thể được tự do lựa chọn)

[15 30 70 40]

nhập mô tả hình ảnh ở đây

[64 64 64 64]

nhập mô tả hình ảnh ở đây

[0 10 50 80]

nhập mô tả hình ảnh ở đây

[0 0 90 80]

nhập mô tả hình ảnh ở đây

[5 50 0 0]

nhập mô tả hình ảnh ở đây

[5 50 0 80]

nhập mô tả hình ảnh ở đây

[24 32 127 48]

nhập mô tả hình ảnh ở đây


1
Tôi đã mong đợi một thử thách simian hơn từ tiêu đề !
Ben

@Ben Tài liệu tham khảo đó cũng được dự định :-) Tôi thích Mất ngủ !
Luis Mendo

Câu trả lời:


7

MATL, 31 22 byte

Oii64ivYsO127itO5$h&XG

Chấp nhận bốn đầu vào riêng biệt ra lệnh như A, D, R,S

Dùng thử tại MATL Online

Giải trình

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

nhập mô tả hình ảnh ở đây


43

TikZ, 195 193 181 177 172 167 163 160 159 byte

Nhờ David Carlisle cho câu trả lời hữu ích của mình ở đây

\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}

Vâng, bạn đã nghe đúng TikZ .

Giải trình

Điều này sử dụng một vài kỹ thuật để đạt được mục tiêu của nó. Điều đầu tiên là đầu vào. Hầu hết mọi người có thể không biết rằng L A T E X có thể nhận đầu vào. Vâng, nó có thể. Điều này đạt được với lệnh \typein. Điều này sẽ tạm dừng trình biên dịch và yêu cầu đầu vào từ người dùng như gán nó cho một biến.

Các kỹ thuật chính khác là sử dụng \def. \deftrong Tikz là mạnh mẽ vô lý. Về cơ bản, nó định nghĩa một đoạn mã và dán nó ở mọi nơi bạn gọi là biến. Trong mã này, chúng tôi xác định hai điều \typein[#1]{}để chúng tôi có thể gán các biến của mình một cách ngẫu nhiên và )--(\a+\dbởi vì mã này hiển thị rất nhiều lần trong phiên bản không được mã hóa.

Đây là hai phiên bản của mã (không có trình bao bọc):

Chơi gôn

\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}

Ung dung:

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

Hình ảnh, tưởng tượng:

Vì tôi không thể tải trực tiếp hình ảnh pdf và chuyển đổi nó sang bất kỳ định dạng nào khác dường như khiến dòng này biến mất hoàn toàn, đây là hình ảnh có thể trông như thế nào khi được mở trong Bản xem trước (đầu vào cho hình ảnh này là [64 64 64 64]):

Xem trước hình ảnh

Như bạn có thể thấy nó rất mỏng. Tuy nhiên vì đây là hình ảnh PDF và không phải hình ảnh raster nên không phải tuân thủ các yêu cầu về độ dày.


12
Tôi thực sự ngưỡng mộ thực tế rằng bạn biết TikZ rất tốt rằng đó là giải pháp đầu tiên đi vào tâm trí của bạn. (Và nếu không, đó là điều huyền thoại sẽ nhớ)
Chân phải

1
Không input tikz\begin{document}hoạt động?
Gây tử vong vào

5
làm thế nào về hình ảnh?
Borsch

Làm thế nào để bạn thực sự kết xuất này? pdflatex adsr.texdường như không hoạt động. - Đợi đã, nó hoạt động, tôi chỉ không mong đợi nó sẽ yêu cầu đầu vào tương tác!
đã ngừng quay ngược chiều

@WheatWizard fantemagick có thể chuyển đổi PDF một cách hợp lý nếu bạn làm đúng
Sange Borsch

20

Python 2, 83 80 79 byte

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])

Dùng thử trực tuyến (phiên bản 83 byte, vì nó chạy trực tuyến)

Lưu ý rằng một số kết quả đầu ra có thể không hoàn toàn hiển thị khi sử dụng Trinket, do cách thức hoạt động của khung vẽ. Bạn sẽ cần tải xuống và cài đặt Python nếu bạn muốn nó hoạt động tốt hơn.

Ung dung:

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)

Phiên bản này không hoạt động trong Trinket, vì Trinket không hỗ trợ giải nén giá trị đầu vào.


Bạn có thể sử dụng maptrong 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 Tôi nhận được SuspensionError: Cannot call a function that blocks or suspends here on line undefined in main.pytrên Trinket. Bạn đã xác nhận rằng nó hoạt động? Tôi không chắc liệu lỗi có phải là duy nhất đối với Trinket hay không.
mbomb007

Làm việc cho tôi trong 2.7.12.
xnor

@xnor Mmk, cảm ơn. Có lẽ đó là một hạn chế trong Skulpt.
mbomb007

Tôi đã gửi một phiên bản đơn giản hơn của chương trình này như một ví dụ cho repo Skulpt github và họ nghĩ rằng đó là một phát hiện hay. Hy vọng rằng họ sẽ có thể sửa nó, nhưng tốc độ "chạy nước rút rùa" của họ dường như là một cuộc dạo chơi.
mbomb007

17

Toán học, 61 58 byte

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

là toán tử cho Transposevà được hiển thị dưới dạng siêu ký tự Tbởi Mathicala.

Đưa các đối số theo thứ tự S, R, A, Dvà trả về một đối tượng đồ họa vector.

Kết quả cho tất cả bảy trường hợp thử nghiệm:

nhập mô tả hình ảnh ở đây Nhấn vào đây để xem phiên bản lớn hơn.


Nó thật nhanh!
Luis Mendo

+1 để dạy tôi ListLinePlot:) Và cũng có một điều ListStepPlotrất hữu ích!
Greg Martin

12

R, 66 63 byte

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

Hiển thị hình ảnh, với các phòng thí nghiệm trục cumsum(c(0,A,D,64,R))c(0,127,S,S,0), cũng như các đường trục và nhãn số.

Cảm ơn @Zahiro Mor đã cạo sạch 3 byte !

Câu trả lời trước:

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
bạn có thể sử dụng cumsum(c(0,A,D,64,R)) để thay thế thuật ngữ đầu tiên trong cốt truyện. với cumsum bạn sẽ không cần thủ thuật b và vẫn cạo 3 byte :) 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 byte

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

Điều này mang lại một hàm ẩn danh "ans" phải được gọi là ans (A, D, S, R).


9

JavaScript (ES6) + HTML, 126 + 23 = 149

c=O.getContext`2d`;c.moveTo(a=0,z=O.height=128);g=(y,x=prompt())=>c.lineTo(a+=+x,y)||g;g(0)(s=z+~prompt())(s,64)(z);c.stroke()
<canvas id=O width=512>

Đưa đầu vào một lần theo thứ tự A, S, D, R.


9

JavaScript (ES6), 114 111 byte

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>

Trả về một hình ảnh SVG phù hợp cho innerHTML. Thêm 18 byte cho XML hợp lệ.


Thật tuyệt vời khi con số được cập nhật trong thời gian thực!
Luis Mendo

Điều này thật tuyệt, đôi khi tôi nên học cú pháp SVG. Có lẽ thêm giá trị mặc định cho <input>s?
Sản xuất ETH

@ETHproductions Bạn có bất kỳ mặc định cụ thể nào trong tâm trí không? (Cho rằng cài đặt mặc định sẽ không thực sự kích hoạt biểu đồ ban đầu ...)
Neil

Tôi đã suy nghĩ có lẽ chỉ 64,64,64,64. Thông thường tôi sẽ mã hóa đầu ra chính xác cho đầu vào mặc định, nhưng tôi thấy điều đó sẽ khó khăn như thế nào ở đây ...
Sản phẩm ETH

8

Haskell, 112 110 byte

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]

Ví dụ sử dụng : (0#10) 50 80.

phong bì adsr

Điều này sử dụng Glossthư viện. Các displaychức năng hy vọng một cửa sổ để vẽ trong (ở đây: một cửa sổ mà không cần tiêu đề ( ""), kích thước 600x300, vị trí (0,0)trên desktop), màu nền ( red) và hình ảnh phù thủy là một dòng dọc theo con đường được làm bằng cách chạy tổng tích lũy của [0,a,d,64,r]= [0,a,a+d,a+d+64,a+d+64+r]là tọa độ x và [0,127,s,s,0]là tọa độ y.

Chỉnh sửa: Cảm ơn @xnor cho 2 byte!


Nên viết ngắn hơnscanl(+)0[a,d,64,r]
xnor

5

Đang xử lý, 134 108 + 14 (gọi tới size) = 148 122 byte

Đầu tiên chúng ta cần một cuộc gọi đến sizemột nơi nào đó trong chương trình để đầu ra sẽ vừa trong cửa sổ (mặc định là 100x100).

size(400,400);

Và đây là chức năng thực tế:

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);}

Gọi nó như thế f(15,20,70,40);

Ảnh chụp màn hình

15, 20, 70, 40

Hình ảnh, tưởng tượng


Câu trả lời mới hơn của tôi đơn giản hơn câu trả lời cũ hơn, nhưng tôi thích câu trả lời cũ hơn (ngay cả khi nó lớn hơn).

Câu trả lời cũ (148 byte)

size(400,400);

và hai chức năng

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);}

Gọi nó như thế nào f(int_array_containing_values);và kết quả sẽ trông giống như:f(new int[]{15,20,70,40});


4

SmileBASIC, 90 byte

INPUT A,D,S,R
B=A+D+64W=#Y-S
GLINE.,#Y,A,0GLINE A,0,A+D,W
GLINE A+D,W,B,W
GLINE B,W,B+R,#Y

4

PHP, 149 130 byte

[,$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);

đưa đầu vào từ các đối số dòng lệnh, ghi hình ảnh (PNG với biểu đồ màu xanh lam trên nền đen) vào thiết bị xuất chuẩn. Yêu cầu PHP 7.1 trở lên.

sử dụng, vd

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

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

+4 byte cho PHP cũ hơn: Thay thế [,$a,$d,$s,$r]bằng list(,$a,$d,$s,$r).


Có một hack nhỏ trong đó: thay vì sử dụng imageopenpolygonđể ẩn đường cơ sở, đường đa giác hoàn thiện được vẽ bên ngoài khung vẽ. (y = 127 sẽ chỉ hiển thị trên một hình ảnh có chiều cao> = 128.)

Tôi có thể đã lưu nhiều hơn với màu 99 hoặc 9 thay vì 999; nhưng những cái đó khá khó nhìn trên màu đen. :)


3

Bash + ân sủng , 70 byte

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

Kịch bản ghi vào tệp ftọa độ của từng điểm và xmgrace (phiên bản GUI) đọc tệp và hiển thị âm mưu bằng các dòng theo mặc định.

Chạy :

./plot_ADSR.sh 15 30 70 40

Đầu ra: (màn hình in)

15 30 70 40

Tôi nghĩ rằng điều này có thể được thực hiện trực tiếp bởi một tập lệnh ân sủng, nếu nó có thể chấp nhận đầu vào, nhưng tôi không quen với cú pháp của nó. Tôi sẽ xem xét nó.

Giải trình:

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

Đi, 947 915 506 byte

Điều này là xa tối ưu hóa, cố gắng học ngôn ngữ trong khi tham gia vào những câu hỏi này. Hãy chỉ ra những gì tôi có thể làm.

hình ảnh cố định

Ngưng tụ:

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)}

Vô điều kiện:

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 nó là. Theo mặc định 0,0 là trên cùng bên trái. Ill nghịch đảo mọi thứ ngay khi tôi có thể.
kemicofa

1
Tôi không bao giờ mã hóa trong đi, vì vậy tôi không biết. Người dùng ở đây chơi mã của họ theo cách thủ công vì họ có thể tiết kiệm nhiều byte hơn so với công cụ khai thác chung. Thực hành mã hóa xấu và thủ thuật được hoan nghênh ở đây. Đối với ex, sẽ không thay thế các đối tượng struct bằng các biến (như l1x, l1y, l1X, l1Y) có thể là golfier?
seshoumara

1
@rugdealer Điều này có thể giúp ích, trong trường hợp bạn chưa thấy nó
Luis Mendo

1
Mất gần 400 byte nhờ vào liên kết của bạn @LuisMendo
kemicofa

1
@rugdealer Wow, thật là nhiều \ o /
Luis Mendo

1

dc, 120 byte

Ban đầu tôi nghĩ rằng tôi không thể trả lời bằng dc, nhưng tôi thấy rằng việc in cú pháp của hình ảnh vector được cho phép.

?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

Mã này tính toán tọa độ dịch của từng điểm và tạo cú pháp SVG cho cốt truyện. Vì trình chỉnh sửa hình ảnh có gốc ở góc trên bên trái, tôi phải trừ các ygiá trị từ height, 127 trong trường hợp này, để hình ảnh được hiển thị như thể gốc nằm ở góc dưới bên trái.

Chạy ví dụ: hoặc dùng thử trực tuyến!

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

Đầu ra:

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

Để hiển thị cốt truyện hình ảnh, hãy lưu đầu ra chính xác đó vào một tệp và mở nó bằng Gimp, ví dụ, hoặc nhập văn bản vào một trang html như tôi đã làm ở trên.

Giải thích: dc là một ngôn ngữ ngăn xếp ngược d esk c alculator stack

Kịch bản là một chuỗi dài chuỗi cú pháp SVG. Từ khóa Mlà viết tắt của di chuyển để phối hợpLlà viết tắt của đường vẽ từ vị trí hiện tại đến tọa độ đã cho .

?                           # 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.