Crea un'animazione a forbice!


21

Prova a creare una semplice animazione con forbici d'arte ASCII!

Sfida

Tutti gli input saranno numeri interi da -31 a 31.

L'output sarà un'animazione (da emettere da qualche parte , purché il fotogramma precedente venga sostituito. Sono consentite GIF.), Separati da (circa) 1 quarto di secondo.

Se l'ingresso ( n) è positivo:

  • L'animazione dovrebbe iniziare con 8<le forbici aperte AKA.
  • Il prossimo frame è 8=. Questo mostra le forbici "taglio".
  • Un trattino (segno di taglio) viene aggiunto dietro le forbici e l'animazione si ripete fino a quando non ci sono ntrattini.

Se l'ingresso è negativo:

  • Le forbici iniziano aperte e rivolte verso sinistra (in questo modo:) >8, con nspazi davanti.
  • Le forbici si chiudono e rimangono rivolte verso sinistra ( =8).
  • Le forbici si riaprono, quando lo spazio viene rimosso e viene aggiunto un trattino dietro le forbici.

Se l'ingresso è zero:

  • Uscita solo le forbici di apertura e chiusura, per 10 fotogrammi. Possono essere rivolti in entrambe le direzioni, purché siano coerenti.

Questo è , quindi vince l'invio più breve in byte. (Anche se la tua iscrizione chiaramente non vincerà a causa di una sorta di "linguaggio del golf" nuovo, vorremmo comunque vederlo.)

I messaggi di errore sono consentiti, purché il messaggio di errore stesso non interferisca con l'animazione.

Esempio di coppie di input e output:

(Ho separato i fotogrammi per chiarezza, ma ci dovrebbero essere circa 0,25 secondi tra ciascun fotogramma)

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

Godere!


Sì. Lo aggiungerò.
iPhoenix il

Il font deve essere monospaziato?
Οuroso

@ Οurous Se la tua lingua lo supporta, sì. Altrimenti no.
iPhoenix il

Risposte:



5

MATL , 59 58 57 byte

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

Provalo su MATL Online! Oppure vedi un esempio eseguito dal compilatore offline:

inserisci qui la descrizione dell'immagine


Potrei essere solo io, ma sembra che le animazioni a forbice chiuse siano più lunghe di quelle a forbice aperta. Ciò è dovuto solo all'elaborazione della lingua?
iPhoenix il

1
Non l'ho notato, ma potrebbe essere. Quello che noto è che quelli a sinistra sono un po 'più lenti; e questo ha senso perché hanno un po 'più di elaborazione. Ad ogni modo, solo per essere sicuri, dato che la sfida dice separata da (circa) 1 quarto di secondo immagino sia accettabile, giusto?
Luis Mendo,

Ho trovato qualcuno che conosceva MATL e mi hanno mostrato cosa stava facendo il tuo codice, e sembra che
vada

@iPhoenix avrei dovuto aggiungere una spiegazione :-)
Luis Mendo il

4

JavaScript (ES2017) + HTML, 165 + 10 byte

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

Provalo nello snippet seguente:

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
Alcuni rapidi risparmi per arrivare a 157 byte usando solo JS. (Anche se alertogni "fotogramma" potrebbe non aderire alle specifiche, potresti desiderare di ottenere chiarimenti al riguardo.)
Shaggy,

@Shaggy Grazie per i miglioramenti! Non ho usato intenzionalmente alertpoiché i requisiti sono che i frame arrivano a intervalli di ~ 0,25s, che alertnon supportano senza ulteriori input dell'utente.
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

Far terminare l'ingresso 0 in un frame diverso dagli altri è stato un ostacolo molto interessante!

Poiché a TI-BASIC non piacciono le stringhe vuote, questo mantiene almeno un carattere fittizio a sinistra delle forbici, il primo dei quali è costantemente uno spazio; per evitare, si spera, di contarlo come parte degli n spazi per gli input negativi, questo programma inizia a stampare dalla colonna più a destra della prima riga, quindi avvolge il resto della stringa verso il basso per iniziare il campo di animazione reale lì, appena prima colonna.

Alcune note per un dispositivo esotico: la dimensione del codice TI-BASIC è misurata in token, non in caratteri. Per confronti costanti di calcolatori incrociati, di solito ignoriamo i conteggi dei byte relativi alle lunghezze delle intestazioni (ad esempio, sottraggiamo 8 dal PROGRAMMA: FORBICI). Inoltre, per le routine che si comportano perfettamente nella schermata principale (quelle che mancano di strutture di controllo, per la maggior parte), eliminiamo ulteriormente le dimensioni di un programma vuoto per "salvare" anche su 9 byte. Questo programma, in particolare, non è scrivibile nella schermata principale, quindi la libertà non verrà presa.


Ho provato questa sfida in TI-BASIC (nella sala studio, sulla mia CE. Dove altro?) Quando ci ho pensato, e il mio programma era almeno il doppio di questo. Molto bene.
iPhoenix,

2

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

Provalo online! (nota: clcnon funziona in TIO, quindi sono solo tutti i frame di animazione emessi in sequenza). Grazie per @LuisMendo per avermi informato della funzione e(...)in Octave, che è uguale a exp(1)*ones(...).

Si scopre che le assegnazioni in linea restituiscono solo le voci dell'array modificate, non l'intero array. Ciò significa che costruzioni simili q(k(i+1)+=s)non sono possibili, quindi il programma è quasi come MATLAB. In effetti, la voce MATLAB è solo leggermente più lunga,

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

In Octave, penso che tu possa sostituire +onesil più brutto +~e. Inoltre, in Octave e in Matlab, sostituisci [i i+1]con i:i+1.
Luis Mendo,

@LuisMendo A che serve usare e(...)così? Non credo di aver mai sentito il bisogno di una matrice m-by-n di e. Per un buon golf, però.
Sanchises,

Forse gli sviluppatori di Octave avevano in mente il golf del codice, haha
Luis Mendo,

1

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

Provalo online!

Nota che questo non funziona su TIO, il link è solo a scopo di presentazione.

I risultati possono variare se si dispone di una CLOCK_PER_TICKcostante diversa da 1000quella predefinita per Windows Clean x86.


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)

Provalo online!


(approximately) 1 quarter of a second; perché non usare un tempo di .2inattività di secondi e salvare un byte?
Jonathan Frech,

0

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

Praticamente autoesplicativo quando ci approfondisci, almeno secondo me. Il programma deve essere in esecuzione su un computer con il comando / alias cls.

Provalo online! (Ho dovuto sovrascrivere il metodo system (), proprio per questo script, a causa delle limitazioni sopra menzionate.)

Ho provato a usare

puts `cls`, ...

Ma ha appena stampato un personaggio invisibile, qualcuno sa perché?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.