Sahadaki en yüksek puan


18

Giriş

Bir alan ile dolu bir dikdörtgen olsun sadece karakterler -ve [0-9]. Bir alan örneği:

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

Bu alanın üç küçük alana ayrıldığını görüyorsunuz:

resim açıklamasını buraya girin

Daha küçük bir alanın puanını hesaplamak için tüm sayıları toplarız. Örneğin:

11
111
0010
111

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

Bu bölgenin toplam puanı 9'dur . Şimdi aynı şeyi ikinci alan için de yapıyoruz:

   011123
    010

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

Toplam puan da 9'dur . Şimdi son alanı incelemeliyiz:

       01
    01234

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

Bunun toplam puanı 11'dir . Sahadaki en yüksek puan 11'dir, bu yüzden çıktı almamız gereken budur.

Görev

Bir alan (2B dize, dizi vb. Şeklinde) verildiğinde , alandaki en yüksek puanı alın. Verilen alanların her zaman en az 1 basamak içereceğini varsayabilirsiniz . Bu , bu yüzden en az bayt ile gönderme kazanır!

Test senaryoları

Test örneği 1:

Input:
1

Output:
1

Test örneği 2:

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

Output:
2

Test örneği 3:

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

Output:
69

Test durumu 4:

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

Output:
3

1
Vay be ... güzel meydan okuma.
R. Kap

"0010 --- 01" bunun yerine ["0010", "", "", "01"] değil mi?
Ven

ayrıca "111-01234", neden olmasın ["111", "01234"]?
Ven

Anlamıyorum. Bölgeleri -ayırmayı düşündüm ? "Bir alanı tanımlayan şey" kısmını daha net hale getirebilir misiniz, lütfen?
Ven

bunu açıklamak için meydan okuyabilir misiniz lütfen?
Ven

Yanıtlar:


3

MATL , 54 51 49 bayt

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

Giriş, ;satır ayırıcı olarak MATL (AB) formatında bir 2D karakter dizisidir . Örnekteki ve test senaryolarındaki girdiler sırasıyla:

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

Çevrimiçi deneyin!

açıklama

Bu, "bağlanmak" ilişkisi ile tanımlanan grafiğin bitişik bir matrisini oluşturarak çalışır. Örnek olarak, 3 × 4 alanını düşünün

52-4
15-8
3-72

Bir 2D dizideki girişler (kolon-majör) doğrusal indeksleme kullanılarak MATL'de kolayca açıklanabilir. 3 × 4 durumunda, her girişin doğrusal endeksi şu şekilde verilir:

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

Bitişiklik matrisi, matris çarpımı kullanılarak adımlarla oluşturulur. İlk adımda, hemen komşuları ele alır. Örneğin, dizinlenmiş 3 noktası kendisinin ve dizin 2'nin komşusudur. 6'ya komşu değildir, çünkü bu nokta alana göre bir sayı içermez. Bu örnekte "yakın komşu" ilişkisinin bitişiklik matrisi, verilen 12 × 12 matris L'dir .

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

(Sütun 3'ün 1satır 2 ve 3'te değeri olduğu görülebilir .) Bu matris her zaman simetriktir ve köşegen 1içermeyen noktalar için değer taşır -.

Bir sonraki adım " aradaki en fazla bir nokta ile bağlantılı" ilişkisinin bitişiklik matrisi olacaktır . Bunu elde etmek için, L'yi kendi başına çoğaltmak ve sıfır olmayan girişleri ayarlamak yeterlidir 1. Genel olarak, " bir yolla bağlı" ilişkisinin bitişik matrisi , M , L' yi mümkün olan maksimum yol uzunluğunu temsil eden bir üsse (matris anlamda) yükselterek elde edilir . Maksimum yol uzunluğunun üst sınırı, L cinsinden sıfır olmayan girişlerin sayısıdır .

Matris gücünün doğrudan hesaplanması taşmaya neden olabilir, çünkü büyük sayılar hızla ortaya çıkar. Bu nedenle, aynı sayıda matrisle kademeli olarak çarpmak, büyük sayıların oluşmasını önlemek için her adımdan sonra sıfır olmayan girdileri 1'e dönüştürmek daha iyidir.

Sütun I ve M noktası ile (herhangi bir yol ile) bağlanır noktalarını temsil eden i . Şimdi, seviye alanı doğrusal sırayla bir sütun vektörü c'ye indirgenebilir , burada her giriş karşılık gelen sayıyı veya tanımlanmamış bir değeri içerir -. Bu durumda Yani c olurdu

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

Her bir sütun Mutiplying M ile C öğeye ve her sütunun toplamını işlem her bir nokta için, verir i , alan noktasının toplam puan i aittir. Bir alan, birbirine bağlı tüm noktalar tarafından tanımlanır. Birçok sütunun aynı sonucu vereceğini unutmayın; yani, sütun i ve j noktaları, aynı miktar verecek i ve j, (aynı alana aittir) bağlanır. Nihai sonuç, bu meblağların maksimumu.

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

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

açıklama

Girdi alanını dize olarak alır. Alandaki her sayı için, alandaki tüm sayıları toplar. Bunu, alandaki her sayıyı birden çok kez yineleyerek, bitişik bir hücre daha önce sayılmış bir sayı içeriyorsa sayıya ekleyerek yapar. Alanın bir parçası olan sayılan sayılar, tekrar sayılmayacak şekilde 99 olarak ayarlanarak temsil edilir. En yüksek puanı sayı olarak verir.

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 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır


İlk adım: girişi okuyun

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

İkinci adım: bir alanı değerlendirmek için bir fonksiyon tanımlayın

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.

Üçüncü adım: tüm alanları okuyun ve gereken maksimum değeri bulun

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.
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.