Tạo một hình ảnh động kéo!


21

Hãy thử tạo một hoạt hình kéo nghệ thuật ASCII đơn giản!

Thử thách

Tất cả các đầu vào sẽ là số nguyên -31 đến 31.

Đầu ra sẽ là một hình ảnh động (Sẽ được xuất ra ở đâu đó , miễn là khung hình trước đó được thay thế. GIF được cho phép.), Cách nhau khoảng (khoảng) 1 phần tư giây.

Nếu đầu vào ( n) dương:

  • Các hình ảnh động nên bắt đầu với 8<, kéo mở AKA.
  • Khung tiếp theo là 8=. Điều này cho thấy cái kéo "cắt".
  • Một dấu gạch ngang (dấu cắt) được thêm vào phía sau kéo và hình động lặp lại cho đến khi có ndấu gạch ngang.

Nếu đầu vào là âm:

  • Cái kéo bắt đầu mở và hướng về phía bên trái (Như thế này >8:), với nkhoảng trống ở phía trước nó.
  • Cái kéo đóng lại và vẫn hướng về phía bên trái ( =8).
  • Kéo mở lại, khi không gian được loại bỏ, và một dấu gạch ngang được thêm vào phía sau kéo.

Nếu đầu vào bằng không:

  • Đầu ra chỉ cần mở và đóng kéo, trong 10 khung. Họ có thể phải đối mặt với một trong hai hướng, miễn là nó phù hợp.

Đây là , vì vậy bài nộp ngắn nhất tính bằng byte sẽ thắng. (Ngay cả khi mục nhập của bạn rõ ràng sẽ không giành chiến thắng vì một số "ngôn ngữ chơi gôn" mới lạ, chúng tôi vẫn muốn thấy nó.)

Thông báo lỗi được cho phép, miễn là bản thân thông báo lỗi không can thiệp vào hình ảnh động.

Ví dụ Cặp đầu vào và đầu ra:

(Tôi tách các khung hình cho rõ ràng, nhưng sẽ có khoảng 0,25 giây giữa mỗi khung hình)

Input: 1
Output: 
8<
8=
-8<

Input: 2
Output:
8<
8=
-8<
-8=
--8<

Input: 5
Output:
8<
8=
-8<
-8=
--8<
--8=
---8<
---8=
----8<
----8=
-----8<

Input: 0
Output:
8<
8=
8<
8=
8<
8=
8<
8=
8<
8=

Input: -2
Output:
  >8
  =8
 >8-
 =8-
>8--

Input: -3
Output:
   >8
   =8
  >8-
  =8-
 >8--
 =8--
>8---

Thưởng thức!


Vâng, nó là. Tôi sẽ thêm điều đó.
iPhoenix

Có phông chữ cần phải được đơn cách?
Οurous

@ Urous Nếu ngôn ngữ của bạn hỗ trợ nó, vâng. Mặt khác, không.
iPhoenix

Câu trả lời:



5

MATL , 59 58 57 byte

|EQG~10*+:"&FXx45@q2/kGg*XHY"8Vh61@oGO<Eq*+h4M?G|H-Z"hP]D

Hãy thử nó tại MATL Online! Hoặc xem một ví dụ chạy từ trình biên dịch ngoại tuyến:

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


Nó có thể chỉ là tôi, nhưng có vẻ như các hình ảnh động cắt kéo kín dài hơn các hình cắt kéo mở. Đây có phải chỉ là do việc xử lý ngôn ngữ?
iPhoenix

1
Tôi đã không nhận thấy điều đó, nhưng nó có thể. Những gì tôi nhận thấy là, những người bên trái chậm hơn một chút; và điều đó có ý nghĩa bởi vì họ có một số xử lý nhiều hơn. Dù sao, chỉ để chắc chắn, vì thử thách nói cách nhau khoảng (khoảng) 1 phần tư giây tôi đoán nó có thể chấp nhận được, phải không?
Luis Mendo

Tôi đã tìm thấy một người biết MATL và họ đã cho tôi biết mã của bạn đang làm gì và có vẻ ổn :)
iPhoenix

@iPhoenix Tôi nên thêm một lời giải thích :-)
Luis Mendo

4

JavaScript (ES2017) + HTML, 165 + 10 byte

-16 byte bởi @Shaggy

n=>(g=i=>i<-~(n?2*m:9)&&setTimeout(g,250,i+1,s=8+"<>="[i%2?2:n<0|0],o=("-".repeat(i/2)+s).padEnd(m+2),e.innerHTML=(n?n<0?[...o].reverse().join``:o:s)))(0,m=n<0?-n:n)
<pre id=e>

Hãy thử nó trong đoạn trích dưới đây:

let globalTimeout;
const _setTimeout = setTimeout;
window.setTimeout = function(){ globalTimeout = _setTimeout.apply(this, arguments); }
// Code above is to support user input

f=
n=>(g=i=>i<-~(n?2*m:9)&&setTimeout(g,250,i+1,s=8+"<>="[i%2?2:n<0|0],o=("-".repeat(i/2)+s).padEnd(m+2),e.textContent=(n?n<0?[...o].reverse().join``:o:s)))(0,m=n<0?-n:n)

// Code below is to support user input
f(10)
const $inp = document.getElementById("inp");
inp.addEventListener("change", ()=>{
  clearTimeout(globalTimeout);
  f(+inp.value);
});
<input type="number" id="inp" min="-31" max="31" value="10" />

<pre id=e>


1
Một vài khoản tiết kiệm nhanh để giúp bạn giảm xuống còn 157 byte chỉ bằng cách sử dụng JS. (Mặc dù alerting từng "khung" có thể không tuân thủ thông số kỹ thuật, bạn có thể muốn làm rõ về điều đó.)
Shaggy

@Shaggy Cảm ơn những cải tiến! Tôi cố tình không sử dụng alertvì các yêu cầu là các khung có khoảng ~ 0,25 giây, alertkhông hỗ trợ nếu không có thêm người dùng nhập liệu.
Birjolaxew

2

TI-BASIC, 173 byte

:"-
:For(X,1,5
:Ans+Ans
:End
:For(X,1,32
:" "+Ans+" →Str1
:End
:ClrHome
:Input N
:N<0→X
:For(A,not(N),abs(N+5not(N
:For(B,4-3X,6-3X-(A=abs(N)),2
:33X-Anot(not(N
:Output(1,16,sub(Str1,33X+32,abs(Ans-1)-NX-31X)+sub(">8=8<8=",B,2)+sub(Str1,Ans+32,1
:rand(11
:End
:End

Có đầu vào 0 kết thúc trong một khung khác với các đầu vào khác là một trở ngại rất thú vị!

Vì TI-BASIC không thích các chuỗi trống, điều này duy trì ít nhất một ký tự giả ở bên trái của kéo, đầu tiên liên tục là một khoảng trắng; để hy vọng tránh việc coi đây là một phần của n khoảng trống cho đầu vào âm, chương trình này bắt đầu in từ cột ngoài cùng bên phải của hàng đầu tiên, sau đó bọc phần còn lại của chuỗi xuống để bắt đầu trường hoạt hình thực tế ở đó, làm mới Cột đầu tiên.

Một số lưu ý cho một thiết bị kỳ lạ: kích thước mã TI-BASIC được đo bằng mã thông báo, không phải ký tự. Để so sánh giữa các máy tính chéo nhất quán, chúng tôi thường bỏ qua số byte xử lý độ dài tiêu đề (ví dụ: chúng tôi trừ 8 từ PROGRAM: SCISSORS). Ngoài ra, đối với các thói quen hoạt động tốt trên màn hình chính (phần lớn thiếu cấu trúc điều khiển), chúng tôi cũng loại bỏ kích thước của một chương trình trống để "tiết kiệm" trên 9 byte. Chương trình này đặc biệt không thể đánh máy trên màn hình chính, do đó, sự tự do sẽ không được thực hiện.


Tôi đã thử thách này trong TI-BASIC (Trong hội trường học tập, trên CE của tôi. Còn ở đâu nữa?) Khi tôi nghĩ về nó, và chương trình của tôi lớn hơn ít nhất gấp đôi so với điều này. Làm tốt.
iPhoenix

2

Octave , 190 186 byte

k=32+~e((a=abs(n=(z=input(''))+~z*10))+1,1);for i=1:a
clc
k(i:i+1)=[56,61-(s=sign(n))];q=@(m)fprintf(rot90([m ''],s));q(k)
if(i-a)pause(.25)
clc
k(i+1)+=s;q(k)
pause(.25);k(i)=45;end
end

Hãy thử trực tuyến! (lưu ý: clckhông hoạt động trong TIO, do đó, tất cả các khung hình động được xuất ra liên tục). Cảm ơn @LuisMendo vì đã cho tôi biết chức năng e(...)trong Octave, tương đương với exp(1)*ones(...).

Nó chỉ ra rằng các bài tập nội tuyến chỉ trả về các mục mảng đã thay đổi, không phải toàn bộ mảng. Điều này có nghĩa là các công trình như q(k(i+1)+=s)không thể thực hiện được, vì vậy chương trình này gần giống như MATLAB. Trên thực tế, mục MATLAB chỉ dài hơn một chút,

MATLAB, 198 195 byte

n=input('');n=n+~n*10;a=abs(n);s=sign(n);k=zeros(a+1,1);q=@(k)fprintf(rot90([k ''],s));for i=1:a
k(i:i+1)=[56 61-s];clc
q(k)
if(i-a)pause(.25);
k(i+1)=k(i+1)+s;clc
q(k)
pause(.25)
k(i)=45;end
end

Trong Octave, tôi nghĩ bạn có thể thay thế +onesbằng cái xấu hơn +~e. Ngoài ra, trong Octave và Matlab, thay thế [i i+1]bằng i:i+1.
Luis Mendo

@LuisMendo Việc sử dụng e(...)như thế là gì? Tôi không nghĩ rằng tôi đã từng cảm thấy cần một ma trận m-by-n e. Làm cho chơi golf tốt mặc dù.
Sanchise

Có lẽ các nhà phát triển Octave đã nghĩ đến môn đánh gôn, haha
Luis Mendo

1

Sạch sẽ , 294 byte

import StdEnv,System.Time,ArgEnv,System._Unsafe
Start#n=toInt(select(getCommandLine)1)
=[?k l\\k<-[1..]&l<-if(n==0)(flatten o$5)(init)[$(abs n+2)'\b'++if(n<0)(rjustify(abs n+2))reverse[c,'8': $i'-']\\i<-[0..abs n],c<-[if(n<0)'>''<','=']]]
?t#(Clock n)=accUnsafe clock
|n>t*250=id= ?t
$ =repeatn

Hãy thử trực tuyến!

Lưu ý rằng điều này không hoạt động trên TIO, liên kết chỉ dành cho mục đích trình bày.

Kết quả của bạn có thể thay đổi nếu bạn có một CLOCK_PER_TICKhằng số khác 1000, mặc định cho x86 Windows Clean.


0

Python 2 , 170 byte

import time
n=input()
a=abs(n);s=a and n/a
for i in range([a-~a,10][a<1]):print'\n'*30+(a-i/2)*-s*' '+i/2*s*'-'+'>='[i%2]*(s<1)+'8'+'<='[i%2]*s+i/2*-s*'-';time.sleep(.25)

Hãy thử trực tuyến!


(approximately) 1 quarter of a second; Tại sao không sử dụng thời gian ngủ của .2giây và lưu một byte?
Jonathan Frech

0

Ruby, 169 byte

->x{i="";o=?=;(x!=0&&x.abs*2+1||10).times{|l|o=o[?=]?x>0?"8<":">8":x>0?"8=":"=8";f=?\s*(x<0&&-x-l/2||0);system"cls";puts x>0?i+o:f+o+i;i+=?-if(l).odd?&&x!=0;sleep 0.25}}

Khá nhiều tự giải thích khi bạn đào sâu vào nó, ít nhất theo ý kiến ​​của tôi. Chương trình phải được chạy trên máy tính với lệnh / bí danh cls.

Hãy thử trực tuyến! (Phải ghi đè phương thức system (), chỉ cho tập lệnh này, do những hạn chế được đề cập ở trên.)

Tôi đã thử sử dụng

puts `cls`, ...

Nhưng nó chỉ in một ký tự vô hình, có ai biết tại sao không?

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.