Encuentra el número con la mayor suma de vecinos

12

El reto

Dada una cuadrícula de números (10 <= N <= 99) Devuelve el número con la suma más alta de los cuatro números adyacentes; Esos son los números arriba, abajo, a la derecha y a la izquierda del número, pero no a sí mismo.

  1. El número en sí mismo no cuenta, solo sus cuatro vecinos.
  2. Un número en el borde debe tratarse como si el número faltante fuera un 0.
  3. Diseñaré la prueba para evitar lazos.
  4. Los números no se repetirán.
  5. Este es el .

Ejemplo

Dado

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

Regreso

18

Una prueba real

Dado

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

Regreso

13

Dado

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

Regreso

15
Paraguas
fuente
1
" Un número en el borde se puede tratar como si el número faltante fuera un 0. " - Eso implica que tenemos la opción de manejar los números en un borde de la cuadrícula. Por lo tanto, ¿podemos elegir envolvernos al otro lado de la cuadrícula?
Shaggy
@Shaggy No. Eso podría cambiar el resultado esperado. Hagámoslo todos de la misma manera. Texto actualizado s / can / should /
Paraguas
2
esperando la inevitable respuesta
MATL
Noto que la mayoría de las soluciones mutan la entrada de alguna manera. ¿Eso es convencional aquí? Mi solución (aún por publicar) incluye los bytes necesarios para mutar la entrada y me pregunto por qué muchos otros no lo hacen.
Paraguas
1
@Umbrella Generalmente no nos importa si la entrada se modifica. Nos interesa el código corto, no el código limpio. Mientras la salida sea correcta, tendemos a ser bastante permisivos.

Respuestas:

9

MATL , 20 15 13 12 bytes

t1Y6Z+tuX>=)

Ahorré 5 bytes gracias a Emigna, 2 gracias a Giuseppe y otro gracias a Luis Mendo.
Pruébalo en línea!

Explicación

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.

fuente
6

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

-2 gracias a Cows quack. -1 gracias a ngn.

Función de prefijo tácito anónimo. Toma una matriz como argumento. Asume ⎕IO( I ndex O rigin) ser 0, que es predeterminado en muchos sistemas.

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

Pruébalo en línea!

, descifrar (aplanar) la entrada

{}⊃ Elija un elemento de acuerdo con el resultado de la siguiente función:

⊢⍵ ceder el argumento (se separa 3 3de )

 … ⌺3 3 Aplique la siguiente función a cada vecindario de 3 por 3:

  ⊢∘, ignorar la información de borde a favor del vecindario desvencijado (aplanado)

  (... ) aplique la siguiente función tácita a aquellos

   -/ la suma alterna (lit. asociativa derecha menos reducción)

   +/- reste eso de la suma (esto da la suma de todos los demás elementos)

, desentrañar (aplanar) que (el barrio suma)

 producir los índices que ordenarían eso

 elija el primero (es decir, el índice de la suma más alta)

Adán
fuente
Eso fue rápido. ¿Viniste preparado? ;)
Paraguas
3
@Umbrella No, solo uso un lenguaje de programación que es rápido para programar.
Adám
3
¿Cómo es esto {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,? Editar: o incluso{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805
@Cowsquack Siempre olvido ese truco.
Adám
2
-1 byte:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn
5

Jalea , 22 bytes

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

Pruébalo en línea!

No tener incorporaciones de convolución como MATL y Dyalog Olvidar su idioma tiene daños incorporados de convolución (gracias @dylnan), pero podemos hacer algo bien sin ellos, en parte gracias a ŒMy œị. Primero, una función auxiliar para calcular vecinos en una sola dirección, que incidentalmente transpone la entrada:

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

Visualmente, el cálculo es:

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

Interpretación: la celda (x, y) de este resultado es la suma de los vecinos horizontales de la celda (y, x). (Por ejemplo, aquí vemos que f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] .)

Entonces, la función principal:

,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
fuente
1
¿Qué hay de æc?
dylnan
oh, no lo sabía :) Estoy demasiado ocupado para jugar al golf, así que siéntase libre de escribir una respuesta usándolo.
Lynn
5

Jalea , 18 bytes

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

Pruébalo en línea!

La función auxiliar encuentra los vecinos de cada elemento en cada fila. La función principal hace esto a las filas y las columnas luego encuentra el elemento que tiene la suma máxima de vecindad.

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
fuente
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])]

Pruébalo en línea!

Lynn
fuente
2

Plantilla , 1 + 10 = 11 bytes (no competitivos)

Opción de línea de comando:  1 calcular 1 generación

y⊃⍨⊃⍒,
+/N

Pruébalo en línea!

y de la entrada original aplanada,
⊃⍨ elija
 la primera
 en orden descendente
, de la entrada aplanada

+/ sumas de
N los vecindarios von neumanN sin yo

Adán
fuente
Por supuesto, hay un lenguaje con un carácter incorporado para los vecinos.
Paraguas
1
Para ser justos, su único propósito es resolver este tipo de problemas .
Adám
¿Por qué no compite?
Kevin Cruijssen
1
@KevinCruijssen he añadido y a la lengua cuando vi que era necesario un acceso más fácil a la entrada original. Antes de eso, tenías que escribir en (,⍎'input')lugar de y.
Adám
1
@ Adám Ah ok, sí, entonces de hecho no está compitiendo. No había notado que el desafío fue publicado ayer. Si era un viejo desafío, no competir porque el idioma (o la versión del idioma) es más nuevo ya no lo hace no competitivo en el meta actual .
Kevin Cruijssen
2

JavaScript (ES6), 94 bytes

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

Pruébalo en línea!

¿Cómo?

En lugar de buscar el máximo de la suma de los 4 vecinos, buscamos el mínimo m de la suma s de sus one-complementos. Esto nos permite procesar valores indefinidos como ceros, porque:

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

El mapa interno () está escrito de tal manera que no altera el contenido de la fila r . Por lo tanto, podemos guardar su resultado en p para probar los mejores vecinos en la próxima iteración.

Usamos:

  • ~r[x-1] para la celda izquierda
  • ~r[x+1] para la celda correcta
  • ~p[x] para la celda superior
  • ~(a[y+1]||0)[x] para la celda inferior
Arnauld
fuente
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;}

Pruébalo en línea.

Explicación:

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
fuente
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
fuente
1
Bienvenido a PPCG! Su código parece suponer que la entrada se almacena en una variable llamada g , que no está permitida . Debería escribir un programa completo que lea la entrada o una función (que generalmente es, y con mucho, la forma preferida en JS).
Arnauld
1
@Arnauld ¡Gracias! Arreglé el código
Jean-Philippe Leclerc
Puede considerar agregar un enlace TIO para facilitar la prueba. (Eliminé el segundo caso de prueba para que el enlace encajara en un comentario).
Arnauld