Bir makas animasyonu oluşturun!


21

Basit bir ASCII sanat makası animasyonu yaratmaya çalışın!

Meydan okuma

Tüm girişler -31 ila 31 arasındaki tamsayılar olacaktır.

Çıktı bir animasyon olacaktır ( önceki kare değiştirildiği sürece bir yere çıkarılmalıdır . GIF'lere izin verilir.), Saniyenin 1 çeyreği (yaklaşık) ile ayrılır.

Giriş ( n) pozitifse:

  • Animasyon 8<AKA'nın açık makasıyla başlamalı .
  • Bir sonraki kare 8=. Bu makas "kesme" gösterir.
  • Makasın arkasına bir çizgi (kesim işareti) eklenir ve animasyon, nçizgi olana kadar tekrar eder .

Giriş negatifse:

  • Makas , önünde boşluklar olacak şekilde açılmaya ve sola doğru bakmaya başlar (Bu >8şekilde n:).
  • Makas kapanır ve sola doğru bakar ( =8).
  • Makas, alan kaldırıldıkça yeniden açılır ve makasın arkasına bir çizgi eklenir.

Giriş sıfır ise:

  • 10 kare için sadece açma ve kapama makası verin. Tutarlı olduğu sürece her iki yöne dönük olabilirler.

Bu , yani bayt cinsinden en kısa sürede gönderim kazanıyor. (Girişiniz bir çeşit yeni çıkmış "golf dili" yüzünden açıkça kazanmasa bile, onu görmek isteriz.)

Hata mesajlarının, animasyonu etkilemediği sürece hata mesajlarına izin verilir.

Örnek Giriş ve Çıkış Çiftleri:

(Çerçeveleri netlik için ayırdım, ancak her çerçevenin arasında yaklaşık 0,25 saniye olmalıdır)

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

Keyfini çıkarın!


Evet öyle. Bunu ekleyeceğim.
iPhoenix

Yazı tipi monospaced gerekiyor mu?
Büyük

@ Οurous Diliniz destekliyorsa, evet. Aksi takdirde, hayır.
iPhoenix

Yanıtlar:



5

MATL , 59 58 57 bayt

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

MATL Online'da deneyin ! Veya çevrimdışı derleyiciden çalıştırılan bir örneğe bakın:

görüntü tanımını buraya girin


Sadece ben olabilirim, ancak kapalı makas animasyonlarının açık makaslardan daha uzun olduğu görülüyor. Bu sadece dilin işlenmesinden mi kaynaklanıyor?
iPhoenix

1
Bunu farketmedim, ama olabilir. Fark ettim ki, soldakiler biraz daha yavaş; ve bu mantıklı çünkü daha fazla işlemesi var. Her neyse, sadece emin olmak için, meydan okuma ayrıldığını söylediği için (yaklaşık) saniyenin 1 çeyreğinde biri sanırım kabul edilebilir değil mi?
Luis Mendo,

MATL'yi bilen birini buldum ve kodunuzun ne yaptığını gösterdiler ve iyi görünüyor :)
iPhoenix

@iPhoenix Bir açıklama eklemeliydim :-)
Luis Mendo

4

JavaScript (ES2017) + HTML, 165 + 10 bayt

-16 byte @Shaggy tarafından

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>

Aşağıdaki pasajda deneyin:

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
Sadece JS kullanarak 157 bayta indirmenizi sağlayacak birkaç hızlı tasarruf . ( Her "kare" nin tanımlanması şartnameye alert
Shaggy

@Shaggy Gelişmeler için teşekkürler! Ben kasıtlı olarak kullanmadım, alertçünkü gereksinimler karelerin alertdaha fazla kullanıcı girişi olmadan desteklemeyecek şekilde ~ 0.25s aralıklarla gelmesiydi .
Birjolaxew

2

TI-BASIC, 173 bayt

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

0 girişinin diğerlerinden farklı bir çerçevede sonlandırılması çok ilginç bir engeldi!

TI-BASIC boş dizgileri sevmediğinden, bu makasın solunda en az bir boş karakter bulundurur; umarım bunu n'nin bir parçası olarak saymaktan kaçınmak negatif girdiler için boşluklarının bir için, bu program ilk satırın en sağındaki sütundan yazdırmaya başlar, ardından oradaki gerçek animasyon alanına başlamak için dizginin kalanını aşağıya doğru sarar. ilk sütun.

Egzotik bir cihaz için bazı notlar: TI-BASIC kod boyutu, karakterlerle değil belirteçlerle ölçülür. Tutarlı hesap makineleri karşılaştırması için, genellikle başlık uzunluklarıyla ilgili bayt sayısını yok sayarız (örneğin, PROGRAM: SCISSORS'tan 8 çıkarırız). Ek olarak, ana ekranda tam olarak iyi davranılan rutinler için (çoğu kez kontrol yapılarında bulunmayanlar), 9 baytta da "kaydetmek" için boş bir programın boyutunu daha da ortadan kaldırıyoruz. Özellikle bu program ana ekranda yazılmaz, bu nedenle özgürlük alınmaz.


Bu zorluğu TI-BASIC'te (çalışma salonunda, CE'mde. Başka nerede?) Düşündüm de denedim ve programım bunun en az iki katı büyüklüğündeydi. Aferin.
iPhoenix

2

Octave , 190 186 bayt

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

Çevrimiçi deneyin! (not: clcTIO'da çalışmadığından, sırayla çıkarılan tüm animasyon kareleridir). @LuisMendo için bana e(...)eşit olan Octave'deki işlevden haberdar olduğum için teşekkür ederiz exp(1)*ones(...).

Satır içi atamaların dizinin tamamı yerine yalnızca değiştirilen dizi girişlerini döndürdüğü ortaya çıktı. Bu gibi yapıların q(k(i+1)+=s)mümkün olmadığı anlamına gelir , bu nedenle program neredeyse MATLAB'a benzer. Aslında, MATLAB girişi sadece biraz daha uzundur,

MATLAB, 198 195 bayt

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

Octave'de, +onesçirkin tarafından değiştirilebileceğini düşünüyorum +~e. Ayrıca, Octave ve Matlabda yerine [i i+1]göre i:i+1.
Luis Mendo,

@LuisMendo Dünya'da bunun kullanımı e(...)nedir? Bir m-by-n matrisine hiç ihtiyaç duymadığımı sanmıyorum e. Yine de iyi golf için yapar.
18'de Sanchises

Belki de Octave geliştiricileri akılda kod golfüne sahipti, haha
Luis Mendo,

1

Temiz , 294 bayt

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

Çevrimiçi deneyin!

Bunun TIO'da çalışmadığını, bağlantının sadece sunum amaçlı olduğunu unutmayın.

X86 Windows Clean için varsayılan değer CLOCK_PER_TICKdışında bir sabitiniz varsa, sonuçlarınız değişebilir 1000.


0

Python 2 , 170 bayt

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)

Çevrimiçi deneyin!


(approximately) 1 quarter of a second; neden .2saniye uyku süresi kullanmıyor ve bayttan tasarruf etmiyorsunuz ?
Jonathan Frech,

0

Ruby, 169 bayt

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

Kazmak zaman kendi kendine çok açıklayıcı, benim görüşüme göre en az. Program bir bilgisayarda cls komutu / alias ile çalışıyor olmalı.

Çevrimiçi deneyin! (Yukarıda belirtilen sınırlamalar nedeniyle, sadece bu senaryo için system () yönteminin üzerine yazmak zorunda kaldım.)

Kullanmaya çalıştım

puts `cls`, ...

Ama sadece görünmez bir karakter bastı, kimse nedenini biliyor?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.