<(«<) Птица-танцовщица (>»)>


22

Ваша птица жаждет каких-то упражнений и ей надоело все время застревать в статичных положениях. Напишите программу, которая будет показывать беспорядочно танцующую птицу аськи, обновляя каждые 100 мс * n или 200 мс * 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, двойная кавычка
redstarcoder

6
Что ж, сегодня я узнал, что вам не нужно избегать кавычек в многострочных строках в python.
Павел

Если мой язык не может изменить вывод, могу ли я выводить новую птицу каждые 100/200 мс?
devRicher

1
Используя Ideone , \rпобег Lua, похоже, действует как a \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 снова. По крайней мере, для меня это, кажется, только первый раз, после чего он равен нулю (или не определен). Также иногда вывод не определен. Должно ли это быть% 7?
Крис М

Вы правы, я забыл передать. Это действительно должно быть% 7. Я неправильно подсчитал количество поз птиц. Спасибо за исправление, оно исправлено.
Лука

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

Спасибо. Я нашел улучшение 4B при редактировании своего ответа, что означало, что я сэкономил 2B, так что все в порядке. Разделение нуля используется для сохранения байтов в ES5 и более ранних версиях, но вы можете опустить скобки со строками шаблонов начиная с ES6, так что это уже не так полезно. Это остаток от другого подхода (где я использовал строку шаблона в качестве первого аргумента для setInterval).
Лука

2

PowerShell , 124 117 байт

(Спасибо, ТиммиД )

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 (спасибо)! Я думаю, что эти изменения достаточно значительны, чтобы оправдать ваш собственный ответ; это не оставляет ничего особенного в моем коде :)
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

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методе в ядре.

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)))))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.