Buat animasi gunting!

21

Cobalah untuk membuat animasi gunting seni ASCII sederhana!

Tantangan

Semua input akan berupa bilangan bulat -31 hingga 31.

Outputnya akan berupa animasi (Untuk dikeluarkan di suatu tempat , selama frame sebelumnya diganti. GIF diperbolehkan.), Dipisahkan oleh (kurang-lebih) 1 seperempat detik.

Jika input ( n) positif:

  • Animasi harus dimulai dengan 8<, AKA membuka gunting.
  • Bingkai selanjutnya adalah 8=. Ini menunjukkan gunting "memotong".
  • Tanda hubung (tanda potong) ditambahkan di belakang gunting, dan animasi berulang sampai ada ntanda hubung.

Jika input negatif:

  • Gunting mulai terbuka dan menghadap ke kiri (Seperti ini >8:), dengan nspasi di depannya.
  • Gunting menutup dan tetap menghadap ke kiri ( =8).
  • Gunting dibuka kembali, saat ruang dihapus, dan tanda hubung ditambahkan di belakang gunting.

Jika inputnya nol:

  • Keluarkan hanya pembukaan dan penutupan gunting, untuk 10 frame. Mereka dapat menghadapi kedua arah, selama itu konsisten.

Ini adalah , jadi pengiriman terpendek dalam byte akan menang. (Bahkan jika entri Anda jelas tidak akan menang karena semacam "bahasa golf" yang baru, kami masih ingin melihatnya.)

Pesan kesalahan diperbolehkan, selama pesan kesalahan itu sendiri tidak mengganggu animasi.

Contoh Pasang Input dan Output:

(Saya memisahkan frame untuk kejelasan, tetapi harus ada sekitar 0,25 detik antara setiap frame)

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

Nikmati!

iPhoenix
sumber
Ya itu. Saya akan menambahkannya.
iPhoenix
Apakah font perlu di-monospace?
Surous
@ Οurous Jika bahasa Anda mendukungnya, ya. Kalau tidak, tidak.
iPhoenix

Jawaban:

5

MATL , 59 58 57 byte

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

Cobalah di MATL Online! Atau lihat contoh jalankan dari kompiler offline:

masukkan deskripsi gambar di sini

Luis Mendo
sumber
Mungkin hanya saya, tetapi tampaknya animasi gunting tertutup lebih panjang daripada animasi gunting terbuka. Apakah ini hanya karena pemrosesan bahasa?
iPhoenix
1
Saya belum menyadarinya, tapi bisa jadi begitu. Yang saya perhatikan adalah, yang ke kiri sedikit lebih lambat; dan itu masuk akal karena mereka memiliki lebih banyak pemrosesan. Ngomong-ngomong, hanya untuk memastikan, karena tantangannya mengatakan dipisahkan oleh (kurang-lebih) seperempat detik saya kira itu bisa diterima, kan?
Luis Mendo
Saya menemukan seseorang yang mengenal MATL, dan mereka menunjukkan kepada saya apa yang sedang dilakukan kode Anda, dan sepertinya baik-baik saja :)
iPhoenix
@iPhoenix Saya seharusnya menambahkan penjelasan :-)
Luis Mendo
4

JavaScript (ES2017) + HTML, 165 + 10 byte

-16 byte oleh @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>

Cobalah di cuplikan di bawah ini:

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>

Birjolaxew
sumber
1
Beberapa penghematan cepat untuk menurunkan Anda ke 157 byte hanya dengan menggunakan JS. (Meskipun alertmasing-masing "bingkai" mungkin tidak mematuhi spesifikasi, Anda mungkin ingin mendapatkan klarifikasi tentang hal itu.)
Shaggy
@Shaggy Terima kasih atas perbaikannya! Saya sengaja tidak menggunakan alertkarena persyaratannya adalah bahwa frame datang pada interval ~ 0.25s, yang alerttidak akan mendukung tanpa input pengguna lebih lanjut.
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

Memiliki 0 input berakhir dalam bingkai yang berbeda dari yang lain adalah hambatan yang sangat menarik!

Karena TI-BASIC tidak suka string kosong, ini mempertahankan setidaknya satu karakter dummy di sebelah kiri gunting, yang pertama adalah ruang terus-menerus; untuk menghindari penghitungan ini sebagai bagian dari ruang n untuk input negatif, program ini mulai mencetak dari kolom paling kanan dari baris pertama, kemudian membungkus sisa string ke bawah untuk memulai bidang animasi yang sebenarnya di sana, segar dari kolom pertama.

Beberapa catatan untuk perangkat eksotis: Ukuran kode TI-BASIC diukur dalam token, bukan karakter. Untuk perbandingan lintas-kalkulator yang konsisten, kami biasanya mengabaikan jumlah byte yang berurusan dengan panjang header (misalnya, kami mengurangi 8 dari PROGRAM: SCISSORS). Selain itu, untuk rutinitas yang sepenuhnya berperilaku baik di layar awal (yang sebagian besar tidak memiliki struktur kontrol), kami juga menghilangkan ukuran program kosong untuk "menghemat" pada 9 byte juga. Program ini khususnya tidak dapat diketik di layar beranda, sehingga kebebasan tidak akan diambil.

Weregoose
sumber
Saya mencoba tantangan ini di TI-BASIC (di ruang belajar, di CE saya. Di mana lagi?) Ketika saya memikirkannya, dan program saya setidaknya dua kali lebih besar dari ini. Sudah selesai dilakukan dengan baik.
iPhoenix
2

Oktaf , 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

Cobalah online! (catatan: clctidak berfungsi di TIO, jadi hanya semua frame animasi yang dihasilkan secara berurutan). Terima kasih atas @LuisMendo karena membuat saya mengetahui fungsi e(...)di Octave, yang setara dengan exp(1)*ones(...).

Ternyata tugas inline hanya mengembalikan entri array yang diubah, bukan seluruh array. Ini berarti bahwa konstruksi seperti q(k(i+1)+=s)tidak dimungkinkan, jadi programnya hampir seperti MATLAB. Bahkan, entri MATLAB hanya sedikit lebih lama,

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
Sanchises
sumber
Di Octave, saya pikir Anda bisa mengganti +onesdengan yang lebih buruk +~e. Juga, dalam Oktaf dan Matlab, ganti [i i+1]dengan i:i+1.
Luis Mendo
@LuisMendo Apa yang di bumi adalah penggunaan e(...)seperti itu? Saya tidak berpikir saya pernah merasakan perlunya matriks m-by-n e. Membuat golf bagus.
Sanchises
Mungkin pengembang Octave memiliki kode golf dalam pikiran, haha
Luis Mendo
1

Bersih , 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

Cobalah online!

Perhatikan bahwa ini tidak berfungsi pada TIO, tautannya hanya untuk tujuan presentasi.

Hasil Anda dapat bervariasi jika Anda memiliki CLOCK_PER_TICKkonstanta selain 1000, standar untuk x86 Windows Clean.

Suram
sumber
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)

Cobalah online!

ovs
sumber
(approximately) 1 quarter of a second; mengapa tidak menggunakan waktu tidur .2detik dan menyimpan 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}}

Cukup banyak penjelasan sendiri ketika Anda menggali, setidaknya menurut pendapat saya. Program harus dijalankan di komputer dengan perintah / alias cls.

Cobalah online! (Harus menimpa metode system (), hanya untuk skrip ini, karena keterbatasan yang disebutkan di atas.)

Saya memang mencoba menggunakannya

puts `cls`, ...

Tapi itu hanya mencetak karakter yang tidak terlihat, ada yang tahu kenapa

Håvard Nygård
sumber