<(“ <) นักเต้นนก (>”)>


22

นกของคุณมีอาการคันในการออกกำลังกายและเบื่อที่จะติดอยู่ในท่าคงที่ตลอดเวลา เขียนโปรแกรมที่จะแสดงนก ascii เต้นแบบสุ่มอัพเดตทุก ๆ 100ms * n หรือ 200ms * n ขึ้นอยู่กับท่าเต้น นกเริ่มต้นด้วยท่าเต้น<(")>เสมอ

โปรแกรมควรยอมรับอินพุตหนึ่งค่าซึ่งเป็นตัวเลขเพื่อเพิ่มช่วงเวลาสลีปโดย ( n >= 0 && n <= 50)

การเคลื่อนไหว 100 มิลลิวินาที

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

การเคลื่อนไหว 200 มิลลิวินาที

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

รายละเอียดพิเศษ

  • การสุ่มไม่จำเป็นต้องเหมือนกัน แต่ท่าเต้นแต่ละครั้งควรมีโอกาสพอสมควรที่จะเกิดขึ้น (อย่างน้อย 1 ใน 60 ดูเหมือนจะยุติธรรมมันก็โอเคถ้าท่าเดียวกันเกิดขึ้นสองครั้งในแถว)
  • ควรมีนกหนึ่งตัวที่ปรากฏในแต่ละครั้งไม่ใช่นกหลายตัว
  • อนุญาตให้ใช้ช่องว่างต่อท้ายได้ (แต่ไม่สามารถใช้อักขระต่อท้ายอื่น ๆ )
  • ควรแสดงนกก่อนนอน

ตัวอย่างใน 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

@Pavel คำพูดซ้ำ
redstarcoder

6
วันนี้ฉันเรียนรู้ว่าคุณไม่จำเป็นต้องหลีกเลี่ยงเครื่องหมายคำพูดในสตริงหลายบรรทัดในหลาม
Pavel

หากภาษาของฉันไม่สามารถแก้ไขผลลัพธ์ได้ฉันจะส่งออกนกใหม่ทุก ๆ 100/200 ms ได้หรือไม่
devRicher

1
ใช้Ideone , ลัวะหลบหนีดูเหมือนว่าจะทำหน้าที่เหมือนเป็นเพียงแค่\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! (ล่ามกำลังทำการทดลองหากไม่ได้เริ่มต้นให้ลองกด "Run" อีกครั้งหรือรีเฟรชหน้า)

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย

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

*> <> , 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บนสแต็กและออกไปคุณไป! วิธีนี้จะใช้(")อักขระเพื่อบันทึกบางไบต์

คำอธิบาย

initialisation

<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 ไปในทิศทางที่ผิด

สร้างการเต้นรำ 100ms

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

สร้างการเต้นรำ 200ms

xนี้เป็นอีกหนึ่งที่ขึ้นต้นด้วย มันจะถูกแยกออกเป็นสองส่วน: <(")>และอีกส่วนหนึ่ง(>")> and <("<)เนื่องจากเป็นสองส่วนที่แตกต่างกันและxเป็นสิ่งเดียวที่แบ่งปัน

<(")>

>:2* _"><"b2.

สิ่งนี้จะเป็นจุดเริ่มต้นของgenerate 100ms danceกิจวัตรประจำวัน แต่เติมมือนก><แทนการ^vคอมโบแบบสุ่ม มันคูณnสองในเวลานี้เช่นกัน สิ่งนี้ทำให้การติดตั้งทั้งหมดใช้ประโยชน์จาก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)}

ฉันใช้มิลลิวินาทีนับตั้งแต่ยุคเพื่อสร้างหมายเลขสุ่ม -h ในทางทฤษฎีสิ่งนี้จะสร้างหมายเลข (ชุด) เสมอกัน แต่การทดสอบบนพีซีของฉันให้ผลลัพธ์ที่ค่อนข้างสุ่ม (ตัวเลขส่วนใหญ่จะปรากฏขึ้นอย่างเท่าเทียมกัน นอกจากนี้ยังใช้ความจริงที่ว่าองค์ประกอบ html ที่มีรหัสได้รับการเพิ่มไปยังวัตถุหน้าต่างทั่วโลกใน JavaScript จึงdocument.getElementById()ไม่จำเป็น

HTML: 8 ไบต์

<b id=a>

ฉันไม่ใส่เครื่องหมายคำพูดที่นี่และฉันไม่ได้ปิดbแท็ก ไม่ใช่ HTML ที่ถูกต้อง แต่เบราว์เซอร์ทั้งหมดจะปิดแท็กโดยอัตโนมัติ ฉันทำให้มันกล้าเพราะbเป็นองค์ประกอบ HTML ตัวเดียวและเพราะการเต้นของนกของฉันสมควรได้รับการสังเกต


1
เมื่อ f โทรซ้ำตัวเองจะไม่ผ่าน n อีกครั้ง อย่างน้อยสำหรับฉันนี่ดูเหมือนจะให้เกียรติเพียงครั้งแรกหลังจากนั้นมันจะเป็นศูนย์ (หรือไม่ได้กำหนด) บางครั้งเอาต์พุตก็ไม่ได้ถูกกำหนด ควรเป็น% 7 หรือไม่
Chris M

คุณถูกต้องฉันลืมที่จะผ่าน n มันควรจะเป็น% 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และใช้ pseudo-ternary เพื่อลงไปที่ 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เพราะไม่มีเลขคณิตอันชาญฉลาดหรือตัวดำเนินการเชิงเปรียบเทียบ แต่หลังจากทำสิ่งนี้ฉันคิดว่านูเดลพร้อมสำหรับการเปิดตัวครั้งแรก

ลองมัน:)

มันทำงานอย่างไร

                                                                     # 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

Clojure, 185 178 ไบต์

18 <(")>ไบต์เพราะมันไม่ได้เริ่มต้นด้วย

-7 ไบต์โดย inlining และการกำจัด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วิธีสตริงในแกนกลางจริงๆ

Ungolfed:

(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.