목자라고


23

피곤하지만 잠들 수 없습니다. 양을 세도록 도와주세요.

입력 N (양의 정수)이 주어지면 아래 샘플과 같이 N 양이 아스키 울타리 위로 뛰어 오게하십시오. 한 번에 하나의 프레임 만 표시해야합니다.

o |-|
──|-|──  0

 o|-|
──|-|──  0

   o
  |-|
──|-|──  0

  |-|o
──|-|──  0

  |-| o
──|-|──  0

o |-|
──|-|──  1

 o|-|
──|-|──  1

   o
  |-|
──|-|──  1

카운트는 '지면'의 오른쪽 아래에 유지해야합니다. 후행 및 선행 공백 및 줄 바꿈이 허용됩니다. 선택한 언어가 각 프레임의 화면을 지우는 데 어려움이있는 경우 화면을 지우는 데 충분한 줄 바꿈을 추가 할 수 있습니다. 답변에이 줄에 몇 줄을 추가해야하는지 명시하십시오. N 번째 양이 5 층에있을 때 프로그램을 종료해야합니다.

내일 일찍 일어나야하므로 바이트 단위의 가장 짧은 코드가 이깁니다. 기능 또는 완전한 프로그램을 제출하십시오. 표준 허점이 적용됩니다.


6
1. 사람들이 짧은 코드로 정당화를 사용할 때 고통을 겪습니다 ( "내일 일찍 일어나야합니다"). 2. 프레임 사이에 얼마나 많은 공백을 두어야합니까? 줄 바꿈이 1 개인 것처럼 보이지만 명확하게 말하고 싶을 수도 있습니다.
Rɪᴋᴇʀ

12
1) 아스피린 복용 2) 화면에 1 프레임 만있을 수 있습니다. 이 프레임은 각 상태를 개별적으로 보여주기위한 것으로 한 화면에 동시에 표시되어서는 안됩니다.
steenbergh

3
많은 언어에는 표시를 지우는 옵션이 없습니다. 이러한 경우 어떤 출력을 제공해야합니까?
Jonathan Allan

6
"화면을 지우려면 충분한 줄 바꿈을 추가하십시오". 출력 창의 크기와 화면 해상도에 의존하지 않습니까?
Emigna

3
귀하의 예에 따르면 N=3, 마지막 프레임의 오른쪽 끝에 양이 포함되며 카운터는 여전히이라고 말합니다 2. 그 맞습니까?
Luis Mendo

답변:


15

MATL , 60 56 53 바이트

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD

위 코드가있는 애니메이션은 매우 빠르게 실행됩니다. 다음 버전에는 4 바이트 이상의 비용으로 애니메이션을 느리게보고 쉽게 볼 수 있도록하기위한 일시 중지 기능이 포함되어 있습니다 (챌린지에 필요하지 않음).

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD.2Y.

MATL Online 에서 사용해보십시오 ! 통역사는 베타입니다. 작동하지 않으면 페이지를 새로 고침하십시오.

또는 오프라인 컴파일러의 레코딩을 참조하십시오.

여기에 이미지 설명을 입력하십시오

설명

:"              % Input N implicitly. Repeat N times
  @q            %   Push iteration index minus 1, that is, from 0 to N-1. This
                %   are the numbers of sheep
  XJx           %   Copy into clipboard J and delete
  [HKCbO]       %   Push array [2 4 7 -2 0]
  "             %   For each value in that array. This loops generates the 5
                %   frames for each number of sheep
    7Z"         %     Push string of 7 spaces
    '  |-|  '   %     Push this string
    v           %     Concatenate vertically. This gives a 2x7 char array
                %     with the upper part of the frame, except the 'o',
                %     which will be now placed in a varying position 
    'o'         %     Push string 'o'
    @           %     Push loop variable, that is, 2, 4, 7, -2 or 0
    (           %     Write 'o' into that position of the 2x7 char array.
                %     The position is interpreated linearly, that is, a single
                %     number is used as index into the 2D array in column-major
                %     order (down, then across). So index 2 is lower-left corner,
                %     index 4 is to the right of that etc. Indexing is
                %     semi-modular (modular for non-positive values). So 0 is
                %     the lower-right corner, and -2 is to the left of that
    '--|-|--  ' %     Push this string
    JV          %     Push current number of sheep converted to string
    h           %     Concatenate horizontally
    Xx          %     Clear screen
    XD          %     Display all stack contents
    .2Y.        %     Pause for 0.2 seconds (optional)
                %   End implicitly
                % End implicitly

6

자바 스크립트 (ES6) 120 124 바이트

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+(n-1),(++s%5?f(n,m,s):f(n-1,m,0))):''

계산 된 마지막 프레임이 먼저 표시됩니다. 이 덕분에 점프 수는 n-1
In alert이며, 캐릭터의 너비가 다르므로 부러진 것처럼 보입니다.


이전 답변 :

120 바이트, 점프 번호는 0 대신 1부터 시작하기 때문에 잘못되었습니다

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+n,(++s%5?f(n,m,s):f(n-1,m,0))):''

@LuisMendo 카운터를 0에서 시작하도록 업데이트했습니다. 막대는에 의해 사용 된 글꼴 덕분 alert입니다. 가장자리가있는 크롬과 동일한 결과가 있으며 파이어 폭스에서는 더 나쁩니다.
Hedi

6

자바 스크립트 (ES6) 144 142 바이트

출력을 지우고 각 프레임 사이에서 300ms를 기다립니다.

n=>(F=j=>((c=console).clear(),c.log(`   2
01|-|34
──|-|── `.replace(/\d/g,i=>(j-i)%5?' ':'o')+(j/5|0)),++j<n*5&&setTimeout(`F(${j})`,300)))(0)

여기에서 테스트 할 수 있습니다 (콘솔을 열어야합니다).


이것은 (에서 카운터를 증가하지 않는 것 45마지막으로 양 울타리 ... 뛰어 후)
ʰᵈˑ

@ ʰᵈˑ-이것이 예상되는 동작이라고 생각합니다. (도전 의견에서 Luis Mendo의 질문을 참조하십시오.)
Arnauld

아 그래, 나는 그것을 읽지 않았다- 다른 사람을 위해 코멘트를위한 링크
ʰᵈˑ

4

루비, 83 바이트

->n{(n*5).times{|i|$><<"   c
  |-|  
ab|-|de  #{i/5}
".tr('abcde',' '*(i%5)+'o ')}}

표준 출력으로 인쇄합니다. 줄 바꿈으로 구분 된 출력. 화면 높이를 3으로 줄이면 한 번에 하나의 이미지 만 표시됩니다.


4

C #, 234 바이트

using C=System.Console;class P{static void Main(string[]a){for(int n=0;n-1+""!=a[0];++n){foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write("    \n  |-|  \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}}}}

언뜻보기에 string[] args와 주변에 공백이 for (int있습니다. Int32.Parse될 수 있습니다 int.Parse.
Yytsi

1
수업 이름 Program을 그냥 P또는 다른 것으로 변경할 수 있습니다
Matias Cicero

1
string될 수 있습니다 var. for 루프 args[0]의 정수는 정수로 구문 분석하는 동시에 초기화 될 수 있습니다 .
Yytsi

낮아질 때마다 바이트 수를 편집하는 것을 볼 수 있습니다. 그러나, 나는 진행률을 추적하기 위해 오래된 바이트 수 (라인과 교차)를 유지하는 것이 좋습니다 :)
Yytsi

컴파일해야 할 함수 만 있으면되며 Action<string[]>외부 for 루프 주변의 대괄호를 제거하여 200 바이트를 얻을 수 있다고 생각합니다.using C=System.Console;a=>{for(int n=0;n-1+""!=a[0];++n)foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write(" \n |-| \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}};
TheLethalCoder

3

PHP + 자바 스크립트, 168 바이트

<?extract($_GET);$s="     ";$s[$f=++$f%5]=o;echo strtr("<pre>   C
AB|─|DE
──|─|── $c",EABCD,$s),($c+=!$f)<$n?"<script>location.href='s.php?n=$n&c=$c&f=$f'</script>":"";

파일로 저장하고 s.php로 브라우저에서을 (를) 호출 하십시오 s.php?n=<n>.

모든 프레임에 대해 새로운 매개 변수를 사용하여 지연없이 호출합니다.


나는 5를 더 절약 할 수 있었다 index.php. 그러나 나는 그렇게 멀리 가고 싶지 않습니다.


PHP 5와 7에서 이것을 시도했지만 Chrome이 제공하는 모든 것은입니다 C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
steenbergh

@steenbergh short_open_tag비활성화했습니다. 활성화하거나 (기본값) php뒤에 + space를 추가하십시오 <?.
Titus

그렇습니다. 지금 실행 중입니다.
steenbergh

3

Tcl, 168 바이트

10 행 높이의 화면을 사용하는 버전입니다. ( 7아래에서 화면 높이를 4에서 열로 바꾸십시오.)

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

정말 빠르게 실행되므로 두 번째 줄에 일시 중지를 추가 할 수 있습니다.

Tcl, 177 바이트

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {after 250
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

문자열을 맨 위에 다시 사용하여 두 가지 다른 작업을 수행합니다.

  • 내부 루프의 목록으로 (각 양의 양 + 울타리를 표시하기 위해)
  • 양 + 울타리 이미지 템플릿에서 숫자를 제거하기 위해 숫자 → 공백의 매핑으로

템플릿 자체는 표시 할 문자열 이미지입니다. 먼저 양의 현재 위치 숫자 (내부 루프)를 'o'에 매핑합니다 (문자열 교체). 그런 다음 나머지 숫자를 공백에 매핑합니다. 그런 다음 결과 문자열을 인쇄합니다.

문자열 자체는 세 번째 줄의 마지막 {다음에 시작하여 마지막 줄의 가장 왼쪽}으로 끝납니다.


3

Q 기본, 110 바이트

INPUT n
FOR i=0TO 5*n-1
CLS
?
?"  |-|"
?"--|-|-- ";i\5
x=i MOD 5
LOCATE(x=2)+2,1+x-(x>1)+x\3
?"o"
SLEEP 1
NEXT

5*n진드기를 반복합니다 . 각 진드기마다 화면을 지우고 스타일과 양 LOCATE을 인쇄 한 다음 o적절한 지점에 인쇄하는 데 사용 합니다 . 함께 x0과 4 사이에 위치되는 코드 :

  • 열: (x=2)+2
    • 경우 x=2사실이다 -1+2=1
    • 경우 x=2거짓, 0+2=2
  • 기둥: 1+x-(x>1)+x\3
    • 경우 x이다 0하거나 1, x>1거짓과 x\3입니다 0: 1+x-0+0= 1또는2
    • 경우 x이며 2, x>1사실과 x\3입니다 0: 1+x-(-1)+0=4
    • 경우 x이다 3하거나 4, x>1사실과 x\3입니다 1: 1+x-(-1)+1= 6또는7

마지막으로 SLEEP1 초 동안 반복합니다. 매 프레임마다 Enter 키를 누르는 것을 신경 쓰지 않으면에 대한 인수를 제거하여 2 바이트를 면도 할 수 있습니다 SLEEP.


3

PHP, 132 131 바이트

댓글 후 수정 (감사합니다) :

<?php for(;$i<$argv[1]*5;sleep(1),system(clear),$c="    
  |-|  
──|-|──  ".floor($i/5),$c[[5,6,3,10,11][$i++%5]]=o)echo$c;

어느 골퍼가 아닙니다 :

<?php

ini_set('error_reporting', '0');        # golfing precondition

for(; $i<$argv[1]*5;                    # repeat N times
  sleep(1),                             # sleep after iteration
  system(clear),                        # clear screen (linux only)
  $c = "    
  |-|  
──|-|──  " . floor($i / 5),             # define template
  $c[[5, 6, 3, 10, 11][$i++ % 5]] = o)  # replace with sheep (and finish "for" statement)
  echo $c;                              # output result

원본 게시물

<?php $i=0;for(;;){system("clear");$c="  \n  |-|  \n──|-|──  ";$c[[3,4,1,8,9][$i%5]]='o';echo"  $c".floor($i++/5);sleep(1);}

우분투에서 테스트했습니다 ( system("clear")Windows에서 작동하는지 모름 )

언 골프 드 :

<?php
$i = 0;
for(;;) {
  system("clear");
  $content = "  \n  |-|  \n──|-|──  ";
  $content[[3,4,1,8,9][$i%5]] = 'o';
  echo "  $content " . floor($i++/5);
  sleep(1);
}

1
Windows에 대한 Idk이지만 clear따옴표 가 필요하지 않습니다.
Titus

1
Windows를 생각하면 ... clsDOS에있었습니다.
Titus

1
를 제거하면 $i=0;경고는 일반적으로 코드 골프 (-5 바이트)로 표시되지 않습니다. 같은 이유로 따옴표 clearo(-4 바이트) 가 필요하지 않습니다 . 바꾸기 \n실제 줄 바꿈 (-2 바이트)에 의해들. 명령문이 아닌 표현식 만 있기 때문에 for루프에 마지막 것 이외의 것을 모두 넣을 수 있으므로 대괄호 ( for(;;system(clear),$c=…)sleep(1);) (-2 바이트) 를 제거 할 수 있습니다 . 마지막으로 조건을 추가하는 것을 잊어 버립니다 $i<$argv[0](+ 11 바이트).
Blackhole

고맙습니다! 루프에 에코가 발생하지 않았습니다. 그러나 다시 게시 된 솔루션은 그렇게하고 있습니다.
user470370

3

node.js + sleep , 169 바이트

c='   2\n01|-|34\n──|-|──  '
for(i=0;i<process.argv[2]*5;require('sleep').sleep(1))console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))

독창적 인 솔루션

Node.js를, 146 (142) 185 바이트

우분투 터미널에서만 테스트되었으며 현재 n 개의 양으로 테스트되었습니다.

i=0
c='   2\n01|-|34\n──|-|──  '
setInterval(function(){console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))
if(process.argv[2]*5==i)process.exit()},9)

글쎄, 그것은 9ms마다 프레임입니다. 더 수면을 취한 버전 (1 초마다 프레임) :

i=0;setInterval(function(){console.log('\033[2J'+'   2\n01|-|34\n──|-|──  '.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))},1000)

그리고 골퍼되지 않은 :

var i = 0;
setInterval(function(){
  console.log('\033[2J' + '   2\n01|-|34\n──|-|──  '.replace(i%5, 'o').replace(/\d/g, ' ') + Math.floor(i++/5));
}, 1000)

나의 첫 번째 해결책에서, 나는 N 양에 대한 매개 변수를 잊었다
user470370

2

05AB1E , 66 60 59 바이트

FNU5Fð4×N<i¨'oJ},N<iðë'o}ðNÉis}"|-|  "JN1›iR},…──|Â'-sððXJ,

CP-1252 인코딩을 사용합니다 .

설명

반복은 양 여행의 내부 반복 (0-> 4)을 나타냅니다.

메인 루프

F      # For N in range [0 .. input)
 NU    # Save N in variable X
 5F    # For N in range [0 .. 5)

상단 행 생성

ð4×         # push 4 spaces
N<i    }    # if we're on the 2nd iteration
   ¨'oJ     # replace the last space with an "o"
,           # print row

가운데 행 생성

N<iðë'o}     # push a space if we're on the 2nd iteration, else push "o"
ð            # push a space
NÉis}        # if we're on an odd numbered iteration, swap the stacks top 2 chars
"|-|  "      # push this string
J            # join the stack to one string
N1›iR}       # if we're on the any of the last 3 iterations, reverse the string
,            # print row

하단 행 생성

…──|  # push the string "──|"
     # push a reversed copy
'-s   # push "-" between the 2 strings on the stack
ðð    # push 2 spaces
X     # push the N we saved in the main loop (current sheep number)
J,    # join and print row

1

젤리 , 55 54 53 바이트

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż
×5Ḷµ:5ż@Ç€Y

TryItOnline

줄 바꿈으로 구분 된 프레임을 인쇄합니다.

방법?

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż           - Link 1, build a frame without counts: frameNumber
       ¤              - nilad and link(s) as a nilad:
 30214                -     literal 30214 (a nilad)
      D               -     to decimal: [3,0,2,1,4]
ị                     - index into (1-based and modular, so frames go 4,3,0,2,1,4,...)
        “o    ”       - string "o    "
               ṙ      - rotated to the left by that number
                “   “ - the rest, except the last character, is:
““|-|““               -     an array of strings ["   ","\n","","|-|","","\n__|-|__  "]
__|-|__  ”            -     i.e. split where a sheep might go

          ż           - zip the sheep (the rotated "o    ") into that

×5Ḷµ:5ż@Ç€Y - Main link: nSheep
×5          - multiply by 5 -> nFrames
  Ḷ         - lowered range: [0,1,2,...nFrames-1]
   µ        - monadic chain separation
    :5      - integer division by 5 (vectorises): [5 zeros, 5 ones, ..., 5 (nSheep-1)s]
      ż@    - zip with reversed arguments
        ǀ  - call last link (1) as a monad for each (zip sheep numbers with frames)
          Y - join with line feeds (TODO: replace with future animate frames atom :p)

1

파이썬 (2), 171 (159) 144 바이트, 163 개 (151) 136 문자

재귀 함수를 사용하는 솔루션. f (int)로 호출

편집하다

-12 주석을 다시 읽고 양이 필드 끝에 도달 할 때 카운트를 증가시킬 필요가 없음을 확인한 후 -12

-15 인덱스 목록을 직접 반복하고 변수를 잃음으로써 -15

def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`)
  f(a-1,x+1)

노트

UTF-8 인코딩을 가정합니다

@Luis MATL 답변에서와 같이 ─ 대신-를 사용하면 문자 수와 일치하도록 바이트 수가 8 씩 줄어 UTF-8 종속성이 손실됩니다.

줄 바꿈 50 개 추가-콘솔 맨 아래에 출력 (os.system ( "clear") 가져 오기 및 사용보다 저렴하며 Windows 및 Linux에서 작동)

출력 사이에 1 초의 시간 지연이있는 버전 (170 바이트, 162 자)

import time
def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`);time.sleep(1)
  f(a-1,x+1)

1

Bash + 표준 Linux 유틸리티 (339 바이트)

e(){ echo "$@";}
n(){ e -n "$@";}
r(){ [ $? -eq 0 ]&&s=o||s=" ";[ $1 ]&&n " $s "||n "$s";}
f(){ k=$(($1%5));n "  ";[ $k -eq 2 ];r .;e "  ";for i in 0 1;do [ $k -eq $i ];r;done;n "|-|";for i in 3 4;do [ $k -eq $i ];r;done;e;n "──|-|──";}
for l in `seq 1 $1`;do for z in `seq 0 4`;do clear;f $z;e "  $((l-1))";sleep 1;done;done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.