<(“<) 버드 댄서 (>”)>


22

당신의 새는 약간의 운동에 가려움증을 앓고 있으며 항상 정적 인 위치에 갇혀 있습니다. 춤추는 움직임에 따라 100ms * n 또는 200ms * n마다 업데이트되는 무작위 춤추는 아시이 조류를 보여주는 프로그램을 작성하십시오. 새는 항상 춤 동작으로 시작합니다 <(")>.

프로그램은 수면 간격에 ( n >= 0 && n <= 50) 을 곱하는 숫자 인 하나의 입력을 수용해야합니다 .

100ms 이동

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

200ms 이동

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

추가 정보

  • 임의성이 균일하지 않아도되지만 각 댄스 동작은 합리적으로 발생할 가능성이 있어야합니다 (60 명 중 1 명 이상이 공정한 것 같습니다. 동일한 동작이 두 번 연속 발생해도 괜찮습니다)
  • 한 번에 하나의 새만 표시되고 여러 개의 새가 표시되지 않아야합니다
  • 후행 공백은 허용되지만 다른 후행 문자는 허용되지 않습니다.
  • 수면 전에 새가 표시되어야합니다

파이썬 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 / 200ms마다 새를 출력 할 수 있습니까?
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

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

-8 바이트를위한 @LuisMendo에게 감사합니다!


5

*> <> , 103101 바이트

<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위에 a 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"를 생성 한 다음 반환하는 간단한 함수입니다. xIP가 왼쪽이나 오른쪽으로 만 이동하도록 지시하는 지시 사항이있는 댄스 선택기와 유사하게 작동합니다 .

     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콤보 대신 새 손을 채 웁니다 . 이번에도 n2를 곱 합니다. 이것은 모든 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

자바 스크립트 (ES6) + HTML5 : 118 116 + 8 = 124 바이트

자바 스크립트 : 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)}

시대를 초월한 밀리 초를 사용하여 임의의 숫자를 생성합니다. 이론적으로 이것은 항상 같은 (세트) 숫자를 생성하지만 내 PC에서 테스트하면 거의 임의의 결과가 나왔습니다 (대부분의 숫자는 거의 같거나 적음). 또한 id가있는 html 요소가 JavaScript의 전역 창 객체에 추가된다는 사실을 사용하므로 document.getElementById()필요하지 않습니다.

HTML : 8 바이트

<b id=a>

여기서 인용 부호를 생략하고 b태그를 닫지 않습니다 . 유효한 HTML은 아니지만 모든 브라우저가 자동으로 태그를 닫습니다. 나는 b한 글자의 HTML 요소 이기 때문에 대담하게 만들었고 내 새의 춤을 볼 가치가 있기 때문입니다.


1
f가 다시 호출되면 n을 다시 전달하지 않습니다. 나에게 적어도 이것은 처음으로 n을 존중하는 것처럼 보이며 그 후에는 0 (또는 정의되지 않음)입니다. 또한 때때로 출력이 정의되지 않습니다. r % 7이어야합니까?
Chris M

네 말이 맞아, 나는 n을 지나가는 것을 잊었다. 실제로 % 7이어야합니다. 나는 새 자세의 양을 잘못 계산했다. 수정 해 주셔서 감사합니다. 이제 수정되었습니다.
Luke

바이트 수를 계속 늘려서 죄송합니다! 멋진 골프, 나는 임의의 기능과 제로 스 플리 팅을 좋아합니다
Chris M

감사. 내 답변을 편집하는 동안 4B 개선이 발견되어 2B를 절약 했으므로 괜찮습니다. ES5 및 이전 버전에서 바이트를 저장하는 데 사용되는 0 분할은 ES6 이후 템플릿 문자열로 괄호를 생략 할 수 있으므로 더 이상 유용하지 않습니다. 다른 접근 방식의 나머지 부분입니다 (setInterval의 첫 번째 인수로 템플릿 문자열을 사용했습니다).
Luke

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 (감사합니다)를 계속 쫓아냅니다! 나는 이러한 변화가 당신의 대답을 보증 할만큼 충분히 중요하다고 생각합니다. 그것은 내 코드에서 독특한 것을 많이 남기지 않습니다 :)
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

파이썬, 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

루비, 97 + 1 = 98 바이트

-n플래그 에서 +1 바이트

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 바이트

로 시작하지 않았으므로 +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보다 크면 100ms, 그렇지 않으면 200ms를 기다립니다.

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)))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.