현장에서 가장 높은 점수


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
와우 ... 좋은 도전.
R. Kap

"0010 --- 01"대신 [ "0010", "", "", "01"]이 아닙니까?
Ven

"111-01234"도 왜 그렇지 ["111", "01234"]않습니까?
Ven

이해가 안 돼요 나는 -영역 이 분리 되었다고 생각 했습니까? "지역을 정의하는 것"부분을 더 명확하게 할 수 있습니까?
Ven

당신은 그것을 설명하는 도전을 다시 말씀해 주시겠습니까?
Ven

답변:


3

MATL , 54 51 49 바이트

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

입력은 ;행 구분자로 사용 되는 MATL (AB) 형식의 2D 문자 배열입니다 . 예제 및 테스트 케이스의 입력은 각각 다음과 같습니다.

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

2D 배열의 항목은 (열 주요) 선형 인덱싱을 사용하여 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 에 자체 를 곱하고 0이 아닌 항목을로 설정하면 1됩니다. 일반적으로, " 일부 경로에 의해 연결된"관계 M 의 인접 행렬은 L 을 최대 가능한 경로 길이를 나타내는 지수 (매트릭 의미로) 로 증가시킴으로써 얻어진다 . 최대 경로 길이의 상한은 L 의 0이 아닌 항목 수입니다 .

많은 수의 빨리 발생하기 때문에 매트릭스 전력을 직접 계산하면 오버플로가 발생할 수 있습니다. 따라서 동일한 행렬을 점진적으로 곱하여 각 단계 후에 0이 아닌 항목을 1로 변환하여 많은 수의 누적을 방지하는 것이 좋습니다.

M의i 는 (어떤 경로로든) 점 i 와 연결된 점을 나타냅니다 . 이제 레벨 필드 를 선형 순서 로 열 벡터 c 로 줄일 수 있습니다 . 여기서 각 항목에는에 해당하는 숫자 또는 정의되지 않은 값이 포함됩니다 . 따라서이 경우 c-

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

각 열 Mutiplying M을 하여 C의 요소 와이즈 각 열의 합을 계산하면, 각 점에 대해, 제공 I , 영역 포인트의 총 점수는 에 속한다. 영역은 서로 연결된 모든 지점으로 정의됩니다. 많은 열이 동일한 결과를 제공합니다. 즉, 열은 IJ는 점 경우 동일한 액수를 제공 IJ는 (동일한 지역에 속하는)에 접속된다. 최종 결과는 그 합계의 최대 값입니다.

        % 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

자바 스크립트 (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.

세 번째 단계 : 모든 영역을 읽고 rqeuired 최대 값 찾기

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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.