<(Tiếng <) Vũ công chim (> lồng)>


22

Con chim của bạn đã bị ngứa khi tập thể dục và phát ốm vì bị mắc kẹt trong các vị trí tĩnh mọi lúc. Viết chương trình sẽ hiển thị một chú chim ascii đang nhảy ngẫu nhiên, cập nhật cứ sau 100ms * n hoặc 200ms * n tùy theo động tác nhảy. Con chim luôn bắt đầu với những bước nhảy <(")>.

Chương trình nên chấp nhận một đầu vào là một số để nhân khoảng thời gian ngủ với ( n >= 0 && n <= 50).

Di chuyển 100ms

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

Di chuyển 200ms

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

Thêm chi tiết

  • Sự ngẫu nhiên không nhất thiết phải đồng nhất nhưng mỗi bước nhảy nên có cơ hội hợp lý xảy ra (ít nhất 1 trên 60 có vẻ công bằng, sẽ ổn nếu chuyển động tương tự xảy ra hai lần liên tiếp)
  • Chỉ nên có một con chim được hiển thị cùng một lúc, không nên có nhiều con chim
  • Khoảng trắng lưu trữ được cho phép (nhưng các ký tự khác thì không)
  • Một con chim nên được hiển thị trước khi ngủ

Ví dụ trong 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)

Chiến thắng


Đôi mắt của con chim là một trích dẫn kép hay hai trích dẫn đơn?
Pavel

@Pavel, trích dẫn kép
redstarcoder

6
Chà, hôm nay tôi đã học được rằng bạn không cần phải thoát dấu ngoặc kép trong chuỗi nhiều dòng trong python.
Pavel

Nếu ngôn ngữ của tôi không thể sửa đổi kết quả đầu ra, tôi có thể chỉ xuất một con chim mới sau mỗi 100/200 ms không?
devR Rich

1
Sử dụng Ideone , \rlối thoát Lua dường như hoạt động giống như a \n. Tôi cũng không thể sử dụng os.execute("cls")ở đó. @redstarcoder
devR Rich

Câu trả lời:


3

MATL , 53 byte

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

Di chuyển là thống nhất ngẫu nhiên.

Dưới đây là một mẫu chạy với n = 2. Hoặc dùng thử tại MATL Online! (Trình thông dịch là thử nghiệm. Nếu ban đầu nó không chạy, hãy thử nhấn "Chạy" lại hoặc làm mới trang).

nhập mô tả hình ảnh ở đây

Giải trình

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

Thật không may, điều này không thể được hiển thị trong TIO vì không có "luồng" đầu ra. Đây là một gif cho một đầu vào 1thay thế:

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

Cảm ơn @LuisMendo cho -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<'<("<)'

Hãy thử nó ở đây! (ghi nvào ngăn xếp ban đầu hoặc bạn sẽ gặp lỗi)

Tôi quyết định đâm đầu vào thử thách của mình vì không có câu trả lời 100 byte phụ. Đặt ntrên ngăn xếp và đi bạn đi! Điều này sử dụng lại các (")ký tự để lưu một số byte.

Giải trình

Khởi tạo

<vD[3'(")'

Ở đây chúng tôi lưu trữ (")để sử dụng sau.

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

Người chọn nhảy

1x<.5
 \

Điều này thường được thực hiện để chọn loại nhảy chúng tôi sẽ tạo.

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

Có một vở trênx và một <bên phải của nó quá. Những thứ này làm cho xget được thực thi lại nếu nó cố di chuyển IP sai hướng.

Tạo ra điệu nhảy 100ms

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

Ở đây chúng tôi tạo và xuất một trong những bước nhảy 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 - Tạo "^" hoặc "v"

R!"^"x"v">

Đây là một hàm đơn giản tạo ra "^" hoặc "v" sau đó trả về. Nó hoạt động tương tự như trình chọn nhảy, nơi nó có các hướng dẫn xung quanh xđể đảm bảo IP chỉ di chuyển sang trái hoặc phải.

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

Tạo vũ điệu 200ms

Đây là một cái khác bắt đầu với x. Nó sẽ được tách thành hai phần: <(")>và phần khác (>")> and <("<), vì chúng là hai phần riêng biệt và xlà thứ duy nhất họ chia sẻ.

<(")>

>:2* _"><"b2.

Điều này về cơ bản là bắt đầu của generate 100ms dancethói quen, nhưng đưa vào tay chim ><thay vì một ^vkết hợp ngẫu nhiên . Nó nhân với nhai lần này là tốt. Điều này làm cho tất cả thiết lập để sử dụng generate 100ms dancethói quen để xuất ra toàn bộ con chim và chờ 200ms thay thế.

>              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<'<("<)'

Giải thích nhỏ này là về (>")><("<)thế hệ, mặc dù xcó thể gửi IP bên ngoài nó (giải thích bên dưới).

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

Tôi đang sử dụng mili giây kể từ epoch để tạo số ngẫu nhiên. Về mặt lý thuyết, điều này sẽ luôn tạo ra (các) số (s) giống nhau, nhưng một thử nghiệm trên PC của tôi đã cho tôi một kết quả khá ngẫu nhiên (hầu hết các số xuất hiện ít nhiều bằng nhau). Cũng sử dụng thực tế là các phần tử html có id được thêm vào đối tượng cửa sổ chung trong JavaScript, do đó document.getElementById()không cần thiết.

HTML: 8 byte

<b id=a>

Tôi đang bỏ qua các trích dẫn ở đây và tôi sẽ không đóng bthẻ. Nó không phải là html hợp lệ, nhưng tất cả các trình duyệt sẽ tự động đóng thẻ. Tôi đã làm cho nó đậm bởi vì blà một yếu tố HTML một ký tự và bởi vì điệu nhảy của con chim của tôi xứng đáng được chú ý.


1
Khi f gọi lại chính nó, nó sẽ không vượt qua n lần nữa. Đối với tôi ít nhất điều này dường như chỉ tôn vinh n lần đầu tiên, sau đó nó bằng không (hoặc không xác định). Ngoài ra đôi khi đầu ra không được xác định. Nó có nên là r% 7 không?
Chris M

Bạn nói đúng, tôi quên vượt qua n. Nó thực sự phải là% 7. Tôi đã tính sai số lượng chim đặt ra. Cảm ơn đã sửa chữa, giờ nó đã được sửa.
Luke

Xin lỗi tôi tiếp tục tăng số byte của bạn! Chơi golf tuyệt vời, tôi thích chức năng ngẫu nhiên và không chia tách
Chris M

Cảm ơn. Tôi đã tìm thấy một cải tiến 4B trong khi chỉnh sửa câu trả lời của mình, điều đó có nghĩa là tôi đã kết thúc việc tiết kiệm 2B, vì vậy mọi thứ đều ổn. Việc chia số 0 được sử dụng để lưu byte trong ES5 trở về trước, nhưng bạn có thể bỏ qua dấu ngoặc đơn với chuỗi mẫu kể từ ES6, vì vậy nó không còn hữu ích nữa. Nó là phần còn lại từ một cách tiếp cận khác (trong đó tôi đã sử dụng chuỗi mẫu làm đối số đầu tiên cho setInterval).
Lu-ca

2

PowerShell , 124 117 byte

(Cảm ơn TimmyD )

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

Hãy thử trực tuyến! (Không phải nó sẽ hoạt động trong TIO ...)


Bạn có thể loại bỏ $bvà sử dụng một giả ba để giảm xuống 117 - for(){(-split'^(")v v(")^ ^(")^ v(")v (>")> <(")> <("<)')[($i=0..6|random)];sleep -m((100,200)[$i-gt3]*$args[0]);cls}... Tôi nghĩ ngắn hơn là có thể; Tôi vẫn đang chọc nó.
admBorkBork

Bạn cứ bảo tôi ra @TimmyD (cảm ơn)! Tôi nghĩ những thay đổi đó là đủ quan trọng để đảm bảo câu trả lời của riêng bạn; nó không để lại bất cứ điều gì độc đáo trong mã của tôi :)
briantist

Không, chúng chỉ là những điều chỉnh nhỏ trên mã của bạn. Logic tổng thể là chính xác như nhau. Có tại đó.
admBorkBork

2

Noodel , không biên dịch 67 byte

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

Thử thách này rất khó khăn với Noodel vì nó không có bất kỳ toán tử dựa trên số học hoặc so sánh thông minh nào. Nhưng sau khi thực hiện thử thách này, tôi nghĩ Noodel đã sẵn sàng cho lần phát hành đầu tiên.

Thử nó:)

Làm thế nào nó hoạt động

                                                                     # 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

Đây là một phiên bản hoạt động như một đoạn mã.

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

Tôi cũng đã cố gắng để làm điều đó mà không có nghệ thuật gà ascii, nhưng đó là cách lâu hơn.

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 từ -ncờ.

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 vì nó không bắt đầu bằng <(")>.

-7 byte bằng cách nội tuyến birdsvà loại bỏ 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)))

Chỉ cần tách chim trên các khoảng trắng, chọn một chỉ số ngẫu nhiên từ 0-6, hiển thị con chim đã chọn, sau đó nếu chỉ số được chọn lớn hơn 2, nó sẽ đợi trong 100ms, khác 200ms.

Clojure thực sự cần một splitphương thức chuỗi trong lõi.

Ung dung:

(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)))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.