Sayıları Aynı Toplamla Gruplama


12

Göreviniz, kare basamaklı bir ızgara ( 0-9) verildiğinde, basamakların gruplandırılabileceği yollardan birini çıktılamaktır:

  1. Her rakam tam olarak bir grubun parçasıdır
  2. Tüm gruplar aynı sayıda basamağa sahiptir
  3. Tüm gruplar, çokgen benzeri bir şekle bağlıdır (bu, her grupta 1 öğe yoksa, gruptaki her basamağın aynı grubun en az bir basamağının yanında [sol, sağ, yukarı, aşağı] olduğu anlamına gelir).
  4. Tüm grupların toplamı aynıdır

Giriş ızgarası her zaman bir kare olacaktır: İstediğiniz herhangi bir giriş yöntemini seçebilirsiniz (bir işleve veya yönteme bağımsız değişkenler sağlamak dahil). Ayrıca, giriş programınızın basamakları gruplandırması gereken grup sayısını sağlar.

Örnek girdi:

Giriş biçiminizin olduğunu varsayalım stringOfDigits numberOfGroups.

Örnek bir giriş şöyledir:

156790809 3

hangi (bir ızgara sqrt(9) * sqrt(9)) çevirmek

1 5 6
7 9 0
8 0 9

3 gruba ayırmanız gerekir, her biri 9 / 3 = 3aynı toplamda elemanlara sahip olmalıdır .

Çıktı: Çıktı, her bir rakamı ve ardından a-zgrubunu gösteren bir harf olacak şekilde, biçimlendirme için isteğe bağlı boşluklar ve yeni satırlar içeren basamak dizesi olmalıdır . numberOfTotalDigits / numberOfGroupsHer grupta tam olarak unsurlar olmalıdır . Asla bir şeyi 26'dan fazla gruba bölmek zorunda kalmayacaksınız.

Örnek çıktı:

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

Tüm as'leri bs ve bs ile değiştirmenin aeşit derecede geçerli olduğunu unutmayın. Her grup ayrı bir harfle belirtildiği sürece çıktı geçerlidir.

Buna ek olarak, çoğu programın bu satırlar boyunca bir şey çıkmasını bekliyorum, çünkü yeni satırlar / boşluklar isteğe bağlıdır:

1a5a6b7c9a0b8c0c9b

Bu durumda, grubun tüm basamak eklenerek a, bya c15. Buna ek olarak yapar, tüm gruplar bazı poligonun bağlıdırlar.

Geçersiz çıktılar:

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

çünkü gruplar çokgen oluşturmaz (özellikle, 6bizole edilir ve 0cyalnızdır).

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

çünkü grubun b4 elemanı, csadece 2 elemanı var.

Vb.

Geçerli bir çözüm yoksa, programınız herhangi bir şey yapabilir (yani durdurma, çökme, sonsuza kadar çalıştır), ancak programınız Nonegeçerli bir çözüm olmadığında yazdırırsa -15puanınıza göre.

Birden fazla çözüm varsa, yalnızca bir tane yazdırmanız gerekir, ancak -20programınız hepsini bir sınırlayıcı ile ayrılmış olarak yazdırırsa.

Bu kod golf, çok kısa kod (ikramiye ile) kazanır!


İlk geçersiz çıktıda, bence 6bizole değil demek 0b.
Level River St

Programımızın ne kadar hızlı olduğu önemli mi? Çalışıyorsa doğrulamak çok yavaşsa ne olur?
Beta Çürüğü

156790889 3olması gerektiği gibi görünüyor156790809 3
isaacg

Yanıtlar:


10

Pyth , 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

değişiklikler:

  • 130 -> 120: Yeni satırdan ayrılmış girişe geçti.

  • 120 -> 134: Matrisin yan uzunluğuna eşit olmayan gruplar içeren bir hata düzeltildi.

  • 134 -> 120: Grup yeniden adlandırma altında eşdeğeri olanlar da dahil olmak üzere tüm çözümleri yazdırır.

  • 120 -> 122: Tüm yasal gruplar yerine yalnızca yolların oluşturulacağı bir hata düzeltildi.

Test sürüşü:

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

Açıklama:

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
"Pyth"? "Base64" kodunu yanlış yazdınız.
Ingo Bürk

4

JavaScript (ES6) 361 (376-15) 372

(Belki yine de biraz daha golf yapılabilir)

Bir işlev olarak, ilk param basamak dizesidir ve ikinci param grup sayısıdır.
İlk çözümde durdurulan saf bir özyinelemeli arama (-20 bonus yok).
Bazı daha büyük girdilerin performansını doğrulamak için biraz daha test senaryosuna ihtiyacınız var.

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'

Açıklanamayan ve Açıklanan

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';
}

FireFox / FireBug konsolunda test et

F("156790809",3) çıktı 1c5c6b7a9c0b8a0a9b

F("156790819",3) çıktı None

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.