Znajdź liczbę o największej sumie sąsiadów

12

Wyzwanie

Biorąc pod uwagę siatkę liczb (10 <= N <= 99) Zwróć liczbę z najwyższą sumą czterech liczb sąsiadujących z nią; to są liczby powyżej, poniżej, po prawej i lewej stronie liczby, ale nie sama.

  1. Sama liczba się nie liczy, tylko jej czterej sąsiedzi.
  2. Liczbę na krawędzi należy traktować tak, jakby brakująca liczba to 0.
  3. Zaprojektuję test, aby uniknąć powiązań.
  4. Liczby się nie powtarzają.
  5. To jest .

Przykład

Dany

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

Powrót

18

Prawdziwy test

Dany

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

Powrót

13

Dany

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

Powrót

15
Parasol
źródło
1
Liczbę na krawędzi można traktować tak, jakby brakująca liczba to 0. ” - Oznacza to, że mamy wybór, jak obsługiwać liczby na krawędzi siatki. Czy możemy zatem zawinąć na drugą stronę siatki?
Shaggy
@Shaggy Nie. To może zmienić oczekiwany wynik. Zróbmy to wszystko w ten sam sposób. Tekst zaktualizowano s / can / should /
Umbrella
2
czekam na nieuchronną odpowiedź
MATL
Zauważam, że większość rozwiązań w jakiś sposób mutuje dane wejściowe. Czy to jest tutaj konwencjonalne? Moje (jeszcze nie opublikowane) rozwiązanie zawiera bajty wymagane do mutacji danych wejściowych i zastanawiam się, dlaczego wielu innych nie.
Parasol
1
@Umbrella Na ogół nie obchodzi nas, czy dane wejściowe zostaną zmodyfikowane. Interesuje nas krótki kod, a nie czysty kod. Dopóki dane wyjściowe są prawidłowe, mamy tendencję do pobłażania.

Odpowiedzi:

9

MATL , 20 15 13 12 bajtów

t1Y6Z+tuX>=)

Zaoszczędzono 5 bajtów dzięki Emignie, 2 dzięki Giuseppe i kolejne dzięki Luisowi Mendo.
Wypróbuj online!

Wyjaśnienie

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.

źródło
6

APL (Dyalog Unicode) , 31 27 26 24 23 bajtów SBCS

-2 dzięki szarlatanowi Krów. -1 dzięki ngn.

Anonimowa ukryta funkcja prefiksu. Jako argument przyjmuje macierz. Przyjmuje się ⎕IO( I ndex O rigin) 0, co jest domyślne w wielu systemach.

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

Wypróbuj online!

, ravel (spłaszcz) wejście

{… Wybierz }⊃ element z tego zgodnie z wynikiem następującej funkcji:

⊢⍵ podać argument (oddziela się 3 3od )

 … ⌺3 3 Zastosuj następującą funkcję do każdej dzielnicy 3 na 3:

  ⊢∘, zignoruj ​​informacje o krawędzi na rzecz zrujnowanej (spłaszczonej) dzielnicy

  () Zastosuj następującą milczącą funkcję do tych

   -/ suma przemienna (lit. minus asocjatywna minus redukcja)

   +/- odejmij to od sumy (daje to sumę każdego innego elementu)

, ravel (spłaszcz) to (suma sąsiedztwa)

 tworzyć indeksy, które by to sortowały

 wybierz pierwszy (tj. indeks najwyższej sumy)

Adám
źródło
To było szybkie. Przyszedłeś przygotowany? ;)
Parasol
3
@Umbrella Nie, używam tylko języka programowania, który można szybko zaprogramować.
Adám
3
Jak to {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,jest Edytuj: lub nawet{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805
@ Cowsquack Zawsze zapominam o tej sztuczce.
Adám
2
-1 bajt:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn
5

Galaretka , 22 bajty

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

Wypróbuj online!

Brak wbudowanych splotów takich jak MATL i Dyalog Zapominanie języka ma wbudowane splotowe (dziękuję @dylnan) boli, ale możemy sobie poradzić bez nich, częściowo dzięki ŒMi œị. Po pierwsze, funkcja pomocnicza do obliczania sąsiadów tylko w jednym kierunku, która przypadkowo transponuje dane wejściowe:

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

Wizualnie obliczenia są następujące:

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

Interpretacja: komórka (x, y) tego wyniku jest sumą poziomych sąsiadów komórki (y, x). (Na przykład tutaj widzimy, że f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] .)

Następnie główna funkcja:

,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
źródło
1
Co æc?
dylnan
och, nie wiedziałem o tym :) Jestem zbyt zajęty, by grać w golfa, więc nie krępuj się napisać odpowiedź używając tego.
Lynn,
5

Galaretka , 18 bajtów

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

Wypróbuj online!

Funkcja pomocnika wyszukuje sąsiadów każdego elementu w każdym rzędzie. Główna funkcja robi to z wierszami, a następnie kolumny znajdują element, który ma maksymalną sumę sąsiedztwa.

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
źródło
2

Python 2 , 127 bajtów

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

Wypróbuj online!

Lynn
źródło
2

Szablon , 1 + 10 = 11 bajtów (niekonkurencyjny)

Opcja wiersza polecenia:  1 oblicz 1 generację

y⊃⍨⊃⍒,
+/N

Wypróbuj online!

y z spłaszczonego oryginalnego wejścia
⊃⍨ wybierz
 pierwszy
 w malejącej kolejności
, spłaszczonego

+/ sumy
N dzielnic von neumanN bez jaźni

Adám
źródło
Oczywiście istnieje język z jedną postacią wbudowaną dla sąsiadów.
Parasol
1
Szczerze mówiąc, jego jedynym celem jest rozwiązywanie tego rodzaju problemów .
Adám
Dlaczego to nie konkuruje?
Kevin Cruijssen
1
@KevinCruijssen Dodałem y do języka, gdy zobaczyłem, że potrzebuje łatwiejszego dostępu do oryginalnych danych wejściowych. Wcześniej trzeba było pisać (,⍎'input')zamiast y.
Adám
1
@ Adám Ah ok, tak, to rzeczywiście nie konkuruje. Nie zauważyłem, że wyzwanie zostało opublikowane wczoraj. Jeśli było to stare wyzwanie, niekonkurowanie, ponieważ język (lub wersja językowa) jest nowsza , nie oznacza, że ​​przestaje konkurować w obecnej meta .
Kevin Cruijssen
2

JavaScript (ES6), 94 bajty

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

Wypróbuj online!

W jaki sposób?

Zamiast szukać maksimum sumy 4 sąsiadów, szukamy minimalnej m sumy s ich jeden-dopełnień. To pozwala nam przetwarzać niezdefiniowane wartości tak jak zera, ponieważ:

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

Wewnętrzna mapy () jest napisane w taki sposób, który nie zmienia zawartości rzędu R . Dlatego możemy zapisać jego wynik w p , aby przetestować najlepszych sąsiadów w następnej iteracji.

Używamy:

  • ~r[x-1] dla lewej komórki
  • ~r[x+1] dla właściwej komórki
  • ~p[x] dla górnej komórki
  • ~(a[y+1]||0)[x] dla dolnej komórki
Arnauld
źródło
1

Java 8, 187 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
1

JavaScript ES6, 170 bajtów

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
źródło
1
Witamy w PPCG! Twój kod wydaje się zakładać, że dane wejściowe są przechowywane w zmiennej o nazwie g , co jest niedozwolone . Powinieneś napisać albo pełny program, który czyta dane wejściowe, albo funkcję (co jest zdecydowanie i zdecydowanie preferowanym sposobem w JS).
Arnauld
1
@Arnauld Dziękujemy! Naprawiłem kod
Jean-Philippe Leclerc
Możesz rozważyć dodanie linku TIO, aby ułatwić testowanie. (Usunąłem drugi przypadek testowy, aby link zmieścił się w komentarzu.)
Arnauld