Trouver le nombre avec la plus grande somme de voisins

12

Le défi

Étant donné une grille de nombres (10 <= N <= 99) Numéro de retour avec la somme la plus élevée des quatre nombres adjacents; ce sont les nombres au-dessus, en dessous, à droite et à gauche du nombre, mais pas lui-même.

  1. Le nombre lui-même ne compte pas, seulement ses quatre voisins.
  2. Un nombre sur le bord doit être traité comme si le nombre manquant était un 0.
  3. Je vais concevoir le test pour éviter les liens.
  4. Les chiffres ne se répéteront pas.
  5. C'est du .

Exemple

Donné

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

Revenir

18

Un vrai test

Donné

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

Revenir

13

Donné

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

Revenir

15
Parapluie
la source
1
" Un nombre sur le bord peut être traité comme si le nombre manquant était un 0. " - Cela implique que nous avons le choix sur la façon de gérer les nombres sur un bord de la grille. Peut-on donc choisir de s'enrouler de l'autre côté de la grille?
Shaggy
@Shaggy Non. Cela pourrait changer le résultat attendu. Faisons-le tous de la même manière. Texte mis à jour s / can / should /
Umbrella
2
en attente de la réponse MATL inévitable
Fatalize
Je remarque que la plupart des solutions modifient l'entrée d'une manière ou d'une autre. Est-ce conventionnel ici? Ma solution (qui n'a pas encore été publiée) inclut les octets nécessaires pour muter l'entrée et je me demande pourquoi beaucoup d'autres ne le font pas.
Umbrella
1
@Umbrella Nous ne nous soucions généralement pas si l'entrée est modifiée. Nous nous intéressons au code court, pas au code propre. Tant que la sortie est correcte, nous avons tendance à être assez permissifs.

Réponses:

9

MATL , 20 15 13 12 octets

t1Y6Z+tuX>=)

Enregistré 5 octets grâce à Emigna, 2 grâce à Giuseppe et un autre grâce à Luis Mendo.
Essayez-le en ligne!

Explication

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.

la source
6

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

-2 grâce au charlatan des vaches. -1 grâce à ngn.

Fonction de préfixe tacite anonyme. Prend une matrice comme argument. Suppose que ⎕IO( I ndex O rigin) est 0, ce qui est par défaut sur de nombreux systèmes.

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

Essayez-le en ligne!

, défoncer (aplatir) l'entrée

{}⊃ Choisissez un élément de celui-ci en fonction du résultat de la fonction suivante:

⊢⍵ donner l'argument (séparé 3 3de )

 … ⌺3 3 Appliquer la fonction suivante à chaque quartier 3 par 3:

  ⊢∘, ignorer les informations de bord en faveur du quartier défait (aplati)

  () Appliquer la fonction tacite suivante à ceux

   -/ la somme alternée (lit. droite moins associative réduction)

   +/- soustrayez cela de la somme (cela donne la somme de tous les autres éléments)

, défiler (aplatir) que (le quartier résume)

 produire les indices qui trieraient cette

 choisir le premier (c'est-à-dire l'indice de la somme la plus élevée)

Adam
la source
C'était rapide. Êtes-vous venu préparé? ;)
Umbrella
3
@ Umbrella Non, j'utilise simplement un langage de programmation qui est rapide à programmer.
Adám
3
Comment ça {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,? Edit: ou même{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805
@Cowsquack J'oublie toujours cette astuce.
Adám
2
-1 octet:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn
5

Gelée , 22 octets

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

Essayez-le en ligne!

Ne pas avoir de fonctions intégrées de convolution comme MATL et Dyalog Oublier votre langue a des fonctions intégrées de convolution (merci @dylnan) ça fait mal, mais nous pouvons faire quelque chose de bien sans elles, en partie grâce à ŒMet œị. Tout d'abord, une fonction d'aide pour calculer les voisins dans une seule direction, qui transpose accessoirement l'entrée:

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

Visuellement, le calcul est:

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

Interprétation: la cellule (x, y) de ce résultat est la somme des voisins horizontaux de la cellule (y, x). (Par exemple, nous voyons ici que f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] .)

Ensuite, la fonction principale:

,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
la source
1
Et alors æc?
dylnan
oh, je ne le savais pas :) Je suis trop occupé pour jouer au golf alors n'hésitez pas à écrire une réponse en l'utilisant.
Lynn
5

Gelée , 18 octets

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

Essayez-le en ligne!

La fonction d'assistance recherche les voisins de chaque élément dans chaque ligne. La fonction principale le fait pour les lignes et les colonnes trouvent ensuite l'élément qui a la somme de voisinage maximale.

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
la source
2

Python 2 , 127 octets

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

Essayez-le en ligne!

Lynn
la source
2

Pochoir , 1 + 10 = 11 octets (non concurrent)

Option de ligne de commande:  1 calculer 1 génération

y⊃⍨⊃⍒,
+/N

Essayez-le en ligne!

y à partir de l'entrée d'origine aplatie,
⊃⍨ sélectionnez
 la première
 dans l'ordre décroissant
, de l'aplatissement

+/ sommes des
N quartiers von neumanN sans moi

Adam
la source
Bien sûr, il y a une langue avec un caractère intégré pour les voisins.
Umbrella
1
Pour être juste, son seul but est de résoudre ce genre de problèmes .
Adám
Pourquoi est-ce non concurrentiel?
Kevin Cruijssen
1
@KevinCruijssen J'ai ajouté y à la langue quand j'ai vu qu'elle avait besoin d'un accès plus facile à l'entrée d'origine. Avant cela, vous deviez écrire (,⍎'input')au lieu de y.
Adám
1
@ Adám Ah ok, ouais, alors c'est en effet non compétitif. Je n'avais pas remarqué que le défi avait été publié hier. S'il s'agissait d'un ancien défi, non concurrentiel parce que la langue (ou la version linguistique) est plus récente, cela ne le rend plus non concurrentiel dans la méta actuelle .
Kevin Cruijssen
2

JavaScript (ES6), 94 octets

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

Essayez-le en ligne!

Comment?

Au lieu de chercher le maximum de la somme des 4 voisins, nous recherchons le minimum m de la somme s de leurs compléments. Cela nous permet de traiter des valeurs non définies comme des zéros, car:

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

La carte intérieure () est écrite de telle manière qu'elle ne modifie pas le contenu de la ligne r . Par conséquent, nous pouvons enregistrer son résultat dans p afin de tester les principaux voisins lors de la prochaine itération.

Nous utilisons:

  • ~r[x-1] pour la cellule gauche
  • ~r[x+1] pour la bonne cellule
  • ~p[x] pour la cellule supérieure
  • ~(a[y+1]||0)[x] pour la cellule du bas
Arnauld
la source
1

Java 8, 187 octets

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

Essayez-le en ligne.

Explication:

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
la source
1

Javascript ES6, 170 octets

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
la source
1
Bienvenue chez PPCG! Votre code semble supposer que l'entrée est stockée dans une variable nommée g , ce qui n'est pas autorisé . Vous devez écrire soit un programme complet qui lit l'entrée ou une fonction (qui est généralement et de loin la manière préférée dans JS).
Arnauld
1
@Arnauld Merci! J'ai corrigé le code
Jean-Philippe Leclerc
Vous pouvez envisager d'ajouter un lien TIO pour faciliter le test. (J'ai supprimé le 2ème cas de test pour que le lien tienne dans un commentaire.)
Arnauld