<(“ <)鸟舞者(>”)>


22

您的鸟一直在瘙痒一些运动,并且讨厌一直被困在静止的位置。编写一个程序,该程序将显示一个随机跳舞的ascii鸟,并根据跳舞动作每100ms * n或200ms * n更新一次。鸟总是从舞步开始<(")>

程序应接受一个输入,该输入是一个将睡眠间隔乘以(n >= 0 && n <= 50)的数字。

100ms动作

^(")v
v(")^
^(")^
v(")v

200ms动作

(>")>
<(")>
<("<)

额外细节

  • 随机性不一定要统一,但是每个舞步都应该有合理的发生机会(每60个舞步中至少有1个看起来很公平,如果同一舞步连续出现两次也可以)
  • 一次只能显示一只鸟,而不是多只鸟
  • 允许尾随空格(但不允许其他尾随字符)
  • 鸟应显示之前的睡眠

Python 3中的示例

import random, time, sys

birds = """(>")>
<(")>
<("<)
^(")v
v(")^
^(")^
v(")v"""
birds = birds.split()

interval = int(input("Sleep for 100ms*"))
selection = -1

while True:
    if selection == -1:
        selection = 1
    else:
        selection = random.randint(0, len(birds)-1)
    sys.stdout.write('\r'+birds[selection])
    if selection > 2:
        time.sleep(0.1*interval)
    else:
        time.sleep(0.2*interval)

获奖


鸟的眼睛是双引号还是两个单引号?
帕维尔

@Pavel,双引号
redstarcoder

6
好吧,今天我了解到您不必在python中的多行字符串中转义引号。
帕维尔

如果我的语言无法修改输出,是否可以每100/200毫秒输出一只新鸟?
devRicher

1
使用Ideone时,Lua \r逃逸的行为似乎像海盗一样\n。我也不能在那里使用os.execute("cls")。@redstarcoder
devRicher

Answers:


3

MATL,53字节

xXx`'./U;HbG#3@@!{uu'F'v^<>(")'Za7e 7YrY)D5M3>QG*&XxT

动作都是随机的。

以下是使用运行的示例n = 2。或在MATL Online上尝试(解释器是实验性的。如果它最初没有运行,请尝试再次按“运行”或刷新页面)。

在此处输入图片说明

说明

x                   % Take input n and delete it
Xx                  % Clear screen
`                   % Do...while
  './U;HbG#3@@!{uu' %   Push this (compressed) string
  F                 %   Specify source alphabet for decompression
  'v^<>(")'         %   Push target alphabet
  Za                %   Base conversion (decompress)
  7e                %   Reshape as a 7-row char matrix. Each row is a move
  7Yr               %   Push random integer from 1 to 7
  Y)                %   Select that row from the char matrix
  D                 %   Display it
  5M                %   Push the integer again
  3>                %   Does it exceed 3? Gives false (0) or true (1)
  Q                 %   Add 1
  G*                %   Multiply by n
  &Xx               %   Pause that many tenths of a second and clear screen
  T                 %   Push true
                    % End (implicit). Since top of the stack is true, this causes
                    % and infinite loop

6

Matlab, 125 117字节

不幸的是,由于没有“流”输出,因此无法在TIO中显示。这是gif的1替代输入:

t=input('')*.1;a='^(")vv(")^^(")^v(")v(>")><(")><("<)';while 1;n=randi(7);clc;disp(a(n*5-4:n*5));pause(t+t*(n>4));end

感谢@LuisMendo -8个字节!


5

*> <>103101字节

<vD[3'(")'
1x<.5
S\:43_C43CdooI:o@:o@:o@Do
R!"^"x"v">
>:2* _"><"92.
x '>)">('u.02S*2:oooooodO<'<("<)'

在这里尝试!(在n初始堆栈上写,否则会出现错误)

由于没有100字节以下的答案,因此我决定对我的挑战采取行动。放置n在堆栈上,并远离你去!这将重用(")字符以节省一些字节。

说明

初始化

<vD[3'(")'

我们在这里存储(")以备后用。

<           move the IP left
   [3'(")'  push '(")' to a new stack
  D         move back down to a clean stack
 v          move the IP down into "dance chooser"

舞蹈选择器

1x<.5
 \

经常执行此操作以选择我们要生成的舞蹈类型。

 x         generate a 100ms dance or a 200ms dance
1  .5      jump to "200ms dance"
 \         mirror IP into "100ms dance"

在的v上方x和上方也有一个<x如果它试图将IP向错误的方向移动,这些将使get重新执行。

产生100毫秒的舞蹈

S\:1*43_C43CdooI:o@:o@:o@Do

在这里,我们生成并输出100ms舞步之一。

 \                         mirror the IP right
  :                        copy n
   43 C43C                 call "generate '^' or 'v'" twice
     _                     ignored mirror
          do               output a carriage return
            o              output the first hand of the bird
             I:o@:o@:o@D   select, copy, and output '(")'
                        o  output the second hand of the bird
S                          sleep for previous n*100ms
 \                         mirror IP back to "dance chooser"

43C-生成“ ^”或“ v”

R!"^"x"v">

这是一个简单的函数,它生成“ ^”或“ v”然后返回。它与舞蹈选择器的工作方式相似,在舞蹈选择器中有指示x以确保IP只能左右移动。

     x      generate "^" or "v"
R!"^"    >  push "^" to stack and return
R     "v"   push "v" to stack and return

产生200毫秒的舞蹈

这是另一个以开头的x。它将分为两部分:<(")>另一部分(>")> and <("<),因为它们是两个不同的部分,x是它们唯一共享的部分。

<(")>

>:2* _"><"b2.

这基本上是generate 100ms dance例程的开始,但是填充了鸟的手><而不是随机的^v组合。这次也乘以n2。这使得所有设置都可以利用generate 100ms dance例程输出整个鸟类,而要等待200ms。

>              move IP right
 :2*           copy n and do n*2
     _         ignored mirror
      "><"     push "><" to stack
          b2.  jump to "output carriage return" in "generate 100ms dance"

(>")><("<)

x '>)">('u.02S*2:oooooodO<'<("<)'

这个小解释是关于(>")><("<)生成的,尽管x可以将IP发送到它之外(如下所述)。

x                                  move to "choose dance", generate (>")>, <("<), or <(")> (previous routine)  
  '>)">('                          push '(>")>' to the stack
                          '<("<)'  push '<("<)' to the stack
         u              O<         ensure inner code block is always executed with IP moving left
                      od           output carriage return
                 ooooo             output bird
             S*2:                  sleep for n*200ms
          .02                      jump to "dance chooser"

3

的JavaScript(ES6)+ HTML5:118 116 + 8 = 124个字节

Javascript:119个字节

f=n=>{a.innerHTML='(>")>0<(")>0<("<)0^(")v0v(")^0^(")^0v(")v'.split(0)[r=+new Date%7],setTimeout(f,(1+(r<3))*100*n,n)}

我正在使用从纪元以来的毫秒数来生成随机数。从理论上讲,这将始终生成相同的(一组)数字,但是在我的PC上进行的测试却给了我一个非常随机的结果(大多数数字或多或少地相等地出现)。还使用这样的事实,即将具有id的html元素添加到JavaScript的全局窗口对象中,因此document.getElementById()不需要。

HTML:8个字节

<b id=a>

我在这里省略了引号,并且没有关闭b标签。这不是有效的html,但是所有浏览器都会自动关闭该标签。我将其设为大胆是因为它b是一个单字符HTML元素,并且值得一提的是我的鸟舞。


1
当f重新调用自身时,它不会再传递n。至少对我而言,这似乎只是第一次兑现,之后为零(或未定义)。同样有时输出是不确定的。应该是r%7吗?
克里斯M,

没错,我忘了通过。确实应该是%7。我误算了鸟的姿势。感谢您的更正,现在已修复。
路加福音

抱歉,我一直在增加您的字节数!酷高尔夫,我喜欢随机功能和零分裂
Chris M

谢谢。我在编辑答案时发现4B的改进,这意味着我最终节省了2B,所以没关系。零分割用于保存ES5和更早版本中的字节,但是自ES6起,您可以省略带有模板字符串的括号,因此它不再有用。它是另一种方法的剩余部分(我使用模板字符串作为setInterval的第一个参数)。
路加福音

2

PowerShell中124个 117字节

(感谢TimmyD

for(){(-split'^(")v v(")^ ^(")^ v(")v (>")> <(")> <("<)')[($i=0..6|random)];sleep -m((100,200)[$i-gt3]*$args[0]);cls}

在线尝试!(并不是说它将在TIO中起作用...)


您可以消除$b并使用伪三元数降低到117 for(){(-split'^(")v v(")^ ^(")^ v(")v (>")> <(")> <("<)')[($i=0..6|random)];sleep -m((100,200)[$i-gt3]*$args[0]);cls}-... 我还在戳它。
AdmBorkBork

你只是一直在救我@TimmyD(谢谢)!我认为这些更改意义重大,足以保证您有自己的答案。它并没有在我的代码中留下很多独特的东西:)
briantist

不,它们只是您的代码上的细微调整。总体逻辑是完全相同的。吃吧
AdmBorkBork

2

Noodel,非竞争性67 个字节

ʠƘṣḳƑðẉḤż’ṀỴ(EḞ4ĊḌṀY%¤ĠẸG^ḞðxỌð
ḊḢðḞ’ṀḌcṀḌcİ8c¬ððɲḷṛḋʠṡʠạÇƥƥạƥḋʠ⁺µḍ

对于Noodel而言,这一挑战非常困难,因为它没有任何智能算术或基于比较的运算符。但是在经历了这一挑战之后,我认为Noodel已经准备好发布其第一个版本。

试试吧:)

怎么运行的

                                                                     # Note: The input is immediately pushed onto the stack.
ʠ                                                                    # Moves the pointer for the top of the stack down one.
 ƘṣḳƑðẉḤż’ṀỴ(EḞ4ĊḌṀY%¤ĠẸG^ḞðxỌð                                      # Creates a string based off of the key "ƘṣḳƑðẉḤż" and the compressed text "ṀỴ(EḞ4ĊḌṀY%¤ĠẸG^ḞðxỌð" to create "^(")vðv(")^ð^(")^ðv(")vð(>")>ð<(")>ð<("<)" which then gets split by the null character "ð" to create an array of strings which gets pushed to the stack.
                               \n                                    # A new line to separate the literals.
                                 ḊḢðḞ’ṀḌcṀḌcİ8c¬ðð                   # Creates a string based off of the key "ḊḢðḞ" and the compressed text "ṀḌcṀḌcİ8c¬ðð" to create "100ð100ð100ð100ð200ð200ð200" which then gets split the same way as before.
                                                  ɲ                  # Turns each element in the array into a number creating the array of delays.
                                                   ḷ                 # Loops the rest of the code unconditionally.
                                                    ṛ                # Generates a random number from 0 to the length-1 of the array on top of the stack.
                                                     ḋ               # Duplicates the random number.
                                                      ʠ              # Moves the stack pointer down to save one of the random numbers for later.
                                                       ṡ             # Swap the array with the random number such that the array is on top again.
                                                        ʠ            # Moves the stack pointer down such that the random number is on top.
                                                         ạ           # Uses the random number to access the bird array which is now after the random number and pushes the element onto the stack.
                                                          Ç          # Clears the screen and pops the bird and pushes it to the screen.
                                                           ƥƥ        # Moves the stack pointer up two times such that the random number is the top.
                                                             ạ       # Use the random number to access the array with delays and pushes that item onto the stack.
                                                              ƥ      # Moves the stack pointer up in order to have the input on top.
                                                               ḋ     # Duplicates the users input.
                                                                ʠ    # Moves the stack pointer back down in order to have the user input on top followed by the random item from the delay array.
                                                                 ⁺µ  # This command pops two numbers off and multiplies them and pushes the result back on.
                                                                   ḍ # Pops off of the stack and uses that as a delay in milliseconds.

64字节

这是一个可用作代码段的版本。

ʠƘṣḳƑðẉḤż’ṀỴ(EḞ4ĊḌṀY%¤ĠẸG^ḞðxỌð EAð¶’Ṁ|ṢĿ<h4¶¬ȥḷṛḋʠṡʠạÇƥƥạƥḋʠ⁺µḍ

<div id="noodel" code="ʠƘṣḳƑðẉḤż’ṀỴ(EḞ4ĊḌṀY%¤ĠẸG^ḞðxỌð EAð¶’Ṁ|ṢĿ<h4¶¬ȥḷṛḋʠṡʠạÇƥƥạƥḋʠ⁺µḍ" input="2" cols="5" rows="3"></div>

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


1

Python,157字节

import time,random;n,m=5,int(input())
while 1:print('(>")><(")><("<)^(")vv(")^^(")^v(")v'[n:n+5]);time.sleep((.1+(n<15)/10)*m);n=(n+random.randint(1,6)*5)%35

我也尝试过不使用鸡肉ascii技术,但这要花更长的时间。

import time,random;n,m=5,int(input())
while 1:
  print(['^v'[n%2]+'(")'+'v^'[0<n<3],''.join(map(chr,[40+20*(n>4),62-22*(n>4),34,41+19*(n>5),62-21*(n>5)]))][n>3])
  time.sleep((.1+(n>3)/10)*m);n=(n+random.randint(1,6))%7

1

Ruby,97 + 1 = 98字节

-n标志的+1个字节。

a=1;loop{puts %w{^(")v <(")> v(")^ (>")> ^(")^ <("<) v(")v}[a];sleep$_.to_i*0.1*(1+a%2);a=rand 7}

1

Clojure中,185个 178字节

+18个字节,因为它不是以开头<(")>

通过内联-7字节birds,并摆脱了let

#(loop[m nil r(or m 1)](print"\r"((clojure.string/split"(>\")> <(\")> <(\"<) ^(\")v v(\")^ ^(\")^ v(\")v"#" ")r))(flush)(Thread/sleep(*(if(> r 2)100 200)%))(recur 1(rand-int 7)))

只需在空间上拆分小鸟,从0-6中选择一个随机索引,显示选择的小鸟,然后如果选择的索引大于2,则等待100毫秒,否则等待200毫秒。

Clojure确实split在核心中需要一个字符串方法。

取消高尔夫:

(defn dancing-bird [n]
  (loop [m nil]
    (let [birds (clojure.string/split "(>\")> <(\")> <(\"<) ^(\")v v(\")^ ^(\")^ v(\")v" #" ")
          rand-i (or m 1)]
      (print "\r" (birds rand-i))
      (flush)
      (Thread/sleep (* (if (> r 2) 100 200) n))
      (recur (rand-int 7)))))
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.