¡Crea una animación de tijera!

21

¡Intenta crear una animación de tijeras de arte ASCII simple!

Reto

Todas las entradas serán enteras -31 a 31.

La salida será una animación (se emitirá en algún lugar , siempre que se reemplace el fotograma anterior. Se permiten GIF.), Separados por (aproximadamente) 1 cuarto de segundo.

Si la entrada ( n) es positiva:

  • La animación debería comenzar con 8<, también conocido como tijeras abiertas.
  • El siguiente cuadro es 8=. Esto muestra las tijeras "cortando".
  • Se agrega un guión (marca de corte) detrás de las tijeras, y la animación se repite hasta que haya nguiones.

Si la entrada es negativa:

  • Las tijeras comienzan abiertas y mirando hacia la izquierda (así:) >8, con nespacios en frente.
  • Las tijeras se cierran y permanecen mirando hacia la izquierda ( =8).
  • Las tijeras se vuelven a abrir, a medida que se elimina el espacio, y se agrega un guión detrás de las tijeras.

Si la entrada es cero:

  • Salida solo las tijeras de apertura y cierre, para 10 cuadros. Pueden estar orientados en cualquier dirección, siempre que sea consistente.

Este es el , por lo que gana el envío más corto en bytes. (Incluso si su entrada claramente no ganará debido a algún tipo de "lenguaje de golf" novedoso, todavía nos gustaría verlo).

Los mensajes de error están permitidos, siempre que el mensaje de error en sí no interfiera con la animación.

Ejemplo de pares de entrada y salida:

(Separé los cuadros para mayor claridad, pero debería haber aproximadamente 0,25 segundos entre cada cuadro)

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

¡Disfrutar!

iPhoenix
fuente
Sí lo es. Agregaré eso.
iPhoenix
¿La fuente debe ser monoespaciada?
Precioso
@ Οurous Si su idioma lo admite, sí. De otra manera no.
iPhoenix

Respuestas:

5

MATL , 59 58 57 bytes

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

¡Pruébalo en MATL Online! O vea un ejemplo ejecutado desde el compilador fuera de línea:

ingrese la descripción de la imagen aquí

Luis Mendo
fuente
Podría ser solo yo, pero parece que las animaciones de tijera cerradas son más largas que las de tijera abierta. ¿Es esto solo debido al procesamiento del lenguaje?
iPhoenix
1
No me he dado cuenta de eso, pero podría ser. Lo que noto es que los de la izquierda son un poco más lentos; y eso tiene sentido porque tienen algo más de procesamiento. De todos modos, solo para estar seguro, ya que el desafío dice separado por (aproximadamente) 1 cuarto de segundo , supongo que es aceptable, ¿verdad?
Luis Mendo
Encontré a alguien que conocía MATL, y me mostraron lo que hacía tu código, y parece estar bien :)
iPhoenix
@ iPhoenix Debería haber agregado una explicación :-)
Luis Mendo
4

JavaScript (ES2017) + HTML, 165 + 10 bytes

-16 bytes por @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>

Pruébelo en el fragmento de abajo:

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
fuente
1
Unos ahorros rápidos para reducirlo a 157 bytes usando solo JS. (Aunque es posible que alertcada "marco" no se adhiera a la especificación, es posible que desee obtener una aclaración sobre eso.)
Shaggy
@ Shaggy Gracias por las mejoras! No lo alertutilicé intencionalmente, ya que los requisitos son que los marcos vienen a intervalos de ~ 0.25 segundos, lo alertque no sería compatible sin una mayor entrada del usuario.
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

¡Hacer que la entrada 0 terminara en un marco diferente de los demás fue un obstáculo muy interesante!

Como a TI-BASIC no le gustan las cadenas vacías, esto mantiene al menos un carácter ficticio a la izquierda de las tijeras, el primero de los cuales es constantemente un espacio; para evitar contar esto como parte de los n espacios para entradas negativas, este programa comienza a imprimir desde la columna más a la derecha de la primera fila, luego envuelve el resto de la cadena hacia abajo para comenzar el campo real de animación allí, recién salido del primera columna.

Algunas notas para un dispositivo exótico: el tamaño del código TI-BASIC se mide en tokens, no en caracteres. Para comparaciones consistentes de calculadoras cruzadas, generalmente ignoramos los recuentos de bytes que tratan con longitudes de encabezado (por ejemplo, restamos 8 de PROGRAMA: TIJERAS). Además, para las rutinas que se comportan completamente bien en la pantalla de inicio (las que carecen de estructuras de control, en su mayor parte), eliminamos aún más el tamaño de un programa vacío para "guardar" en 9 bytes también. Este programa en particular no se puede escribir en la pantalla de inicio, por lo que no se tomará la libertad.

Weregoose
fuente
Probé este desafío en TI-BASIC (en la sala de estudio, en mi CE. ¿Dónde más?) Cuando lo pensé, y mi programa era al menos dos veces más grande que esto. Bien hecho.
iPhoenix
2

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

Pruébalo en línea! (nota: clcno funciona en TIO, por lo que solo se muestran todos los cuadros de animación secuencialmente). Gracias por @LuisMendo por informarme sobre la función e(...)en Octave, que es igual a exp(1)*ones(...).

Resulta que las asignaciones en línea devuelven solo las entradas de matriz modificadas, no toda la matriz. Esto significa que construcciones como q(k(i+1)+=s)no son posibles, por lo que el programa es casi como MATLAB. De hecho, la entrada de MATLAB es solo un poco más larga,

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
Sanchises
fuente
En Octave, creo que puedes reemplazarlo +onespor el más feo +~e. Además, en Octave y en Matlab, reemplace [i i+1]por i:i+1.
Luis Mendo
@LuisMendo ¿De qué demonios se usa e(...)así? No creo haber sentido la necesidad de una matriz de m por n e. Sin embargo, es un buen golf.
Sanchises
Quizás los desarrolladores de Octave tenían en mente el código golf, jaja
Luis Mendo
1

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

Pruébalo en línea!

Tenga en cuenta que esto no funciona en TIO, el enlace es solo para fines de presentación.

Sus resultados pueden variar si tiene una CLOCK_PER_TICKconstante distinta a 1000la predeterminada para Windows Clean x86.

Οurous
fuente
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)

Pruébalo en línea!

ovs
fuente
(approximately) 1 quarter of a second; ¿Por qué no usar un tiempo de reposo de .2segundos y guardar un byte?
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}}

Bastante autoexplicativo cuando profundizas en ello, al menos en mi opinión. El programa debe ejecutarse en una computadora con el comando / alias cls.

Pruébalo en línea! (Tuve que sobrescribir el método system (), solo para este script, debido a las limitaciones mencionadas anteriormente).

Intenté usar

puts `cls`, ...

Pero acaba de imprimir un personaje invisible, ¿alguien sabe por qué?

Håvard Nygård
fuente