<(“ <)バードダンサー(>”)>


22

あなたの鳥は何らかの運動のためにかゆみを覚えており、常に静的な位置で立ち往生するのにうんざりしています。ランダムに踊るアスキー鳥を表示するプログラムを作成し、ダンスの動きに応じて100ms * nまたは200ms * nごとに更新します。鳥は常にダンスの動きから始まります<(")>

プログラムは、スリープ間隔に(n >= 0 && n <= 50)を掛ける数値である1つの入力を受け入れる必要があります。

100ms移動

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

200ms移動

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

追加の詳細

  • ランダム性は均一である必要はありませんが、各ダンスの動きは発生する合理的なチャンスを持っている必要があります(少なくとも60分の1は公平に思えます。同じ動きが連続して2回発生しても問題ありません)
  • 複数の鳥ではなく、一度に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)

勝ち


鳥の目は二重引用符ですか、それとも2つの単一引用符ですか?
パベル

@Pavel、二重引用符
redstarcoder

6
さて、今日、Pythonで複数行の文字列の引用符をエスケープする必要がないことを学びました。
パベル

自分の言語で出力を変更できない場合、100/200ミリ秒ごとに新しい鳥を出力できますか?
devRicher

1
イデオネを使用して、Lua \rエスケープはちょうどのように行動するよう\nです。os.execute("cls")そこでも使用できません。@redstarcoder
devRicher

回答:


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で表示できません。1代わりの入力のgifは次のとおりです。

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

-8バイトありがとう@LuisMendo!


5

*> <>103 101バイト

<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を再実行します。

100msのダンスを生成

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

ここでは、100msのダンスの動きの1つを生成して出力します。

 \                         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」を生成して戻る単純な関数です。xIPが左または右にのみ移動するように指示するダンスチューザーと同様に機能します。

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

200msのダンスを生成

これはで始まる別の例ですx。2つのセクションに分割されます:<(")>と別の(>")> and <("<)セクションxは、2つの異なるセクションであり、共有する唯一のものであるためです。

<(")>

>:2* _"><"b2.

これは基本的にgenerate 100ms danceルーチンの開始を行い><ますが、ランダムな^vコンボの代わりに鳥の手に移入します。n今回も2 倍になります。これにより、すべてのセットアップが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<'<("<)'

この小さな説明は(>")>and <("<)生成に関するものですが、その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ではありませんが、すべてのブラウザーはとにかくタグを自動的に閉じます。1 b文字のHTML要素であり、私の鳥のダンスが注目されるに値するため、私はそれを大胆にしました。


1
fがそれ自体を再呼び出しするとき、再びnを渡しません。少なくとも私にとっては、これは初めてnのみを尊重するようで、その後はゼロ(または未定義)になります。また、出力が未定義になる場合があります。r%7である必要がありますか?
クリスM

そうです、nを渡すのを忘れました。確かに%7でなければなりません。私は鳥のポーズの量を誤算しました。修正のおかげで、修正されました。
ルーク

申し訳ありませんが、バイト数を増やし続けています!クールなゴルフ、ランダム関数とゼロスプリッティングが好き
クリスM

ありがとう。回答の編集中に4Bの改善が見つかりました。つまり、2Bを節約することになったので、大丈夫です。ES5以前ではバイトを保存するためにゼロ分割が使用されていましたが、ES6以降ではテンプレート文字列の括弧を省略することができるため、もはや有用ではありません。これは別のアプローチの残りです(setIntervalの最初の引数としてテンプレート文字列を使用しました)。
ルーク

2

PowerShell124 117バイト

TimmyDに感謝)

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

オンラインでお試しください!(TIOで動作するわけではありません...)


$b疑似3項を除去して使用することで、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

私も鶏のアスキーアートなしでそれをやろうとしましたが、それはずっと長かったです。

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

ルビー、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バイトをインライン化してbirdslet

#(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)))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.