Komşuların En Yüksek Sayısını Bulun


12

Meydan okuma

Bir sayı ızgarası verildiğinde (10 <= N <= 99) Bitişikteki dört sayının en yüksek toplamına sahip sayıyı döndürün; sayının üstündeki, altındaki, sağındaki ve solundaki sayılardır, ancak kendisi değildir.

  1. Sayının kendisi sayılmaz, sadece dört komşusu.
  2. Kenarında bir sayı olmalıdır eksik sayısı 0 gibi tedavi edilebilir.
  3. Bağları önlemek için testi tasarlayacağım.
  4. Sayılar tekrarlanmaz.
  5. Bu .

Misal

verilmiş

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

Dönüş

18

Gerçek Bir Test

verilmiş

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

Dönüş

13

verilmiş

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

Dönüş

15

1
" Kenarında bir dizi olabilir eksik sayısı 0. olsa muamelesi " - İşte ızgaranın bir kenarında numaralarını nasıl ele dair bir seçim var anlamına gelir. Bu nedenle ızgaranın diğer tarafına sarmayı seçebilir miyiz?
Shaggy

@Shaggy Hayır. Bu beklenen sonucu değiştirebilir. Hepimiz aynı şekilde yapalım. Metin güncellendi s / can / should /
Umbrella

2
kaçınılmaz Matl cevap bekliyor
Fatalize

Çözümlerin çoğunun girdiyi bir şekilde değiştirdiğini fark ettim. Bu geleneksel mi? (Henüz gönderilecek) çözümüm, girdiyi değiştirmek için gerekli baytları içeriyor ve neden birçok kişinin neden olmadığını merak ediyorum.
Şemsiye

1
@Umbrella Girişin değiştirilip değiştirilmemesi genellikle umurumda değildir. Kısa kodla ilgileniyoruz, temiz kodla değil. Çıktı doğru olduğu sürece oldukça hoşgörülü olma eğilimindeyiz.

Yanıtlar:


9

MATL , 20 15 13 12 bayt

t1Y6Z+tuX>=)

Emigna sayesinde 2 bayt, Giuseppe sayesinde 2 bayt, Luis Mendo sayesinde ise 2 bayt tasarruf etti.
Çevrimiçi deneyin!

açıklama

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 bayt SBCS

-2 Cows quack sayesinde. -1 sayesinde ngn.

Anonim zımni önek fonksiyonu. Bir matrisi argüman olarak alır. Varsayımlar ⎕IO( I ndex O rigin) olmak 0üzere birçok sistem üzerine varsayılan olan.

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

Çevrimiçi deneyin!

, girişi ravel (düzleştir)

{...}⊃  Aşağıdaki fonksiyonun sonucuna göre bir eleman seçin:

⊢⍵ bağımsız değişken (verim ayırır 3 3gelen )

 … ⌺3 3 Her 3'e 3 mahalleye aşağıdaki işlevi uygulayın:

  ⊢∘, ravelled (düzleştirilmiş) mahalle lehine kenar bilgilerini yoksay

  () Bu tacit fonksiyonunu

   -/ alternatif meblağ (lit. sağ çağrışım eksi azaltma)

   +/- toplamdan çıkarın (bu, diğer tüm öğelerin toplamını verir)

, ravel (düzeltin) (mahalle toplanır)

 bunu sıralayacak endeksleri üretmek

 ilkini seçin (yani en yüksek toplamın endeksi)


Bu kadar hızlı oldu. Hazır mısın? ;)
Şemsiye

3
@Umbrella Hayır, programlamak için hızlı bir programlama dili kullanıyorum.
Adám

3
Bu nasıl {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,? Düzenleme: hatta çift{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805

@Cowsquack Bu numarayı hep unuturum.
Adám

2
-1 bayt:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn

5

Jöle , 22 bayt

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

Çevrimiçi deneyin!

MATL ve Dyalog gibi evrişim yerleşiklerine sahip olmamanız dilinizi unutmak evrişim yerleşiklerine (teşekkür ederim @ dylnan) acı verir, ama kısmen ŒMve sayesinde bir çeşit tamam yapabiliriz œị. İlk olarak, komşuları sadece bir yönde hesaplamak için yardımcı bir işlevdir, bu da girdiyi tesadüfen değiştirir:

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

Görsel olarak, hesaplama:

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

Yorum: Bu sonucun hücresi (x, y), hücrenin (y, x) yatay komşularının toplamıdır. (Örneğin, burada f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] olduğunu görüyoruz .)

Ardından, ana işlev:

,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
Ne olmuş æc?
2018'de

oh, ben bunu bilmiyordum :) golf daha çok meşgul bu yüzden kullanarak bir cevap yazmak için çekinmeyin.
Lynn

5

Jöle , 18 bayt

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

Çevrimiçi deneyin!

Yardımcı işlevi, her satırdaki her öğenin komşularını bulur. Ana işlev bunu satırlara yapar ve sütunlar maksimum komşuluk toplamına sahip öğeyi bulur.

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.

3

Wolfram Dili (Mathematica) , 58 bayt

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

Matrisi ile bükün(0101ben1010) ile bükün, en büyük gerçek parçaya sahip elemanı alın ve hayali kısmını alın.

Çevrimiçi deneyin!



2

Şablon , 1 + 10 = 11 bayt (rakip olmayan)

Komut satırı seçeneği:  1 hesaplama 1 nesli

y⊃⍨⊃⍒,
+/N

Çevrimiçi deneyin!

y düzleştirilmiş orijinal girişten
⊃⍨ çekme
 birinci
 sırasına göre
, düzleştirilmiş

+/
N benfsiz von neumanN mahallelerinin  toplamları


Tabii ki komşular için yerleşik tek karakterli bir dil var.
Şemsiye

1
Adil olmak gerekirse, tek amacı bu tür sorunları çözmek .
Adám

Neden rekabet etmiyor?
Kevin Cruijssen

1
@KevinCruijssen Orijinal girdiye daha kolay erişilmesi gerektiğini gördüğümde dile ekledim y . Ondan önce bunun (,⍎'input')yerine yazmak zorundaydınız y.
Adám

1
@ Adám Ah tamam, evet, o zaman gerçekten rekabet etmiyor. Zorluğun dün gönderildiğini fark etmemişti. Eski bir meydan okuma ise, dil (veya dil sürümü) daha yeni olduğu için rekabet etmiyorsa, mevcut metada artık rekabet etmiyor .
Kevin Cruijssen

2

JavaScript (ES6), 94 bayt

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

Çevrimiçi deneyin!

Nasıl?

Yerine 4 komşuları toplamının en fazla arayan nedeniyle, asgari aramaya m toplamının s onların tek temâmîlerinin. Bu, sıfırlar gibi tanımlanmamış değerleri işlememize olanak tanır, çünkü:

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

İç harita () , r sırasının içeriğini değiştirmeyecek şekilde yazılmıştır . Bu nedenle, bir sonraki yinelemede üst komşuları test etmek için sonucunu p olarak kaydedebiliriz .

Kullanırız:

  • ~r[x-1] sol hücre için
  • ~r[x+1] doğru hücre için
  • ~p[x] üst hücre için
  • ~(a[y+1]||0)[x] alt hücre için


1

Java 8, 187 bayt

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

Çevrimiçi deneyin.

Açıklama:

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 bayt

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'ye Hoşgeldiniz! Kodunuz girişi adlı bir değişken saklanır varsaymak gibi görünüyor g , izin verilmez . Girdiyi okuyan tam bir program veya bir işlev yazmalısınız (JS'de genellikle ve çok tercih edilen yöntemdir).
Arnauld

1
@Arnauld Teşekkürler! Kodu düzelttim
Jean-Philippe Leclerc

Bir Test etmeyi kolaylaştırmak için TIO bağlantısı . (Bağlantının bir yoruma uyması için 2. test vakasını kaldırdım.)
Arnauld
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.