Nhóm các số có cùng một tổng


12

Nhiệm vụ của bạn là, được cung cấp một lưới các chữ số ( 0-9), xuất ra một trong những cách mà các chữ số có thể được nhóm lại sao cho:

  1. Mỗi chữ số là một phần của chính xác một nhóm
  2. Tất cả các nhóm có cùng số chữ số
  3. Tất cả các nhóm được giới hạn bởi một hình dạng giống như đa giác (điều này có nghĩa là mọi chữ số trong nhóm nằm bên cạnh [trái, phải, lên, xuống] ít nhất một chữ số khác của cùng một nhóm, trừ khi mỗi nhóm có 1 phần tử).
  4. Tất cả các nhóm có cùng một tổng

Lưới đầu vào sẽ luôn là một hình vuông: Bạn có thể chọn bất kỳ phương thức nhập nào bạn muốn (bao gồm cung cấp đối số cho hàm hoặc phương thức). Ngoài ra, đầu vào sẽ cung cấp số lượng nhóm mà chương trình của bạn nên nhóm các chữ số thành.

Ví dụ đầu vào:

Giả sử định dạng đầu vào của bạn là stringOfDigits numberOfGroups.

Một ví dụ đầu vào sẽ là:

156790809 3

mà sẽ dịch sang (một lưới sqrt(9) * sqrt(9))

1 5 6
7 9 0
8 0 9

mà bạn sẽ phải chia thành 3 nhóm, mỗi nhóm nên có 9 / 3 = 3các phần tử có cùng một tổng.

Đầu ra: Đầu ra phải là chuỗi các chữ số, với các khoảng trắng và dòng mới tùy chọn để định dạng, với mỗi chữ số theo sau là một chữ cái a-zchỉ nhóm của nó. Cần có chính xác numberOfTotalDigits / numberOfGroupscác yếu tố trong mỗi nhóm. Bạn sẽ không bao giờ phải chia một cái gì đó thành hơn 26 nhóm.

Ví dụ đầu ra:

1a 5a 6b
7c 9a 0b
8c 0c 9b

Lưu ý rằng thay thế tất cả as bằng bs và bs bằng as đều có giá trị như nhau. Miễn là mỗi nhóm được ký hiệu bằng một chữ cái riêng biệt, đầu ra là hợp lệ.

Ngoài ra, tôi hy vọng hầu hết các chương trình sẽ xuất ra thứ gì đó dọc theo dòng này, bởi vì dòng mới / dấu cách là tùy chọn:

1a5a6b7c9a0b8c0c9b

Trong trường hợp này, thêm tất cả các chữ số của nhóm a, bhoặc clàm cho 15. Thêm vào đó, tất cả các nhóm đều bị ràng buộc bởi một số đa giác.

Đầu ra không hợp lệ:

1a 5a 6b
7c 9a 0c
8c 0b 9b

bởi vì các nhóm không tạo thành đa giác (cụ thể, 6bbị cô lập và 0ccũng cô đơn).

1a 5a 6b
7c 9a 0b
8c 0b 9b

bởi vì nhóm bcó 4 yếu tố trong khi cchỉ có 2.

Vân vân.

Nếu không có giải pháp hợp lệ, chương trình của bạn có thể làm bất cứ điều gì (ví dụ như dừng, sập, chạy mãi mãi) nhưng nếu chương trình của bạn in Nonekhi không có giải pháp hợp lệ, -15sẽ ghi điểm của bạn.

Nếu có nhiều hơn một giải pháp, bạn chỉ phải in một giải pháp, nhưng -20nếu chương trình của bạn in tất cả chúng được phân tách bằng một số dấu phân cách.

Đây là mã golf, vì vậy mã ngắn nhất (có tiền thưởng) sẽ thắng!


Trong đầu ra không hợp lệ đầu tiên, tôi nghĩ bạn có nghĩa 6blà bị cô lập, không phải là 0b.
Cấp sông St

Có vấn đề như thế nào nhanh chóng chương trình của chúng tôi? Nếu nó quá chậm để xác nhận nếu nó hoạt động thì sao?
Beta Decay

156790889 3có vẻ như nó phải vậy156790809 3
isaacg

Câu trả lời:


10

Bình , 122 - 20 - 15 = 87

=Z/lzQ=ks^lz.5Jm]dUzL[-bk+bk?tb%bkb?hb%hbkb)FNJIgNZB~Jm+NksmybN;|jbS{msm+@zk@S*Z<GQxsdkUzfqSsTUz^fqsmv@*ZzbY/smvdzQJQ"None

Thay đổi:

  • 130 -> 120: Chuyển sang đầu vào tách dòng mới.

  • 120 -> 134: Đã sửa lỗi liên quan đến các nhóm không có kích thước bằng độ dài cạnh của ma trận.

  • 134 -> 120: In tất cả các giải pháp, bao gồm các giải pháp tương đương theo đổi tên nhóm.

  • 120 -> 122: Đã sửa lỗi trong đó chỉ các đường dẫn sẽ được tạo, thay vì tất cả các nhóm hợp pháp.

Chạy thử nghiệm:

pyth programs/sum_group.pyth <<< '156790809
3'
1a5a6b7c9a0b8c0c9b
1a5a6c7b9a0c8b0b9c
1b5b6a7c9b0a8c0c9a
1b5b6c7a9b0c8a0a9c
1c5c6a7b9c0a8b0b9a
1c5c6b7a9c0b8a0a9b


pyth programs/sum_group.pyth <<< '156790808
3'
None

pyth programs/sum_group.pyth <<< '1111     
2'
1a1a1b1b
1a1b1a1b
1b1a1b1a
1b1b1a1a

Giải trình:

Pyth code           (Pseudo)-Python code              Comments

(implicit)          z = input()                       z is the digit string
(implicit)          Q = eval(input())                 S is the number of groups
(implicit)          G = 'abcdefghijklmnopqrstuvwxyz'
=Z/lzQ              Z = len(z)/Q                      Z is the size of each group.
=ks^lz.5            k = int(len(z) ** .5)             k is the side length of the matrix.
Jm]dUz              J = map(lambda d:[d], range(len(z))) Locations are encoded as numbers.
L                   def y(b): return                  y will be the transition function.
 [-bQ                         [b-k,                   Move up - the row above is k less.
  +bQ                          b+k,                   Move down - the row below is k more.
  ?tb%bkb                      b-1 if b%k else b      Move left, unless at the left edge.
  ?hb%hbkb)                    b+1 if (b+1)%k else b] Move right, unless at right edge.
FNJ                 for N in J:                       This constructs the list of all
   IgNZB                       if N[Z-1]: break       Z-length connected groups.
   ~Jm+Nk                      J+=map(lambda k: N+[k],  Append to J the group of N +
      smybN                          sum(map(lambda b:  anything reachable from
                                     y(b),N)))        anywhere in N.
   ;                (end for)
|                   or                                Print first truthy thing between
 S{                 sorted(set(                       Unique elements in sorted order of
   ms               map(lambda b:sum(                 Map+sum over allowable combinations
     m+@zd          map(lambda d:z[d]+                Character in original digit string
       @S*Z<GQ      sorted(G[:Q]*Z)[                  Repeated and sorted early alphabet
        xsbd        sum(b).index(d)],                 At index of number in sum of groups
      Uz                range(len(z)))                Over possible indexes.
   f                filter(lambda T:                  To generate allowable combinations, 
                                                      we will filter all groups of Q paths.
    qSsTUz          sorted(sum(T)) == range(len(z))   Ensure all locations are visited.
    ^                                                 Combinations of
     f              filter(lambda Y:                  Filter over connected Z-length groups
      qsm           equal(sum(map(lambda k:           Sum of the values of the group
         v@*ZzkY    eval((z*Z)[k]),Y)                 In the original digit string
       /smvbzQ      sum(map(lambda b:eval(b),z))/Q    must equal the sum of all values in z
                                                      divided by the number of groups.
      J             J                                 Filter over connected Z-length groups
     Q              Q                                 Combinations of length Q
 "None              "None"                            If the above was empty, print "None"

9
"Bình hoa"? Bạn viết sai chính tả "base64".
Ingo Bürk

4

JavaScript (ES6) 361 (376-15) 372

(Có lẽ vẫn có thể chơi gôn thêm một chút)

Là một hàm, param đầu tiên là chuỗi các chữ số và param thứ hai là số lượng nhóm.
Đó là một tìm kiếm đệ quy ngây thơ, dừng lại ở giải pháp đầu tiên được tìm thấy (không có phần thưởng -20).
Cần thêm một số trường hợp thử nghiệm để xác minh hiệu suất trên một số đầu vào lớn hơn.

F=(g,n,l=g.length,i=w=Math.sqrt(l),o=s=h='',
  R=(g,p,k,j=l/n,t=s/n,v=0,h=String.fromCharCode(97+k))=>(
    t-=g[p],!(t<0)&&(
      g=[...g],g[p]=h,
      S=f=>g.some((c,p)=>c<':'&&f(p)),
      --j?S(p=>(g[p+1]==h|g[p-1]==h|g[p+w+1]==h|g[p-w-1]==h)?v=R(g,p,k,j,t):0)
      :t?0:k?S(p=>v=R(g,p,k-1)):v=g
    ),v
  )
)=>([for(c of g)(s-=-c,h+=--i?c:(i=w,c+':'))],h=R(g=h,-1,n,1))?h.map((c,p)=>o+=c!=':'?g[p]+c:'')&&o:'None'

Giải thích & giải thích

F=(g,n)=> 
{
  var l = g.length, // string size, group size is l/n 
      w = Math.sqrt(l), // width of grid
      s,i,h,o;

  // Build a new string in h, adding rows delimiters that will act as boundary markers  
  // At the same time calculate the total sum of all digits
  h='',  // Init string
  s = 0, // Init sum 
  i = w, // Init running counter for delimiters
  [for(c of g)(
    s -= -c, // compute sum using minus to avoid string concatenation
    h += --i ? c : (i=w, c+':') // add current char + delimiter when needed
  )];


  // Recursive search
  // Paramaters:
  // g : current grid array, during search used digits are replaced with group letters
  // p : current position
  // k : current group id (start at n, decreaseing)
  // j : current group size, start at l/n decreasing, at 0 goto next group id
  // t : current group sum value, start at s/n decreasing

  var R=(g,p,k,j,t)=> 
  {
    var v = 0, // init value to return is 0
        h = String.fromCharCode(97+k); // group letter from group

    t-=g[p]; // subtract current digit

    if (t<0) // exceed the sum value, return 0 to stop search and backtrak
      return 0;

    g=[...g]; // build a new array from orginal parameter
    g[p] = h; // mark current position

    // Utility function  to scan grid array
    // call worker function  f only for digit elements
    //   skipping group markers, row delimieters and out of grid values (that are undefined)  
    // Using .some will return ealry if f returns truthy  
    var S=f=>g.some((c,p)=>c<':'&&f(p));

    if (--j) // decrement current group size, if 0 then group completed
    { // if not 0
      // Scan grid to find cells adiacent to current group and call R for each 
      S( p => {
        if (g[p+1]==h|g[p-1]==h|g[p+w+1]==h|g[p-w-1]==h) // check if adiacent to a mark valued h
        {
          return v=R(g,p,k,j,t) // set v value and returns it
        }
      })
      // here v could be 0 or a full grid 
    }
    else
    {
      // special case: at first call, t is be NaN because p -1 (outside the grid)
      // to start a full grid serach
      if (t) // check if current reached 0
        return 0; // if not, return 0 to stop search and backtrak


      if (k) // check if current group completed
      {
        // if not at last group, recursive call to R to check next group 
        S( p => {
          // exec the call for each valid cell still in grid
          // params j and t start again at init values
          return v=R(g,p,k-1,l/n,s/n) // set value v and returns it
        })
        // here v could be 0 or a full grid 
      }
      else
      {
        return g; // all groups checked, search OK, return grid with all groups marked
      }
    }
    return v
  };
  g = h; // set g = h, so g has the row boundaries and all the digits

  h=R(h,-1,n,1); // first call with position -1 to and group size 1 to start a full grid search

  if (h) // h is the grid with group marked if search ok, else h is 0
  {
    o = ''; // init output string
    // build output string merging the group marks in h and the original digits in g
    h.map( (c,p) => o += c>':' ? g[p]+c: '') // cut delimiter ':'
    return o;
  }
  return 'None';
}

Kiểm tra trong bảng điều khiển FireFox / FireBug

F("156790809",3) đầu ra 1c5c6b7a9c0b8a0a9b

F("156790819",3) đầu ra None

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.