Создайте анимацию ножниц!

21

Попробуйте создать простую анимацию ножниц ASCII!

Вызов

Все входные данные будут целыми числами от -31 до 31.

Выводом будет анимация (которая будет выведена где-то , пока предыдущий кадр заменен. GIF-файлы разрешены.), Разделенные (приблизительно) 1 четвертью секунды.

Если вход ( n) положительный:

  • Анимация должна начинаться с 8<AKA с открытыми ножницами.
  • Следующий кадр 8=. Это показывает ножницы "резки".
  • Тире (метка обрезки) добавляется за ножницами, и анимация повторяется, пока не nпоявятся тире.

Если вход отрицательный:

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

Если вход равен нулю:

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

Это , поэтому выигрывает самое короткое представление в байтах. (Даже если ваша заявка явно не выиграет из-за какого-то новомодного «языка игры в гольф», мы все равно хотели бы это увидеть.)

Сообщения об ошибках допускаются, если само сообщение об ошибке не мешает анимации.

Пример входных и выходных пар:

(Я выделил кадры для ясности, но между каждым кадром должно быть приблизительно 0,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
источник
Да, это. Я добавлю это.
iPhoenix
Нужно ли использовать моноширинный шрифт?
18:30
@ Ο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>

Birjolaxew
источник
1
Несколько быстрых сбережений, чтобы сократить объем до 157 байт, используя только JS. (Хотя alertкаждый «кадр» может не соответствовать спецификации, вы можете получить разъяснения по этому поводу.)
Shaggy
@ Shaggy Спасибо за улучшения! Я намеренно не использовал, alertпоскольку требования состоят в том, чтобы кадры появлялись с интервалами ~ 0,25 с, что alertне будет поддерживаться без дальнейшего ввода данных пользователем.
Биржолаксев
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 из PROGRAM: SCISSORS). Кроме того, для подпрограмм, которые ведут себя хорошо на домашнем экране (по большей части испытывающих недостаток в структурах управления), мы дополнительно исключаем размер пустой программы, чтобы «сохранить» и 9 байтов. Эта программа, в частности, не может быть напечатана на домашнем экране, так что свобода не будет взята.

Weregoose
источник
Я пробовал эту задачу в 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
Sanchises
источник
В Octave, я думаю, вы можете заменить +onesна более уродливый +~e. Также в Octave и в Matlab замените [i i+1]на i:i+1.
Луис Мендо
@ LuisMendo Что на земле такое использование e(...)? Я не думаю, что я когда-либо чувствовал потребность в матрице m-by-n e. Делает для хорошего гольфа, хотя.
Sanchises
Возможно, разработчики 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, ссылка только для целей презентации.

Ваши результаты могут отличаться, если у вас есть CLOCK_PER_TICKконстанта 1000, отличная от значения по умолчанию для Windows XP Clean.

Οurous
источник
0

Python 2 , 170 байт

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)

Попробуйте онлайн!

овс
источник
(approximately) 1 quarter of a second; почему бы не использовать время сна .2секунд и сохранить байт?
Джонатан Фрех
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`, ...

Но это просто напечатанный невидимый персонаж, кто-нибудь знает почему?

Ховард Нигорд
источник