Skor tertinggi di lapangan

18

pengantar

Biarkan bidang menjadi persegi panjang yang hanya diisi dengan karakter -dan [0-9]. Contoh bidang adalah:

11-011123
111-010--
0010---01
111-01234

Anda melihat bahwa bidang ini telah dipisahkan menjadi tiga area yang lebih kecil:

masukkan deskripsi gambar di sini

Untuk menghitung skor area yang lebih kecil, kami hanya menambahkan semua angka. Sebagai contoh:

11
111
0010
111

1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 = 9

Total skor untuk area ini adalah 9 . Kami sekarang melakukan hal yang sama untuk area kedua:

   011123
    010

0 + 1 + 1 + 1 + 2 + 3 + 0 + 1 + 0 = 9

Total skor juga 9 . Sekarang kita harus memeriksa area terakhir:

       01
    01234

0 + 1 + 0 + 1 + 2 + 3 + 4 = 11

Ini memiliki skor total 11 . Skor tertinggi di lapangan adalah 11, jadi inilah yang perlu kami hasilkan.

Tugas

Diberikan bidang (dalam bentuk string 2D, array, dll.), Menghasilkan skor tertinggi di bidang tersebut. Anda dapat mengasumsikan bahwa bidang yang diberikan akan selalu mengandung setidaknya 1 digit. Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Uji kasus

Uji kasus 1:

Input:
1

Output:
1

Uji kasus 2:

Input:
1-1-1-1
-1-1-1-
2-1-1-1
-1-1-1-

Output:
2

Uji kasus 3:

Input:
12-45-
4-65-9
87-654
12-487
45----
684764

Output:
69

Uji kasus 4:

Input:
111-12
------
21--10

Output:
3
Adnan
sumber
1
Wow ... tantangan yang bagus.
R. Kap
"0010 --- 01" bukankah itu ["0010", "", "", "01"]?
Ven
juga "111-01234", mengapa tidak ["111", "01234"]?
Ven
Saya tidak mengerti. Saya pikir -memisahkan daerah? Bisakah Anda membuat bagian "apa yang mendefinisikan suatu area" menjadi lebih jelas?
Ven
dapatkah Anda menulis ulang tantangan untuk menjelaskan hal itu?
Ven

Jawaban:

3

MATL , 54 51 49 byte

n:"G~1@(2Y6Z+leG45>1e*5M@)*]vtz:"otY*g]G48-X:*sX>

Input adalah array char 2D dalam format MATL (AB), dengan ;pemisah baris. Masukan dalam contoh dan dalam kasus uji masing-masing:

['11-011123';'111-010--';'0010---01';'111-01234']
['1']
['1-1-1-1';'-1-1-1-';'2-1-1-1';'-1-1-1-']
['12-45-';'4-65-9';'87-654';'12-487';'45----';'684764']
['111-12';'------';'21--10']

Cobalah online!

Penjelasan

Ini bekerja dengan membangun matriks adjacency dari grafik yang didefinisikan oleh hubungan "sedang terhubung". Sebagai contoh, perhatikan bidang 3 × 4

52-4
15-8
3-72

Entri dalam array 2D mudah dijelaskan dalam MATL menggunakan pengindeksan linear (kolom-utama). Dalam kasus 3 × 4, indeks linier dari setiap entri diberikan sebagai

1  4  7 10
2  5  8 11
3  6  9 12

Matriks adjacency dibangun dalam langkah-langkah menggunakan perkalian matriks. Pada langkah pertama, segera tetangga dianggap. Misalnya, titik yang diindeks 3 adalah tetangga itu sendiri dan itu dengan indeks 2. Itu bukan tetangga dari 6 karena titik itu tidak mengandung angka sesuai dengan bidang. Dalam contoh ini, matriks adjacency dari relasi "tetangga langsung" adalah matriks 12x12 L yang diberikan sebagai

1 1 0 1 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 0 0 0
0 1 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 0 1 1

(Dapat dilihat bahwa kolom 3 memiliki nilai 1pada baris 2 dan 3.) Matriks ini selalu simetris dan diagonalnya memiliki nilai 1untuk poin yang tidak mengandung -.

Langkah selanjutnya adalah matriks kedekatan hubungan "terhubung dengan paling banyak satu titik di antara ". Untuk mendapatkannya, cukup untuk mengalikan L dengan sendirinya dan mengatur entri bukan nol ke 1. Secara umum, matriks adjacency dari relasi "dihubungkan oleh beberapa lintasan", M , diperoleh dengan menaikkan L ke eksponen (dalam arti matriks) yang mewakili panjang lintasan maksimum yang mungkin. Sebuah batas atas panjang jalur maksimum adalah jumlah nol entri dalam L .

Menghitung daya matriks secara langsung dapat menyebabkan overflow, karena sejumlah besar cepat terjadi. Jadi lebih baik untuk secara bertahap mengalikan dengan matriks yang sama, mengubah entri bukan nol menjadi 1 setelah setiap langkah untuk mencegah peningkatan jumlah besar.

Kolom i dari M menunjukkan titik-titik yang terhubung (dengan jalur apa pun) dengan titik i . Sekarang, bidang level dapat dikurangi menjadi vektor kolom c dalam urutan linier, di mana setiap entri berisi angka yang sesuai atau nilai yang tidak ditentukan untuk -. Jadi dalam hal ini c akan

5
1
3
2
5
-
-
-
7
4
8
2

Mengubah setiap kolom M dengan elemen- c dan menghitung jumlah setiap kolom memberi, untuk setiap poin i , skor total dari titik area yang saya miliki. Suatu area didefinisikan oleh semua titik yang saling terhubung. Perhatikan bahwa banyak kolom akan memberikan hasil yang sama; yaitu, kolom i dan j akan memberikan jumlah yang sama jika poin i dan j terhubung (milik area yang sama). Hasil akhir adalah jumlah maksimal dari jumlah tersebut.

        % Implicitly take input: 2D char array
n:      % Range [1,...,N], where N is number of entries in the input
"       % For loop. Each iteration builds a row of matrix L
  G     %   Push input again
  ~     %   Logical negate: transform into matrix of zeros
  1     %   Push 1, to be written into a matrix entry
  @     %   Iteration index. Ranges from 1 to N
  (     %   Write that 1 into the N-th entry (linear order)
  2Y6   %   Push array [0 1 0; 1 1 1; 0 1 0]: mask of immediate neighbours
  Z+    %   Convolve and keep same-size result
  le    %   Linearize into row array
  G45>  %   Array of same size as the input that contains 1 for numbers, 0 for '-'
  1e    %   Linearize into row array
  *     %   Multiply element-wise
  5M    %   Push last array again: 1 for numbers, 0 for '-'
  @)    %   Get 0 or 1 value of that array corresponding to current iteration
  *     %   Multiply. This is to give a row of zeros for non-numbers
]       % End. We have all rows of L in the stack
v       % Concatenate all rows into a matrix: L.
tz:     % Duplicate. Range [1,...,K], where K is the number of nonzeros in L
"       % For loop. Repear K times. This loop computes the 0/1 matrix power
  o     %   Convert matrix entries to double
  tY*   %   Duplicate and matrix-multiply
  g     %   Convert to logical values, that is, nonzero values become 1
]       % End. We have matrix M
G48-    % Convert input chars to the corresponding numbers by subtractig 48
X:      % Linearize into column array. This is vector c
*       % Element-wise multiplication with broadcast (implicit repetition)
s       % Sum of each column. Gives a row array
X>      % Maximum of that row array
        % Implicitly display
Luis Mendo
sumber
3

JavaScript (ES6), 157 byte

s=>[...o=s].map((n,i)=>o=n<'.'|(a=[...s]).map(_=>a.map((c,j)=>c>'-'&c<10&(a[j+1]|a[j-1]|a[j+l]|a[j-l])>90?a[n-=-c,j]=99:0),a[i]=99)|o>n?o:n,l=~s.search`
`)|o

Penjelasan

Mengambil bidang input sebagai string. Untuk setiap angka di bidang, jumlah semua angka di area. Ini dilakukan dengan mengulangi setiap angka dalam bidang beberapa kali, menambahkan angka ke skor jika sel yang berdekatan berisi nomor yang dihitung sebelumnya. Angka yang dihitung yang merupakan bagian dari area diwakili dengan mengaturnya ke 99 sehingga mereka tidak dihitung lagi. Menghasilkan skor tertinggi sebagai angka.

var solution =

s=>
  [...o=s].map((n,i)=>o=n<'.'|             // for each number on the field
                                           // n = area score
      (a=[...s])                           // a = array of each field character
      .map(_=>                             // loop to ensure whole area is found
        a.map((c,j)=>                      // for each cell c at index j
          c>'-'&c<10&                      // if the current cell is a number
          (a[j+1]|a[j-1]|a[j+l]|a[j-l])>90 // and an adjacent cells is in the area
          ?a[n-=-c,j]=99:0                 // add the cell to the area
        ),                                 // and the number to the score
        a[i]=99                            // mark the starting cell as counted
      )
      |o>n?o:n,                            // o = output (max of o and n)
    l=~s.search`
`                                          // l = line length of field
  )
  |o                                       // return o
<textarea id="input" rows="6" cols="40">12-45-
4-65-9
87-654
12-487
45----
684764</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>

pengguna81655
sumber
2

Pyth, 93 byte

A,hlh.zjJ\-.zKsm?qdJd\#HD'b=KXKbJR+i@HbTsm?&&gd0<dlKq@Kd\#'d0[tbhb-bG+bG;Wh=NxK\#=+Y'N)h.MZY

Cobalah online!

Bagaimana itu bekerja


Langkah pertama: baca input

A,hlh.zjJ\-.zKsm?qdJd\#H
A,                           Assign the following to G and H:
  hlh.z                          G = increment(length(first(all_input())))
       jJ\-.z                    H = join(J="-",all_input())
                m       H    for d in H:
                 ?qdJ            if equal(d,J):
                     d               add d to the list
                                 else:
                      \#             add "#" to the list
                             end
               s             sum the list
              K              assign to K

Sample input:
11-011123
111-010--
0010---01
111-01234

G = 10
H = "11-011123-111-010---0010---01-111-01234" (note the extra dashes connecting each line)
J = "-"
K = "##-######-###-###---####---##-###-#####"

Langkah kedua: tentukan fungsi untuk mengevaluasi satu area

D'b=KXKbJR+i@HbTsm?&&gd0<dlKq@Kd\#'d0[tbhb-bG+bG;
D'b                                             ;  def quote(b):
   =KXKbJ                                              K[b] = J
         R+                                            return the sum of A and B, where:
           i@HbT                                         A = to_integer(H[b],10)

                 m                   [tbhb-bG+bG         for d in {dec(b), inc(b), minus(b,G), add(b,G)}:
                  ?&&                                      if .... and ........ and ............... :
                     gd0                                      d>=0
                        <dlK                                           d<len(K)
                            q@Kd\#                                                  equal(K[d],"#")
                                  'd                           add quote(d) to temp_list
                                                           else:
                                    0                          add 0 to temp_list
                s                                        B = sum(temp_list)

Basically, this function (quote) is given a starting
point (b), and then recursively find its neighbour and
add their values to the output.

Langkah ketiga: baca semua area dan temukan nilai maksimum yang diinginkan

Wh=NxK\#=+Y'N)h.MZY
Wh=NxK\#     )         while inc(N=find(K,"#")):   --while K still has "#"
        =+Y'N              Y+= quote(N)
               .MZY    find the maximum of Y,
              h        then print the first.
Biarawati Bocor
sumber