创建剪刀动画!


21

尝试创建一个简单的ASCII美工剪刀动画!

挑战

所有输入将是-31至31的整数。

输出将是动画(要在某处输出,只要替换上一帧即可。允许使用GIF。),动画间隔为(大约)四分之一秒。

如果输入(n)为正:

  • 动画应以开头8<,也就是打开剪刀。
  • 下一个帧是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

字体需要等距吗?
Οurous

@Οurous如果您的语言支持,则可以。否则,不会。
iPhoenix

Answers:



5

MATL59 58 57字节

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

MATL在线上尝试一下或查看从脱机编译器运行的示例:

在此处输入图片说明


可能只是我一个人,但封闭剪刀式动画似乎比开放剪刀式动画更长。这仅仅是由于语言的处理吗?
iPhoenix

1
我没有注意到,但是有可能。我注意到的是,向左的速度较慢;这是有道理的,因为它们还有更多处理能力。无论如何,可以肯定的是,由于挑战说间隔了(大约)四分之一秒,我想这是可以接受的,对吗?
Luis Mendo

我找到了一个认识MATL的人,他们向我展示了您的代码在做什么,这似乎还不错:)
iPhoenix

@iPhoenix我应该添加一个解释:-)
Luis

4

JavaScript(ES2017)+ HTML,165 + 10字节

@Shaggy -16个字节

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代码的大小以令牌而不是字符为单位。对于一致的跨计算器比较,我们通常忽略处理报头长度的字节计数(例如,从PROGRAM:SCISSORS中减去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,198195字节

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。此外,在八度及其在Matlab中,取代[i i+1]通过i:i+1
路易斯·门多

@LuisMendo到底有什么用e(...)?我认为我从来没有需要过一个m×n的矩阵e。虽然使良好的高尔夫。
桑契斯

八度音开发人员可能会考虑编写代码高尔夫球,哈哈
Luis Mendo,

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

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

Ruby,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`, ...

但是它只是印了一个看不见的字符,有人知道为什么吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.