<(„<) Bird Dancer (>”)>

22

Twój ptak swędzi od niektórych ćwiczeń i ma dość ciągłego trzymania się w pozycji statycznej. Napisz program, który wyświetli losowo tańczącego ptaka ascii, aktualizując co 100ms * n lub 200ms * n w zależności od ruchu tanecznego. Ptak zawsze zaczyna się od tańca <(")>.

Program powinien zaakceptować jedno wejście, które jest liczbą pomnożoną przedziału uśpienia przez ( n >= 0 && n <= 50).

100ms ruchów

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

200ms Moves

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

Dodatkowe informacje

  • Losowość nie musi być jednolita, ale każdy ruch taneczny powinien mieć uzasadnioną szansę na wystąpienie (co najmniej 1 na 60 wydaje się sprawiedliwy, jest OK, jeśli ten sam ruch występuje dwa razy z rzędu)
  • Jednocześnie powinien być wyświetlany tylko jeden ptak, a nie wiele ptaków
  • Końcowe białe znaki są dozwolone (ale inne końcowe znaki nie są)
  • Ptak powinien być wystawiony przed snem

Przykład w 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)

Zwycięski

redstarcoder
źródło
Czy oczy ptaka to podwójny cytat czy dwa pojedyncze cytaty?
Pavel
@Pavel, podwójny cytat
redstarcoder
6
Cóż, dzisiaj dowiedziałem się, że nie musisz unikać znaków cudzysłowu w ciągach wieloliniowych w pythonie.
Pavel
Jeśli mój język nie może modyfikować wyników, czy mogę po prostu wysyłać nowego ptaka co 100/200 ms?
devRicher
1
Przy pomocy Ideone\r ucieczka Lua wydaje się działać jak \n. Nie mogę też os.execute("cls")tam użyć . @redstarcoder
devRicher

Odpowiedzi:

3

MATL , 53 bajty

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

Ruchy są jednolicie losowe.

Poniżej znajduje się przykładowy przebieg z n = 2. Lub spróbuj w MATL Online! (Tłumacz jest eksperymentalny. Jeśli nie działa, spróbuj ponownie nacisnąć „Uruchom” lub odświeżyć stronę).

wprowadź opis zdjęcia tutaj

Wyjaśnienie

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
Luis Mendo
źródło
6

Matlab, 125 117 bajtów

Niestety nie można tego wyświetlić w TIO, ponieważ nie ma „streamingu” wyjścia. Oto gif dla danych wejściowych 1zamiast:

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

Dzięki @LuisMendo za -8 bajtów!

wada
źródło
5

*> <> , 103 101 bajtów

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

Wypróbuj tutaj! (napisz nna początkowym stosie, inaczej pojawi się błąd)

Zdecydowałem się rzucić wyzwanie na moje wyzwanie, ponieważ nie było odpowiedzi poniżej 100 bajtów. Umieść nna stosie i gotowe! Spowoduje to ponowne użycie (")znaków do zapisania niektórych bajtów.

Wyjaśnienie

Inicjalizacja

<vD[3'(")'

Tutaj przechowujemy (")do późniejszego wykorzystania.

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

Wybór tańca

1x<.5
 \

Jest to często wykonywane, aby wybrać rodzaj tańca, który będziemy generować.

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

Jest vpowyżej xi <na prawo od niego zbyt. Powodują one xponowne uruchomienie, jeśli spróbuje przesunąć adres IP w złym kierunku.

Wygeneruj taniec 100ms

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

Tutaj generujemy i generujemy jeden ze 100ms ruchów tanecznych.

 \                         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 - Wygeneruj „^” lub „v”

R!"^"x"v">

Jest to prosta funkcja, która generuje „^” lub „v”, a następnie zwraca. Działa podobnie do selektora tańca, gdzie ma instrukcje, xaby zapewnić, że IP porusza się tylko w lewo lub w prawo.

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

Generuj taniec 200ms

To kolejny, który zaczyna się od x. Zostanie on podzielony na dwie sekcje: <(")>i drugą (>")> and <("<), ponieważ są to dwie odrębne sekcje i xto jedyna rzecz, którą dzielą.

<(")>

>:2* _"><"b2.

Zasadniczo robi to początek generate 100ms dancerutyny, ale wypełnia ręce ptaka jak ><przypadkowe ^vpołączenie. nTym razem mnoży się również przez dwa. To sprawia, że ​​wszystko jest skonfigurowane do użycia generate 100ms danceprocedury, aby wyprowadzić cały ptak i zamiast tego poczekać 200 ms.

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

(>")> i <("<)

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

To małe wyjaśnienie dotyczy generowania (>")>i <("<)generowania, chociaż xmoże wysyłać adres IP poza nim (wyjaśniony poniżej).

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"
redstarcoder
źródło
3

JavaScript (ES6) + HTML5: 118 116 + 8 = 124 bajty

JavaScript: 119 bajtów

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

Używam milisekund od epoki do generowania liczb losowych. Teoretycznie zawsze generowałoby to ten sam (zbiór) numer (y), ale test na moim komputerze dał mi dość losowy wynik (większość liczb wyglądała mniej więcej tak samo). Również korzystanie z faktu, że elementy HTML z identyfikatorem są dodawane do globalnego obiektu okna w JavaScript, więc document.getElementById()nie jest potrzebne.

HTML: 8 bajtów

<b id=a>

Pomijam cytaty tutaj i nie zamykam btagu. To nie jest poprawny HTML, ale mimo to wszystkie przeglądarki automatycznie zamykają tag. Zrobiłem to odważnie, ponieważ bjest to jednoznakowy element HTML i dlatego, że taniec mojego ptaka zasługuje na zauważenie.

Luke
źródło
1
Kiedy f ponownie się wywołuje, nie przechodzi ponownie n. Dla mnie przynajmniej wydaje się to honorować tylko za pierwszym razem, po czym jest zero (lub niezdefiniowane). Czasami dane wyjściowe są niezdefiniowane. Czy powinno to być r% 7?
Chris M
Masz rację, zapomniałem przekazać n. Rzeczywiście powinien to być% 7. Zliczyłem ilość pozów ptaków. Dzięki za korektę, teraz jest naprawiona.
Łukasz
Przepraszam, ciągle zwiększam liczbę bajtów! Fajne gry w golfa, podoba mi się funkcja losowa i dzielenie zera
Chris M
Dzięki. Podczas edytowania odpowiedzi znalazłem poprawę 4B, co oznaczało, że zapisałem 2B, więc jest w porządku. Dzielenie zera używane do zapisywania bajtów w ES5 i wcześniejszych, ale można pominąć nawiasy z ciągami szablonów od ES6, więc nie jest już tak przydatne. Jest to pozostałość z innego podejścia (gdzie jako pierwszy argument dla setInterval użyłem ciągu szablonu).
Łukasza
2

PowerShell , 124 117 bajtów

(Dzięki TimmyD )

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

Wypróbuj online! (Nie żeby działało w TIO ...)

briantist
źródło
Możesz wyeliminować $bi użyć pseudo-trójki, aby zejść do 117 - for(){(-split'^(")v v(")^ ^(")^ v(")v (>")> <(")> <("<)')[($i=0..6|random)];sleep -m((100,200)[$i-gt3]*$args[0]);cls}... Myślę, że krótszy jest możliwy; Nadal się na to szturcham.
AdmBorkBork
Ciągle mnie ratujesz @TimmyD (dzięki)! Myślę, że zmiany te są na tyle znaczące, że uzasadniają twoją własną odpowiedź; nie pozostawia nic wyjątkowego w moim kodzie :)
briantist
Nie, to tylko drobne poprawki w twoim kodzie. Ogólna logika jest dokładnie taka sama. Mają na to.
AdmBorkBork
2

Noodel , niekonkurencyjne 67 bajtów

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

To wyzwanie było bardzo trudne dla Noodel, ponieważ nie ma żadnych inteligentnych operatorów arytmetycznych lub porównawczych. Ale po wykonaniu tego wyzwania myślę, że Noodel jest gotowy na pierwsze wydanie.

Spróbuj:)

Jak to działa

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

Oto wersja, która działa jak fragment kodu.

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

tkellehe
źródło
1

Python, 157 bajtów

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

Próbowałem też to zrobić bez sztuki ascii z kurczaka, ale to było o wiele dłużej.

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
Cormac
źródło
1

Rubinowy, 97 + 1 = 98 bajtów

+1 bajt z -nflagi.

a=1;loop{puts %w{^(")v <(")> v(")^ (>")> ^(")^ <("<) v(")v}[a];sleep$_.to_i*0.1*(1+a%2);a=rand 7}
Wartość tuszu
źródło
1

Clojure, 185 178 bajtów

+18 bajtów, ponieważ nie zaczynało się od <(")>.

-7 bajtów poprzez wstawienie birdsi pozbycie się 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)))

Po prostu dzieli ptaki na spacje, wybiera losowy indeks od 0-6, wyświetla wybranego ptaka, a jeśli wybrany wskaźnik jest większy niż 2, czeka na 100 ms, w przeciwnym razie 200 ms.

Clojure naprawdę potrzebuje splitmetody strunowej w rdzeniu.

Nie golfowany:

(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)))))
Carcigenicate
źródło