Створіть анімацію ножиць!


21

Спробуйте створити просту анімацію художньої ножиці ASCII!

Виклик

Усі входи будуть цілими числами -31 до 31.

Вихід буде анімацією (виводиться кудись , поки буде замінено попередній кадр. Дозволені GIF.), Розділені на (приблизно) 1 чверть секунди.

Якщо вхід ( n) позитивний:

  • Анімація повинна починатися з 8<відкритих ножиць AKA.
  • Наступний кадр - 8=. Це показує, що ножиці "ріжуться".
  • За ножицями додається тире (відрізний знак), а анімація повторюється, поки не з’являться nтире.

Якщо вхід негативний:

  • Ножиці починають відкриватися і звернені в бік ліворуч (приблизно так:) >8, з nпробілами перед ним.
  • Ножиці закриваються та залишаються зверненими вліво ( =8).
  • Ножиці знову відкриваються, оскільки простір видаляється, а за ножицями додається тире.

Якщо вхід дорівнює нулю:

  • Вивести лише ножиці, що відкриваються та закриваються, на 10 кадрів. Вони можуть стикатися в будь-якому напрямку, доки це буде послідовно.

Це , тому виграє найкоротше подання в байтах. (Навіть якщо ваш запис явно не виграє через якусь новомодну "гольф-мову", ми все одно хотіли б її побачити.)

Повідомлення про помилки дозволені, доки саме повідомлення про помилку не заважає анімації.

Приклад пар введення та виведення:

(Я розділив кадри для наочності, але між кожним кадром має бути приблизно .25 секунд)

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

Насолоджуйтесь!


Так. Я додам це.
iPhoenix

Чи потрібно шрифт односхилим?
Οurous

@ Οurous Якщо ваша мова це підтримує, так. Інакше ні.
iPhoenix

Відповіді:



5

MATL , 59 58 57 байт

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

Спробуйте в MATL Online! Або подивіться приклад запуску з офлайн-компілятора:

введіть тут опис зображення


Це може бути просто я, але виявляється, що анімація із закритими ножицями довша, ніж у відкритих ножиць. Це лише пов'язано з обробкою мови?
iPhoenix

1
Я цього не помічав, але це могло бути. Що я помічаю, - лівіші трохи повільніше; і це має сенс, оскільки у них є ще якась обробка. У будь-якому випадку, просто для переконання, оскільки виклик говорить, що розділений на (приблизно) 1 чверть секунди, я думаю, це прийнятно, правда?
Луїс Мендо

Я знайшов когось, хто знав MATL, і вони показали мені, що робить ваш код, і, здається, добре :)
iPhoenix

@iPhoenix Я повинен був додати пояснення :-)
Луїс Мендо

4

JavaScript (ES2017) + HTML, 165 + 10 байт

-16 байт від @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>

Спробуйте в наведеному нижче фрагменті:

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
Кілька швидких заощаджень, щоб знизити до 157 байт за допомогою просто JS. (Хоча alertкожен "кадр" може не дотримуватися специфікації, можливо, ви захочете отримати уточнення з цього приводу.)
Shaggy

@Shaggy Дякую за покращення! Я навмисно не використовував, alertоскільки вимоги полягають у тому, щоб кадри надходили з інтервалом ~ 0,25s, що alertне підтримувало б без подальшого введення користувачем.
Birjolaxew

2

TI-BASIC, 173 байти

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

Дуже цікавою перешкодою було закінчення введення 0 в іншому кадрі від інших.

Оскільки TI-BASIC не любить порожніх рядків, це підтримує щонайменше один манекен ліворуч від ножиць, перший з яких постійно є пробілом; щоб сподіватися, щоб не вважати це частиною n пробілів для негативних вводів, ця програма починає друкувати з правого правого стовпця першого ряду, а потім перегортає решту рядка вниз, щоб почати фактичне поле анімації там, свіжим від перша колонка.

Деякі примітки для екзотичного пристрою: розмір коду TI-BASIC вимірюється в лексемах, а не символах. Для послідовних крос-калькуляторних порівнянь ми зазвичай ігноруємо кількість байтів, що стосуються довжин заголовка (наприклад, віднімаємо 8 від ПРОГРАМИ: СКАСОРИ). Крім того, для підпрограм, які повністю добре себе почувають на головному екрані (здебільшого тих, у яких відсутні керуючі структури, здебільшого), ми додатково усуваємо розмір порожньої програми, щоб "заощадити" також на 9 байтах. Зокрема, ця програма не набирається на головному екрані, так що свобода не буде зайнята.


Я спробував цей виклик у TI-BASIC (У навчальному залі, на моєму CE. Де ще?), Коли я думав про це, і моя програма була щонайменше удвічі більша за цю. Молодці.
iPhoenix

2

Октава , 190 186 байт

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

Спробуйте в Інтернеті! (зверніть увагу: clcне працює в TIO, тому це просто всі анімаційні кадри, що виводяться послідовно). Дякую за @LuisMendo, що дав мені знати про функцію e(...)в Octave, яка дорівнює exp(1)*ones(...).

Виявляється, вбудовані завдання повертають лише змінені записи масиву, а не весь масив. Це означає, що подібні конструкції q(k(i+1)+=s)неможливі, тому програма майже схожа на MATLAB. Насправді запис MATLAB лише трохи довший,

MATLAB, 198 195 байт

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

В Octave, я думаю, ти можеш замінити +onesна потворніший +~e. Також в Октаві та в Матлабі замініть [i i+1]на i:i+1.
Луїс Мендо

@LuisMendo Що для Землі таке використання e(...)? Я не думаю, що я ніколи не відчував потреби в m-by-n матриці e. Хоча добре для гри в гольф.
Санчіз

Можливо, розробники Octave мали на увазі код гольфу, ха-ха
Луїс Мендо

1

Чисто , 294 байти

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

Спробуйте в Інтернеті!

Зауважте, що це не працює в TIO, посилання призначене лише для презентації.

Результати можуть відрізнятись, якщо для x86 Windows Clean за умовчанням встановлено CLOCK_PER_TICKпостійне значення, ніж інше 1000.



0

Рубі, 169 байт

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

Досить сильно пояснюючи себе, коли копаєтесь у ньому, принаймні, на мою думку. Програма повинна запускатися на комп’ютері з командою / псевдонімом cls.

Спробуйте в Інтернеті! (Доводилося перезаписувати метод system (), саме для цього сценарію через обмеження, згадані вище.)

Я намагався використовувати

puts `cls`, ...

Але він просто надрукував невидимий символ, хто-небудь знає чому?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.