잠들기 위해 양 계산


11

대부분의 사람들은 잠들기 위해 양을 세는 것에 대해 그 군대에 익숙합니다. 양 무리가 있고, 그들 중 일부는 울타리 위로 뛰어 오르고, 양들이 점프 할 때 양을 센다. 아마도 이것은 당신의 마음을 고요하게하고 당신을 수면과 같은 상태로 만들어 잠들게 할 것입니다.

다음은 계산을 기다리는 오른쪽을 향한 ASCII 양입니다.

'00^>
 ||

울타리 위로 점프하는 ASCII 양은 다음과 같습니다.

'00^>
 /\
 ++

다음은 이미 계산 된 왼쪽을 향한 것입니다.

<^00'
  ||

도전

두 개의 입력 정수가 주어 n지고 m, n > 2양의 총 수 를 설명하고 m > 0이미 계산 된 양의 수를 말하면 양의 수를 나타내는 ASCII 예술 표현이 잠들게됩니다.

이제 비틀기 :

  • 양이 들어있는 펜의 크기로 인해 맨 윗줄에는 최대 10양만 넣을 수 있으며 항상 맨 윗줄에 있어야하는 현재 점프하는 양은 계산하지 않습니다.
  • 그 다음 줄에는 양이 각각의 펜 밖에있을 수 없습니다 (두 번째 줄의 왼쪽에는 첫 번째 줄보다 더 많은 양을 가질 수 없으며 오른쪽도 동일).
  • 이 경우 11이상 총 양, 상단 행이 있어야합니다 10플러스에서 점프 양.
  • 다음과 같은 경우 선행 / 후행 공백과 양 사이의 공백은 중요하지 않습니다.
    1. 양 사이에는 최소 하나의 공백 문자가 있습니다
    2. 모든 문자가 적절하게 정렬됩니다.

이러한 규칙이 충족되는 한 양의 실제 배열은 구현에 달려 있습니다.

예를 들어, 가장 간단한 경우 는 n=3m=1입니다.

         '00^>
'00^>     /\      <^00'
 ||       ++        ||

다음은 n=11m=6하나 개의 수평 라인에 들어갈 수있는 가장 양.

                        '00^>
'00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00' <^00' <^00' <^00'
 ||    ||    ||    ||    ++     ||    ||    ||    ||    ||    ||

여기에 다른 예제와 함께,의 n=11m=1

                                                      '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ||    ++     || 

와 더 큰 예 n=30m=12

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>       <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||           ||    || 

'00^>                                                 <^00' <^00'
 ||                                                     ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

                                                      <^00' <^00'
                                                        ||    || 

여기에 예입니다 n=17m=2

                                                '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ||    ++     ||    ||

'00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||  

여기에 예입니다 n=19m=3

                                          '00^>
'00^> '00^> '00^> '00^> '00^> '00^> '00^>  /\   <^00' <^00' <^00'
 ||    ||    ||    ||    ||    ||    ||    ++     ||    ||    || 

'00^> '00^> '00^> '00^> '00^> '00^> '00^>
 ||    ||    ||    ||    ||    ||    ||  

'00^>
 ||  

이것들은 모두 입니다. 마지막으로 오른쪽에 양의 세로 배열을 만들어서 왼쪽을 대신 두 행에 맞출 수 있습니다. 또는 오른쪽에 2x2 정사각형 양이 있는데, 왼쪽 양도 두 줄에 맞습니다. 기타.

I / O 및 규칙

  • 적절한 형식과 편리한 방법 으로 입력 할 수 있습니다 .
  • 문자가 적절하게 정렬되는 경우 선행 / 후행 개행 문자 또는 기타 공백은 선택 사항입니다.
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 콘솔로 출력 할 수 있고, 문자열 목록으로 반환되거나, 단일 문자열로 반환 될 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

2
@Rod 나는 더 큰 예제를 추가했지만 노트는 단지 있다고 와 출력이 다를 수 있습니다.
AdmBorkBork


권장 테스트 사례 : n=11m=9
Adám

@ 아담이 10 테스트 케이스가 될 수 n=11같은 것을 0<m<=10. 이렇게하면 맨 위 줄에있는 모든 양과 울타리 의 왼쪽 ( n-1-m) 및 오른쪽 ( m)에 양의 동적 양이 있어야하며 고정 된 펜 크기를 사용할 수 없습니다.
MT0

@ MT0 사실이지만, 하나 또는 두 개의 테스트 사례만으로도 솔루션이 작동 함을 알 수 있습니다.
Adám

답변:


9

APL (Dyalog Unicode) , 118 바이트 SBCS

익명의 람다. 소요 n왼쪽 인수로 및 m오른쪽 인자로. 중첩 배열 결과를 반환하지만이 중첩 배열의 기본 표시는 사양을 따릅니다. 계산 된 양에는 최대 9 개의 열을 사용하고 대기중인 양에는 나머지 열을 사용합니다.

{(r⍴(×/rd,⍨⌈w÷d10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2S)(↑(s'>',⍨¯1b)' /\' ' ++')(r⍴(×/r←9,⍨⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')}

온라인으로 사용해보십시오!

{} 익명의 람다; 왼쪽 논쟁, 오른쪽 논쟁

이 기능에는 Waiting , JumpingCounted의 세 부분이 있습니다 . 각각은 괄호로 묶여 결과가 3 요소 목록이됩니다.

계산 (r⍴(×/r←9,⍨∘⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')

''()' ||' 미러링 된 양의 세 줄, 가운데 하나는 다음과 같습니다.

b←'''00^<' 몸과에 할당 b

 문자열 목록을 문자 행렬로 혼합합니다 (공백으로 채워짐)

 거울

S←S(큰 S heep)에  할당

 단위로 처리 할 수 ​​있도록 동봉하십시오.

⍵⍴ 계산 된 양의 수를 사용하여 주기적으로

()↑ 그로부터 다음과 같은 수의 요소를 취하십시오 (시제품 항목으로 채워짐, 즉 같은 배열이지만 모든 문자가 공백으로 바 replaced)

⍵÷9 계산 된 양의 아홉 번째

 모으다

9,⍨ 그것에 9를 더하다

r← 할당 r(우리 것 r에 eshape와; 행과 열)

×/ 해당 목록의 제품 (필수를 포함하여 필요한 요소 수)

r⍴ 치수 길이가있는 배열로 재구성 r

점프 (↑(s←'>',⍨¯1↓b)' /\' ' ++')

()' /\' ' ++' 점프하는 양의 세 줄, 첫 번째 줄 :

¯1↓b 에서 마지막 문자를 삭제 b

'>',⍨ 오른쪽 머리를 추가

s← 매장에서 s(작은 S의 힙이고)

 문자열 목록을 문자 행렬로 혼합합니다 (공백으로 채워짐)

기다리는 (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S 거울 S

s@2 넣어 s 에서 (이 현재의 데이터 교환)이 라인 (2)

 단위로 처리 할 수 ​​있도록 동봉하십시오.

()⍴ 주기적으로 다음 크기로 변경합니다.

⍵+1 계산 된 양의 수에 1을 더한 것

⍺- 총계에서 빼기

w← 할당 w( w aiting)

()↑ 그로부터 다음과 같은 수의 요소를 취하십시오 (시제품 항목으로 채움).

⊢/r 가장 오른쪽 요소 r(즉, 계산 된 양에 사용 된 열 수)

⍵⌊ 총합과 그 최소

10- 열에서 빼기

d← 할당 d( d ifference; 누락 된 열)

 분할 w그것에 의하여

 반올림 (필요한 행 수 제공)

d,⍨ 덧붙이다 d

r← 할당 r(우리 것 r에 eshape와; 행과 열)

×/ 해당 목록의 제품 (필수를 포함하여 필요한 요소 수)

r⍴ 치수 길이가있는 배열로 재구성 r


1
@WeijunZhou 당신 말이 맞아요.
Adám

1
나는이 도전에 어떻게 대답 할 지 궁금했다. 그렇게 생각합니다 : p
J. Sallé

1
@WeijunZhou 수정되었습니다.
Adám

"항상 양을 기다리는 열 9 개와 계산 된 양을위한 열 하나를 예약합니다." 이 작업 n=11,m=9과 규칙 "맨 위 줄에 10 더하기 점프 양이 있어야합니까?"
MT0

3

자바 스크립트, 281 , 293 , 288 바이트

a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});

아래 스 니펫을 사용할 때는 갑작스런 기면증이 발생할 위험이 높습니다.

  <form id="form">
    <input type="text" name="n" placeholder="n (sheep total)">
    <input type="text" name="m" placeholder="m (sheep in right hand field)">
    <button type="submit">Let's Go!</button>    
  </form>

  <pre id="output">
  </pre>

  <script>
    a="      ";c=((n,m)=>{b="";for(i=0;i<(q=m>(o=(l=(t=n-m-1)?t:0)/9)?m:o);++i){for(j=0;j<3;++j){b+=[a,"'00^> "," ||   "][j].repeat(r=l>i*9?(z=o-i)>1?9:Math.ceil(z*9):0)+a.repeat((l>9?9:l)-r)+(i?"     ":["'00^>"," /\\  "," ++  "][j])+[a," <^00'","   || "][j].repeat(m>i?1:0)+"\n"}}return b});
      form.addEventListener("submit", function(e){
        e.preventDefault();
  
        var n = parseInt(form.n.value);
        var m = parseInt(form.m.value);
  
        if(n != NaN && m != NaN){
          if(m > n){
            output.innerText = "C'mon man, how can you have more sheep in the right hand field than there are sheep in general?";
          }
          else{
            output.innerText = c(n, m);
          }
        }
        else{
          output.innerText = "Numbers only please.";
        }
      });
    </script>


2
이것은 n = 50, m = 3에 대해 4 개의 계산 된 양을 나타내고, n = 20, m = 3에 대해 잘못 정렬 된 양을 갖는다. 또한 n = 20, m = 1은 2 계산 된 양을 나타냅니다.
ale10ander

2
그 오류를 수정했습니다. 또한 반올림 오류로 인해 일부 양이 탈출하는 것을 발견했습니다.
Jhal

경우 m = n에는 오류가 발생합니다.
aimorris

이것은 내가 무시할 수 있다고 가정 한 시나리오입니다. 질문이 쓰여진 방식은 다음과 같습니다. m = 오른쪽 양의 개수 n = 총 양의 개수 그리고 양도 울타리를 뛰어 넘고 있습니다. 따라서 n은 m과 같을 수 없으므로 계산하지 않았습니다.
Jhal

2

C, 392 바이트

바이트를 저장해 준 @Jonathan Frech에게 감사합니다!

#define F;for(
x,y,k;p(L,a,b,t)char L[][78];{F k=5;k--;)L[x=a*4+(t<2)][y=b*6+k]=t?"'00^>"[k]:"<^00'"[k];L[++x][y-=~!t]=47;L[x][++y]=92;L[x][--y]=L[x+=(t>1)][y]=t<2?'|':43;}i,l;f(n,m){char L[i=n*4][78]F;i--;){F L[i][l=77]=0;l--;)L[i][l]=32;}F l=n+~m;++i<l&&i<9+!m;)p(L,0,i,1);l-=i;p(L,0,i++,2)F;i<11&&m--;)p(L,0,i++,0)F i=0;l--;)p(L,++i,0,1)F i=1;m-->0;)p(L,i++,10,0)F l=0;l<i*4;)puts(L+l++);}

온라인으로 사용해보십시오!

풀림 :

#define F;for(

x, y, k;
p(L, a, b, t) char L[][78];
{
    F k=5; k--;)
        L[x=a*4+(t<2)][y=b*6+k] = t ? "'00^>"[k] : "<^00'"[k];

    L[++x][y-=~!t] = 47;
    L[x][++y] = 92;
    L[x][--y] = L[x+=(t>1)][y] = t<2 ? '|' : 43;
}

i, l;
f(n, m)
{
    char L[i=n*4][78]
    F; i--;)
    {
        F L[i][l=77]=0; l--;)
            L[i][l] = 32;
    }

    F l=n+~m; ++i<l&&i<9+!m;)
        p(L,0,i,1);

    l-=i;
    p(L,0,i++,2)

    F; i<11&&m--;)
        p(L,0,i++,0)

    F i=0; l--;)
        p(L,++i,0,1)

    F i=1; m-->0;)
        p(L,i++,10,0)

    F l=0; l<i*4;)
        puts(L+l++);
}

y+=1+!t일 수 있습니다 y-=~!t.
Jonathan Frech

@JonathanFrech 네, 감사합니다!
Steadybox

1

파이썬 2 , 222 277 바이트

n,m=input();n-=m+1
s=" '00^>"
j=1;L='  ||  '
a,b=[[[5,5],[10-m,m]][m<9],[n,10-n]][n<9]
print' '*6*a+s
while n>0 or 0<m:N,M=min(n,a),min(m,b);n-=a;m-=b;print '%-*s'%(6*a,N*s),'%5s'%('/\  '*j)+'%*s'%(6*b,M*" <^00'")+'\n'+'%*s'%(-6*a,N*L),'%5s'%('++  '*j),'%*s'%(6*b,M*L)+'\n';j=0

온라인으로 사용해보십시오!


에 실패 n=11하고m=2 .
Adám

나는 이것을 달렸을 때 첫 줄에 11 마리의 양을 얻지 못했다.
Robert Benson

1
@RobertBenson 감사합니다. 수정
TFeld

0

AWK , 293 바이트

{f=" '00^>"
l="  ||  " 
L="  /\\   "
p="  ++   "
Y=$2
X=$1-Y-1
E="      "
x=$1>11?Y<5?10-Y:X>5?5:X:X
y=$1>11?X<5?10-X:5:Y
printf"%"6*(x+1)"s\n",f
for(;X>0||Y>0;A=B=""){for(i=0;i++<x;B=B (X>=0?l:E))A=A (--X>=0?f:E)
A=A L
B=B p
for(i=0;i++<y&&--Y>=0;B=B l)A=A"<^00' "
print A"\n"B"\n"
L=p=E" "}}

온라인으로 사용해보십시오!

루프를 피하기 위해 문자열 대체를 사용하려고 시도했지만 더 많은 코드가 필요했습니다.

설명

{f=" '00^>"    Let's assign
l="  ||  "     some variables
L="  /\\   "   for the ASCII
p="  ++   "    pieces
Y=$2        The number of sheep that have already jumped
X=$1-Y-1    Sheep patiently waiting to jump
E="      "  A string to keep things spaced properly
x=$1>11?Y<5?10-Y:X>5?5:X:X  If there's enough sheep, let's use 5 per column
y=$1>11?X<5?10-X:5:Y        Otherwise, use enough to get 11 sheep in first row
printf"%"6*(x+1)"s\n",f     Print the top part of the jumping sheep
for(;X>0||Y>0;A=B=""){      Loop until we've printed all the sheep
  for(i=0;i++<x;              Loop over waiting sheep in this row
    B=B (X>=0?l:E))             Build the "legs" string
      A=A (--X>=0?f:E)            Build the "bodies" string
  A=A L                       Add the legs and post 
  B=B p                       for the jumping sheep
  for(i=0;i++<y&&--Y>=0;   Loop over the jumped sheep in this row
    B=B l) A=A"<^00' "     Add to the "legs" and "bodies" string 
  print A"\n"B"\n"         Print what we've got so far
  L=p=E" "                 Prevent the jumping sheep's parts from printing lots of times
}}

나는 양 예술이 오히려 귀엽다고 말해야한다. :)


0

, 98 바이트

Nθ≔⁻⊖NθηF⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«J⁰¦⁰‖T§ι⁰↗F§ι¹«<^00'¶  || ↗¿¬﹪⊕κ§ι²”|I4O

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

이미 계산 된 양의 수를 입력하십시오.

≔⁻⊖Nθη

총 양의 수를 입력하고 계산해야 할 수량을 계산하십시오.

F⟦⟦00¶/\¶++ θ⌊⟦⌈⟦⁵⁻χη⟧θ⟧⟧⟦0^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«

두 개의 배열로 구성된 배열을 만듭니다. 각 배열에는 다음과 같은 요소가 있습니다.

  • 점프하는 양의 절반을 포함하는 줄
  • 울타리의 측면에있는 양의 수
  • 울타리의 측면에있는 한 줄에있는 양의 수
    • 울타리의 측면에있는 양의 수 (5보다 작은 경우)
    • 10-울타리 반대편의 양의 수 (5보다 작은 경우) 또는
    • 양측에 양이 5 마리 이상인 경우 5
J⁰¦⁰‖T§ι⁰↗

캔버스를 반영하고 반 점프 양을 인쇄하십시오.

F§ι¹«

그 쪽의 양을 반복합니다.

<^00'¶  || ↗

양을 인쇄하십시오.

¿¬﹪⊕κ§ι²”|I4O

이것이 행의 끝이라면, 다음 양의 시작 부분에 줄 바꿈과 공백을 인쇄하십시오.

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