Đếm cừu để ngủ


11

Hầu hết mọi người đều quen thuộc với trope về việc đếm cừu để ngủ. Có một đàn cừu, một số trong số chúng nhảy qua hàng rào và bạn đếm cừu khi chúng nhảy. Giả sử, điều này giúp làm dịu tâm trí của bạn và đưa bạn vào trạng thái giống như giấc ngủ để bạn ngủ thiếp đi.

Đây là một con cừu ASCII quay mặt sang phải, đang chờ được tính:

'00^>
 ||

Đây là một con cừu ASCII nhảy qua hàng rào:

'00^>
 /\
 ++

Đây là một mặt quay về bên trái, đã được tính:

<^00'
  ||

Các thách thức

Đưa ra hai số nguyên đầu vào, nm, với việc n > 2mô tả tổng số bao nhiêu con cừu và m > 0cho biết có bao nhiêu con cừu đã được đếm, xuất ra một đại diện nghệ thuật ASCII đếm cừu để ngủ.

Bây giờ cho các twist:

  • Do kích thước của những chiếc bút mà cừu đang ở, hàng trên cùng chỉ có thể chứa tối đa 10cừu, không kể cừu đang nhảy mà cũng phải luôn ở hàng trên cùng.
  • Các hàng tiếp theo không thể có cừu bên ngoài bút tương ứng của chúng (bạn không thể có nhiều cừu ở bên trái ở hàng thứ hai so với bạn làm ở hàng đầu tiên và tương tự cho bên phải).
  • Nếu có 11hoặc nhiều tổng số cừu, hàng trên cùng phải có 10cộng với cừu nhảy trong đó.
  • Khoảng trắng hàng đầu / dấu và khoảng trắng giữa cừu không thành vấn đề, miễn là:
    1. Có tối thiểu một ký tự khoảng trắng giữa cừu
    2. Tất cả các nhân vật xếp hàng một cách thích hợp.

Miễn là các quy tắc này được đáp ứng, sự sắp xếp thực tế của con cừu là tùy thuộc vào việc bạn thực hiện.

Ví dụ

Ví dụ, đây là n=3m=1trường hợp đơn giản nhất.

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

Đây là n=11m=6, hầu hết các con cừu có thể nằm trên một đường ngang.

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

Đây là một ví dụ khác về điều đó, với n=11m=1

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

Một ví dụ lớn hơn với 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'
                                                        ||    || 

Đây là một ví dụ với n=17m=2

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

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

Đây là một ví dụ với n=19m=3

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

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

'00^>
 ||  

Lưu ý rằng tất cả những điều này là ví dụ . Đối với cái cuối cùng, bạn có thể cuộn lên tạo ra một mảng cừu thẳng đứng ở phía bên tay phải, điều này sẽ cho phép phía bên trái khớp với hai hàng thay thế. Hoặc có thể là một hình vuông cừu 2x2 ở phía bên tay phải, cũng sẽ phù hợp với cừu bên tay trái lên hai hàng. Vân vân.

I / O và Nội quy

  • Đầu vào có thể được thực hiện trong bất kỳ định dạng hợp lý và bằng bất kỳ phương pháp thuận tiện .
  • Các dòng mới hàng đầu / dấu hoặc khoảng trắng khác là tùy chọn, miễn là các ký tự xếp hàng một cách thích hợp.
  • Hoặc là một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Đầu ra có thể là bàn điều khiển, được trả về dưới dạng danh sách các chuỗi, được trả về dưới dạng một chuỗi, v.v.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

2
@Rod Tôi đã thêm một ví dụ lớn hơn, nhưng lưu ý rằng đó chỉ là một ví dụ và đầu ra của bạn có thể khác.
admBorkBork


Trường hợp thử nghiệm được đề xuất: n=11m=9
Adám

@ Adám Có thể có 10 trường hợp thử nghiệm n=11như vậy 0<m<=10. Điều này buộc bạn phải có tất cả cừu ở hàng trên cùng và một số cừu động ở bên trái ( n-1-m) và phải ( m) của hàng rào và không thể sử dụng các cỡ bút cố định.
MT0

@ MT0 Đúng, nhưng một hoặc hai trường hợp thử nghiệm là đủ để cho thấy rằng một giải pháp hoạt động.
Adám

Câu trả lời:


9

APL (Dyalog Unicode) , 118 byte SBCS

Vô danh lambda. Đưa ra nnhư đối số trái và mnhư đối số phải. Trả về kết quả mảng lồng nhau, nhưng màn hình mặc định của mảng lồng nhau này tuân theo thông số kỹ thuật. Sử dụng tối đa chín cột cho cừu đếm và các cột còn lại để chờ cừu.

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

Hãy thử trực tuyến!

{... } lambda vô danh; là đối số trái, là đối số phải

Hàm này có ba phần riêng biệt: Chờ đợi , NhảyĐếm . Mỗi cái được ngoặc đơn, làm cho kết quả là một danh sách ba yếu tố.

Đã đếm (r⍴(×/r←9,⍨∘⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')

''(... )' ||' ba dòng của một con cừu tính nhân đôi, một trong những trung là:

b←'''00^<' cơ thể và được giao cho b

 trộn danh sách các chuỗi thành một ma trận ký tự (đệm với khoảng trắng)

 gương rằng

S← gán cho S(big S heep)

 kèm theo nó để chúng ta có thể đối phó với nó như một đơn vị

⍵⍴ sử dụng số lượng cừu đếm để định hình lại theo chu kỳ

(Từ đó )↑ lấy số phần tử sau đây (đệm với các mục nguyên mẫu, tức là cùng một mảng nhưng với tất cả các ký tự được thay thế bằng khoảng trắng)

⍵÷9 một phần chín số cừu được đếm

 làm tròn lên

9,⍨ nối 9 vào đó

r← gán cho r(những gì chúng tôi sẽ r eshape với; hàng và cột)

×/ sản phẩm của danh sách đó (đây là số lượng yếu tố chúng tôi cần, bao gồm cả điền)

r⍴ định hình lại một mảng có độ dài kích thước r

Nhảy (↑(s←'>',⍨¯1↓b)' /\' ' ++')

(... )' /\' ' ++' ba dòng của một con cừu nhảy, một trong những đầu tiên là:

¯1↓b thả nhân vật cuối cùng từ b

'>',⍨ nối đầu phải

s← cửa hàng ở s(nhỏ s Heep)

 trộn danh sách các chuỗi thành một ma trận ký tự (đệm với khoảng trắng)

Đang chờ đợi (r⍴(×/r←d,⍨⌈w÷d←10-⍵⌊⊢/r)↑w⍴(w←⍺-⍵+1)⍴⊂s@2⌽S)

⌽S gương S

s@2 đặt s dòng 2 của nó (thay thế dữ liệu hiện tại ở đó)

 kèm theo nó để chúng ta có thể đối phó với nó như một đơn vị

(Sự )⍴ định hình lại theo chu kỳ mà đến kích thước sau:

⍵+1 số cừu đếm được cộng với một

⍺- trừ đi từ tổng số

w← gán cho w( w aites)

(Sai )↑ lấy số lượng các yếu tố sau từ đó (đệm với các vật phẩm nguyên mẫu)

⊢/r phần tử ngoài cùng bên phải của r(tức là số cột được sử dụng cho cừu đếm)

⍵⌊ tối thiểu của tổng số và đó

10- trừ đi từ mười

d← gán cho d( d ifference; thiếu cột)

 chia wcho nó

 làm tròn lên (đưa ra số lượng hàng cần thiết)

d,⍨ chắp thêm d

r← gán cho r(những gì chúng tôi sẽ r eshape với; hàng và cột)

×/ sản phẩm của danh sách đó (đây là số lượng yếu tố chúng tôi cần, bao gồm cả điền)

r⍴ định hình lại một mảng có độ dài kích thước r


1
@ WeijunZhou Bạn nói đúng, sẽ sửa.
Adám

1
Tôi đã tự hỏi làm thế quái nào tôi sẽ trả lời thử thách này. Tôi đoán đó là như thế nào: p
J. Sallé

1
@WeijunZhou Đã sửa.
Adám

"Luôn dự trữ chín cột cho cừu chờ và một cột cho cừu đếm." Điều này có hiệu quả không n=11,m=9và quy tắc "hàng trên cùng phải có 10 con cừu nhảy trong đó."?
MT0

3

Javascript, 281 , 293 , 288 byte

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

Hãy cẩn thận khi sử dụng đoạn mã dưới đây, có nguy cơ cao gây ra chứng ngủ rũ đột ngột.

  <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
Điều này cho thấy 4 con cừu được tính cho n = 50, m = 3 và cũng có con cừu bị xếp sai cho n = 20, m = 3. Ngoài ra n = 20, m = 1 cho thấy 2 con cừu được tính.
ale10ander

2
Đã sửa những lỗi đó. Cũng tìm thấy một số cừu đã trốn thoát do lỗi làm tròn.
Jhal

Nếu m = nbạn gặp lỗi.
aimorris

Đây là một kịch bản mà tôi giả định có thể bị bỏ qua. Cách mà câu hỏi được viết đã nói rằng: m = Số lượng cừu ở phía bên tay phải n = Tổng số cừu Và có một con cừu cũng nhảy hàng rào. Do đó n không thể bằng m, do đó tôi không tính đến nó.
Jhal

2

C, 392 byte

Cảm ơn @Jonathan Frech vì đã tiết kiệm một byte!

#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++);}

Hãy thử trực tuyến!

Chưa được kiểm soát:

#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+!tcó thể y-=~!t.
Jonathan Frech

@JonathanFrech Yep, cảm ơn!
Steadybox

1

Python 2 , 222 277 byte

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

Hãy thử trực tuyến!


Thất bại trên n=11m=2 .
Adám

Tôi không nhận được 11 con cừu ở hàng đầu tiên khi tôi chạy nó.
Robert Benson

1
@RobertBenson Cảm ơn, đã sửa
TFeld

0

AWK , 293 byte

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

Hãy thử trực tuyến!

Tôi đã thử sử dụng thay thế chuỗi để tránh một số vòng lặp, nhưng phải mất nhiều mã hơn.

Giải trình

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

Tôi phải nói rằng nghệ thuật cừu khá dễ thương. :)


0

Than , 98 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Nθ

Nhập số lượng cừu đã được tính.

≔⁻⊖Nθη

Nhập tổng số cừu và tính toán số lượng vẫn cần tính.

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

Tạo một mảng gồm hai mảng. Mỗi mảng có các yếu tố sau:

  • Một chuỗi chứa một nửa số cừu nhảy
  • Số lượng cừu ở phía bên kia của hàng rào
  • Số lượng cừu trong một hàng ở phía bên kia của hàng rào, một trong hai
    • số lượng cừu ở phía bên kia của hàng rào, nếu ít hơn 5, hoặc
    • 10 - số lượng cừu ở phía bên kia của hàng rào, nếu ít hơn 5, hoặc
    • 5, nếu cả hai bên có ít nhất 5 con cừu
J⁰¦⁰‖T§ι⁰↗

Phản chiếu vải và in một nửa cừu nhảy.

F§ι¹«

Vòng qua con cừu ở phía đó.

<^00'¶  || ↗

In một con cừu.

¿¬﹪⊕κ§ι²”|I4O

Nếu đây là phần cuối của hàng thì hãy in một số dòng mới và khoảng trắng để bắt đầu con cừu tiếp theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.