跳伞运动


28

这是我的第一个挑战,因此我将其保持简单。

如果您曾经telnet towel.blinkenlights.nl在命令行上键入并按下Enter键,那么您将体验到升迁的乐趣。简单来说,Asciimation是一种用ascii艺术制作动画。今天,我们将做一个非常基本的练习,让一个人做起重千斤顶。

我们将把两张ascii图片放在一起。1号:

_o_
 0
/ \

2号:

\o/
_0_
<blank line>

请注意,第二个在结尾处有一个空白行。

因此,您的程序应执行以下步骤:

  1. 清除控制台屏幕。
  2. 打印正确的ascii艺术图像。
  3. 设置一个标志或其他东西,以便您下次知道其他图像。
  4. 等待片刻(大约一秒钟)。
  5. 继续1。

规则

  • 您的程序必须是(理论上)无限循环。
  • 必须先创建您使用的编程语言,然后才能发布此挑战。
  • 这是,因此以字节为单位的最短代码获胜。
  • 有标准漏洞。

请享用!


<空白行>上可以有空格吗?
雅库布2015年

1
这是否有独立于平台,因为Linux的清除命令(clear)是Windows的一个(不同的cls
β衰变

1
空行只是为了解释位置吗?如果从屏幕顶部进行打印以使空白行没有可见的差异,可以将其省略吗?
trichoplax

@Jakube是的,可以有空格。
bitsnbites 2015年

1
@trichoplax是的。空行只是为了指出头部必须保持在同一位置。
bitsnbites 2015年

Answers:


29

CJam,51 45 42 38 36字节

"c\o/
_0_""^[c_o_
 0
/ \^["{_o\6e4m!}g

上面使用插入符号。该序列^[实际上是代码点为27的ASCII字符。

^[c@DomHastings的答案经他的许可)中借用了转义序列(),以节省4个字节。

验证

您可以像这样重新创建文件:

base64 -d > jj.cjam <<< ImNcby8KXzBfIiIbY19vXwogMAovIFwbIntfb1w2ZTRtIX1n

要运行代码,请下载CJam解释器并执行以下步骤:

java -jar cjam-0.6.5.jar jj.cjam

这将在支持console_codes或适当子集的任何终端上工作。1个

怎么运行的

e# Push both jumping jacks on the stack.

"c\o/
_0_"

"^[c_o_
 0
/ \^["

e# When chained together, they contain two occurrences of the string "\ec",
e# which resets the terminal. Encoding the ESC byte in the second string
e# eliminates the need two escape a backslash before the string terminator.

{         e# Do:
  _o      e#   Copy the jumping jack on top of the stack and print the copy.
  \       e#   Swap the order of the jumping jacks.
  6e4m!   e#   Calculate the factorial of 60,000 and discard the result.
          e#   This takes "about a second".
}g        e# Since the discarded factorial was non-zero, repeat the loop.

1 如果在运行程序之前隐藏终端的光标,则跳跃插孔的外观会更好。例如,在Konsole中,您可以将光标的颜色设置为与背景色匹配。由于必须^[c重置终端,因此必须通过终端的设置来完成。


36
+1仅用于Calculate the factorial of 60,000 and discard the result. This takes "about a second".;)
ETHproductions 2015年

对于“无意义的操作,它返回真实值并花费大约一秒钟的时间来计算”,也许2Fm*是一个短了一个字节的好选择6e4m!
林恩

@Mauris我曾尝试使用进行类似的操作e!,但它们似乎已被记住。在第一次迭代之后,可怜的杰克心脏病发作了……
丹尼斯

10

Pyth- 41 40 39字节

.VZ"\x1b[H\x1b[J"@c"_o_
 0
/ \\\o/
_0_"Tb .p9

\x1b由于SO会破坏特殊字符,因此我将s计为一个字节)。

显然,由于a)无限循环和b)使用终端转义码,因此无法在线使用。

#                Infinite loop
 "..."           Print escape sequences to clear screen
 @               Modular indexing
  c     T        Chop at index ten into the constituent frames
   "..."         Frames 1 & 2 concatenated (Pyth allows literal newlines in strings)
  ~              Post assign. This is an assign that returns the old value.
   h             Increment function. Putting it after an assign makes it augmented assign.
   Z             Variable auto-initialized to zero.
 .p9             Permutations(range(9), 9). Takes about a second on my machine.

我惊讶地发现增强分配与后分配协同工作。Pyth很棒。


使用.V0作为无限循环
Jakube

由于OP已经确认不需要显式打印空白行,因此您现在可以保存一个字节
trichoplax 2015年

@Jakube似乎什么都没有保存。
马尔蒂森

您的解释与您的代码不符:P
Beta Decay

9

QBasic,58个字节

QB64上测试。

CLS
?"_o_"
?0
?"/ \"
SLEEP 1
CLS
?"\o/"
?"_0_"
SLEEP 1
RUN

即使通常很冗长,解决问题的正确语言也可能具有惊人的竞争力。当然?PRINT帮助的快捷方式也是如此。CLSCL小号 creen; RUN没有参数的情况下将重新启动程序,这是获得无限循环的最短方法。

唯一的其他技巧是0在第一张照片的中间部分打印。QBasic在打印非负数值时(在其之前和之后)放置一个空格,结果为 0 。已保存超过3个字符" 0"

我可能还会指出,这段代码中的延迟实际上是一秒钟,并且与机器无关。; ^ P


2
我记得在各种版本的BASIC中打印数字时,周围的空间使他们感到烦恼。很高兴看到它有很好的用途...
trichoplax

7

Perl (* nix),54个字节

sleep print"\x1bc",$-++%2?'\o/
_0_
':'_o_
 0
/ \
'while 1

\x1b被计为1个字节,但为了便于测试而进行了转义。)上面的代码已通过Bash测试,并通过@Dennis缩短了另一个字节!

Perl (Windows),56个字节

sleep print"\x1b[2J",$-++%2?'\o/
_0_
':'_o_
 0
/ \
'while 1

感谢@Jarmex的测试和建议!


2
害怕无法在Windows上运行,但是您可以使用以下命令print"@[2J"将其删除1个字节:用ASCII 27替换引号内的@(出于测试目的,print"\033[2J"可能会更容易)。
Jarmex 2015年

您可以\e用文字ESC字节替换。-您介意我\ec在回答中使用这个trick俩吗?
丹尼斯2015年

@Dennis当然是,因为"\e"无论如何这只是一个捷径。请继续!
Dom Hastings

6

Javascript(ES6),109 93 79 70字节+ HTML,12 10个字节= 120 106 91 80个字节

非常坦率的。使用模板字符串存储图像,并切换布尔值以确定要使用的图像。

注意:此解决方案可能无效,因为它实际上并未使用控制台。但是,我不认为有可能使用JS清除浏览器控制台,至少在使用Firefox时无法清除。

a=!1,setInterval(_=>O.innerHTML=(a=!a)?`_o_ 
 0
/ \\`:`\\o/ 
_0_`,1e3)
<pre id=O>


1
@orlp代码创建动画人。(Chrome @ Windows)。但是,这是基于GUI的,而不是基于控制台的。可能不被认为是有效的。
贾斯汀2015年

3
1.在我的计算机上,此功能在Firefox上可以正常运行,但在Chrome上无法正常运行,因此我想您应该将其标记为ECMAScript 6,以避免混淆。2.如果放入<pre id="a"/>HTML部分,则<pre>代码中不需要标签。
丹尼斯

1
或者,更好的是,摆脱HTML并替换document.getElementById`a` document.body
NinjaBearMonkey 2015年

1
通过制作HTML <pre>并进行操作,我得到了87个字节document.all[4]。这样,您就可以摆脱包装字符串,而只需制作它innerHTML=a?`...`:`...`}
NinjaBearMonkey 2015年

1
这已停止工作,我在Chrome
β衰变

5

Bash,86 84字节

while sleep 1;do printf "\e[2J_o_\n 0\n/ \\";sleep 1;printf "\r\e[2J\o/\n_0_\n";done

3

Python 2,99个字节

在Windows上运行

import os,time
g=0
while 1:os.system("cls");print["\\o/\n_0_","_o_\n 0 \n/ \\"][g];time.sleep(1);g=~g

对于UNIX计算机,添加两个字节:

import os,time
g=0
while 1:os.system("clear");print["\\o/\n_0_","_o_\n 0 \n/ \\"][g];time.sleep(1);g=~g

3

awk- 95 92 86 84 83

END{
    for(;++j;)
        system("clear;printf '"(j%2?"_o_\n 0\n/ \\":"\\o/\n_0_")"';sleep 1")
}

很好的锻炼:D只是想知道这是否可行。虽然没有价格上涨...;)

如果有人想测试一下:在运行程序之后,必须按Ctrl + D(输入结束)才能真正启动END块。要终止它,我必须使用Ctrl + Z。

我也有这个,只有74个字节,但是它从暂停一秒钟开始,这不是我想的行为

END{
    for(;1;print++j%2?"_o_\n 0\n/ \\":"\\o/\n_0_")
        system("sleep 1;clear")
}

1
睡眠间隔三秒吗?
trichoplax

哦,我的上帝。感谢您的提示:)或如果不是提示:不,这只睡了0.33秒。
Cabbie407'9

我不知道awk,但似乎它可以在几秒钟内完成测量。:)
trichoplax

1
如果它移动得更快,它看起来会更有趣,以至于我忘了那里打高尔夫球; D
Cabbie407

sleep命令不是awk,是bash,btw
Cabbie407'9

2

批次-82字节

编辑:静音超时命令,并删除多余的换行符。

cls&echo _o_&echo  0&echo / \&timeout>nul 1&cls&echo \o/&echo _0_&timeout>nul 1&%0

我已经看到另外2个类似的批处理答案,所以我真的不想发布此帖子,但这是我有史以来第一次高尔夫。


1
但是,光秃秃的timeout 1会将大量不需要的输出放到控制台上
edc65

是的,我有额外的输出。编辑。
彼得·伦克菲

1
可能>mul是类型错误,或者您可能不知道是什么nulen.wikipedia.org/wiki/Null_device
edc65

@ edc65复制粘贴的背景,而不是测试。谢谢!
彼得·伦克菲

2

BBC BASIC,75个字节

请注意,令牌化将其拉低到75个字节。空格是由IDE添加的。

      g=0
   10 IFg=0THENPRINT"\o/":PRINT"_0_"ELSEPRINT"_o_":PRINT" 0 ":PRINT"/ \"
      g=1-g:WAIT 100CLS:GOTO10

Properties showing program size


2

的JavaScript ES6,100个 95字节

(f=_=>{console.log(_?`_o_
 0
/ \\`:`\\o/
_0_`)
(b=setTimeout)(q=>(clear(),b(b=>f(!_))),1e3)})()

登录到控制台。每晚在Safari上测试


2

分批,151个 130 118字节

cls
@echo _o_
@echo  0
@echo / \
@PING -n 2 127.0.0.1>NUL
cls
@echo \o/
@echo _0_
@PING -n 2 127.0.0.1>NUL
%0

现在,OP已经确认不需要显式打印空白行,您也许可以保存一些字节
trichoplax

您应该可以改为使用12个字符@PING 127.0.0.1 -n 2>NUL。Ping默认在两次尝试之间等待大约一秒钟,因此这距离准确无误数毫秒之内,足以应对这一挑战。参考
AdmBorkBork

golfed关闭12字节由于TimmyD
最大

2

CBM 64 BASIC V2,121个 119 112 117字节

2?CHR$(147)+"\o/":?" 0":?"/ \"
3GOSUB7
4?CHR$(147)+"_o_":?"_0_"
5GOSUB7
6RUN
7A=TI
8IFTI-A<60THENGOTO8
9RETURN

是否?CHR$(147)清除屏幕?如果是这样,您可能现在可以保存2个字节,因为OP确认不需要显式打印空白行
trichoplax

这不会产生第一个动画帧(即,手臂处于水平位置)。
Psychonaut,2015年

你是对的...我要修复它!
最多

1

朱莉娅,70个字节

(上的Windows,通过更换clearcls,拜undergroundmonorail)

n(i=1)=(sleep(1);run(`cls`);print(i>0?"_o_
 0
/ \\":"\\o/
_0_");n(-i))

在Linux上,为72个字节

n(i=1)=(sleep(1);run(`clear`);print(i>0?"_o_
 0
/ \\":"\\o/
_0_");n(-i))

这使用实际的换行符而不是\n保存字节;否则,将i1或-1作为“标志”,并且它使用递归来实现无限循环。称其为n(1)n()

也, run(`clear`) / run(`cls`)使用shell命令清除窗​​口,因为Julia没有内置的窗口清除命令。


如果在Windows上运行此命令,则通过更改clear为保存两个字节cls(我假设我对Julia一无所知)。
地下

@undergroundmonorail-谢谢,但是我使用Ubuntu,cls无法正常工作。希望Julia决定实施真正的终端清算功能。
Glen O'9

@GlenO在Windows上cls有效(请参阅我的答案)
Beta Decay

1

Windows批处理83 89

编辑在OP澄清后删除了空行

@cls&echo _o_&echo  0&echo./ \&timeout>nul 1&cls&echo \o/&echo _0_&timeout>nul 1&%0

如果您摆脱了跳跃男子的空行(无论如何也看不到),则得分为83

注意:timeoutWindows XP中不存在。它适用于Vista或更高版本。而且timeout,对于第二秒来说并不精确,因此,它是实施步骤4(等待片刻(大约一秒))的理想选择。


1

Javascript(ES6),82个字节

我对以前使用控制台的答案的修改。在Firefox中可以部分使用,但只能在Chrome,AFAIK中清除控制台。

a=!0,c=console,setInterval(_=>c.log(c.clear(a=!a)|a?`_o_
 0
/ \\`:`\\o/
_0_`),1e3)

一如既往地欢迎您提出建议!


爱它!我注意到,Chrome现在也正在为我执行ES6!
Dom Hastings

@DomHastings我以前从未在Chrome中开发过,但是我听说它默认情况下不支持ES6,所以我和您一样感到惊讶!:)
ETHproductions 2015年

1

JavaScript,92 91 89字节

x=0;setInterval(function(){console.log("\033c"+["_o_\n 0\n/ \\","\\o/\n_0_"][x^=1])},1e3)
  • 没有ES6功能(但使用它们会明显缩短)
  • 在Linux上与Node.js一起使用(不了解其他环境)
  • 在Chrome的控制台中部分运行(c显示该视图而不是清除控制台,破坏了输出)

"\033c"+从上面的代码中删除以下内容,即可在浏览器中使用它,但不能清除控制台。

x=0;setInterval(function(){console.log(["_o_\n 0\n/ \\","\\o/\n_0_"][x^=1])},1e3)


令人印象深刻的工作!使用ES6功能,我得到77:x=0;setInterval(_=>console.log("\033c"+[`_o_<line break> 0<line break>/ \\`,`\\o/<line break>_0_`][x^=1]),1e3)由于某种原因,JS不允许我console.log作为函数传递,而ASCII man作为附加参数。
ETHproductions 2015年

@ETHproductions谢谢!我考虑过要在ES6中进行此操作,但是由于从未使用过它并且没有安装io.js,所以我决定不这样做。就无法传递console.log给而言setInterval,原因是我们没有传递函数,而是对其进行了调用。它会在setInterval调用之前进行评估,并且由于console.log不会返回,因此实际上会传递undefinedsetInterval。说得通?并感谢您将其缩短!
Nateowami 2015年

我理解您的意思,但是根据此页面,此代码应该可以正常工作:x=0;setInterval(console.log,1e3,"\033c"+[_o_ <换行符> 0 <换行符> / \`,\\o/<line break>_0_] [x ^ = 1])`实际上,它没有带来如果我替换为console.log,则会出现错误alert
ETHproductions 2015年

啊,我明白你的意思。我认为问题是,我们每次都需要记录不同的内容,但是"\033c"+[`_o_<line break> 0<line break>/ `,\\o/<line break>_0_`][x^=1]在调用之前会先进行评估setInterval
Nateowami 2015年

0

Ruby,79个字节

k=!0;loop{puts((k)?"\e[H\e[2J_o_\n 0\n/ \\":"\e[H\e[2J\\o/\n_0_");k=!k;sleep 1}

需要转义码。


0

第四,86个字节

需要GNU Forth作为转义字符串。要在非GNU Forth中运行,只需更改S\"S",转义的字符将无法正确打印。

: P PAGE TYPE CR 999 MS ;
: R BEGIN S\" \\o/\n_0_" P S\" _o_\n 0 \n/ \\" P 0 UNTIL ; R


0

CBM BASIC v2.0(68个字符)

0?"S_o_q||0q||N M":goS1:?"SMoN":?"_0_":goS1:gO
1wA161,255,pE(161):reT

上面需要一些解释,因为Stack Exchange标记不能正确表示PETSCII字符:

  • 为方便起见,此处以小写形式显示了该程序,但可以并且应该在Commodore 64上输入该程序并以大写模式运行。
  • 第一个和第三个“ S”字符实际上是反向视频,是通过CLR按键(SHIFT+HOME)产生的。
  • “ q”字符实际上是反向视频,是通过按下向下光标(CRSR ⇓)产生的。
  • “ |” 字符实际上是反向视频,是通过按左光标(SHIFT+ CRSR ⇒)产生的。

0

蜂蜡119 113字节

ph0`J2[`}ghq'-<gh0N}`0`}gN`/o\`Ngh0`J`<
>g}`o`}N` `0>'d`0 `N`/ \`0hg>-'phg}`[2`b
dF1f+5~Zzf(.FP9f..F3_#     d   <

程序重要部分的说明:

left to right  right to left

3FBf   or       fBF3          27       ASCII code for (esc)
3             [x,x,3]•        set lstack 1st to 3
 F            [3,3,3]•        set lstack to 1st
  B           [3,3,27]•       1st=1st^2nd
   f                          push lstack 1st on gstack
——————
9PF.(f   or    f(.FP9         102400   counter to roughly match a wait time
                                       of 1 s on my i5 2410M Laptop
9             [x,x,9]•        set lstack 1st to 9
 P            [x,x,10]•       increment 1st
  F           [10,10,10]•     set lstack to 1st
   .          [10,10,100]•    1st=1st*2nd
    (         [10,10,102400]• 1st=1st<<2nd (100<<10=102400, arithmetic shift left)
     f                        push lstack 1st on gstack
——————
zZ~5+f   or    f+5~Zz         95       ASCII for '_'
z             [0,0,0]•        initialize lstack to zero
 Z            [0,0,90]•       get value from relative coordinate (0,0),
                              which is the location of `Z` itself, ASCII(Z)=90
  ~           [0,90,0]•       flip 1st and 2nd lstack values
   5          [0,90,5]•       set lstack 1st to 5 
    +         [0,90,95]•      1st = 1st+2nd
     f                        push lstack 1st on gstack

f的上推gstack(全球栈),以供日后使用的值。这些值可通过0gh(或镜像的hg0)和hggh)指令访问。h向上旋转gstack,g读取gstack 的最高值,并将其推入蜜蜂的lstack(本地堆栈)(指令指针)。

}`o`}N` 0 `N`/ \`                      sequence to print the standing man

N`\o/`Ng}`0`}N                         sequence to print the jumping man

}`[2J`                        equivalent to the ANSI escape sequence (esc)[2J
                              to clear the screen
>-'p  or >-'q  or >  p        loop for counting down (wait 1 s)
d  <      b  <    d'-<

如果需要,稍后将进行详细说明。也许有动画。


0

死鱼,非竞争(658字节)

iiisisdddddoiiiiiiiiiiiiiiiioddddddddddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoddddsddddoiiiiiiiiiiiiiiiioddddddddddddddddoddddddddddddddddddddddodddsddodddddddddddddddoddddddddddddddddddddddsddddddddoddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoosddddddddoiiiiiiiiiiiiiiiiiiioddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddodddddddddddddddddddddddddddddddddddddosdddddodddddddddddddddddddddddddddddddddddddddddddddddoddddddddddddddddddddddddddddddddddddddsdddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoo

这是一种非竞争性解决方案,因为它不能完全满足挑战性要求。死鱼是一种非常奇怪的解释语言,它只有4个命令和一个累加器。累加器是一个初始化为0的单字节变量。这4个命令是:

  • i =累加器 a = a + 1
  • d =减少累加器 a = a - 1
  • s =累加器平方 a = a * a
  • o =输出累加器 print(a)

由于该语言不包括重复,清除屏幕或延迟,因此不符合要求。预期产量:

_o_
 0 
/ \
(Blank line, not from the program)
\o/
_0_
(Blank line, not from the program)
(Blank line, not from the program)

代码说明:

_  iiisisdddddo
o  iiiiiiiiiiiiiiiio
_  ddddddddddddddddo
\n dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
   ddddsddddo
0  iiiiiiiiiiiiiiiio
   ddddddddddddddddo
\n ddddddddddddddddddddddo
/  dddsddo
   dddddddddddddddo
\  ddddddddddddddddddddddsddddddddo
\n ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
\n o
\  sddddddddo
o  iiiiiiiiiiiiiiiiiiio
/  ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
\n dddddddddddddddddddddddddddddddddddddo
_  sdddddo
0  dddddddddddddddddddddddddddddddddddddddddddddddo
_  ddddddddddddddddddddddddddddddddddddddsdddddo
\n dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddo
\n o

Python 3中的Deadfish解释器:

c=input()
o=""
a=0
for p in range(0,len(c)):
    i=c[p]
    if i=="i":
        a += 1
    if i=="d":
        a+=-1
    if i=="s":
        a=a*a
    if i=="o":
        o+=chr(a)
print(o)

0

Noodel,非竞争性24字节

非竞争性因为Noodel挑战创建之后出生的:)

”ṛ|ọBCḊCBCḣ“\o/¶_0_ḷėçḍs

试试吧:)

怎么运行的

”ṛ|ọBCḊCBCḣ              # Creates a string that gets decompressed into "_o_¶¤0¤¶/¤\" and places it into the pipe.
           “\o/¶_0_      # Creates a string and places it into the pipe.
                   ḷ     # Unconditionally loop the code up to a new line or end of program.
                    ė    # Takes what is in the front of the pipe and puts it into the back.
                     ç   # Clears the screen and prints.
                      ḍs # Delays for one second.

当前没有Noodel版本支持此挑战中使用的语法。这是一个做的版本:

24字节

\o/¶_0_ _o_¶¤0¤¶/¤\ḷçėḍs

<div id="noodel" code="\o/¶_0_ _o_¶¤0¤¶/¤\ḷçėḍs" input="" cols="5" rows="5"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

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.