Crie uma animação em tesoura!

21

Tente criar uma animação em tesoura de arte ASCII simples!

Desafio

Todas as entradas serão números -31 a 31.

A saída será uma animação (a ser emitida em algum lugar , desde que o quadro anterior seja substituído. GIFs são permitidos.), Separados por (aproximadamente) 1 quarto de segundo.

Se a entrada ( n) for positiva:

  • A animação deve começar com 8<uma tesoura aberta AKA.
  • O próximo quadro é 8=. Isso mostra a tesoura "cortando".
  • Um traço (marca de corte) é adicionado atrás da tesoura, e a animação se repete até que haja ntraços.

Se a entrada for negativa:

  • A tesoura começa aberta e voltada para a esquerda (assim:) >8, com nespaços à sua frente.
  • A tesoura fecha e permanece voltada para a esquerda ( =8).
  • A tesoura reabre, à medida que o espaço é removido e um traço é adicionado atrás da tesoura.

Se a entrada for zero:

  • Saída apenas a tesoura abrindo e fechando, por 10 quadros. Eles podem estar voltados para qualquer direção, desde que seja consistente.

Isso é , então a submissão mais curta em bytes vence. (Mesmo que a sua inscrição não ganhe claramente por causa de algum tipo de "idioma de golfe" novo, ainda gostaríamos de vê-la.)

As mensagens de erro são permitidas, desde que a própria mensagem de erro não interfira na animação.

Exemplo de pares de entrada e saída:

(Separei os quadros para maior clareza, mas deve haver aproximadamente 0,25 segundos entre cada quadro)

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

Apreciar!

iPhoenix
fonte
Sim. Vou acrescentar isso.
IPhoenix
A fonte precisa ser monoespaçada?
Οurous
@ Οurous Se o seu idioma suportar, sim. Caso contrário, não.
IPhoenix

Respostas:

5

MATL , 59 58 57 bytes

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

Experimente no MATL Online! Ou veja um exemplo executado no compilador offline:

insira a descrição da imagem aqui

Luis Mendo
fonte
Pode ser apenas eu, mas parece que as animações em tesoura fechada são mais longas que as animações em tesoura aberta. Isso se deve apenas ao processamento do idioma?
iPhoenix 26/01/18
1
Eu não notei isso, mas poderia ser. O que noto é que os de esquerda são um pouco mais lentos; e isso faz sentido porque eles têm um pouco mais de processamento. De qualquer forma, só para ter certeza, já que o desafio diz separado por (aproximadamente) 1 quarto de segundo , acho que é aceitável, certo?
Luis Mendo
Eu encontrei alguém que sabia MATL, e eles mostraram o meu o seu código estava fazendo, e parece bem :)
iPhoenix
@iPhoenix eu deveria ter acrescentado uma explicação :-)
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>

Experimente no trecho abaixo:

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
fonte
1
Algumas rápidas de poupança para que você obtenha até 157 bytes usando apenas JS. (Embora alerting cada "frame" pode não aderir à especificação, você pode querer obter esclarecimentos sobre isso.)
Shaggy
@ Shaggy Obrigado pelas melhorias! Eu não usei intencionalmente, alertjá que os requisitos são que os quadros cheguem a intervalos de ~ 0,25s, o que alertnão seria suportado sem mais informações do usuário.
precisa saber é o seguinte
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

Ter a entrada 0 terminada em um quadro diferente dos outros foi um obstáculo muito interessante!

Como o TI-BASIC não gosta de cordas vazias, isso mantém pelo menos um caractere fictício à esquerda da tesoura, o primeiro dos quais é constantemente um espaço; para evitar contar isso como parte dos n espaços para entradas negativas, este programa começa a imprimir a partir da coluna mais à direita da primeira linha e, em seguida, quebra o restante da string para baixo, a fim de iniciar o campo real de animação, recém primeira coluna.

Algumas notas para um dispositivo exótico: O tamanho do código TI-BASIC é medido em tokens, não em caracteres. Para comparações consistentes de calculadoras cruzadas, geralmente ignoramos a contagem de bytes que lida com os comprimentos dos cabeçalhos (por exemplo, subtraímos 8 de PROGRAM: SCISSORS). Além disso, para rotinas que se comportam totalmente na tela inicial (aquelas que não possuem estruturas de controle, na maioria das vezes), eliminamos ainda mais o tamanho de um programa vazio para "salvar" em 9 bytes também. Este programa em particular não pode ser digitado na tela inicial, para que a liberdade não seja tomada.

Weregoose
fonte
Eu tentei esse desafio no TI-BASIC (na sala de estudos, no meu CE. Onde mais?) Quando pensei nisso, e meu programa era pelo menos duas vezes maior que isso. Bem feito.
IPhoenix
2

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

Experimente online! (nota: clcnão funciona no TIO, portanto, são apenas todos os quadros de animação produzidos sequencialmente). Obrigado por @LuisMendo por me informar sobre a função e(...)no Octave, que é igual a exp(1)*ones(...).

Acontece que as atribuições em linha retornam apenas as entradas alteradas da matriz, não a matriz inteira. Isso significa que construções como q(k(i+1)+=s)não são possíveis, portanto o programa é quase como MATLAB. De fato, a entrada do MATLAB é apenas um pouco mais longa,

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
fonte
Na oitava, acho que você pode substituir +onespelo mais feio +~e. Além disso, no Octave e no Matlab, substitua [i i+1]por i:i+1.
Luis Mendo 27/01
@LuisMendo De que diabos é esse uso e(...)? Acho que nunca senti a necessidade de uma matriz m-por-n de e. Faz para um bom golfe embora.
Sanchises
Talvez os desenvolvedores Octave tinha golf código em mente, haha
Luis Mendo
1

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

Experimente online!

Observe que isso não funciona no TIO, o link é apenas para fins de apresentação.

Seus resultados podem variar se você tiver uma CLOCK_PER_TICKconstante diferente 1000do padrão para x86 Windows Clean.

Furioso
fonte
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)

Experimente online!

ovs
fonte
(approximately) 1 quarter of a second; por que não usar um tempo de espera de .2segundos e salvar um byte?
Jonathan Frech 28/01
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}}

Praticamente auto-explicativo quando você explora, pelo menos na minha opinião. O programa deve estar em execução em um computador com o comando / alias cls.

Experimente online! (Foi necessário substituir o método system (), apenas para esse script, devido às limitações mencionadas acima.)

Eu tentei usar

puts `cls`, ...

Mas acabou de imprimir um personagem invisível, alguém sabe por quê?

Håvard Nygård
fonte