<("<) Танцююча птахів (>")>


22

Ваша птах свербить деякими вправами і болить від того, що весь час застрягає у статичних положеннях. Напишіть програму, яка показуватиме випадково танцюючу пташку-асцію, оновлюючи кожні 100 мс * н або 200 мс * н залежно від ходу танцю. Птах завжди починається з танцювального руху <(")>.

Програма повинна приймати один вхід, який є числом, щоб помножити інтервал сну на ( 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, подвійна цитата
redstarcoder

6
Ну, сьогодні я дізнався, що вам не доведеться уникати лапок у багаторядкових рядках python.
Павло

Якщо моя мова не може змінити вихідні дані, чи можу я просто виводити нового птаха кожні 100/200 мс?
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! (Інтерпретатор експериментальний. Якщо він не запускається, спробуйте знову натиснути «Виконати» або оновити сторінку).

введіть тут опис зображення

Пояснення

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

Матлаб, 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на стопку і далеко ви йдете! Це повторно використовує (")символи для збереження деяких байт.

Пояснення

Ініціалізація

<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 в неправильному напрямку.

Створіть танець 100 мс

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

Тут ми генеруємо та виводимо один із танцювальних рухів на 100 м.

 \                         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комбо. Він і nв цей раз помножується на два. Це робить все можливим, щоб використовувати generate 100ms danceрутинну програму для виведення всього птаха і чекати замість цього 200 мс.

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

Я використовую мілісекунди з епохи для генерування випадкового результату. Теоретично це завжди генерувало б одне і те саме (набір) номерів, але тест на моєму комп'ютері дав мені досить випадковий результат (більшість цифр виявлялося більш-менш однаково). Також, використовуючи той факт, що html-елементи з ідентифікатором потрапляють до глобального об’єкта вікон у JavaScript, тому document.getElementById()не потрібні.

HTML: 8 байт

<b id=a>

Я опускаю цитати тут і не закриваю bтег. Це недійсний html, але тег все одно автоматично закриває тег. Я зробив це сміливим, оскільки bце односимвольний HTML-елемент і тому, що мій пташиний танець заслуговує на те, щоб його помітили.


1
Коли f повторно дзвонить, він більше не передає n. Мені, принаймні, це здається лише вшановуванням першого разу, після чого він дорівнює нулю (або невизначено). Також іноді вихід не визначений. Чи має бути r% 7?
Кріс М

Ти маєш рацію, я забув передати російську. Це дійсно має бути% 7. Я неправильно рахував кількість пташиних поз. Дякуємо за виправлення, це виправлено зараз.
Лука

Вибачте, я продовжую збільшувати кількість байтів! Класний гольф, мені подобається випадкова функція та нульовий розкол
Кріс М

Спасибі. Під час редагування моєї відповіді я знайшов покращення в 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 (спасибі)! Я думаю, що ці зміни є досить вагомими, щоб гарантувати власну відповідь; це не залишає багато нічого унікального в моєму коді :)
британіст

Ні, вони лише незначні зміни у вашому коді. Загальна логіка точно така ж. Майте на це.
AdmBorkBork

2

Локшина , не конкуруючий 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

Пітон, 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 байт шляхом вбудовування 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)))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.