Créez une animation de ciseaux!

21

Essayez de créer une simple animation de ciseaux d'art ASCII!

Défi

Toutes les entrées seront des entiers de -31 à 31.

La sortie sera une animation (à sortir quelque part , tant que l'image précédente est remplacée. Les GIF sont autorisés.), Séparés par (environ) 1 quart de seconde.

Si l'entrée ( n) est positive:

  • L'animation devrait commencer par 8<, les ciseaux ouverts AKA.
  • L'image suivante est 8=. Cela montre les ciseaux "coupe".
  • Un tiret (marque de coupe) est ajouté derrière les ciseaux et l'animation se répète jusqu'à ce qu'il y ait des ntirets.

Si l'entrée est négative:

  • Les ciseaux commencent ouverts et tournés vers la gauche (comme ceci:) >8, avec des nespaces devant.
  • Les ciseaux se ferment et restent tournés vers la gauche ( =8).
  • Les ciseaux se rouvrent, car l'espace est supprimé, et un tiret est ajouté derrière les ciseaux.

Si l'entrée est nulle:

  • Sortie juste les ciseaux d'ouverture et de fermeture, pour 10 images. Ils peuvent faire face à l'une ou l'autre direction, à condition qu'elle soit cohérente.

Il s'agit de , donc la soumission la plus courte en octets l'emporte. (Même si votre participation ne gagnera clairement pas à cause d'une sorte de "langage du golf" nouveau, nous aimerions toujours le voir.)

Les messages d'erreur sont autorisés, tant que le message d'erreur lui-même n'interfère pas avec l'animation.

Exemples de paires d'entrée et de sortie:

(J'ai séparé les images pour plus de clarté, mais il devrait y avoir environ 0,25 seconde entre chaque image)

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

Prendre plaisir!

iPhoenix
la source
Oui, ça l'est. J'ajouterai cela.
iPhoenix
La police doit-elle être espacée?
2018 21urous
@ Οurous Si votre langue le prend en charge, oui. Sinon, non.
iPhoenix

Réponses:

5

MATL , 59 58 57 octets

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

Essayez-le sur MATL Online! Ou voyez un exemple exécuté à partir du compilateur hors ligne:

entrez la description de l'image ici

Luis Mendo
la source
C'est peut-être juste moi, mais il semble que les animations avec des ciseaux fermés soient plus longues que celles avec des ciseaux ouverts. Est-ce uniquement dû au traitement de la langue?
iPhoenix
1
Je ne l'ai pas remarqué, mais c'est possible. Ce que je remarque, c'est que ceux de gauche sont un peu plus lents; et cela a du sens parce qu'ils ont un peu plus de traitement. Quoi qu'il en soit, juste pour être sûr, puisque le défi dit séparé par (environ) 1 quart de seconde, je suppose que c'est acceptable, non?
Luis Mendo
J'ai trouvé quelqu'un qui connaissait MATL, et ils m'ont montré ce que faisait votre code, et ça semble bien :)
iPhoenix
@iPhoenix J'aurais dû ajouter une explication :-)
Luis Mendo
4

JavaScript (ES2017) + HTML, 165 + 10 octets

-16 octets par @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>

Essayez-le dans l'extrait ci-dessous:

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
la source
1
Quelques économies rapides pour passer à 157 octets en utilisant uniquement JS. (Bien alertque chaque "trame" n'adhère pas aux spécifications, vous voudrez peut-être obtenir des éclaircissements à ce sujet.)
Shaggy
@Shaggy Merci pour les améliorations! Je n'ai pas utilisé intentionnellement, alertcar les exigences sont que les images viennent à des intervalles de ~ 0,25 s, ce alertqui ne serait pas pris en charge sans autre intervention de l'utilisateur.
Birjolaxew
2

TI-BASIC, 173 octets

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

Le fait que l'entrée 0 se termine dans une trame différente des autres était un obstacle très intéressant!

Étant donné que TI-BASIC n'aime pas les chaînes vides, cela maintient au moins un caractère factice à gauche des ciseaux, dont le premier est constamment un espace; pour éviter, espérons-le, de compter cela dans les n espaces pour les entrées négatives, ce programme commence à imprimer à partir de la colonne la plus à droite de la première ligne, puis enroule le reste de la chaîne vers le bas afin de commencer le champ réel d'animation là-bas, tout frais première colonne.

Quelques notes pour un appareil exotique: la taille du code TI-BASIC est mesurée en jetons, pas en caractères. Pour des comparaisons inter-calculatrices cohérentes, nous ignorons généralement le nombre d'octets traitant des longueurs d'en-tête (par exemple, nous soustrayons 8 de PROGRAM: SCISSORS). De plus, pour les routines qui se comportent parfaitement sur l'écran d'accueil (celles qui manquent de structures de contrôle, pour la plupart), nous éliminons en outre la taille d'un programme vide pour "économiser" sur 9 octets également. Ce programme en particulier n'est pas typable sur l'écran d'accueil, de sorte que la liberté ne sera pas prise.

Weregoose
la source
J'ai essayé ce défi en TI-BASIC (dans la salle d'étude, sur mon CE. Où d'autre?) Quand j'y ai pensé, et mon programme était au moins deux fois plus grand que cela. Bien joué.
iPhoenix
2

Octave , 190 186 octets

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

Essayez-le en ligne! (Remarque: clcne fonctionne pas dans TIO, il s'agit donc uniquement de toutes les images d'animation générées de manière séquentielle). Merci pour @LuisMendo de m'avoir informé de la fonction e(...)dans Octave, qui est égale à exp(1)*ones(...).

Il s'avère que les affectations en ligne renvoient uniquement les entrées de tableau modifiées, pas le tableau entier. Cela signifie que les constructions comme q(k(i+1)+=s)ne sont pas possibles, donc le programme est presque comme MATLAB. En fait, l'entrée MATLAB n'est que légèrement plus longue,

MATLAB, 198 195 octets

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
la source
Dans Octave, je pense que vous pouvez remplacer +onespar le plus laid +~e. Aussi, dans Octave et Matlab, remplacez [i i+1]par i:i+1.
Luis Mendo
@LuisMendo De quoi diable est l'utilisation e(...)comme ça? Je ne pense pas avoir jamais ressenti le besoin d'une matrice m par n e. Fait pour le bon golf cependant.
Sanchises
Peut-être que les développeurs d'Octave avaient en tête le golf de code, haha
Luis Mendo
1

Nettoyer , 294 octets

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

Essayez-le en ligne!

Notez que cela ne fonctionne pas sur TIO, le lien est uniquement à des fins de présentation.

Vos résultats peuvent varier si vous avez une CLOCK_PER_TICKconstante autre que 1000la valeur par défaut pour x86 Windows Clean.

Οurous
la source
0

Python 2 , 170 octets

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)

Essayez-le en ligne!

ovs
la source
(approximately) 1 quarter of a second; pourquoi ne pas utiliser un temps de sommeil de .2quelques secondes et enregistrer un octet?
Jonathan Frech
0

Rubis, 169 octets

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

À peu près auto-explicatif lorsque vous y creusez, du moins à mon avis. Le programme doit être exécuté sur un ordinateur avec la commande / alias cls.

Essayez-le en ligne!(A dû écraser la méthode system (), juste pour ce script, en raison des limitations mentionnées ci-dessus.)

J'ai essayé d'utiliser

puts `cls`, ...

Mais il vient d'imprimer un personnage invisible, quelqu'un sait pourquoi?

Håvard Nygård
la source