<("<) Penari Burung (>")>


22

Burung Anda telah gatal untuk beberapa latihan dan muak terjebak dalam posisi statis sepanjang waktu. Tulis program yang akan menunjukkan burung ascii yang menari secara acak, memperbarui setiap 100ms * n atau 200ms * n tergantung pada gerakan dansa. Burung itu selalu dimulai dengan gerakan tarian <(")>.

Program harus menerima satu input yang merupakan angka untuk mengalikan interval tidur dengan ( n >= 0 && n <= 50).

100 ms Bergerak

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

200 ms Bergerak

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

Detail Ekstra

  • Keacakan tidak harus seragam tetapi setiap gerakan tarian harus memiliki kesempatan yang wajar untuk terjadi (setidaknya 1 dari 60 terlihat adil, tidak apa-apa jika gerakan yang sama terjadi dua kali berturut-turut)
  • Seharusnya hanya ada satu burung ditampilkan pada satu waktu, bukan banyak burung
  • Trailing whitespace diizinkan (tetapi karakter trailing lainnya tidak)
  • Seekor burung harus ditampilkan sebelum tidur

Contoh dalam 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)

Kemenangan

  • Ini adalah sehingga byte paling tidak menang!

Apakah mata burung itu kutipan ganda atau dua kutipan tunggal?
Pavel

@Pavel, kutipan ganda
redstarcoder

6
Nah, hari ini saya belajar Anda tidak perlu melarikan diri dari tanda kutip dalam string multi baris dalam python.
Pavel

Jika bahasa saya tidak dapat memodifikasi output, bisakah saya hanya mengeluarkan bird baru setiap 100/200 ms?
devRicher

1
Menggunakan Ideone , \rpelarian Lua tampaknya bertindak seperti a \n. Saya juga tidak bisa menggunakannya di os.execute("cls")sana. @redstarcoder
devRicher

Jawaban:


3

MATL , 53 byte

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

Bergerak secara acak acak.

Di bawah ini adalah contoh dijalankan n = 2. Atau coba di MATL Online! (Penerjemah bersifat eksperimental. Jika tidak berjalan pada awalnya, coba tekan "Jalankan" lagi atau segarkan halaman).

masukkan deskripsi gambar di sini

Penjelasan

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 byte

Sayangnya ini tidak dapat ditampilkan di TIO karena tidak ada "streaming" dari output. Berikut adalah gif untuk input 1gantinya:

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

Terima kasih @LuisMendo untuk -8 byte!


5

*> <> , 103 101 byte

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

Coba di sini! (tulis di ntumpukan awal atau Anda akan mendapatkan kesalahan)

Saya memutuskan untuk menusuk tantangan saya karena tidak ada jawaban sub byte 100. Tempatkan ndi tumpukan dan pergilah! Ini menggunakan kembali (")karakter untuk menyimpan beberapa byte.

Penjelasan

Inisialisasi

<vD[3'(")'

Di sini kami menyimpan (")untuk penggunaan nanti.

<           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"

Pemilih menari

1x<.5
 \

Ini sering dilakukan untuk memilih jenis tarian yang akan kita hasilkan.

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

Ada di vatas xdan <di sebelah kanan juga. Ini membuat xeksekusi ulang jika mencoba untuk memindahkan IP ke arah yang salah.

Hasilkan tarian 100 ms

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

Di sini kita menghasilkan dan menampilkan salah satu gerakan tarian 100 ms.

 \                         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 - Hasilkan "^" atau "v"

R!"^"x"v">

Ini adalah fungsi sederhana yang menghasilkan "^" atau "v" lalu kembali. Ini bekerja mirip dengan pemilih tari di mana ia memiliki instruksi sekitar xuntuk memastikan IP hanya bergerak ke kiri atau kanan.

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

Hasilkan tarian 200 ms

Ini adalah hal lain yang dimulai dengan x. Ini akan dipisahkan menjadi dua bagian: <(")>dan yang lain (>")> and <("<), karena mereka adalah dua bagian yang berbeda dan xmerupakan satu-satunya yang mereka bagikan.

<(")>

>:2* _"><"b2.

Ini pada dasarnya merupakan awal dari generate 100ms dancerutinitas, tetapi mengisi tangan burung ><bukan sebagai ^vkombo acak . Ini dikalikan ndua kali ini juga. Ini membuat semuanya siap untuk menggunakan generate 100ms dancerutin untuk mengeluarkan seluruh burung dan menunggu 200 ms sebagai gantinya.

>              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"

(>")> dan <("<)

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

Penjelasan kecil ini adalah tentang generasi (>")>dan <("<), meskipun xdapat mengirim IP di luarnya (dijelaskan di bawah).

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 byte

Javascript: 119 byte

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)}

Saya menggunakan milidetik sejak zaman untuk menghasilkan angka acak-ish. Secara teoritis, ini akan selalu menghasilkan nomor (s) yang sama, tetapi tes pada PC saya memberi saya hasil yang cukup acak (sebagian besar angka muncul kurang lebih sama). Juga menggunakan fakta bahwa elemen html dengan id dapat ditambahkan ke objek jendela global dalam JavaScript, jadi document.getElementById()tidak diperlukan.

HTML: 8 byte

<b id=a>

Saya menghilangkan tanda kutip di sini dan saya tidak menutup btag. Ini bukan html yang valid, tetapi semua browser secara otomatis menutup tag. Saya membuatnya berani karena belemen HTML satu karakter dan karena tarian burung saya pantas diperhatikan.


1
Ketika f memanggil ulang dirinya sendiri, itu tidak lulus n lagi. Bagi saya setidaknya ini tampaknya hanya untuk pertama kalinya, setelah itu nol (atau tidak ditentukan). Terkadang output tidak terdefinisi. Haruskah r% 7?
Chris M

Anda benar, saya lupa lulus. Seharusnya% 7. Saya salah menghitung jumlah pose burung. Terima kasih atas koreksinya, sudah diperbaiki sekarang.
Luke

Maaf saya terus meningkatkan jumlah byte Anda! Golf keren, saya suka fungsi acak dan nol pemisahan
Chris M

Terima kasih. Saya menemukan peningkatan 4B saat mengedit jawaban saya, yang berarti saya akhirnya menghemat 2B, jadi tidak apa-apa. Pemisahan nol digunakan untuk menyimpan byte di ES5 dan sebelumnya, tetapi Anda bisa menghilangkan tanda kurung dengan string templat sejak ES6, jadi itu tidak berguna lagi. Ini adalah sisa dari pendekatan yang berbeda (di mana saya menggunakan string template sebagai argumen pertama untuk setInterval).
Luke

2

PowerShell , 124 117 byte

(Terima kasih TimmyD )

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

Cobalah online! (Bukan berarti itu akan bekerja di TIO ...)


Anda dapat menghilangkan $bdan menggunakan pseudo-ternary untuk turun ke 117 - for(){(-split'^(")v v(")^ ^(")^ v(")v (>")> <(")> <("<)')[($i=0..6|random)];sleep -m((100,200)[$i-gt3]*$args[0]);cls}... Saya pikir lebih pendek mungkin; Saya masih menyodoknya.
AdmBorkBork

Kamu terus bail saya keluar @TimmyD (terima kasih)! Saya pikir perubahan itu cukup signifikan untuk menjamin jawaban Anda sendiri; tidak meninggalkan banyak hal unik dalam kode saya :)
briantist

Tidak, itu hanya sedikit perubahan pada kode Anda. Logika keseluruhannya sama persis. Miliki itu.
AdmBorkBork

2

Noodel , 67 byte tidak bersaing

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

Tantangan ini sangat sulit bagi Noodel karena tidak memiliki aritmatika pintar atau operator berbasis perbandingan. Tetapi setelah melakukan tantangan ini, saya pikir Noodel siap untuk rilis pertamanya.

Cobalah:)

Bagaimana itu bekerja

                                                                     # 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 byte

Berikut adalah versi yang berfungsi sebagai cuplikan kode.

ʠƘṣḳƑðẉḤż’ṀỴ(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 byte

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

Saya juga mencoba melakukannya tanpa seni ascii ayam, tapi itu jauh lebih lama.

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 byte

+1 byte dari -nflag.

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 byte

+18 byte karena tidak dimulai dengan <(")>.

-7 byte dengan inlining birds, dan menyingkirkan 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)))

Hanya membagi burung pada spasi, mengambil indeks acak dari 0-6, menampilkan burung yang dipilih, maka jika indeks yang dipilih lebih besar dari 2, ia menunggu 100 ms, atau 200 ms.

Clojure benar-benar membutuhkan splitmetode string pada intinya.

Tidak Disatukan:

(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)))))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.