眠りに落ちる羊を数える


11

ほとんどの人は、羊が眠りにつくのを数えようとすることを知っています。羊の群れがいて、そのうちのいくつかはフェンスを飛び越えており、あなたは彼らがジャンプするときに羊を数えます。おそらく、これはあなたの心を静め、眠りに落ちるようにあなたを睡眠のような状態にするのに役立ちます。

カウントされるのを待っている、右向きのASCII羊です。

'00^>
 ||

ASCII羊がフェンスを飛び越えています:

'00^>
 /\
 ++

すでに数えられている、左向きの1つを次に示します。

<^00'
  ||

チャレンジ

2つの入力整数、nおよびが与えられ、合計の羊の数mn > 2記述し、m > 0すでに数えられた羊の数を言って、眠りに落ちる羊を数えるASCIIアート表現を出力します。

ツイストのために:

  • 羊がいるペンの大きさにより、一番上の列には最大数の10羊しか収容できず、常に一番上の列にいる必要がある現在ジャンプしている羊は数えられません。
  • 後続の行では、それぞれのペンの外側に羊を置くことはできません(2番目の行の左側に1番目の行よりも多くの羊を置くことはできません。右側にも同じ羊を置くことはできません)。
  • 11羊の総数が1匹以上ある場合は、一番上の行に10プラスのジャンプ羊が必要です。
  • 前後の空白、および羊の間の空白は問題ではありません。
    1. 羊の間には少なくとも1つの空白文字があります
    2. すべてのキャラクターが適切に並んでいます。

これらのルールが満たされている限り、羊の実際の配置は実装次第です。

たとえば、ここにとがn=3ありm=1、これが最も単純なケースです。

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

これはとでn=11m=61本の水平線に収まる最も羊です。

                        '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=30andのより大きな例m=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^>
 ||  

これらはすべてであることに注意してください。最後の1つについては、右側に羊の垂直配列を作成して、左側を2列に収めることができます。または、右側にある2x2の羊の場合、左側の羊も2列に収まります。等。

I / Oとルール

  • 入力は、合理的な形式で、便利な方法で取得できます。
  • 文字が適切に整列している場合、先頭または末尾の改行またはその他の空白はオプションです。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • コンソールへの出力、文字列のリストとして返される、単一の文字列として返されるなど。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

2
@Rodより大きな例を追加しましたが、これは単なる例であり、出力が異なる可能性があることに注意してください。
AdmBorkBork


推奨テストケース:n=11およびm=9
アダム

@Adámそのn=11ようなテストケースは10個あります0<m<=10。これにより、すべての羊が一番上の行に配置され、動的な数の羊がフェンスの左側(n-1-m)および右側(m)に配置され、固定ペンサイズを使用できなくなります。
MT0

@ MT0はい。ただし、ソリューションが機能することを示すには、1つまたは2つのテストケースで十分です。
アダム

回答:


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^<')' ||')}

オンラインでお試しください!

{} 匿名ラムダ; 左引数、右引数

この関数には、WaitingJumpingCountedの 3つの異なる部分があります。それぞれが括弧で囲まれているため、結果は3要素のリストになります。

カウントされた (r⍴(×/r←9,⍨∘⌈⍵÷9)↑⍵⍴⊂S←⌽↑''(b←'''00^<')' ||')

''()' ||' ミラーリングされた数えられた羊の3行。

b←'''00^<' ボディとに割り当てられています b

 文字列のリストを文字マトリックスに混在させる(スペースで埋める)

 それを映します

S← 割り当てS(ビッグSヒープ)

 ユニットとして扱うことができるようにそれを囲みます

⍵⍴ カウントされた羊の数を使用して、それを周期的に再形成します

()↑ その中から次の数の要素を取得します(プロトタイプ項目、つまり同じ配列で、すべての文字をスペースに置き換えたパディング)

⍵÷9 羊の数の9分の1

 切り上げする

9,⍨ それに9を追加

r← 割り当てるr(私たち意志のR eshapeと、行と列)

×/ そのリストの積(これは、塗りつぶしを含む必要な要素の数です)

r⍴ 次元の長さを持つ配列にそれを作り直します r

ジャンピング (↑(s←'>',⍨¯1↓b)' /\' ' ++')

()' /\' ' ++' ジャンプする羊の3行。最初の行は次のとおりです。

¯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← 割り当てるwW aiting)

()↑ その中から次の数の要素を取得します(典型的なアイテムのパディング)

⊢/r の右端の要素r(つまり、カウントされた羊の使用列の数)

⍵⌊ 合計とその最小値

10- 10からそれを引きます

d← 割り当てdd ifference; missing columns)

 除算wことによって、

 切り上げ(必要な行数を与える)

d,⍨ 追記 d

r← 割り当てるr(私たち意志のR eshapeと、行と列)

×/ そのリストの積(これは、塗りつぶしを含む必要な要素の数です)

r⍴ 次元の長さを持つ配列にそれを作り直します r


1
@WeijunZhouあなたは正しい、修正します。
アダム

1
私はこの挑戦にどのように答えるのだろうと思っていました。そうだと思います:p
J.サレ

1
@WeijunZhou修正済み。
アダム

「待機中の羊用に常に9列、数えられた羊用に1列を予約しています。」これ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
これらのエラーを修正しました。また、丸め誤差により一部の羊が逃げていることがわかりました。
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
ジョナサンフレッチ

@JonathanFrechうん、ありがとう!
Steadybox

1

パイソン2222の 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^>¶\¶+  η⌊⟦⌈⟦⁵⁻χθ⟧η⟧⟧⟧«

2つの配列の配列を作成します。各配列には次の要素があります。

  • ジャンプする羊の半分を含む文字列
  • フェンスのその側の羊の数
  • フェンスのその側の1列の羊の数。
    • 5未満の場合、フェンスのその側の羊の数、または
    • 10-フェンスの反対側の羊の数(5未満の場合)、または
    • 5、両側に少なくとも5頭の羊がいる場合
J⁰¦⁰‖T§ι⁰↗

キャンバスを反射し、半跳びの羊を印刷します。

F§ι¹«

その側の羊をループします。

<^00'¶  || ↗

羊を印刷します。

¿¬﹪⊕κ§ι²”|I4O

これが行の終わりである場合、いくつかの改行とスペースを印刷して、次の羊の先頭に到達します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.