隣人の合計が最も高い数を見つける


12

チャレンジ

数値のグリッド(10 <= N <= 99)が与えられた場合、それに隣接する4つの数値の合計が最も大きい数値を返します。それは数字の上、下、右、左の数字ですが、それ自体ではありません。

  1. 数自体はカウントされず、その4つの近隣のみがカウントされます。
  2. 端の数字は、欠落している数字が0であるかのように扱われるべきです。
  3. 関係を避けるためにテストを設計します。
  4. 数字は繰り返されません。
  5. これはです。

与えられた

56 98 32 96
12 64 45 31
94 18 83 71

戻る

18

実際のテスト

与えられた

98 95 67 66 57 16 40 94 84 37
87 14 19 34 83 99 97 78 50 36
18 44 29 47 21 86 24 15 91 61
60 41 51 26 10 58 11 62 55 71
42 85 56 12 46 81 93 65 49 77
89 13 74 39 54 76 92 33 82 90
96 88 70 79 80 28 25 20 75 68
38 63 17 72 53 48 73 30 45 69
64 35 32 31 23 43 22 52 27 59

戻る

13

与えられた

82 43 79 81 94 36 17 64 58
24 52 13 87 70 18 28 61 69
16 99 75 21 50 44 89 90 51
49 80 63 31 54 65 41 55 38
67 91 76 78 23 86 83 14 73
46 68 62 77 34 48 20 74 10
33 35 26 97 59 66 25 37 32
12 92 84 27 85 56 22 40 45
96 15 98 53 39 30 88 71 29
60 42 11 57 95 19 93 72 47

戻る

15

1
端の数値は、欠落している数値が0であるかのように扱うことできます。」-これは、グリッドの端で数値を処理する方法について選択があることを意味します。したがって、グリッドの反対側にラップアラウンドすることを選択できますか?
シャギー

@Shaggyいいえ。予想される結果が変わる可能性があります。すべて同じ方法でやってみましょう。テキストがs / can / should /に更新されました
Umbrella

2
避けられないMATLの回答を待っている
致命

ほとんどのソリューションは何らかの方法で入力を変更します。ここで慣習的ですか?私の(まだ投稿予定の)ソリューションには、入力を変更するために必要なバイトが含まれています。

1
@Umbrella通常、入力が変更されてもかまいません。きれいなコードではなく、短いコードに興味があります。出力が正しい限り、かなり寛容になる傾向があります。

回答:


9

MATL20 15 13 12バイト

t1Y6Z+tuX>=)

Emignaのおかげで5バイト、Giuseppeのおかげで2バイト、Luis Mendoのおかげでもう1バイト節約できました。
オンラインでお試しください!

説明

t1Y6Z+tuX>=)
t                  Duplicate the (implicit) input.
 1Y6               Push the array [0 1 0; 1 0 1; 0 1 0].
    Z+             Convolve with the input.
       uX>         Get the maximum unique element...
      t   =        ... and compare elementwise.
           )       Index into the input.

6

APL(Dyalog Unicode)31 27 26 24 23 バイトSBCS

-2 Cows quackに感謝します。-1 ngnに感謝します。

匿名の暗黙の接頭辞関数。引数として行列を取ります。想定している⎕IOI NDEX OであることをRIGIN)0多くのシステムではデフォルトです。

{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,

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

, 入力を解く(平坦化する)

{}⊃ 次の関数の結果に従って要素から要素を選択します。

⊢⍵ 引数を生成します(3 3から分離します

 … ⌺3 3 次の関数を各3行3列の近傍に適用します。

  ⊢∘, エッジ情報を無視して、ほぐれた(平坦化された)近傍を優先します

  () 次の暗黙関数をそれらに適用します

   -/ 交互の合計(lit.右結合マイナスの減少)

   +/- 合計からそれを引きます(これは他のすべての要素の合計を与えます)

, ravel(flatten)that(近所の合計)

 それをソートするインデックスを作成します

 最初の(つまり、合計の最高のインデックス)を選択します


それは速かった。準備はできましたか?;)

3
@Umbrellaいいえ、私はちょうどにプログラムに迅速であるプログラミング言語を使用しています。
アダム

3
これは{⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,どう?編集:または{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805

@Cowsquack私はいつもそのトリックを忘れています。
アダム

2
-1バイト:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn

5

ゼリー、22バイト

;€0ZṙØ+SṖ
,ZÇ€Z+$/ŒMœị

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

MATLやDyalogのような畳み込みビルトインがない 言語を忘れる畳み込みビルトイン(@dylnanに感謝)が痛いですが、ŒMとのおかげで、それらがなくても大丈夫œịです。最初に、一方向だけで隣人を計算するヘルパー関数は、偶発的に入力を転置します:

;€0Z         Append a zero to each row, then transpose.
    ṙØ+S     Rotate by +1 and −1 (Ø+ = [1,-1]) and sum these.
        Ṗ    Pop the last row.

視覚的には、計算は次のとおりです。

1 2 3   ;€0   1 2 3 0   Z   1 4 7   ṙØ+     2 5 8   0 0 0     S   2  5  8   Ṗ   2  5  8
4 5 6  ————→  4 5 6 0  ——→  2 5 8  ————→  [ 3 6 9 , 1 4 7 ]  ——→  4 10 16  ——→  4 10 16
7 8 9         7 8 9 0       3 6 9           0 0 0   2 5 8         2  5  8       2  5  8
                            0 0 0           1 4 7   3 6 9         4 10 16

解釈:この結果のセル(x、y)は、セル(y、x)の水平方向の近傍の合計です。(たとえば、ここではf(A)[2,3] = 16 = 7 + 9 = A [3,1] + A [3,3]であることがわかります。)

次に、主な機能:

,ZÇ€            Pair the input with its transpose and apply helper to both.
    Z+$/        Fold by Z+, i.e., turn [X,Y] into transpose(X)+Y.
                Now we've summed the horizontal and vertical neighbors for each cell.
        ŒM      Find the 2D index of the maximal value.
          œị    2D-index (into the original input).

1
どうæc
ディルナン

ああ、私はそれについて知りませんでした:)私はもっとゴルフに忙しすぎているので、それを使って答えを書いてください。
リン

5

ゼリー、18バイト

5BæcµḊṖ)
ZÇZ+ÇŒMœị

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

ヘルパー関数は、各行の各要素の近傍を見つけます。メイン関数は行と列に対してこれを行い、最大近傍合計を持つ要素を見つけます。

5BæcµḊṖ)
5B           bin(5): 1,0,1
  æc         Convolve with [[1,2,9],[other rows]] (for example): [[1,2,10,2,9],...]
    µ        New chain.
       )     Apply this to each element:
     Ḋ       Remove the first element.
      Ṗ      Remove the last element.
             Gives [[2,10,2],...]

ZÇZ+ÇŒMœị   
Z            Zip the matrix
 Ç           Apply helper function
  Z          Zip again. Yields the sum of the vertical neighbors of each element.
   +         Add:
    Ç        The sum of each element's horizontal neighbors.
     ŒM      Find the multidimensional index of the maximal element.
       œị    Index back into the original matrix.



2

ステンシル、1 + 10 = 11バイト(非競合)

コマンドラインオプション:  1 計算1世代

y⊃⍨⊃⍒,
+/N

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

y 平坦元の入力から
⊃⍨ 選ぶ
 最初の
 降順に
, 平坦化のを

+/
N 自己のないフォン・ノイマンN近傍の 合計


もちろん、隣人のために1文字が組み込まれた言語があります。

1
公平を期すために、その唯一の目的はこれらの種類の問題を解決することです。
アダム

なぜ競合しないのですか?
ケビンクルーッセン

1
@KevinCruijssen 元の入力に簡単にアクセスする必要があることがわかったときに言語に追加 yしました。その前に、の(,⍎'input')代わりに書く必要がありましたy
アダム

1
@AdámAh ok、ええ、それは確かに非競合です。チャレンジが昨日投稿されたことに気づかなかった。それが古い挑戦だった場合、言語(または言語バージョン)が新しいため競合しないことは、現在のmetaでそれを競合しないようにしません
ケビンクルイッセン

2

JavaScript(ES6)、94バイト

a=>a.map(p=m=(r,y)=>p=r.map((v,x)=>(s=~r[x-1]+~p[x]+~(a[y+1]||0)[x]+~r[x+1])>m?v:(m=s,o=v)))|o

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

どうやって?

4つの近傍の合計の最大値を探す代わりに、1の補数の合計sの最小mを探します。これにより、ゼロのように未定義の値を処理できます。

~undefined === -1
~0 === -1

内側のmap()は、行rの内容を変更しないように書かれています。したがって、結果をpに保存できます次の反復で上位近傍をテストするためににます。

を使用しております:

  • ~r[x-1] 左のセル用
  • ~r[x+1] 正しい細胞のために
  • ~p[x] トップセル用
  • ~(a[y+1]||0)[x] ボトムセル用


1

Java 8、187バイト

m->{int r=0,l=m.length,i=l,L,j,S=0,s;for(;i-->0;)for(L=j=m[i].length;j-->0;)if((s=(i<1?0:m[i-1][j])+(i<l-1?m[i+1][j]:0)+(j<1?0:m[i][j-1])+(j<L-1?m[i][j+1]:0))>S){S=s;r=m[i][j];}return r;}

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

説明:

m->{                           // Method with integer-matrix parameter and integer return
  int r=0,                     //  Result-integer, starting at 0
      l=m.length,              //  Amount of rows
      i=l,                     //  Rows index integer
      L,                       //  Amount of columns
      j,                       //  Column index integer
      S=0,                     //  Largest sum of four cells
      s;                       //  Current sum of four cells
  for(;i-->0;)                 //  Loop over the rows
    for(L=j=m[i].length;j-->0;)//   Inner loop over the columns
      if((s=                   //    Set the current sum to: the sum of:
           (i<1?0:m[i-1][j])   //     Value of the cell to the left, or 0 if out of bounds
          +(i<l-1?m[i+1][j]:0) //     Value of the cell to the right, or 0 if out of bounds
          +(j<1?0:m[i][j-1])   //     Value of the cell down, or 0 if out of bounds
          +(j<L-1?m[i][j+1]:0))//     Value of the cell up, or 0 if out of bounds
         >S){                  //    If this current sum is larger than the largest sum:
        S=s;                   //     Replace the largest sum with this current sum
        r=m[i][j];}            //     And set the result to the current cell
  return r;}                   //  Return the result

1

Javascript ES6、170バイト

c=g=>{s=0;n=0;f=m=>m||[];for(i=0;i<g.length;i++)for(j=0;j<g[i].length;j++){s=~~f(g[i-1])[j]+~~f(g[i+1])[j]+~~f(g[i])[j-1]+~~f(g[i])[j+1];b=s>n?g[i][j]+!(n=s):b;}return b}

1
PPCGへようこそ!あなたのコードは、入力がgという名前の変数に格納されていると想定しているようですが、これは許可されていません。入力を読み取る完全なプログラムまたは関数(JSでは通常、はるかに好ましい方法)を作成する必要があります。
アーナウルド

1
@Arnauldありがとう!コードを修正しました
ジャン=フィリップルクレール

テストしやすくするために、TIOリンクを追加することを検討してください。(リンクをコメントに収めるために、2番目のテストケースを削除しました。)
Arnauld
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.