Utwórz animację nożyczek!

21

Spróbuj stworzyć prostą animację nożyczek artystycznych ASCII!

Wyzwanie

Wszystkie dane wejściowe będą liczbami całkowitymi od -31 do 31.

Wyjście będzie animacją (do przesłania gdzieś , dopóki poprzednia klatka zostanie zastąpiona. Dozwolone są pliki GIF.), Oddzielone (w przybliżeniu) 1 kwadrans.

Jeśli input ( n) jest dodatni:

  • Animacja powinna zaczynać się od 8<otwartych nożyczek AKA.
  • Następna klatka to 8=. To pokazuje „cięcie” nożyczek.
  • Za nożyczkami dodaje się myślnik (kreskę), a animacja powtarza się, dopóki nie pojawią się nmyśli.

Jeśli dane wejściowe są ujemne:

  • Nożyczki zaczynają się otwierać i skierowane w lewo (w ten sposób >8:), z nodstępami przed nimi.
  • Nożyczki zamykają się i pozostają skierowane w lewo ( =8).
  • Nożyczki otwierają się ponownie, gdy przestrzeń jest usuwana, a za nożyczkami dodawana jest kreska.

Jeśli wartość wejściowa wynosi zero:

  • Wyjmij tylko nożyczki otwierające i zamykające, dla 10 klatek. Mogą być skierowane w dowolnym kierunku, o ile jest to spójne.

To jest , więc wygrywa najkrótsze przesłanie w bajtach. (Nawet jeśli twoje zgłoszenie wyraźnie nie wygra z powodu jakiegoś nowego „golfowego języka”, nadal chcielibyśmy go zobaczyć).

Komunikaty o błędach są dozwolone, o ile sam komunikat o błędzie nie zakłóca animacji.

Przykładowe pary wejść i wyjść:

(Rozdzieliłem klatki dla zachowania przejrzystości, ale pomiędzy każdą klatką powinno być około 0,25 sekundy)

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

Cieszyć się!

iPhoenix
źródło
Tak to jest. Dodam to.
iPhoenix
Czy czcionka musi być umieszczona w stałej szerokości?
Οurous
@ Οurous Jeśli twój język to obsługuje, tak. W przeciwnym razie nie.
iPhoenix

Odpowiedzi:

5

MATL , 59 58 57 bajtów

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

Wypróbuj w MATL Online! Lub zobacz przykład uruchamiany z kompilatora offline:

wprowadź opis zdjęcia tutaj

Luis Mendo
źródło
To może być tylko ja, ale wygląda na to, że zamknięte animacje nożycowe są dłuższe niż otwarte animacje nożycowe. Czy to tylko z powodu przetwarzania języka?
iPhoenix
1
Nie zauważyłem tego, ale może być. Zauważyłem, że lewe są nieco wolniejsze; i to ma sens, ponieważ mają trochę więcej przetwarzania. W każdym razie, dla pewności, ponieważ wyzwanie mówi, że dzieli je (w przybliżeniu) 1 kwadrans, wydaje mi się, że jest to do przyjęcia, prawda?
Luis Mendo,
Znalazłem kogoś, kto znał MATL, a oni pokazali mi, co robi twój kod, i wydaje się, że jest w porządku :)
iPhoenix
@iPhoenix Powinienem dodać wyjaśnienie :-)
Luis Mendo
4

JavaScript (ES2017) + HTML, 165 + 10 bajtów

-16 bajtów przez @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>

Wypróbuj w poniższym fragmencie:

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
źródło
1
Kilka szybkich oszczędności pozwalających obniżyć do 157 bajtów za pomocą JS. (Chociaż wprowadzenie alertkażdej „ramki” może nie być zgodne ze specyfikacją, możesz uzyskać wyjaśnienie).
Kudłaty
@Shaggy Dzięki za ulepszenia! Celowo nie korzystałem, alertponieważ wymagania są takie, że ramki przychodzą w odstępach ~ 0,25 s, co alertnie byłoby obsługiwane bez dalszej ingerencji użytkownika.
Birjolaxew
2

TI-BASIC, 173 bajty

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

Bardzo interesującą przeszkodą było wejście 0 zakończone w innej ramce niż inne.

Ponieważ TI-BASIC nie lubi pustych ciągów, zachowuje co najmniej jeden manekin po lewej stronie nożyczek, z których pierwszy jest zawsze spacją; miejmy nadzieję, że unikniemy liczenia tego jako części n spacji dla negatywnych danych wejściowych, program ten rozpoczyna drukowanie od skrajnej prawej kolumny pierwszego wiersza, a następnie owija pozostałą część łańcucha w dół, aby rozpocząć tam rzeczywiste pole animacji pierwsza kolumna.

Kilka uwag dla egzotycznego urządzenia: Rozmiar kodu TI-BASIC mierzony jest w tokenach, a nie w znakach. W celu uzyskania spójnych porównań między kalkulatorami zwykle ignorujemy liczby bajtów odnoszące się do długości nagłówków (np. Odejmujemy 8 z PROGRAMU: Nożyczki). Ponadto w przypadku procedur, które są w pełni dobrze zachowane na ekranie głównym (w większości pozbawionych struktur kontrolnych), dodatkowo eliminujemy rozmiar pustego programu, aby „zapisać” również na 9 bajtach. W szczególności tego programu nie można pisać na ekranie głównym, więc nie można zabrać wolności.

Wilkołak
źródło
Próbowałem tego wyzwania w TI-BASIC (w sali do nauki, na moim CE. Gdzie jeszcze?), Kiedy o tym pomyślałem, a mój program był co najmniej dwa razy większy niż ten. Dobra robota.
iPhoenix
2

Oktawa , 190 186 bajtów

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

Wypróbuj online! (uwaga: clcnie działa w TIO, więc są to tylko wszystkie klatki animacji wysyłane sekwencyjnie). Dzięki za @LuisMendo za poinformowanie mnie o funkcji e(...)w Octave, która jest równa exp(1)*ones(...).

Okazuje się, że przypisania wbudowane zwracają tylko zmienione wpisy tablicy, a nie całą tablicę. Oznacza to, że podobne konstrukcje q(k(i+1)+=s)nie są możliwe, więc program jest prawie jak MATLAB. W rzeczywistości pozycja MATLAB jest tylko nieco dłuższa,

MATLAB, 198 195 bajtów

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
źródło
Myślę, że w Octave możesz zastąpić +onesbrzydszego +~e. Również w Octave i Matlab zamień [i i+1]na i:i+1.
Luis Mendo
@LuisMendo Czego, na Ziemi, używa się w e(...)ten sposób? Nie sądzę, że kiedykolwiek czułem potrzebę zastosowania macierzy m-by-n e. To sprawia, że ​​gra w golfa jest dobra.
Sanchises
Być może programiści Octave mieli na myśli golfa, haha
Luis Mendo
1

Czysty , 294 bajty

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

Wypróbuj online!

Pamiętaj, że to nie działa w TIO, link służy wyłącznie do celów prezentacji.

Wyniki mogą się różnić, jeśli masz CLOCK_PER_TICKstałą inną niż 1000domyślna dla Windows Clean Clean x86.

Obrzydliwe
źródło
0

Python 2 , 170 bajtów

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)

Wypróbuj online!

ovs
źródło
(approximately) 1 quarter of a second; dlaczego nie wykorzystać czasu snu w .2sekundach i zaoszczędzić bajt?
Jonathan Frech
0

Rubin, 169 bajtów

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

Prawie samo wyjaśniające, kiedy się w to zagłębisz, przynajmniej moim zdaniem. Program musi być uruchomiony na komputerze z poleceniem / aliasem cls.

Wypróbuj online! (Musiałem zastąpić metodę system (), tylko dla tego skryptu, z powodu ograniczeń wymienionych powyżej.)

Próbowałem użyć

puts `cls`, ...

Ale właśnie wydrukował niewidzialną postać, ktoś wie dlaczego?

Håvard Nygård
źródło