Erstellen Sie eine Scherenanimation!


21

Versuchen Sie, eine einfache ASCII-Kunstscherenanimation zu erstellen!

Herausforderung

Alle Eingaben sind Ganzzahlen von -31 bis 31.

Bei der Ausgabe handelt es sich um eine Animation (die irgendwo ausgegeben werden muss , solange der vorherige Frame ersetzt wird. GIFs sind zulässig.), Die durch (ungefähr) eine Viertelsekunde voneinander getrennt ist.

Wenn die Eingabe ( n) positiv ist:

  • Die Animation sollte mit einer 8<offenen Schere beginnen.
  • Der nächste Frame ist 8=. Dies zeigt die Schere "Schneiden".
  • Hinter der Schere wird ein Strich (Schnittmarke) eingefügt, und die Animation wird wiederholt, bis nStriche angezeigt werden.

Wenn die Eingabe negativ ist:

  • Die Schere beginnt offen und zeigt nach links (so:) >8, mit nLeerzeichen davor.
  • Die Schere schließt sich und zeigt nach links ( =8).
  • Die Schere öffnet sich wieder, wenn der Platz entfernt wird und ein Strich hinter der Schere hinzugefügt wird.

Wenn die Eingabe Null ist:

  • Geben Sie nur die Schere zum Öffnen und Schließen für 10 Bilder aus. Sie können in beide Richtungen zeigen, sofern dies konsistent ist.

Das ist , also gewinnt die kürzeste Einsendung in Bytes. (Auch wenn Ihr Beitrag aufgrund einer neuen "Golfsprache" nicht unbedingt gewinnen wird, würden wir ihn gerne sehen.)

Fehlermeldungen sind zulässig, solange die Fehlermeldung selbst die Animation nicht beeinträchtigt.

Beispiel für Eingabe- und Ausgabepaare:

(Ich habe die Frames aus Gründen der Klarheit getrennt, zwischen den einzelnen Frames sollten jedoch ca. 0,25 Sekunden liegen.)

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

Genießen!


Ja ist es. Ich werde das hinzufügen.
iPhoenix

Muss die Schriftart in einem Abstand sein?
Urous

@ Οurous Wenn Ihre Sprache dies unterstützt, ja. Ansonsten nein.
iPhoenix

Antworten:



5

MATL , 59 58 57 Bytes

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

Probieren Sie es bei MATL Online! Oder sehen Sie sich ein Beispiel an, das vom Offline-Compiler ausgeführt wird:

Bildbeschreibung hier eingeben


Es könnte nur ich sein, aber es scheint, dass die geschlossenen Scherenanimationen länger sind als die offenen Scherenanimationen. Liegt das nur an der Verarbeitung der Sprache?
iPhoenix

1
Ich habe das nicht bemerkt, aber es könnte sein. Was ich bemerke, ist, dass die linken etwas langsamer sind; und das macht Sinn, weil sie etwas mehr Verarbeitung haben. Wie auch immer, nur um sicher zu gehen, da die Herausforderung einen Abstand von (ungefähr) einer Viertelsekunde aufweist, denke ich, dass es akzeptabel ist, oder?
Luis Mendo

Ich fand jemanden, der MATL kannte, und sie zeigten mir, was Ihr Code tat, und es scheint in Ordnung zu sein :)
iPhoenix

@iPhoenix Ich hätte eine Erklärung hinzufügen sollen :-)
Luis Mendo

4

JavaScript (ES2017) + HTML, 165 + 10 Byte

-16 Bytes von @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>

Probieren Sie es im folgenden Snippet aus:

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
Ein paar schnelle Einsparungen, um mit nur JS auf 157 Byte zu kommen . (Obwohl alertjedes "Bild" möglicherweise nicht der Spezifikation entspricht, möchten Sie möglicherweise eine Erläuterung dazu erhalten.)
Shaggy

@ Shaggy Danke für die Verbesserungen! Ich habe es absichtlich nicht verwendet, alertda die Anforderungen lauten, dass die Frames in Intervallen von ~ 0,25 s vorliegen, was alertohne weitere Benutzereingaben nicht möglich wäre.
Birjolaxew

2

TI-BASIC, 173 Bytes

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

Es war ein sehr interessantes Hindernis, wenn der 0-Eingang in einem anderen Frame als die anderen endet!

Da TI-BASIC keine leeren Zeichenfolgen mag, wird mindestens ein Dummy-Zeichen links von der Schere beibehalten, wobei das erste ständig ein Leerzeichen ist. Um zu vermeiden, dass dies als Teil der n Leerzeichen für negative Eingaben gezählt wird, beginnt dieses Programm mit dem Ausdruck ab der rechten Spalte der ersten Zeile und umschließt dann den Rest der Zeichenfolge nach unten, um das eigentliche Animationsfeld dort neu zu beginnen erste Spalte.

Einige Hinweise für ein exotisches Gerät: Die TI-BASIC-Codegröße wird in Token und nicht in Zeichen gemessen. Für konsistente rechnerübergreifende Vergleiche ignorieren wir normalerweise die Anzahl der Bytes, die sich auf die Headerlängen beziehen (z. B. subtrahieren wir 8 von PROGRAM: SCISSORS). Darüber hinaus wird für Routinen, die sich auf dem Startbildschirm gut verhalten (die größtenteils keine Kontrollstrukturen aufweisen), die Größe eines leeren Programms weiter verringert, um auch 9 Bytes zu "sparen". Insbesondere dieses Programm ist auf dem Startbildschirm nicht schreibbar, sodass keine Freiheit genommen wird.


Ich habe diese Herausforderung in TI-BASIC (In der Studienhalle, auf meinem CE. Wo sonst?) Ausprobiert, als ich daran dachte, und mein Programm war mindestens doppelt so groß wie dieses. Gut gemacht.
iPhoenix

2

Oktave , 190 186 Bytes

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

Probieren Sie es online! (Hinweis: Funktioniert clcnicht in TIO, daher werden nur alle Animationsframes nacheinander ausgegeben.) Vielen Dank für @LuisMendo, dass Sie mich auf die Funktion e(...)in Octave aufmerksam gemacht haben, die gleichbedeutend mit ist exp(1)*ones(...).

Es stellt sich heraus, dass Inline-Zuweisungen nur die geänderten Array-Einträge zurückgeben, nicht das gesamte Array. Das heißt, Konstruktionen wie q(k(i+1)+=s)sind nicht möglich, das Programm ist also fast wie bei MATLAB. In der Tat ist der MATLAB-Eintrag nur geringfügig länger,

MATLAB, 198 195 Bytes

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

In Octave kann man das meiner Meinung nach +onesdurch das hässlichere ersetzen +~e. Ersetzen Sie außerdem in Octave und in Matlab [i i+1]durch i:i+1.
Luis Mendo

@ LuisMendo Was um alles in der Welt ist die Verwendung von e(...)so? Ich glaube nicht, dass ich jemals das Bedürfnis nach einer m-by-n-Matrix von hatte e. Gute Voraussetzungen zum Golfen.
Sanchises

Vielleicht hatten die Octave-Entwickler Codegolf im Sinn, haha
Luis Mendo

1

Sauber , 294 Bytes

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

Probieren Sie es online!

Beachten Sie, dass dies bei TIO nicht funktioniert. Der Link dient nur zu Präsentationszwecken.

Ihre Ergebnisse können variieren, wenn Sie eine CLOCK_PER_TICKandere Konstante als 1000die Standardkonstante für x86 Windows Clean verwenden.


0

Python 2 , 170 Bytes

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)

Probieren Sie es online!


(approximately) 1 quarter of a second; Warum nicht eine Ruhezeit von .2Sekunden verwenden und ein Byte speichern?
Jonathan Frech

0

Ruby, 169 Bytes

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

Ziemlich selbsterklärend, wenn man sich damit beschäftigt, zumindest meiner Meinung nach. Das Programm muss auf einem Computer mit dem Befehl cls / alias ausgeführt werden.

Probieren Sie es online! (Musste die system () -Methode aufgrund der oben genannten Einschränkungen nur für dieses Skript überschreiben.)

Ich habe versucht zu verwenden

puts `cls`, ...

Aber es hat nur ein unsichtbares Zeichen gedruckt, weiß jemand warum?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.