空腹のマウス


85

16個のチーズの山を4x4の正方形に置きます。からまでのラベルが付いています。最小のパイルはで、最大のパイルはです。116116

空腹のマウスはとても空腹なので、常に最大の山(つまり)に直行し、すぐに食べます。16

その後、最大の隣接する山に行き、その山もすぐに食べます。(うん...それは本当におなかがすいています。)隣の山がなくなるまで続きます。

パイルには最大8つの隣人(水平、垂直、斜め)があります。ラップアラウンドはありません。

以下のチーズの山から始めます。

37105681213159114141162

ハングリーマウスは最初に食べ、次に最大の隣の山、つまり食べます。1611

37105681213159🐭41412

その次の移動は、、、、、、、、、及びこの正確な順序で。131210815149673

🐭5412

Hungry Mouseの周りにはチーズはもうないので、そこで止まります。

挑戦

チーズの初期構成を考えると、ハングリーマウスがそれらを食べるのをやめたら、コードは残りのパイルの合計を印刷または返す必要があります。

上記の例では、予想される回答はです。12

ルール

  • 入力行列のサイズは固定されているため、2D配列または1次元配列のいずれかとして受け取ることができます。
  • からまでの各値は、度だけ表示されることが保証されています。116
  • これはです。

テストケース

[ [ 4,  3,  2,  1], [ 5,  6,  7,  8], [12, 11, 10,  9], [13, 14, 15, 16] ] --> 0
[ [ 8,  1,  9, 14], [11,  6,  5, 16], [13, 15,  2,  7], [10,  3, 12,  4] ] --> 0
[ [ 1,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9,  3,  1,  7], [13,  5, 12,  6], [ 2,  8,  4, 16] ] --> 3
[ [ 3,  7, 10,  5], [ 6,  8, 12, 13], [15,  9, 11,  4], [14,  1, 16,  2] ] --> 12
[ [ 8,  9,  3,  6], [13, 11,  7, 15], [12, 10, 16,  2], [ 4, 14,  1,  5] ] --> 34
[ [ 8, 11, 12,  9], [14,  5, 10, 16], [ 7,  3,  1,  6], [13,  4,  2, 15] ] --> 51
[ [13, 14,  1,  2], [16, 15,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1,  2,  4, 13], [ 7,  8,  5, 14], [ 3, 16,  6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1,  2,  7, 13], [ 6, 16,  4, 14], [ 3,  8,  5, 15] ] --> 103

32
そのマウスキャラクターの+1
ルイスメンドー

2
... 103にする:[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
ジョナサンアラン

9
なんて素敵な挑戦だ!最高のノミネートのために心に留めておきます。
xnor

9
誤解した後、私はこれが空腹のムースではないことを少し悲しんでいました。
アコジ

1
この挑戦は、txoコンピューターの迷路プログラムのマウスを思い出させます。このゲームは1950年代に書かれたもので、伝説によるとtxoは世界で最初のトランジスタ化されたコンピューターでした。はい、信じられないかもしれませんが、誰かがあなたの祖父の日にビデオゲームを書いていました。
ウォルターミッティ

回答:


11

パイソン2133の 130バイト

a=input();m=16
for i in range(m):a[i*5:i*5]=0,
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

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

16要素のフラット化されたリストを取得します。

使い方

a=input();m=16

# Add zero padding on each row, and enough zeroes at the end to avoid index error
for i in range(m):a[i*5:i*5]=0,

# m == maximum element found in last iteration
# i == index of last eaten element
# eaten elements of `a` are reset to 0
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

隣接セル式a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]は短縮できますa[i+j+j/3*2-6]for j in range(9)(ゼロエントリは無害です)。Python 3は、長さ8バイトの文字列をハードコーディングすることで確実に短縮できますが、全体としてはPython 2の方が優れている可能性があります。
xnor

1
ゼロパディングループは賢明ですが、2Dリストを取得する方が短いようですa=[0]*5 for r in input():a=r+[0]+a。おそらく、反復を必要としない、さらに短い文字列スライスソリューションがあります。
xnor

8

Python 2、111バイト

i=x=a=input()
while x:x,i=max((y,j)for j,y in enumerate(a)if i>[]or 2>i/4-j/4>-2<i%4-j%4<2);a[i]=0
print sum(a)

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

バブラーから適合した方法とテストケース。STDINのフラットリストを取得します。

このコードは、行の差と列の差の両方が厳密に-2と2の間であることをチェックすることによりi、2つのフラットインデックスとj接触セルを表すかどうかをチェックします。i/4-j/4i%4-j%4


8

MATL50 49 47バイト

16:HZ^!"2G@m1ZIm~]v16eXK68E16b"Ky0)Y)fyX-X>h]s-

入力;は行の区切りとして使用する行列です。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

16:HZ^!  % Cartesian power of [1 2 ... 16] with exponent 2, transpose. Gives a 
         % 2-row matrix with 1st column [1; 1], 2nd [1; 2], ..., last [16; 16] 
"        % For each column, say [k; j]
  2      %   Push 2
  G@m    %   Push input matrix, then current column [k; j], then check membership.
         %   This gives a 4×4 matrix that contains 1 for entries of the input that
         %   contain k or j 
  1ZI    %   Connected components (based on 8-neighbourhood) of nonzero entries.
         %   This gives a 4×4 matrix with each connected component labeled with
         %   values 1, 2, ... respectively
  m~     %   True if 2 is not present in this matrix. That means there is only
         %   one connected component; that is, k and j are neighbours in the
         %   input matrix, or k=j
]        % End
v16e     % The stack now has 256 values. Concatenate them into a vector and
         % reshape as a 16×16 matrix. This matrix describes neighbourhood: entry 
         % (k,j) is 1 if values k and j are neighbours in the input or if k=j
XK       % Copy into clipboard K
68E      % Push 68 times 2, that is, 136, which is 1+2+...+16
16       % Push 16. This is the initial value eaten by the mouse. New values will
         % be appended to create a vector of eaten values
b        % Bubble up the 16×16 matrix to the top of the stack
"        % For each column. This just executes the loop 16 times
  K      %   Push neighbourhood matrix from clipboard K
  y      %   Copy from below: pushes a copy of the vector of eaten values
  0)     %   Get last value. This is the most recent eaten value
  Y)     %   Get that row of the neighbourhood matrix
  f      %   Indices of nonzeros. This gives a vector of neighbours of the last
         %   eaten value
  y      %   Copy from below: pushes a copy of the vector of eaten values
  X-     %   Set difference (may give an empty result)
  X>     %   Maximum value. This is the new eaten value (maximum neighbour not
         %   already eaten). May be empty, if all neighbours are already eaten
  h      %   Concatenate to vector of eaten values
]        % End
s        % Sum of vector of all eaten values
-        % Subtract from 136. Implicitly display

Idk MatLabですが、+ 136ではなく-136を押すと、少し節約できますか?
タイタス

@タイタスHm私はどのように表示されません
ルイスメンドー

またはその逆:1)136をプッシュする2)各消費値をプッシュする3)消費値を合計する4)136から減算する-> 1)136をプッシュする2)消費値を負にする3)スタックを合計する しかし、明らかに1バイトのみです。おそらくゲインはありません。
タイタス

@Titusああ、そうです、同じバイト数を使用していると思います。また、設定された差に対して、それぞれの食べられた値(その負ではない)が必要です。否定は最後に行う必要があります
ルイスメンドー

6

PHP、177174171バイト

for($v=16;$v;$u+=$v=max($p%4-1?max($a[$p-5],$a[$p-1],$a[$p+3]):0,$a[$p-4],$a[$p+4],$p%4?max($a[$p-3],$a[$p+1],$a[$p+5]):0))$a[$p=array_search($v,$a=&$argv)]=0;echo 120-$u;

で実行し-nr、引数として行列要素を指定するか、オンラインで試してください


5

JavaScript、122バイト

私はこのターンで2回以上間違ったターンをし、さらにゴルフをする時間を使い果たしましたが、少なくともうまくいっています。明日(または、私を知って、今晩電車に乗って!)

a=>(g=n=>n?g([-6,-5,-4,-1,1,4,5,6].map(x=>n=a[x+=i]>n?a[x]:n,a[i=a.indexOf(n)]=n=0)|n)-n:120)(16,a=a.flatMap(x=>[...x,0]))

オンラインで試す


3
+1 flatMap():p
アーナウド

:DIは、ゴルフにこれを使用したのは初めてだと思います!興味のないこと(そして、私がこれに戻ったときに目標を与えるために)、あなたがそれを試みたとき、あなたのスコアは何でしたか?
シャギー

今日はこれに戻るための時間がありませんでした。明日は完全に新鮮な目でやり直せることを意味します。
シャギー

ソリューションを投稿しました。
アーナルド

5

R128の 124 123 112 110バイト

function(r){r=rbind(0,cbind(0,r,0),0)
m=r>15
while(r[m]){r[m]=0
m=r==max(r[which(m)+c(7:5,1)%o%-1:1])}
sum(r)}

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

4x4マトリックスを作成し(視覚化するのに役立ちました)、0でパディングし、16から始まり、周囲の「パイル」から次に大きいものを検索します。

結論として、警告を出力しますが、結果はなく、結果は変更されません。

編集:マトリックスの初期化を1行に圧縮して-4バイト。

編集:ロバート・ハッケンのおかげで-1

編集:ジュゼッペとロビン・ライダーの提案を組み合わせた-13バイト。


の1バイトの変更r==16を保存できますr>15
ロバートハッケン

1
117バイト -行列を取る関数に変更し、which
ジュゼッペ

2
@Giuseppeの提案を改良した112バイトm整数の代わりに論理として保存できるためwhich、2回ではなく1回呼び出すだけで済みます。
ロビンライダー

@RobinRyderのゴルフを使用し、近傍隣接行列の圧縮をいじって110バイト
ジュゼッペ

1
@ Sumner18はのX%o%Yエイリアスですouter(X,Y,'*')outerは、abribtrary(ベクトル化)演算子を使用したOctave / MATLAB / MATLの「ブロードキャスト」機能として機能できるため、最も便利な機能の1つです。こちらをご覧ください。また、まれに便利なのkroneckerは、そのページにリンクされていることです。
ジュゼッペ

4

、47バイト

EA⭆ι§αλ≔QθW›θA«≔⌕KAθθJ﹪θ⁴÷θ⁴≔⌈KMθA»≔ΣEKA⌕αιθ⎚Iθ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

EA⭆ι§αλ

入力番号をアルファベット文字(A = 0 .. Q = 16)に変換し、4x4グリッドとして印刷します。

≔Qθ

Q、すなわち16を食べることから始めます。

W›θA«

食べるものがある間繰り返します。

≔⌕KAθθ

パイルの場所を見つけます。これは、行優先の線形ビューです。

J﹪θ⁴÷θ⁴

座標に変換し、その場所にジャンプします。

≔⌈KMθ

最大の隣接杭を見つけます。

現在の山を食べます。

≔ΣEKA⌕αιθ

パイルを整数に戻し、合計を取ります。

⎚Iθ

キャンバスをクリアして、結果を出力します。


3

PowerShellの、143の 141 136 130 122 121バイト

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){$a[$i]=0
$n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]}$a|%{$s+=$_}
$s

ゴルフの少ないテストスクリプト:

$f = {

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}
$a|%{$s+=$_}
$s

}

@(
    ,( 0  , ( 4,  3,  2,  1), ( 5,  6,  7,  8), (12, 11, 10,  9), (13, 14, 15, 16) )
    ,( 0  , ( 8,  1,  9, 14), (11,  6,  5, 16), (13, 15,  2,  7), (10,  3, 12,  4) )
    ,( 1  , ( 1,  2,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12), (13, 14, 15, 16) )
    ,( 3  , (10, 15, 14, 11), ( 9,  3,  1,  7), (13,  5, 12,  6), ( 2,  8,  4, 16) )
    ,( 12 , ( 3,  7, 10,  5), ( 6,  8, 12, 13), (15,  9, 11,  4), (14,  1, 16,  2) )
    ,( 34 , ( 8,  9,  3,  6), (13, 11,  7, 15), (12, 10, 16,  2), ( 4, 14,  1,  5) )
    ,( 51 , ( 8, 11, 12,  9), (14,  5, 10, 16), ( 7,  3,  1,  6), (13,  4,  2, 15) )
    ,( 78 , (13, 14,  1,  2), (16, 15,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12) )
    ,( 102, ( 9, 10, 11, 12), ( 1,  2,  4, 13), ( 7,  8,  5, 14), ( 3, 16,  6, 15) )
    ,( 103, ( 9, 10, 11, 12), ( 1,  2,  7, 13), ( 6, 16,  4, 14), ( 3,  8,  5, 15) )
) | % {
    $expected, $a = $_
    $result = &$f @a
    "$($result-eq$expected): $result"
}

出力:

True: 0
True: 0
True: 1
True: 3
True: 12
True: 34
True: 51
True: 78
True: 102
True: 103

説明:

最初に、0の上境界線と下境界線を追加して、1次元配列を作成します。

0 0 0 0 0
# # # # 0
# # # # 0
# # # # 0
# # # # 0

     ↓

0 0 0 0 0 # # # # 0 # # # # 0 # # # # 0 # # # # 0

$null配列の末尾で値を取得しようとすると、Powershellが戻ります。

2番目に、ループbiggest neighbor pileは16からゼロ以外の最大値まで開始しました。そしてそれを無効にします(ハングリーマウスはそれを食べます)。

for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}

第三に、残りの山の合計。


3

SAS、236219バイト

パンチカードへの入力、グリッドごとに1行(スペース区切り)、出力はログに出力されます。

この課題は、SASのアレイの制限により若干複雑です。

  • 多次元データステップ配列から一致する要素の行と列のインデックスを返す方法はありません。配列を1-dとして扱い、自分で解決する必要があります。
  • 範囲外になると、SASはnull / zeroを返すのではなく、エラーをスローして処理を停止します。

更新:

  • 削除されたinfile cards;ステートメント(-13)
  • a:配列定義にa1-a16(-4)ではなくワイルドカードを使用しました

ゴルフ:

data;input a1-a16;array a[4,4]a:;p=16;t=136;do while(p);m=whichn(p,of a:);t=t-p;j=mod(m-1,4)+1;i=ceil(m/4);a[i,j]=0;p=0;do k=max(1,i-1)to min(i+1,4);do l=max(1,j-1)to min(j+1,4);p=max(p,a[k,l]);end;end;end;put t;cards;
    <insert punch cards here>
    ; 

ゴルフをしていない:

data;                /*Produce a dataset using automatic naming*/
input a1-a16;        /*Read 16 variables*/
array a[4,4] a:;     /*Assign to a 4x4 array*/
p=16;                /*Initial pile to look for*/
t=136;               /*Total cheese to decrement*/
do while(p);         /*Stop if there are no piles available with size > 0*/
  m=whichn(p,of a:); /*Find array element containing current pile size*/
  t=t-p;             /*Decrement total cheese*/
  j=mod(m-1,4)+1;    /*Get column number*/
  i=ceil(m/4);       /*Get row number*/
  a[i,j]=0;          /*Eat the current pile*/
                     /*Find the size of the largest adjacent pile*/
  p=0;
  do k=max(1,i-1)to min(i+1,4);
    do l=max(1,j-1)to min(j+1,4);
      p=max(p,a[k,l]);
    end;
  end;
end;
put t;              /*Print total remaining cheese to log*/
                    /*Start of punch card input*/
cards; 
  4  3  2  1  5  6  7  8 12 11 10  9 13 14 15 16 
  8  1  9 14 11  6  5 16 13 15  2  7 10  3 12  4 
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
 10 15 14 11  9  3  1  7 13  5 12  6  2  8  4 16 
  3  7 10  5  6  8 12 13 15  9 11  4 14  1 16  2 
  8  9  3  6 13 11  7 15 12 10 16  2  4 14  1  5 
  8 11 12  9 14  5 10 16  7  3  1  6 13  4  2 15 
 13 14  1  2 16 15  3  4  5  6  7  8  9 10 11 12 
  9 10 11 12  1  2  4 13  7  8  5 14  3 16  6 15 
  9 10 11 12  1  2  7 13  6 16  4 14  3  8  5 15 
;                    /*End of punch card input*/
                     /*Implicit run;*/

1
PPCGでパンチカードを使用する場合の+1 :)
GNiklasch

3

Haskell、163バイト

o f=foldl1 f.concat
r=[0..3]
q n=take(min(n+2)3).drop(n-1)
0#m=m
v#m=[o max$q y$q x<$>n|y<-r,x<-r,m!!y!!x==v]!!0#n where n=map(z<$>)m;z w|w==v=0|0<1=w
f=o(+).(16#)

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

このf関数は、4つの整数の4つのリストのリストとして入力を受け取ります。

わずかに食べられない

-- helper to fold over the matrix
o f = foldl1 f . concat

-- range of indices
r = [0 .. 3]

-- slice a list (take the neighborhood of a given coordinate)
-- first we drop everything before the neighborhood and then take the neighborhood itself
q n = take (min (n + 2) 3) . drop (n - 1)

-- a step function
0 # m = m -- if the max value of the previous step is zero, return the map
v # m = 
    -- abuse list comprehension to find the current value in the map
    -- convert the found value to its neighborhood,
    -- then calculate the max cell value in it
    -- and finally take the head of the resulting list
    [ o max (q y (q x<$>n)) | y <- r, x <- r, m!!y!!x == v] !! 0 
       # n -- recurse with our new current value and new map
    where 
        -- a new map with the zero put in place of the value the mouse currently sits on 
        n = map (zero <$>) m
        -- this function returns zero if its argument is equal to v
        -- and original argument value otherwise
        zero w 
            | w == v = 0
            | otherwise = w

-- THE function. first apply the step function to incoming map,
-- then compute sum of its cells
f = o (+) . (16 #)

3

JavaScript(ES7)、97バイト

入力を平坦化された配列として受け取ります。

f=(a,s=p=136,m,d)=>a.map((v,n)=>v<m|(n%4-p%4)**2+(n-p)**2/9>d||(q=n,m=v))|m?f(a,s-m,a[p=q]=0,4):s

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

コメント済み

f = (                    // f= recursive function taking:
  a,                     // - a[] = flattened input array
  s =                    // - s = sum of cheese piles, initialized to 1 + 2 + .. + 16 = 136
      p = 136,           // - p = position of the mouse, initially outside the board
  m,                     // - m = maximum pile, initially undefined
  d                      // - d = distance threshold, initially undefined
) =>                     // 
  a.map((v, n) =>        // for each pile v at position n in a[]:
    v < m |              //   unless this pile is not better than the current maximum
    (n % 4 - p % 4) ** 2 //   or (n % 4 - p % 4)²
    + (n - p) ** 2 / 9   //      + (n - p)² / 9
    > d ||               //   is greater than the distance threshold:
    (q = n, m = v)       //     update m to v and q to n
  )                      // end of map()
  | m ?                  // if we've found a new pile to eat:
    f(                   //   do a recursive call:
      a,                 //     pass a[] unchanged
      s - m,             //     update s by subtracting the pile we've just eaten
      a[p = q] = 0,      //     clear a[q], update p to q and set m = 0
      4                  //     use d = 4 for all next iterations
    )                    //   end of recursive call
  :                      // else:
    s                    //   stop recursion and return s

うん、私はそれの近くにどこも持っていなかっただろう!
シャギー


3

Java 10、272 248バイト

m->{int r=0,c=0,R=4,C,M=1,x,y,X=0,Y=0;for(;R-->0;)for(C=4;C-->0;)if(m[R][C]>15)m[r=R][c=C]=0;for(;M!=0;m[r=X][c=Y]=0)for(M=-1,C=9;C-->0;)try{if((R=m[x=r+C/3-1][y=c+C%3-1])>M){M=R;X=x;Y=y;}}catch(Exception e){}for(var Z:m)for(int z:Z)M+=z;return M;}

すべてのシングル8のチャレンジの答えと同じようにセルがチェックされます。@OlivierGrégoireの
おかげで-24バイト。

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

説明:

m->{                       // Method with integer-matrix parameter and integer return-type
  int r=0,                 //  Row-coordinate for the largest number, starting at 0
      c=0,                 //  Column-coordinate for the largest number, starting at 0
      R=4,C,               //  Row and column indices (later reused as temp integers)
      M=1,                 //  Largest number the mouse just ate, starting at 1
      x,y,X=0,Y=0;         //  Temp integers
  for(;R-->0;)             //  Loop `R` in the range (4, 0]:
    for(C=4;C-->0;)        //   Inner loop `C` in the range (4, 0]:
      if(m[R][C]>15)       //    If the current cell is 16:
        m[r=R][c=C]        //     Set `r,c` to this coordinate
          =0;              //     And empty this cell
  for(;M!=0;               //  Loop as long as the largest number isn't 0:
      ;                    //    After every iteration:
       m[r=X][c=Y]         //     Change the `r,c` coordinates,
         =0)               //     And empty this cell
    for(M=-1,              //   Reset `M` to -1
        C=9;C-->0;)        //   Inner loop `C` in the range (9, 0]:
          try{if((R=       //    Set `R` to:
            m[x=r+C/3-1]   //     If `C` is 0, 1, or 2: Look at the previous row
                           //     Else-if `C` is 6, 7, or 8: Look at the next row
                           //     Else (`C` is 3, 4, or 5): Look at the current row
             [y=c+C%3-1])  //     If `C` is 0, 3, or 6: Look at the previous column
                           //     Else-if `C` is 2, 5, or 8: Look at the next column
                           //     Else (`C` is 1, 4, or 7): Look at the current column
               >M){        //    And if the number in this cell is larger than `M`
                 M=R;      //     Change `M` to this number
                 X=x;Y=y;} //     And change the `X,Y` coordinate to this cell
          }catch(Exception e){}
                           //    Catch and ignore ArrayIndexOutOfBoundsExceptions
                           //    (try-catch saves bytes in comparison to if-checks)
  for(var Z:m)             //  Then loop over all rows of the matrix:
    for(int z:Z)           //   Inner loop over all columns of the matrix:
      M+=z;                //    And sum them all together in `M` (which was 0)
  return M;}               //  Then return this sum as result

int r = c = X = Y = 0、R = 4、M = 1、x、y;にしないでください。?
Serverfrog

@Serverfrog Javaで変数を宣言するときは不可能だと思います。あなたの提案は、を使用してバイトを節約するアイデアを与えてくれint r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;ました。:)
ケビンクルーイッセン

1

J、82バイト

g=.](]*{:@[~:])]_1}~[:>./]{~((,-)1 5 6 7)+]i.{:
[:+/[:(g^:_)16,~[:,0,~0,0,0,.~0,.]

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

私はこれより明日ゴルフに計画し、おそらくこれに似た複数のJ-っぽいソリューション書くものを、私は私が前にいることを行っていなかったので、私は平らにアプローチを試してみた考え出し。


あなたが本当に一番左が必要ですか]g
ガレンイワノフ

1
ガレン、ありがとうございます。これはこのコードの問題の中で最も少ないです:)時間があれば、私はより良い解決策を実装します。
ジョナ

1

、277バイト

func[a][k: 16 until[t:(index? find load form a k)- 1
p: do rejoin[t / 4 + 1"x"t % 4 + 1]a/(p/1)/(p/2): 0
m: 0 foreach d[-1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1][j: p + d
if all[j/1 > 0 j/1 < 5 j/2 > 0 j/2 < 5 m < t: a/(j/1)/(j/2)][m: t]]0 = k: m]s: 0
foreach n load form a[s: s + n]s]

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

それは本当に長い解決策であり、私はそれに満足していませんが、TIOで動作するように修正するのに多くの時間を費やしました(明らかに、Winの安定版とLinuxの安定版のRedには多くの違いがあります)ので、とにかくそれを投稿します...

より読みやすい:

f: func [ a ] [
    k: 16
    until [
        t: (index? find load form a n) - 1
        p: do rejoin [ t / 4 + 1 "x" t % 4 + 1 ]
        a/(p/1)/(p/2): 0
        m: 0
        foreach d [ -1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1 ] [
            j: p + d
            if all[ j/1 > 0
                    j/1 < 5
                    j/2 > 0
                    j/2 < 5 
                    m < t: a/(j/1)/(j/2)
            ] [ m: t ]
        ]
        0 = k: m
    ]
    s: 0
    foreach n load form a [ s: s + n ]
    s
]

1

ゼリー 31 30  29バイト

³œiⱮZIỊȦ
⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ
FḟÇS

この方法は、マウスを起動した状態で60 秒以内に実行するには非常に遅いため16、彼女を開始9し、9s以下しか食べることができないように能力を制限します。(このように彼女は9, 2, 7, 4, 8, 6, 3去って食べる97)。

どうやって?

³œiⱮZIỊȦ - Link 1, isSatisfactory?: list of integers, possiblePileChoice
³        - (using a left argument of) program's 3rd command line argument (M)
   Ɱ     - map across (possiblePileChoice) with:
 œi      -   first multi-dimensional index of (the item) in (M)
    Z    - transpose the resulting list of [row, column] values
     I   - get the incremental differences
      Ị  - insignificant? (vectorises an abs(v) <= 1 test)
       Ȧ - any and all? (0 if any 0s are present in the flattened result [or if it's empty])

⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ - Link 2, getChosenPileList: list of lists of integers, M
⁴               - literal 16
 Ṗ              - pop -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
  ŒP            - power-set -> [[],[1],[2],...,[1,2],[1,3],...,[2,3,7],...,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]]
      €         - for each:
    Œ!          -   all permutations
       Ẏ        - tighten (to a single list of all these individual permutations)
        ⁴       - (using a left argument of) literal 16
          Ɱ     - map across it with:
         ;      -   concatenate (put a 16 at the beginning of each one)
           Ṣ    - sort the resulting list of lists
             Ƈ  - filter keep those for which this is truthy:
            Ç   -   call last Link as a monad (i.e. isSatisfactory(possiblePileChoice)
              Ṫ - tail (get the right-most, i.e. the maximal satisfactory one)

FḟÇS - Main Link: list of lists of integers, M
F    - flatten M
  Ç  - call last Link (2) as a monad (i.e. get getChosenPileList(M))
 ḟ   - filter discard (the resulting values) from (the flattened M)
   S - sum

ああ、パワーセットでは十分ではありません!
ジョナサンアラン

2
@Arnauld-ついにゴルフに少し時間を取りました:Dこれは動作するはずですが、前に使用したテストケースでTIOで実行するには(方法)遅すぎます。
ジョナサンアラン

ダウン投票者はフィードバックをお願いできますか?これは機能し、完全かつ明確な説明があり、現時点で最も短いエントリです。
ジョナサンアラン

私は賛成しましたが、この答えのO((n ^ 2)!)を与えられたので、このチャレンジには多項式時間が必要でした。
リルトシアスト

1

私の最高の仕事ではありません。いくつかの明確な改善が行われ、使用されるアルゴリズムのおそらく基本的なものがあります-を使用するだけで改善できると確信していますがint[]、そのように近隣を効率的に列挙する方法がわかりませんでした。1次元配列のみを使用するPowerShellソリューションが見たいです!

PowerShellコア、348バイト

Function F($o){$t=120;$a=@{-1=,0*4;4=,0*4};0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};$m=16;while($m-gt0){0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};$m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;$t-=$m;$a[$r][$c]=0}$t}

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


より読みやすいバージョン:

Function F($o){
    $t=120;
    $a=@{-1=,0*4;4=,0*4};
    0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};
    $m=16;
    while($m-gt0){
        0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};
        $m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;
        $t-=$m;
        $a[$r][$c]=0
    }
    $t
}


ああ、私が気づいた奇妙なことは、PSv5 (array|sort)[-1]Measure -max働いていた代わりにやろうとしているが、コアで間違った結果を得ていたことです。理由はわかりません。
ヴェスカー

ええ、それは奇妙です。テストしました(0..10|sort)[-1]が、PSv5では10を返しますが、PS Coreでは9を返します。これは、数値ではなく辞書順で処理するためです。恥、それ。
ジェフフリーマン

重要なものを変える古典的なマイクロソフト。
ヴェスカー

この場合、私は同意します。PS Core Sortがint32の配列を文字列の配列にスローする理由はわかりません。しかし、これは暴言に迷い込んでいるので、私は脱線します。再構築をありがとう!
ジェフフリーマン

1

C(gcc)、250バイト

x;y;i;b;R;C;
g(int a[][4],int X,int Y){b=a[Y][X]=0;for(x=-1;x<2;++x)for(y=-1;y<2;++y)if(!(x+X&~3||y+Y&~3||a[y+Y][x+X]<b))b=a[C=Y+y][R=X+x];for(i=x=0;i<16;++i)x+=a[0][i];return b?g(a,R,C):x;}
s(int*a){for(i=0;i<16;++i)if(a[i]==16)return g(a,i%4,i/4);}

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

注:この送信により、入力配列が変更されます。

s()は、可変の引数で呼び出す関数ですint[16](これは、と同じメモリ内でint[4][4]、それをg()解釈するものです)。

s()は、16配列内のの位置を見つけ、この情報をgに渡します。これは、位置を取得する再帰関数であり、その位置の数値を0に設定してから、次のようになります。

  • 隣接する正の数がある場合、最大の隣接する数の位置で再帰します

  • それ以外の場合は、配列内の数値の合計を返します。


s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
RiaD

gが食べる量の合計を返す場合、その合計を計算する必要はありません。sの終わりに16 * 17 / 2-g()を返すだけです
RiaD

論理ORの場合、ビット単位ORを代わりに使用できますか?
RiaD



1

Add ++、281バイト

D,f,@@,VBFB]G€=dbLRz€¦*bMd1_4/i1+$4%B]4 4b[$z€¦o
D,g,@@,c2112011022200200BD1€Ω_2$TAVb]8*z€kþbNG€lbM
D,k,@~,z€¦+d4€>¦+$d1€<¦+$@+!*
D,l,@@#,bUV1_$:G1_$:
D,h,@@,{l}A$bUV1_$:$VbU","jG$t0€obU0j","$t€iA$bUpVdbLRG€=€!z€¦*$b]4*$z€¦o
y:?
m:16
t:120
Wm,`x,$f>y>m,`m,$g>x>y,`y,$h>x>y,`t,-m
Ot

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

うーん、これは複雑なものです。

すべてのテストケースを検証する

使い方

この説明では、入力を使用します

M=[37105681213159114141162]

バツ1バツ16M4バツ4

  • fバツM4バツ4バツMバツ=16MfバツM=43

  • gMyfバツMgMfバツM=11

    これにより、2つのヘルパー関数が実装されます。

    kバツ

    lMy

  • hyM0

0161201+2++14+15

0

0

  • fym16Mバツ:=43
  • gバツy0
  • hバツy160
  • tm

最後に、出力t、つまり残りの収集されていない値。


1

C#(.NET Core)、258バイト

LINQなし。System.Collections.Genericの使用は、後のフォーマット用です-関数はそれを必要としません。

e=>{int a=0,b=0,x=0,y=0,j=0,k;foreach(int p in e){if(p>15){a=x=j/4;b=y=j%4;}j++;}e[x,y]=0;while(1>0){for(j=-1;j<2;j++)for(k=-1;k<2;k++){try{if(e[a+k,b+j]>e[x,y]){x=a+k;y=b+j;}}catch{}}if(e[x,y]<1)break;e[x,y]=0;a=x;b=y;}a=0;foreach(int p in e)a+=p;return a;}

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


1

Perl 6の151の 136 126 125 119バイト

{my@k=$_;my $a=.grep(16,:k)[0];while @k[$a] {@k[$a]=0;$a=^@k .grep({2>$a+>2-$_+>2&$a%4-$_%4>-2}).max({@k[$_]})};[+] @k}

超みすぼらしいソリューション。入力を平坦化された配列として受け取ります。

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



1

K(ngn / k)、49バイト

{{h[,x]:0;*>(+x+0,'1-!3 3)#h}\*>h::(+!4 4)!x;+/h}

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

入力(x)は1次元配列です

(+!4 4)!x 座標のペアをの値にマッピングする辞書 x

h:: グローバル変数に割り当てます h

*> 最大値に対応するキー

{ }\ 収束するまで繰り返し、リストの中間値を収集します

h[,x]:0 現在位置をゼロにする

+x+0,'1-!3 3 隣人の位置

( )#hhより小さな辞書としてそれらをフィルタリングする

*>どの隣人が最大値を持っていますか?新しい反復の現在位置になります

+/h最後に、hの残りの値の合計を返します


1

Wolfram言語(Mathematica)124 115バイト

(p=#&@@Position[m=Join@@ArrayPad[#,1],16];Do[m[[p]]=0;p=MaximalBy[#&@@p+{0,-1,1,-5,5,-6,6,-7,7},m[[#]]&],16];Tr@m)&

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

これは2D配列を取り、両側にパディングし、すぐにフラット化するため、バイトのインデックス作成に費やす必要がありません。これに対する唯一のコストはJoin@@、フラット化することです。その後、次のように進みます。

2Dアレイの124バイトバージョンオンラインでお試しください!

ほとんどが私自身の作品で、J42161217の149バイトの回答から少し派生しています

ゴルフをしていない:

(p = #& @@ Position[m = #~ArrayPad~1,16];     m = input padded with a layer of 0s
                                              p = location of 16
Do[
    m = MapAt[0&,m,p];                        Put a 0 at location p
    p = #& @@ MaximalBy[                      Set p to the member of
        p+#& /@ Tuples[{0,-1,1},2],             {all possible next locations}
        m~Extract~#&],                        that maximizes that element of m,
                                              ties broken by staying at p+{0,0}=p.
16];                                        Do this 16 times.
Tr[Tr/@m]                                   Finally, output the sum of m.
)&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.