Finden Sie die Zahl mit der höchsten Summe der Nachbarn

12

Die Herausforderung

Wenn ein Zahlenraster gegeben ist (10 <= N <= 99), wird die Zahl mit der höchsten Summe der vier angrenzenden Zahlen zurückgegeben. Das sind die Zahlen über, unter, rechts und links von der Zahl, aber nicht selbst.

  1. Die Zahl selbst zählt nicht, nur die vier Nachbarn.
  2. Eine Zahl am Rand sollte so behandelt werden, als wäre die fehlende Zahl eine 0.
  3. Ich werde den Test so gestalten, dass Krawatten vermieden werden.
  4. Zahlen werden nicht wiederholt.
  5. Das ist .

Beispiel

Gegeben

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

Rückkehr

18

Ein echter Test

Gegeben

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

Rückkehr

13

Gegeben

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

Rückkehr

15
Regenschirm
quelle
1
" Eine Zahl an der Kante kann so behandelt werden, als wäre die fehlende Zahl eine 0. " - Dies impliziert, dass wir die Wahl haben, wie mit Zahlen an einer Kante des Rasters umgegangen werden soll. Können wir uns daher dafür entscheiden, auf die andere Seite des Gitters zu springen?
Shaggy
@ Shaggy Nein. Das könnte das erwartete Ergebnis ändern. Lasst es uns alle genauso machen. Text aktualisiert s / can / should /
Umbrella
2
Warten auf die unvermeidliche Antwort von
MATL
Ich stelle fest, dass die meisten Lösungen die Eingabe in irgendeiner Weise verändern. Ist das hier üblich? Meine (noch zu veröffentlichende) Lösung enthält die erforderlichen Bytes, um die Eingabe zu mutieren, und ich frage mich, warum viele andere dies nicht tun.
Umbrella
1
@Umbrella Im Allgemeinen ist es uns egal, ob der Eingang geändert wird. Wir interessieren uns für Kurzcode, nicht für bereinigten Code. Solange die Ausgabe stimmt, neigen wir dazu, ziemlich freizügig zu sein.

Antworten:

9

MATL , 20 15 13 12 Bytes

t1Y6Z+tuX>=)

5 Bytes dank Emigna, 2 dank Giuseppe und ein weiterer dank Luis Mendo.
Probieren Sie es online!

Erläuterung

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.

quelle
6

APL (Dyalog Unicode) , 31 27 26 24 23 Byte SBCS

-2 dank Kühe quaken. -1 danke an ngn.

Anonyme implizite Präfixfunktion. Nimmt eine Matrix als Argument. Nimmt an ⎕IO( I ndex O rigin) zu sein 0, was auf vielen Systemen Standard ist.

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

Probieren Sie es online!

, Ravel (Flatten) die Eingabe

{}⊃ Wählen Sie ein Element aus, das dem Ergebnis der folgenden Funktion entspricht:

⊢⍵ Ergib das Argument (trennt sich 3 3von )

 … ⌺3 3 Wende die folgende Funktion auf jede 3-mal-3-Nachbarschaft an:

  ⊢∘, ignoriere die Randinformationen zugunsten der verwüsteten (abgeflachten) Nachbarschaft

  () Wenden auf diese die folgende implizite Funktion an

   -/ die alternierende Summe (wörtlich rechtsassoziativ minus Reduktion)

   +/- subtrahiere das von der Summe (das ergibt die Summe aller anderen Elemente)

, ravel (flatten) dass (die Nachbarschaft summiert)

 produzieren die Indizes, die das sortieren würden

 wähle den ersten (dh den Index der höchsten Summe)

Adam
quelle
Das war schnell. Bist du vorbereitet gekommen? ;)
Umbrella
3
@Umbrella Nein, ich verwende nur eine Programmiersprache, die sich schnell programmieren lässt.
Adám
3
Wie ist das {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,? Bearbeiten: oder sogar{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
Kritixi Lithos
@Cowsquack Ich vergesse diesen Trick immer.
Adám
2
-1 Byte:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn 20.06.18
5

Jelly , 22 Bytes

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

Probieren Sie es online!

Nicht eingebaute Faltungsfunktionen wie MATL und Dyalog Wenn Sie vergessen, dass Ihre Sprache eingebaute Faltungsfunktionen enthält (danke @dylnan), tut das weh, aber auch dank ŒMund können wir das in Ordnung bringen œị. Erstens eine Hilfsfunktion zum Berechnen von Nachbarn in nur einer Richtung, die im Übrigen die Eingabe transponiert:

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

Visuell lautet die Berechnung:

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

Interpretation: Zelle (x, y) dieses Ergebnisses ist die Summe der horizontalen Nachbarn der Zelle (y, x). (Hier sehen wir zum Beispiel, dass f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] .)

Dann ist die Hauptfunktion:

,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).
Lynn
quelle
1
Was ist æc?
Dylnan
Oh, ich wusste es nicht :) Ich bin zu beschäftigt, um mehr Golf zu spielen, also zögern Sie nicht, eine Antwort damit zu schreiben.
Lynn
5

Jelly , 18 Bytes

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

Probieren Sie es online!

Die Hilfsfunktion findet die Nachbarn jedes Elements in jeder Zeile. Die Hauptfunktion führt dies für die Zeilen und Spalten durch und findet dann das Element mit der maximalen Nachbarschaftssumme.

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.
dylnan
quelle
3

Wolfram Language (Mathematica) , 58 Byte

Im@Last[Union@@ListConvolve[{a={0,1,0},{1,I,1},a},#,2,0]]&

Falte die Matrix mit (0101ich1010), nimm das Element mit dem größten Realteil und nimm seinen Imaginärteil.

Probieren Sie es online!

Alephalpha
quelle
2

Python 2 , 127 Bytes

def f(a):n=len(a[0]);b=sum(a,[])+[0]*n;print b[max(range(len(b)-n),key=lambda i:b[i-1]*(i%n>0)+b[i+1]*(i%n<n-1)+b[i-n]+b[i+n])]

Probieren Sie es online!

Lynn
quelle
2

Schablone , 1 + 10 = 11 Bytes (nicht konkurrierend)

Befehlszeilenoption:  1 Berechne 1 Generation

y⊃⍨⊃⍒,
+/N

Probieren Sie es online!

y von der abgeflachten ursprünglichen Eingabe
⊃⍨  holt
 die erste
 in absteigender Reihenfolge
, von der abgeflachte

+/ Summen
N der von Neumanns Nachbarschaften ohne selbst

Adam
quelle
Natürlich gibt es eine Sprache mit einem eingebauten Zeichen für die Nachbarn.
Umbrella
1
Sein einziger Zweck ist es, diese Art von Problemen zu lösen .
Adám
Warum ist es nicht konkurrierend?
Kevin Cruijssen
1
@ KevinCruijssen Ich y habe der Sprache hinzugefügt , als ich sah, dass der Zugriff auf die ursprüngliche Eingabe erleichtert werden muss. Vorher musste man (,⍎'input')statt schreiben y.
Adám
1
@Adam Ah ok, ja, dann ist es ja nicht konkurrierend. Hätte nicht bemerkt, dass die Herausforderung gestern veröffentlicht wurde. Wenn es sich um eine alte Herausforderung handelte, führt das Nicht-Konkurrieren, da die Sprache (oder Sprachversion) neuer ist, im aktuellen Meta nicht mehr zum Nicht-Konkurrieren .
Kevin Cruijssen
2

JavaScript (ES6), 94 Byte

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

Probieren Sie es online!

Wie?

Anstatt nach dem Maximum der Summe der 4 Nachbarn zu suchen, suchen wir nach dem Minimum m der Summe s ihrer Einkomplemente. Auf diese Weise können wir undefinierte Werte genauso wie Nullen verarbeiten, weil:

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

Die innere Map () ist so geschrieben, dass sie den Inhalt der Zeile r nicht verändert . Daher können wir das Ergebnis in p speichern , um die oberen Nachbarn in der nächsten Iteration zu testen.

Wir gebrauchen:

  • ~r[x-1] für die linke Zelle
  • ~r[x+1] für die richtige Zelle
  • ~p[x] für die oberste Zelle
  • ~(a[y+1]||0)[x] für die unterste Zelle
Arnauld
quelle
1

Java 8, 187 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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
Kevin Cruijssen
quelle
1

Javascript ES6, 170 Bytes

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}
Jean-Philippe Leclerc
quelle
1
Willkommen bei PPCG! Ihr Code scheint davon auszugehen, dass die Eingabe in einer Variablen mit dem Namen g gespeichert ist. was nicht zulässig ist . Sie sollten entweder ein vollständiges Programm schreiben, das die Eingabe liest, oder eine Funktion (die in JS normalerweise und bei weitem die bevorzugte Methode ist).
Arnauld
1
@ Arnauld Danke! Ich habe den Code korrigiert
Jean-Philippe Leclerc
Sie können einen TIO-Link hinzufügen , um das Testen zu vereinfachen. (Ich habe den zweiten Testfall entfernt, damit der Link in einen Kommentar passt.)
Arnauld,