ค้นหาหมายเลขด้วยผลรวมสูงสุดของเพื่อนบ้าน


12

ความท้าทาย

รับกริดของตัวเลข (10 <= N <= 99) Return number พร้อมผลรวมสูงสุดของตัวเลขสี่ตัวที่อยู่ติดกัน นั่นคือตัวเลขด้านบนด้านล่างด้านขวาและด้านซ้ายของตัวเลข แต่ไม่ใช่ตัวเอง

  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

@Shaggy No. ที่อาจเปลี่ยนแปลงผลลัพธ์ที่คาดไว้ ให้ทุกคนทำแบบเดียวกัน ข้อความอัปเดต s / can / ควร /
Umbrella

2
กำลังรอคำตอบ
MATLAB ที่

ฉันสังเกตเห็นว่าโซลูชันส่วนใหญ่กลายพันธุ์อินพุตในบางวิธี นี่เป็นเรื่องธรรมดาไหม โซลูชันของฉัน (ยังจะโพสต์) รวมถึงไบต์ที่จำเป็นในการกลายพันธุ์อินพุตและฉันสงสัยว่าทำไมคนอื่น ๆ ถึงไม่ทำ
ร่ม

1
@Umbrella โดยทั่วไปเราไม่สนใจว่าอินพุตได้รับการแก้ไขหรือไม่ เราสนใจรหัสสั้น ๆ ไม่ใช่รหัสที่สะอาด ตราบใดที่ผลผลิตออกมาถูกต้องเราก็มักจะอนุญาตให้ทำได้

คำตอบ:


9

MATL , 20 15 13 12 ไบต์

t1Y6Z+tuX>=)

บันทึก 5 ไบต์ด้วย Emigna, 2 ขอบคุณ Giuseppe และอีกอย่างขอบคุณ Luis Mendo
ลองออนไลน์!

คำอธิบาย

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⊢⍵}⊃,

ลองออนไลน์!

, ravel (แผ่) อินพุต

{}⊃ เลือกองค์ประกอบจากสิ่งนั้นตามผลลัพธ์ของฟังก์ชันต่อไปนี้:

⊢⍵ ให้เหตุผล (แยก3 3จาก)

 ... ⌺3 3 ใช้ฟังก์ชั่นต่อไปนี้กับแต่ละละแวก 3-by-3:

  ⊢∘, ไม่สนใจข้อมูลขอบเพื่อสนับสนุนย่านที่ถูกทำลาย (แบน)

  (... ) ใช้ฟังก์ชัน tacit ต่อไปนี้กับสิ่งเหล่านั้น

   -/ ผลรวมสลับ (สว่าง. ลดการเชื่อมโยงขวา - ลบ)

   +/- ลบออกจากผลรวม (สิ่งนี้จะให้ผลรวมขององค์ประกอบอื่น ๆ ทุกอัน)

, ravel (แบน) ว่า (จำนวนเพื่อนบ้าน)

 ผลิตดัชนีที่จะจัดเรียงนั้น

 เลือกอันแรก (เช่นดัชนีของผลรวมสูงสุด)


นั่นเร็วมาก. คุณเตรียมมาหรือยัง? ;)
ร่ม

3
@Umbrella ไม่ฉันเพิ่งใช้ภาษาการเขียนโปรแกรมซึ่งเป็นโปรแกรมที่รวดเร็วในการ
Adám

3
เป็น{⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,ไงบ้าง แก้ไข: หรือแม้กระทั่ง{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805

@ Cowquack ฉันมักจะลืมเคล็ดลับนั้น
อดัม

2
-1 ไบต์:{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ก.ย.

5

เยลลี่ , 22 ไบต์

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

ลองออนไลน์!

ไม่ได้มีการบิดตัว -ins เช่น MATL และ Dyalog ลืมภาษาของคุณมีการบิดตัว -ins (ขอบคุณ @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อะไร
dylnan

โอ้ฉันไม่รู้เรื่องนี้ :) ฉันยุ่งเกินกว่าจะเล่นกอล์ฟมากขึ้นดังนั้นอย่าลังเลที่จะเขียนคำตอบโดยใช้มัน
Lynn

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
เพื่อความยุติธรรมจุดประสงค์เพียงอย่างเดียวของมันคือการแก้ปัญหาประเภทนี้
Adám

ทำไมมันถึงไม่ใช่การแข่งขัน?
Kevin Cruijssen

1
@KevinCruijssen ฉันได้เพิ่ม yภาษาเมื่อฉันเห็นว่ามันจำเป็นต้องเข้าถึงข้อมูลต้นฉบับได้ง่ายขึ้น ก่อนที่คุณจะต้องเขียนแทน(,⍎'input') y
อดัม

1
@ Adám Ah ตกลงใช่แล้วแน่นอนมันไม่ใช่การแข่งขัน ไม่ได้สังเกตเห็นความท้าทายถูกโพสต์เมื่อวานนี้ ถ้ามันเป็นความท้าทายที่เก่าที่ไม่ใช่การแข่งขันเพราะภาษา (หรือรุ่นภาษา) เป็นรุ่นใหม่ไม่ได้ทำให้มันไม่ใช่การแข่งขันอีกต่อไปใน meta
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

ลองออนไลน์!

อย่างไร?

แทนที่จะมองหาสูงสุดของผลรวมของ 4 ประเทศเพื่อนบ้านที่เรามองหาขั้นต่ำม.ของทุน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! รหัสของคุณดูเหมือนจะคิดว่าการป้อนข้อมูลที่ถูกเก็บไว้ในชื่อตัวแปรกรัม , ซึ่งไม่ได้รับอนุญาต คุณควรเขียนโปรแกรมทั้งหมดที่อ่านอินพุตหรือฟังก์ชั่น (ซึ่งโดยปกติแล้วจะเป็นวิธีที่ต้องการใน JS)
Arnauld

1
@Arnauld ขอบคุณ! ฉันแก้ไขรหัสแล้ว
Jean-Philippe Leclerc

คุณอาจลองเพิ่มลิงค์ TIOเพื่อให้ง่ายต่อการทดสอบ (ฉันลบกรณีทดสอบที่ 2 เพื่อให้ลิงค์พอดีในความคิดเห็น)
Arnauld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.