Найвищий бал на полі


18

Вступ

Нехай поле - це прямокутник, заповнений лише символами -та [0-9]. Прикладом поля є:

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

Ви бачите, що це поле було розділене на три менші області:

введіть тут опис зображення

Щоб обчислити рахунок меншої площі, ми просто додамо всі числа. Наприклад:

11
111
0010
111

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

Загальний бал за цю область - 9 . Зараз ми робимо те ж саме для другої області:

   011123
    010

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

Загальний бал також 9 . Тепер ми повинні вивчити останню область:

       01
    01234

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

Це загальна оцінка 11 . Найвищий бал на полі - 11, тож це нам потрібно вивести.

Завдання

Давши поле (у вигляді 2D-рядка, масиву тощо), виведіть найвищий бал на поле. Ви можете припустити, що дані поля завжди будуть містити принаймні 1 цифру. Це , тому подання з найменшою кількістю байтів виграє!

Тестові справи

Тест 1:

Input:
1

Output:
1

Тест 2:

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

Output:
2

Тест 3:

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

Output:
69

Тестовий випадок 4:

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

Output:
3

1
Нічого ... приємний виклик.
Р. Кап

"0010 --- 01", це не ["0010", "", "", "01"] натомість?
Вен

також "111-01234", чому це не так ["111", "01234"]?
Вен

Я не розумію. Я думав, що -розділені райони? Чи можете ви зрозуміти частину "що визначає область"?
Вен

ви можете, будь ласка, переформулювати завдання, щоб пояснити це?
Вен

Відповіді:


3

MATL , 54 51 49 байт

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

Вхід - це двовимірний масив символів у форматі MATL (AB) з ;роздільником рядків. Вхідні дані в прикладі та в тестових випадках відповідно:

['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']

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

Пояснення

Це працює, будуючи матрицю суміжності графіка, визначеного відношенням "підключається". Як приклад, розглянемо поле 3 × 4

52-4
15-8
3-72

Записи у двовимірному масиві легко описуються в MATL, використовуючи (стовпчик-основний) лінійну індексацію. У випадку 3 × 4 лінійний індекс кожного запису задається як

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

Матриця суміжності будується поетапно, використовуючи множення матриці. На першому кроці розглядаються безпосередні сусіди. Наприклад, точка, що індексується 3, є сусідкою по собі, а точка з індексом 2. Це не сусід 6, оскільки ця точка не містить числа відповідно до поля. У цьому прикладі матриця примикання відношення «безпосередній сусід» є матрицею 12 × 12 L, заданою як

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

(Видно, що стовпець 3 має значення 1в рядках 2 і 3.) Ця матриця завжди симетрична і її діагональ має значення1 для точок, які не містять -.

Наступним кроком буде матриця примикання відношення, "пов'язане з принаймні однією точкою між ними ". Для його отримання досить помножити L на себе і встановити ненульові записи на 1. Загалом, матриця примикання відношення, "з'єднаного деяким шляхом", M , отримується шляхом підняття L до показника (у сенсі матриці), який представляє максимально можливу довжину шляху. Верхня межа максимальної довжини шляху - це кількість ненульових записів у L .

Обчислення потужності матриці може спричинити переповнення, оскільки великі числа швидко виникають. Тому краще поступово множити на одну і ту ж матрицю, перетворюючи ненульові записи в 1 після кожного кроку, щоб запобігти нарощуванню великих чисел.

Колонка i з M являє собою точки, які з'єднані (будь-яким шляхом) з точкою i . Тепер поле рівня може бути зменшене до вектора стовпця c у лінійному порядку, де кожен запис містить відповідне число або невизначене значення для -. Так що в цьому випадку c було б

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

Змішання кожного стовпця M за допомогою елемента c та обчислення суми кожного стовпця дає для кожної точки i загальний бал точки, що належить точці i . Площа визначається всіма точками, які взаємопов'язані. Зауважте, що багато стовпців дадуть однаковий результат; а саме стовпці i та j дадуть однакову суму, якщо точки i та j з'єднані (належать одній області). Кінцевий результат - максимум цих сум.

        % 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

3

JavaScript (ES6), 157 байт

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

Пояснення

Приймає поле введення як рядок. За кожне число в полі підсумовує всі числа в даній області. Це робиться шляхом повторення кожного номера в полі кілька разів, додаючи число до балу, якщо сусідня комірка містить раніше відлічене число. Перелічені числа, що входять до площі, відображаються, встановивши їх 99, щоб вони знову не рахувалися. Виводить найвищий бал як число.

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>


2

Pyth, 93 байти

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

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

Як це працює


Перший крок: прочитайте введення

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 = "##-######-###-###---####---##-###-#####"

Другий крок: визначте функцію для оцінки однієї області

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.

Третій крок: прочитайте всі області та знайдіть необхідний максимум

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