Agrupe los números con la misma suma

12

Su tarea es, dada una cuadrícula cuadrada de dígitos ( 0-9), generar una de las formas en que los dígitos se pueden agrupar de manera que:

  1. Cada dígito es parte de exactamente un grupo
  2. Todos los grupos tienen el mismo número de dígitos.
  3. Todos los grupos están delimitados por una forma similar a un polígono (esto significa que cada dígito en el grupo está al lado de [izquierda, derecha, arriba, abajo] al menos otro dígito del mismo grupo, a menos que cada grupo tenga 1 elemento).
  4. Todos los grupos tienen la misma suma.

La cuadrícula de entrada siempre será un cuadrado: puede elegir cualquier método de entrada que desee (incluido el suministro de argumentos a una función o método). Además, la entrada proporcionará la cantidad de grupos en los que su programa debería agrupar los dígitos.

Entrada de ejemplo:

Supongamos que su formato de entrada es stringOfDigits numberOfGroups.

Un ejemplo de entrada sería:

156790809 3

que se traduciría a (una cuadrícula de sqrt(9) * sqrt(9))

1 5 6
7 9 0
8 0 9

que tendrías que dividir en 3 grupos, cada uno de los cuales debería tener 9 / 3 = 3elementos con la misma suma.

Salida: La salida debe ser la cadena de dígitos, con espacios opcionales y nuevas líneas para formatear, con cada dígito seguido de una letra que a-zindique su grupo. Debe haber exactamente numberOfTotalDigits / numberOfGroupselementos en cada grupo. Nunca tendrá que dividir algo en más de 26 grupos.

Salida de ejemplo:

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

Tenga en cuenta que reemplazar todas las as con bsy bs con as es igualmente válido. Mientras cada grupo se denota con una letra distinta, la salida es válida.

Además, espero que la mayoría de los programas muestren algo similar a esto, porque las nuevas líneas / espacios son opcionales:

1a5a6b7c9a0b8c0c9b

En este caso, agregar todos los dígitos del grupo a, bo chace 15. Además, todos los grupos están unidos por algún polígono.

Salidas inválidas:

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

porque los grupos no forman polígonos (específicamente, el 6bestá aislado y 0ctambién está solo).

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

porque el grupo btiene 4 elementos mientras que csolo tiene 2.

Etc.

Si no hay una solución válida, su programa puede hacer cualquier cosa (es decir, detenerse, bloquearse, ejecutarse para siempre), pero si su programa imprime Nonecuando no hay una solución válida, -15a su puntaje.

Si hay más de una solución, solo tiene que imprimir una, pero -20si su programa las imprime todas separadas por algún delimitador.

Este es el código de golf, por lo que gana el código más corto (con bonificaciones).

soktinpk
fuente
En la primera salida no válida, creo que quiere decir que 6bestá aislado, no el 0b.
Level River St el
¿Importa lo rápido que es nuestro programa? ¿Qué pasa si es demasiado lento para validar si funciona?
Beta Decay
156790889 3parece que debería ser156790809 3
isaacg

Respuestas:

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

Cambios:

  • 130 -> 120: Cambiado a entrada separada de nueva línea.

  • 120 -> 134: Se corrigió un error que involucraba a grupos que no tenían un tamaño igual a la longitud lateral de la matriz.

  • 134 -> 120: Imprime todas las soluciones, incluidas las equivalentes en el cambio de nombre de grupo.

  • 120 -> 122: se corrigió un error en el que solo se generarían rutas, en lugar de todos los grupos legales.

Prueba de funcionamiento:

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

Explicación:

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"
isaacg
fuente
99
"Pyth"? Escribiste mal "base64".
Ingo Bürk
4

JavaScript (ES6) 361 (376-15) 372

(Tal vez todavía se pueda jugar un poco más)

Como función, el primer parámetro es la cadena de dígitos y el segundo parámetro es el número de grupos.
Es una búsqueda recursiva ingenua, deteniéndose en la primera solución encontrada (sin bonificación de -20).
Necesita algunos casos de prueba más para verificar el rendimiento en una entrada más grande.

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'

No golfista y explicado

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

Prueba en la consola FireFox / FireBug

F("156790809",3) salida 1c5c6b7a9c0b8a0a9b

F("156790819",3) salida None

edc65
fuente