数羊入睡


11

大多数人都熟悉这种数羊入睡的方法。有一群绵羊,其中一些在篱笆上跳跃,而您在绵羊跳跃时数数。据说,这可以使您的思维平静下来,并使您进入类似睡眠的状态,从而使您入睡。

这是一个面向右侧的ASCII绵羊,等待被计数:

'00^>
 ||

这是跳过篱笆的ASCII绵羊:

'00^>
 /\
 ++

这是一个已被数过的朝左的人:

<^00'
  ||

挑战

给定两个输入整数,nmn > 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=17和的例子m=2

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

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

这是一个与n=19和的例子m=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
亚当

@亚当可以有10测试用例n=11这样0<m<=10。这迫使您将所有的绵羊放在最上面一排,并且将动态数目的绵羊放在栅栏的左(n-1-m)和右(m)上,并且不能使用固定的笔大小。
MT0

@ MT0是的,但是一个或两个测试用例应该足以表明解决方案有效。
亚当

Answers:


9

APL(Dyalog Unicode),118 字节SBCS

匿名中缀lambda。注意到n左参数,m作为右边的参数。返回嵌套数组结果,但是此嵌套数组的默认显示符合规范。最多可将九列用于计数的绵羊,其余列用于等待的绵羊。

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

在线尝试!

{} 匿名lambda;是左参数,是右参数

此函数包含三个不同的部分:WaitingJumpingCounted。每一个都用括号括起来,导致结果为三元素列表。

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

''()' ||' 数着一头镜像羊的三行,中间是:

b←'''00^<' 身体并分配给 b

 将字符串列表混合到字符矩阵中(用空格填充)

 反映那个

S← 分配给S(大S堆)

 将其封闭起来,以便我们将其作为一个整体来处理

⍵⍴ 用计数的绵羊数量周期性地重塑

()↑ 从中获取以下数量的元素(使用原型项填充,即填充相同的数组,但所有字符都用空格替换)

⍵÷9 羊数的九分之一

 围捕

9,⍨ 附加9

r← 分配给r(我们将[R ESHAPE用,行和列)

×/ 该列表的乘积(这是我们需要多少个元素,包括填充)

r⍴ 将其重塑为具有尺寸长度的数组 r

跳跃的 (↑(s←'>',⍨¯1↓b)' /\' ' ++')

()' /\' ' ++' 跳羊的三行,第一行是:

¯1↓b 删除最后一个字符 b

'>',⍨ 附加一个朝右的头

s← 存储在s(小小号协)

 将字符串列表混合到字符矩阵中(用空格填充)

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

⌽S 镜子 S

s@2 把s 的该2线(替换当前数据存在)

 将其封闭起来,以便我们将其作为一个整体来处理

()⍴ 周期性地将其重塑为以下大小:

⍵+1 羊数加一

⍺- 从总数中减去

w← 分配给w瓦特爱听)

()↑ 从中获取以下元素(填充典型项目)

⊢/r 最右边的元素r(即,已计数的绵羊使用的列数)

⍵⌊ 总数的最小值

10- 从十减去

d← 分配给dd ifference;缺少列)

 分w

 向上舍入(给出所需的行数)

d,⍨ 附加 d

r← 分配给r(我们将[R ESHAPE用,行和列)

×/ 该列表的乘积(这是我们需要多少个元素,包括填充)

r⍴ 将其重塑为具有尺寸长度的数组 r


1
@WeijunZhou你是对的,会解决。
亚当

1
我想知道我将如何应对这一挑战。我猜就是这样:p
J.Sallé18年

1
@WeijunZhou固定。
亚当

“总是为等待的绵羊保留九列,为被计数的绵羊保留一列。” 这是否起作用,n=11,m=9并且规则“最上面一排必须有10个外加跳羊”。
MT0

3

JAVASCRIPT,281293,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
修复了这些错误。还发现由于舍入错误,一些绵羊逃脱了。
贾尔

如果m = n出现错误。
aimorris '18

我认为这种情况可以忽略。问题的写法是:m =右侧的羊数n =总计的羊数而且还有一只羊也在跳篱笆。因此n不能等于m,因此我没有考虑它。
贾尔

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
乔纳森·弗雷奇

@JonathanFrech是的,谢谢!
Steadybox

1

Python 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=11m=2失败。
亚当

运行此程序时,第一行没有得到11只绵羊。
罗伯特·本森

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

如果这是该行的末尾,则打印一些换行符和空格以到达下一个绵羊的开头。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.