Знайдіть число з найбільшою сумою сусідів


12

Змагання

Дано сітку чисел (10 <= N <= 99) Повернути число з найбільшою сумою чотирьох суміжних до нього чисел; тобто цифри вгорі, внизу, праворуч і ліворуч від числа, але не самі.

  1. Сама кількість не рахується, лише чотири її сусіди.
  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 /
Парасолька

2
чекаючи неминучої відповіді
MATL

Я помічаю, що більшість рішень якимось чином мутують дані. Це звичайне тут? Моє (ще не розміщене) рішення включає в себе байти, необхідні для мутації вводу, і мені цікаво, чому багато інших цього не роблять.
Парасолька

1
@ Umbrella Нам взагалі не байдуже, чи вхід буде змінений. Нас цікавить короткий код, а не чистий код. Поки результат правильний, ми, як правило, досить дозволені.

Відповіді:


9

MATL , 20 15 13 12 байт

t1Y6Z+tuX>=)

Збережено 5 байт завдяки Еміньї, 2 завдяки Джузеппе та ще одне завдяки Луїсу Мендо.
Спробуйте в Інтернеті!

Пояснення

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 завдяки кряканню корів. -1 завдяки ngn.

Функція анонімного мовчазного префікса. В якості аргументу бере матрицю. Передбачає, що ⎕IO( I ndex O rigin) бути 0, що є типовим для багатьох систем.

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

Спробуйте в Інтернеті!

, згорнути (згладити) вхід

{}⊃  Виберіть елемент із цього за результатами наступної функції:

⊢⍵ привести аргумент (відокремлюється 3 3від )

 … ⌺3 3 Застосувати наступну функцію до кожного мікрорайону 3 на 3:

  ⊢∘, ігнорувати крайову інформацію на користь розгубленого (сплющеного) мікрорайону

  () Застосувати до них таку негласну функцію

   -/ змінна сума (літ. право-асоціативне мінус зменшення)

   +/- відняти це від суми (це дає суму всіх інших елементів)

, скакати (згладити), що (сусідство сум)

 виробляють показники, які б це сортували

 вибрати перший (тобто індекс найбільшої суми)


Це було швидко. Ви приїхали підготовлені? ;)
Парасолька

3
@ Umbrella Ні, я просто використовую мову програмування, яка швидко програмується.
Adám

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 мікрорайонів von neumanN без себе


Звичайно, для сусідів є мова з вбудованим символом.
Парасолька

1
Якщо чесно, то її єдиною метою є вирішення подібних проблем .
Адам

Чому він не конкурує?
Кевін Кройсейсен

1
@KevinCruijssen Я додав y до мови, коли побачив, що вона потребує більш легкого доступу до вихідного вводу. Перед цим вам довелося писати (,⍎'input')замість y.
Adám

1
@ Adám Ага гаразд, так, тоді це дійсно не конкурує. Не помітив, що виклик був опублікований вчора. Якщо це був старий виклик, неконкуренція, оскільки мова (або мовна версія) новіша , не робить її більше неконкурентною у поточному мета .
Kevin Cruijssen

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

Спробуйте в Інтернеті!

Як?

Замість того, щоб шукати максимум суми чотирьох сусідів, ми шукаємо мінімум m суми s їх однодоповнення. Це дозволяє обробляти невизначені значення так само, як нулі, тому що:

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

Внутрішня карта () написана таким чином, що вона не змінює змісту рядка 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, щоб полегшити тестування. (Я видалив другий тестовий випадок, щоб посилання було вміщено в коментарі.)
Арнольд,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.