El ratón hambriento


85

Dieciséis montones de queso se colocan en un cuadrado de 4x4. Están etiquetados del 1 al . La pila más pequeña es y la más grande es .16116

El Ratón Hambriento está tan hambriento que siempre va directo al montón más grande (es decir, ) y se lo come de inmediato.16

Después de eso, va a la pila vecina más grande y rápidamente también se come esa. (Sí ... tiene mucha hambre.) Y así sucesivamente hasta que ya no haya una pila vecina.

Una pila puede tener hasta 8 vecinos (horizontal, vertical y diagonal). No hay envoltura.

Ejemplo

Comenzamos con las siguientes pilas de queso:

37105681213159114141162

El Ratón Hambriento primero come , y luego su mayor pila vecina, que es .1611

37105681213159🐭41412

Sus próximos movimientos son , , , , , , , , y en este orden exacto.131210815149673

🐭5412

Ya no hay queso alrededor del Ratón Hambriento, por lo que se detiene allí.

El reto

Dada la configuración inicial del queso, su código debe imprimir o devolver la suma de las pilas restantes una vez que el Ratón Hambriento haya dejado de comerlas.

Para el ejemplo anterior, la respuesta esperada es .12

Reglas

  • Debido a que el tamaño de la matriz de entrada es fijo, puede tomarlo como una matriz 2D o una matriz unidimensional.
  • Se garantiza que cada valor del al aparecerá exactamente una vez.116
  • Este es el .

Casos de prueba

[ [ 4,  3,  2,  1], [ 5,  6,  7,  8], [12, 11, 10,  9], [13, 14, 15, 16] ] --> 0
[ [ 8,  1,  9, 14], [11,  6,  5, 16], [13, 15,  2,  7], [10,  3, 12,  4] ] --> 0
[ [ 1,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12], [13, 14, 15, 16] ] --> 1
[ [10, 15, 14, 11], [ 9,  3,  1,  7], [13,  5, 12,  6], [ 2,  8,  4, 16] ] --> 3
[ [ 3,  7, 10,  5], [ 6,  8, 12, 13], [15,  9, 11,  4], [14,  1, 16,  2] ] --> 12
[ [ 8,  9,  3,  6], [13, 11,  7, 15], [12, 10, 16,  2], [ 4, 14,  1,  5] ] --> 34
[ [ 8, 11, 12,  9], [14,  5, 10, 16], [ 7,  3,  1,  6], [13,  4,  2, 15] ] --> 51
[ [13, 14,  1,  2], [16, 15,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12] ] --> 78
[ [ 9, 10, 11, 12], [ 1,  2,  4, 13], [ 7,  8,  5, 14], [ 3, 16,  6, 15] ] --> 102
[ [ 9, 10, 11, 12], [ 1,  2,  7, 13], [ 6, 16,  4, 14], [ 3,  8,  5, 15] ] --> 103

32
+1 para ese personaje del mouse
Luis Mendo

2
... que 103:[[9, 10, 11, 12], [1, 2, 7, 13], [6, 16, 4, 14], [3, 8, 5, 15]]
Jonathan Allan

99
¡Qué desafío tan bien escrito! Lo tendré en cuenta para las mejores nominaciones.
xnor

99
Después de leer mal, estaba un poco triste porque no era un alce hambriento.
akozi

1
Este desafío me recuerda al mouse en el programa laberinto para la computadora txo. Este juego fue escrito en la década de 1950, y el txo fue la primera computadora transistorizada del mundo, según la leyenda. Sí, lo creas o no, alguien estaba escribiendo videojuegos en los días de tu abuelo.
Walter Mitty

Respuestas:


11

Python 2 , 133 130 bytes

a=input();m=16
for i in range(m):a[i*5:i*5]=0,
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

Pruébalo en línea!

Toma una lista aplanada de 16 elementos.

Cómo funciona

a=input();m=16

# Add zero padding on each row, and enough zeroes at the end to avoid index error
for i in range(m):a[i*5:i*5]=0,

# m == maximum element found in last iteration
# i == index of last eaten element
# eaten elements of `a` are reset to 0
while m:i=a.index(m);a[i]=0;m=max(a[i+x]for x in[-6,-5,-4,-1,1,4,5,6])
print sum(a)

La expresión de celda adyacente a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]se puede acortar a a[i+j+j/3*2-6]for j in range(9)(la entrada cero es inofensiva). Python 3 seguramente puede ser más corto al codificar una cadena de bytes de longitud 8, pero Python 2 aún podría ser mejor en general.
xnor

1
A pesar de su bucle relleno de ceros es inteligente, parece que es más corto para tomar una lista 2D: a=[0]*5 for r in input():a=r+[0]+a. Tal vez hay una solución de corte de cadena aún más corta que no requiere iteración.
xnor

8

Python 2 , 111 bytes

i=x=a=input()
while x:x,i=max((y,j)for j,y in enumerate(a)if i>[]or 2>i/4-j/4>-2<i%4-j%4<2);a[i]=0
print sum(a)

Pruébalo en línea!

Método y casos de prueba adaptados de Bubbler . Toma una lista plana en STDIN.

El código verifica si dos índices planos iy jrepresentan celdas conmovedoras al verificar que tanto la diferencia de fila como la diferencia de i/4-j/4columna i%4-j%4están estrictamente entre -2 y 2. La primera pasada, en cambio, tiene esta verificación exitosa automáticamente para que la entrada más grande se encuentre sin tener en cuenta la adyacencia.


8

MATL , 50 49 47 bytes

16:HZ^!"2G@m1ZIm~]v16eXK68E16b"Ky0)Y)fyX-X>h]s-

La entrada es una matriz, que se usa ;como separador de filas.

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

16:HZ^!  % Cartesian power of [1 2 ... 16] with exponent 2, transpose. Gives a 
         % 2-row matrix with 1st column [1; 1], 2nd [1; 2], ..., last [16; 16] 
"        % For each column, say [k; j]
  2      %   Push 2
  G@m    %   Push input matrix, then current column [k; j], then check membership.
         %   This gives a 4×4 matrix that contains 1 for entries of the input that
         %   contain k or j 
  1ZI    %   Connected components (based on 8-neighbourhood) of nonzero entries.
         %   This gives a 4×4 matrix with each connected component labeled with
         %   values 1, 2, ... respectively
  m~     %   True if 2 is not present in this matrix. That means there is only
         %   one connected component; that is, k and j are neighbours in the
         %   input matrix, or k=j
]        % End
v16e     % The stack now has 256 values. Concatenate them into a vector and
         % reshape as a 16×16 matrix. This matrix describes neighbourhood: entry 
         % (k,j) is 1 if values k and j are neighbours in the input or if k=j
XK       % Copy into clipboard K
68E      % Push 68 times 2, that is, 136, which is 1+2+...+16
16       % Push 16. This is the initial value eaten by the mouse. New values will
         % be appended to create a vector of eaten values
b        % Bubble up the 16×16 matrix to the top of the stack
"        % For each column. This just executes the loop 16 times
  K      %   Push neighbourhood matrix from clipboard K
  y      %   Copy from below: pushes a copy of the vector of eaten values
  0)     %   Get last value. This is the most recent eaten value
  Y)     %   Get that row of the neighbourhood matrix
  f      %   Indices of nonzeros. This gives a vector of neighbours of the last
         %   eaten value
  y      %   Copy from below: pushes a copy of the vector of eaten values
  X-     %   Set difference (may give an empty result)
  X>     %   Maximum value. This is the new eaten value (maximum neighbour not
         %   already eaten). May be empty, if all neighbours are already eaten
  h      %   Concatenate to vector of eaten values
]        % End
s        % Sum of vector of all eaten values
-        % Subtract from 136. Implicitly display

Idk MatLab, pero ¿puedes ahorrar un poco si presionas -136 en lugar de +136?
Tito el

@Titus Hm No veo cómo
Luis Mendo

o al revés: pensé en lugar de 1) presionar 136 2) presionar cada valor comido 3) resumir los valores comidos 4) restar 136 -> 1) presionar 136 2) presionar negativo del valor comido 3) resumir la pila. Pero como obviamente es solo un byte cada uno; Probablemente no haya ganancia.
Titus

@Titus Ah, sí, creo que usa la misma cantidad de bytes. Además, necesito cada valor comido (no es negativo) para la diferencia establecida; la negación tendría que hacerse al final
Luis Mendo

6

PHP, 177 174 171 bytes

for($v=16;$v;$u+=$v=max($p%4-1?max($a[$p-5],$a[$p-1],$a[$p+3]):0,$a[$p-4],$a[$p+4],$p%4?max($a[$p-3],$a[$p+1],$a[$p+5]):0))$a[$p=array_search($v,$a=&$argv)]=0;echo 120-$u;

Ejecute con -nr, proporcione elementos de matriz como argumentos o pruébelo en línea .


5

JavaScript, 122 bytes

Tomé más de un par de vueltas incorrectas en este caso y ahora me he quedado sin tiempo para jugar más al golf, pero al menos está funcionando. Volveré mañana (o, ¡conociéndome, en el tren a casa esta noche!), Si puedo encontrar un minuto.

a=>(g=n=>n?g([-6,-5,-4,-1,1,4,5,6].map(x=>n=a[x+=i]>n?a[x]:n,a[i=a.indexOf(n)]=n=0)|n)-n:120)(16,a=a.flatMap(x=>[...x,0]))

Pruébalo en línea


3
+1 para flatMap(): p
Arnauld

: DI creo que esta es la primera vez que lo uso para golf! Por interés (y para darme un objetivo cuando vuelva a esto), ¿cuál fue su puntaje cuando lo probó?
Shaggy

No tuve un minuto para volver a esto hoy. Con suerte, eso significa que mañana podré comenzar de nuevo con ojos completamente nuevos.
Shaggy

He publicado mi solución.
Arnauld

5

R , 128 124 123 112 110 bytes

function(r){r=rbind(0,cbind(0,r,0),0)
m=r>15
while(r[m]){r[m]=0
m=r==max(r[which(m)+c(7:5,1)%o%-1:1])}
sum(r)}

Pruébalo en línea!

Crea una matriz 4x4 (que me ayudó a visualizar cosas), la rellena con ceros, luego comienza desde 16 y busca en sus "pilas" circundantes el siguiente más grande, y así sucesivamente.

Al concluir, genera una advertencia, pero no tiene ninguna consecuencia y no cambia el resultado.

EDITAR: -4 bytes comprimiendo la inicialización de la matriz en 1 línea.

EDITAR: -1 gracias a Robert Hacken

EDITAR: -13 bytes combinando las sugerencias de Giuseppe y Robin Ryder.


Puede guardar un byte cambiando r==16para r>15.
Robert Hacken

1
117 bytes : cámbielo a una función que tome una matriz y realice algunos alias con el which.
Giuseppe

2
112 bytes mejorando las sugerencias de @Giuseppe: puede almacenar mcomo un lógico en lugar de un entero, y por lo tanto solo necesita llamar whichuna vez en lugar de dos.
Robin Ryder

110 bytes usando el golf de @RobinRyder y jugando con la compresión de la matriz de adyacencia del vecindario.
Giuseppe

1
@ Sumner18 X%o%Yes un alias para outer(X,Y,'*'). outeres una de las funciones más prácticas, ya que puede funcionar como la función de "difusión" de Octave / MATLAB / MATL con operadores de aribtrary (vectorizados). Mira aquí ; También es útil en raras ocasiones kroneckercuál está vinculado en esa página.
Giuseppe

4

Carbón , 47 bytes

EA⭆ι§αλ≔QθW›θA«≔⌕KAθθJ﹪θ⁴÷θ⁴≔⌈KMθA»≔ΣEKA⌕αιθ⎚Iθ

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

EA⭆ι§αλ

Convierta los números de entrada en caracteres alfabéticos (A = 0 .. Q = 16) e imprímalos como una cuadrícula de 4x4.

≔Qθ

Comience por comer la Q, es decir, 16.

W›θA«

Repita mientras haya algo para comer.

≔⌕KAθθ

Encuentra dónde está la pila. Esta es una vista lineal en orden de fila mayor.

J﹪θ⁴÷θ⁴

Convierte a coordenadas y salta a esa ubicación.

≔⌈KMθ

Encuentra la pila adyacente más grande.

Come la pila actual.

≔ΣEKA⌕αιθ

Convierta las pilas de nuevo en enteros y tome la suma.

⎚Iθ

Borrar el lienzo y generar el resultado.


3

Powershell, 143 141 136 130 122 121 bytes

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){$a[$i]=0
$n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]}$a|%{$s+=$_}
$s

Menos guión de prueba de golf:

$f = {

$a=,0*5+($args|%{$_+0})
for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}
$a|%{$s+=$_}
$s

}

@(
    ,( 0  , ( 4,  3,  2,  1), ( 5,  6,  7,  8), (12, 11, 10,  9), (13, 14, 15, 16) )
    ,( 0  , ( 8,  1,  9, 14), (11,  6,  5, 16), (13, 15,  2,  7), (10,  3, 12,  4) )
    ,( 1  , ( 1,  2,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12), (13, 14, 15, 16) )
    ,( 3  , (10, 15, 14, 11), ( 9,  3,  1,  7), (13,  5, 12,  6), ( 2,  8,  4, 16) )
    ,( 12 , ( 3,  7, 10,  5), ( 6,  8, 12, 13), (15,  9, 11,  4), (14,  1, 16,  2) )
    ,( 34 , ( 8,  9,  3,  6), (13, 11,  7, 15), (12, 10, 16,  2), ( 4, 14,  1,  5) )
    ,( 51 , ( 8, 11, 12,  9), (14,  5, 10, 16), ( 7,  3,  1,  6), (13,  4,  2, 15) )
    ,( 78 , (13, 14,  1,  2), (16, 15,  3,  4), ( 5,  6,  7,  8), ( 9, 10, 11, 12) )
    ,( 102, ( 9, 10, 11, 12), ( 1,  2,  4, 13), ( 7,  8,  5, 14), ( 3, 16,  6, 15) )
    ,( 103, ( 9, 10, 11, 12), ( 1,  2,  7, 13), ( 6, 16,  4, 14), ( 3,  8,  5, 15) )
) | % {
    $expected, $a = $_
    $result = &$f @a
    "$($result-eq$expected): $result"
}

Salida:

True: 0
True: 0
True: 1
True: 3
True: 12
True: 34
True: 51
True: 78
True: 102
True: 103

Explicación:

Primero , agregue los bordes superior e inferior de 0 y cree una matriz unidimensional:

0 0 0 0 0
# # # # 0
# # # # 0
# # # # 0
# # # # 0

     ↓

0 0 0 0 0 # # # # 0 # # # # 0 # # # # 0 # # # # 0

Powershell regresa $nullsi intenta obtener el valor detrás del final de la matriz.

En segundo lugar , el ciclo biggest neighbor pilecomenzó desde 16 hasta un máximo distinto de cero. Y anúlalo (el Ratón Hambriento se lo come).

for($n=16;$i=$a.IndexOf($n)){
    $a[$i]=0
    $n=(-1,1+-6..-4+4..6|%{$a[$i+$_]}|sort)[-1]
}

Tercero , suma de las pilas restantes.


3

SAS, 236 219 bytes

Entrada en tarjetas perforadas, una línea por cuadrícula (separada por espacios), salida impresa en el registro.

Este desafío es un poco complicado por algunas limitaciones de los arreglos en SAS:

  • No hay forma de devolver los índices de fila y columna de un elemento coincidente de una matriz multidimensional de pasos de datos: debe tratar la matriz como 1-d y luego resolverlos usted mismo.
  • Si se sale de los límites, SAS arroja un error y detiene el procesamiento en lugar de devolver nulo / cero.

Actualizaciones:

  • infile cards;Sentencia eliminada (-13)
  • Comodín usado a:para la definición de matriz en lugar de a1-a16(-4)

Golfizado:

data;input a1-a16;array a[4,4]a:;p=16;t=136;do while(p);m=whichn(p,of a:);t=t-p;j=mod(m-1,4)+1;i=ceil(m/4);a[i,j]=0;p=0;do k=max(1,i-1)to min(i+1,4);do l=max(1,j-1)to min(j+1,4);p=max(p,a[k,l]);end;end;end;put t;cards;
    <insert punch cards here>
    ; 

Sin golf:

data;                /*Produce a dataset using automatic naming*/
input a1-a16;        /*Read 16 variables*/
array a[4,4] a:;     /*Assign to a 4x4 array*/
p=16;                /*Initial pile to look for*/
t=136;               /*Total cheese to decrement*/
do while(p);         /*Stop if there are no piles available with size > 0*/
  m=whichn(p,of a:); /*Find array element containing current pile size*/
  t=t-p;             /*Decrement total cheese*/
  j=mod(m-1,4)+1;    /*Get column number*/
  i=ceil(m/4);       /*Get row number*/
  a[i,j]=0;          /*Eat the current pile*/
                     /*Find the size of the largest adjacent pile*/
  p=0;
  do k=max(1,i-1)to min(i+1,4);
    do l=max(1,j-1)to min(j+1,4);
      p=max(p,a[k,l]);
    end;
  end;
end;
put t;              /*Print total remaining cheese to log*/
                    /*Start of punch card input*/
cards; 
  4  3  2  1  5  6  7  8 12 11 10  9 13 14 15 16 
  8  1  9 14 11  6  5 16 13 15  2  7 10  3 12  4 
  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 
 10 15 14 11  9  3  1  7 13  5 12  6  2  8  4 16 
  3  7 10  5  6  8 12 13 15  9 11  4 14  1 16  2 
  8  9  3  6 13 11  7 15 12 10 16  2  4 14  1  5 
  8 11 12  9 14  5 10 16  7  3  1  6 13  4  2 15 
 13 14  1  2 16 15  3  4  5  6  7  8  9 10 11 12 
  9 10 11 12  1  2  4 13  7  8  5 14  3 16  6 15 
  9 10 11 12  1  2  7 13  6 16  4 14  3  8  5 15 
;                    /*End of punch card input*/
                     /*Implicit run;*/

1
+1 para el uso de tarjetas perforadas en PPCG :)
GNiklasch

3

Haskell , 163 bytes

o f=foldl1 f.concat
r=[0..3]
q n=take(min(n+2)3).drop(n-1)
0#m=m
v#m=[o max$q y$q x<$>n|y<-r,x<-r,m!!y!!x==v]!!0#n where n=map(z<$>)m;z w|w==v=0|0<1=w
f=o(+).(16#)

Pruébalo en línea!

La ffunción toma la entrada como una lista de 4 listas de 4 enteros.

Ligeramente no golfista

-- helper to fold over the matrix
o f = foldl1 f . concat

-- range of indices
r = [0 .. 3]

-- slice a list (take the neighborhood of a given coordinate)
-- first we drop everything before the neighborhood and then take the neighborhood itself
q n = take (min (n + 2) 3) . drop (n - 1)

-- a step function
0 # m = m -- if the max value of the previous step is zero, return the map
v # m = 
    -- abuse list comprehension to find the current value in the map
    -- convert the found value to its neighborhood,
    -- then calculate the max cell value in it
    -- and finally take the head of the resulting list
    [ o max (q y (q x<$>n)) | y <- r, x <- r, m!!y!!x == v] !! 0 
       # n -- recurse with our new current value and new map
    where 
        -- a new map with the zero put in place of the value the mouse currently sits on 
        n = map (zero <$>) m
        -- this function returns zero if its argument is equal to v
        -- and original argument value otherwise
        zero w 
            | w == v = 0
            | otherwise = w

-- THE function. first apply the step function to incoming map,
-- then compute sum of its cells
f = o (+) . (16 #)

3

JavaScript (ES7), 97 bytes

Toma la entrada como una matriz aplanada.

f=(a,s=p=136,m,d)=>a.map((v,n)=>v<m|(n%4-p%4)**2+(n-p)**2/9>d||(q=n,m=v))|m?f(a,s-m,a[p=q]=0,4):s

Pruébalo en línea!

Comentado

f = (                    // f= recursive function taking:
  a,                     // - a[] = flattened input array
  s =                    // - s = sum of cheese piles, initialized to 1 + 2 + .. + 16 = 136
      p = 136,           // - p = position of the mouse, initially outside the board
  m,                     // - m = maximum pile, initially undefined
  d                      // - d = distance threshold, initially undefined
) =>                     // 
  a.map((v, n) =>        // for each pile v at position n in a[]:
    v < m |              //   unless this pile is not better than the current maximum
    (n % 4 - p % 4) ** 2 //   or (n % 4 - p % 4)²
    + (n - p) ** 2 / 9   //      + (n - p)² / 9
    > d ||               //   is greater than the distance threshold:
    (q = n, m = v)       //     update m to v and q to n
  )                      // end of map()
  | m ?                  // if we've found a new pile to eat:
    f(                   //   do a recursive call:
      a,                 //     pass a[] unchanged
      s - m,             //     update s by subtracting the pile we've just eaten
      a[p = q] = 0,      //     clear a[q], update p to q and set m = 0
      4                  //     use d = 4 for all next iterations
    )                    //   end of recursive call
  :                      // else:
    s                    //   stop recursion and return s

¡Sí, nunca me hubiera acercado a eso!
Shaggy


3

Java 10, 272 248 bytes

m->{int r=0,c=0,R=4,C,M=1,x,y,X=0,Y=0;for(;R-->0;)for(C=4;C-->0;)if(m[R][C]>15)m[r=R][c=C]=0;for(;M!=0;m[r=X][c=Y]=0)for(M=-1,C=9;C-->0;)try{if((R=m[x=r+C/3-1][y=c+C%3-1])>M){M=R;X=x;Y=y;}}catch(Exception e){}for(var Z:m)for(int z:Z)M+=z;return M;}

Las celdas están marcadas de la misma manera que en mi respuesta para el desafío Todos los ochos individuales .
-24 bytes gracias a @ OlivierGrégoire .

Pruébalo en línea.

Explicación:

m->{                       // Method with integer-matrix parameter and integer return-type
  int r=0,                 //  Row-coordinate for the largest number, starting at 0
      c=0,                 //  Column-coordinate for the largest number, starting at 0
      R=4,C,               //  Row and column indices (later reused as temp integers)
      M=1,                 //  Largest number the mouse just ate, starting at 1
      x,y,X=0,Y=0;         //  Temp integers
  for(;R-->0;)             //  Loop `R` in the range (4, 0]:
    for(C=4;C-->0;)        //   Inner loop `C` in the range (4, 0]:
      if(m[R][C]>15)       //    If the current cell is 16:
        m[r=R][c=C]        //     Set `r,c` to this coordinate
          =0;              //     And empty this cell
  for(;M!=0;               //  Loop as long as the largest number isn't 0:
      ;                    //    After every iteration:
       m[r=X][c=Y]         //     Change the `r,c` coordinates,
         =0)               //     And empty this cell
    for(M=-1,              //   Reset `M` to -1
        C=9;C-->0;)        //   Inner loop `C` in the range (9, 0]:
          try{if((R=       //    Set `R` to:
            m[x=r+C/3-1]   //     If `C` is 0, 1, or 2: Look at the previous row
                           //     Else-if `C` is 6, 7, or 8: Look at the next row
                           //     Else (`C` is 3, 4, or 5): Look at the current row
             [y=c+C%3-1])  //     If `C` is 0, 3, or 6: Look at the previous column
                           //     Else-if `C` is 2, 5, or 8: Look at the next column
                           //     Else (`C` is 1, 4, or 7): Look at the current column
               >M){        //    And if the number in this cell is larger than `M`
                 M=R;      //     Change `M` to this number
                 X=x;Y=y;} //     And change the `X,Y` coordinate to this cell
          }catch(Exception e){}
                           //    Catch and ignore ArrayIndexOutOfBoundsExceptions
                           //    (try-catch saves bytes in comparison to if-checks)
  for(var Z:m)             //  Then loop over all rows of the matrix:
    for(int z:Z)           //   Inner loop over all columns of the matrix:
      M+=z;                //    And sum them all together in `M` (which was 0)
  return M;}               //  Then return this sum as result

podría no int int = c = X = Y = 0, R = 4, M = 1, x, y; ?
Serverfrog

@Serverfrog Me temo que no es posible al declarar las variables en Java. Sin embargo, su sugerencia me dio una idea para guardar un byte, usando int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;, así que gracias. :)
Kevin Cruijssen

1

J, 82 bytes

g=.](]*{:@[~:])]_1}~[:>./]{~((,-)1 5 6 7)+]i.{:
[:+/[:(g^:_)16,~[:,0,~0,0,0,.~0,.]

Pruébalo en línea!

Tengo la intención de campo de esta mañana más, y tal vez escribo una solución más J-ish similar a este uno , pero pensé que me gustaría probar el enfoque aplanado ya que no había hecho antes.


Lo que realmente necesita más a la izquierda ]en g?
Galen Ivanov el

1
Gracias Galen, tienes razón. Es el menor de los problemas con este código :) Tengo una solución mucho mejor que implementaré cuando tenga tiempo.
Jonás

1

Rojo , 277 bytes

func[a][k: 16 until[t:(index? find load form a k)- 1
p: do rejoin[t / 4 + 1"x"t % 4 + 1]a/(p/1)/(p/2): 0
m: 0 foreach d[-1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1][j: p + d
if all[j/1 > 0 j/1 < 5 j/2 > 0 j/2 < 5 m < t: a/(j/1)/(j/2)][m: t]]0 = k: m]s: 0
foreach n load form a[s: s + n]s]

Pruébalo en línea!

Es una solución realmente larga y no estoy contento con ella, pero pasé mucho tiempo arreglándola para que funcione en TIO (aparentemente hay muchas diferencias entre las versiones estables Win y Linux de Red), así que la publico de todos modos ...

Más legible:

f: func [ a ] [
    k: 16
    until [
        t: (index? find load form a n) - 1
        p: do rejoin [ t / 4 + 1 "x" t % 4 + 1 ]
        a/(p/1)/(p/2): 0
        m: 0
        foreach d [ -1 0x-1 1x-1 -1x0 1x0 -1x1 0x1 1 ] [
            j: p + d
            if all[ j/1 > 0
                    j/1 < 5
                    j/2 > 0
                    j/2 < 5 
                    m < t: a/(j/1)/(j/2)
            ] [ m: t ]
        ]
        0 = k: m
    ]
    s: 0
    foreach n load form a [ s: s + n ]
    s
]

1

Jalea ,  31 30  29 bytes

³œiⱮZIỊȦ
⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ
FḟÇS

Dado que el método es demasiado lento para ejecutarse dentro de los 60 segundos con el mouse encendido, 16esto la desactiva 9y limita su habilidad de tal manera que solo puede comer 9so menos. ¡ Pruébelo en línea! (así aquí ella come 9, 2, 7, 4, 8, 6, 3dejando97 ).

¿Cómo?

³œiⱮZIỊȦ - Link 1, isSatisfactory?: list of integers, possiblePileChoice
³        - (using a left argument of) program's 3rd command line argument (M)
   Ɱ     - map across (possiblePileChoice) with:
 œi      -   first multi-dimensional index of (the item) in (M)
    Z    - transpose the resulting list of [row, column] values
     I   - get the incremental differences
      Ị  - insignificant? (vectorises an abs(v) <= 1 test)
       Ȧ - any and all? (0 if any 0s are present in the flattened result [or if it's empty])

⁴ṖŒPŒ!€Ẏ⁴;ⱮṢÇƇṪ - Link 2, getChosenPileList: list of lists of integers, M
⁴               - literal 16
 Ṗ              - pop -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
  ŒP            - power-set -> [[],[1],[2],...,[1,2],[1,3],...,[2,3,7],...,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]]
      €         - for each:
    Œ!          -   all permutations
       Ẏ        - tighten (to a single list of all these individual permutations)
        ⁴       - (using a left argument of) literal 16
          Ɱ     - map across it with:
         ;      -   concatenate (put a 16 at the beginning of each one)
           Ṣ    - sort the resulting list of lists
             Ƈ  - filter keep those for which this is truthy:
            Ç   -   call last Link as a monad (i.e. isSatisfactory(possiblePileChoice)
              Ṫ - tail (get the right-most, i.e. the maximal satisfactory one)

FḟÇS - Main Link: list of lists of integers, M
F    - flatten M
  Ç  - call last Link (2) as a monad (i.e. get getChosenPileList(M))
 ḟ   - filter discard (the resulting values) from (the flattened M)
   S - sum

¡Ah, sí, el poder no es suficiente!
Jonathan Allan

2
@Arnauld: finalmente tuve un poco de tiempo para jugar al golf: D Esto debería funcionar, pero será (demasiado) demasiado lento para correr en TIO con el caso de prueba que usó antes.
Jonathan Allan

¿Podría el votante negativo dar algún comentario? Esto funciona, tiene una explicación completa y clara, y también es la entrada más corta en la actualidad.
Jonathan Allan

He votado a favor, pero dada la O ((n ^ 2)!) De esta respuesta, desearía que el desafío hubiera requerido tiempo polinómico.
lirtosiast el

1

No es mi mejor trabajo. Hay algunas mejoras definitivas que hacer, algunas probablemente fundamentales para el algoritmo utilizado: estoy seguro de que puede mejorarse usando solo un int[], pero no pude encontrar la manera de enumerar eficientemente a los vecinos de esa manera. ¡Me encantaría ver una solución PowerShell que use solo una matriz dimensional única!

PowerShell Core , 348 bytes

Function F($o){$t=120;$a=@{-1=,0*4;4=,0*4};0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};$m=16;while($m-gt0){0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};$m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;$t-=$m;$a[$r][$c]=0}$t}

Pruébalo en línea!


Versión más legible:

Function F($o){
    $t=120;
    $a=@{-1=,0*4;4=,0*4};
    0..3|%{$a[$_]=[int[]](-join$o[(3+18*$_)..(3+18*$_+13)]-split',')+,0};
    $m=16;
    while($m-gt0){
        0..3|%{$i=$_;0..3|%{if($a[$i][$_]-eq$m){$r=$i;$c=$_}}};
        $m=($a[$r-1][$c-1],$a[$r-1][$c],$a[$r-1][$c+1],$a[$r][$c+1],$a[$r][$c-1],$a[$r+1][$c-1],$a[$r+1][$c],$a[$r+1][$c+1]|Measure -Max).Maximum;
        $t-=$m;
        $a[$r][$c]=0
    }
    $t
}


Ah, sí, lo extraño que noté es que intentar hacer el trabajo en (array|sort)[-1]lugar de Measure -maxtrabajar en PSv5 pero obtener resultados incorrectos en el núcleo. No tengo idea de por qué.
Veskah

Si, eso es raro. Lo probé (0..10|sort)[-1]pero devuelve 10 en PSv5 pero 9 en PS Core. Esto se debe a que lo trata en orden lexicográfico en lugar de numérico. Lástima que.
Jeff Freeman

Microsoft clásico cambiando las cosas importantes.
Veskah

Estoy de acuerdo en este caso. No estoy seguro de por qué PS Core Sort arroja una matriz de int32 a una matriz de cadenas. Pero, esto se está desviando, así que me desviaré. Gracias por la reestructuración!
Jeff Freeman

1

C (gcc), 250 bytes

x;y;i;b;R;C;
g(int a[][4],int X,int Y){b=a[Y][X]=0;for(x=-1;x<2;++x)for(y=-1;y<2;++y)if(!(x+X&~3||y+Y&~3||a[y+Y][x+X]<b))b=a[C=Y+y][R=X+x];for(i=x=0;i<16;++i)x+=a[0][i];return b?g(a,R,C):x;}
s(int*a){for(i=0;i<16;++i)if(a[i]==16)return g(a,i%4,i/4);}

Pruébalo en línea!

Nota: Este envío modifica la matriz de entrada.

s()es la función para llamar con un argumento de un mutable int[16](que es el mismo en memoria que an int[4][4], que es lo que lo g()interpreta como).

s()encuentra la ubicación de 16en la matriz, luego pasa esta información a g, que es una función recursiva que toma una ubicación, establece el número en esa ubicación a 0 y luego:

  • Si hay un número positivo adyacente, repita con la ubicación del número adyacente más grande

  • De lo contrario, devuelve la suma de los números en la matriz.


s(int*a){for(i=0;a[i]<16;++i);return g(a,i%4,i/4);}
RiaD

Si g devuelve la suma de comida, no necesita calcular la suma en ella. Solo devuelva 16 * 17/2-g () al final de s
RiaD

¿Puedes usar bitwise o en su lugar si es lógico o?
RiaD



1

Agregar ++ , 281 bytes

D,f,@@,VBFB]G€=dbLRz€¦*bMd1_4/i1+$4%B]4 4b[$z€¦o
D,g,@@,c2112011022200200BD1€Ω_2$TAVb]8*z€kþbNG€lbM
D,k,@~,z€¦+d4€>¦+$d1€<¦+$@+!*
D,l,@@#,bUV1_$:G1_$:
D,h,@@,{l}A$bUV1_$:$VbU","jG$t0€obU0j","$t€iA$bUpVdbLRG€=€!z€¦*$b]4*$z€¦o
y:?
m:16
t:120
Wm,`x,$f>y>m,`m,$g>x>y,`y,$h>x>y,`t,-m
Ot

Pruébalo en línea!

Oof, esto es complicado.

Verificar todos los casos de prueba

Cómo funciona

Para esta explicación, usaremos la entrada

M=[37105681213159114141162]

x1x16M4x4

  • f(x,M)4x4xMx=16Mf(x,M)=(4,3)

  • g(M,y)f(x,M)g(M,f(x,M))=11

    Esto implementa las dos funciones auxiliares:

    k(x)

    l(M,y)

  • h(y,M)0

016120(1+2++14+15)

0

0

  • f(y,m)16Mx:=(4,3)
  • g(x,y)0
  • h(x,y)160
  • tm

Finalmente, la salida t , es decir, los valores restantes no recopilados.


1

C # (.NET Core) , 258 bytes

Sin LINQ El uso de System.Collections.Generic es para el formateo posterior; la función no lo requiere.

e=>{int a=0,b=0,x=0,y=0,j=0,k;foreach(int p in e){if(p>15){a=x=j/4;b=y=j%4;}j++;}e[x,y]=0;while(1>0){for(j=-1;j<2;j++)for(k=-1;k<2;k++){try{if(e[a+k,b+j]>e[x,y]){x=a+k;y=b+j;}}catch{}}if(e[x,y]<1)break;e[x,y]=0;a=x;b=y;}a=0;foreach(int p in e)a+=p;return a;}

Pruébalo en línea!


1

Perl 6 , 151 136 126 125 119 bytes

{my@k=$_;my $a=.grep(16,:k)[0];while @k[$a] {@k[$a]=0;$a=^@k .grep({2>$a+>2-$_+>2&$a%4-$_%4>-2}).max({@k[$_]})};[+] @k}

Solución súper cutre. Toma la entrada como matriz aplanada.

Pruébalo en línea!


1

Perl 5 -MList::Util=sum -p , 137 bytes

splice@F,$_,0,0for 12,8,4;map{$k{++$,}=$_;$n=$,if$_&16}@F;map{map{$n=$_+$"if$k{$"+$_}>$k{$n}&&!/2|3/}-6..6;$k{$"=$n}=0}@F;$_=sum values%k

Pruébalo en línea!


1

K (ngn / k) , 49 bytes

{{h[,x]:0;*>(+x+0,'1-!3 3)#h}\*>h::(+!4 4)!x;+/h}

Pruébalo en línea!

la entrada ( x) es una matriz 1d

(+!4 4)!x un diccionario que asigna pares de coordenadas a los valores de x

h:: asignar a una variable global h

*> la clave correspondiente al valor máximo

{ }\ repetir hasta la convergencia, recogiendo valores intermedios en una lista

h[,x]:0 cero la posición actual

+x+0,'1-!3 3 puestos de vecinos

( )#hfiltrarlos hcomo un diccionario más pequeño

*>¿Qué vecino tiene el valor máximo? se convierte en la posición actual para la nueva iteración

+/hfinalmente, devuelve la suma de hlos valores restantes de


1

Wolfram Language (Mathematica) , 124 115 bytes

(p=#&@@Position[m=Join@@ArrayPad[#,1],16];Do[m[[p]]=0;p=MaximalBy[#&@@p+{0,-1,1,-5,5,-6,6,-7,7},m[[#]]&],16];Tr@m)&

Pruébalo en línea!

Esto toma una matriz 2D, la rellena a cada lado, luego la aplana inmediatamente para que no tengamos que gastar la indexación de bytes. El único costo para esto es Join@@aplanar. Luego se procede como a continuación.

Versión de 124 bytes para una matriz 2D: ¡ Pruébelo en línea!

Principalmente mi propio trabajo, con un poco derivado de la respuesta de 149 bytes de J42161217 .

Sin golf:

(p = #& @@ Position[m = #~ArrayPad~1,16];     m = input padded with a layer of 0s
                                              p = location of 16
Do[
    m = MapAt[0&,m,p];                        Put a 0 at location p
    p = #& @@ MaximalBy[                      Set p to the member of
        p+#& /@ Tuples[{0,-1,1},2],             {all possible next locations}
        m~Extract~#&],                        that maximizes that element of m,
                                              ties broken by staying at p+{0,0}=p.
16];                                        Do this 16 times.
Tr[Tr/@m]                                   Finally, output the sum of m.
)&
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.