La souris affamée


85

Seize piles de fromage sont placées sur un carré de 4x4. Ils sont étiquetés de à . Le plus petit tas est et le plus grand est .116116

La souris affamée a tellement faim qu’elle passe toujours directement à la pile la plus grosse ( ) et la mange tout de suite.16

Après cela, il se dirige vers le plus gros tas voisin et le mange rapidement. (Ouais… C'est vraiment affamé.) Et ainsi de suite jusqu'à ce qu'il n'y ait plus de tas de voisins.

Une pile peut avoir jusqu'à 8 voisins (horizontalement, verticalement et en diagonale). Il n'y a pas de bouclage.

Exemple

Nous commençons avec les piles de fromage suivantes:

37105681213159114141162

La souris affamée mange d’abord , puis sa plus grande pile de voisins, qui est .1611

37105681213159🐭41412

Ses prochains mouvements sont , , , , , , , , et dans cet ordre exact.131210815149673

🐭5412

Il n'y a plus de fromage autour de la souris affamée, alors ça s'arrête là.

Le défi

Compte tenu de la configuration initiale du fromage, votre code doit imprimer ou renvoyer la somme des piles restantes une fois que Hungry Mouse a cessé de les manger.

Pour l'exemple ci-dessus, la réponse attendue est .12

Règles

  • Étant donné que la taille de la matrice d'entrée est fixe, vous pouvez la prendre comme un tableau 2D ou un tableau unidimensionnel.
  • Chaque valeur de à est garantie pour apparaître exactement une fois.116
  • C'est du .

Cas de test

[ [ 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 pour ce personnage de souris
Luis Mendo

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

9
Quel défi bien écrit! Je garderai cela à l'esprit pour les meilleures candidatures.
XNOR

9
Après avoir mal lu, j'étais un peu triste que ce ne soit pas un orignal affamé.
akozi

1
Ce défi me rappelle la souris dans le programme de labyrinthe pour l’ordinateur txo. Ce jeu a été écrit dans les années 50 et le txo a été le premier ordinateur à transistors au monde, selon la légende. Oui, croyez-le ou non, quelqu'un écrivait des jeux vidéo à l'époque de votre grand-père.
Walter Mitty

Réponses:


11

Python 2 , 133 à 130 octets

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)

Essayez-le en ligne!

Prend une liste aplatie de 16 éléments.

Comment ça fonctionne

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)

L'expression de cellules adjacentes a[i+x]for x in[-6,-5,-4,-1,1,4,5,6]peut être raccourcie à a[i+j+j/3*2-6]for j in range(9)(l'entrée zéro est inoffensive). Python 3 peut certainement faire plus court en codant en dur un bytestring de longueur 8, mais Python 2 pourrait quand même être meilleur dans l'ensemble.
xnor

1
Bien que votre boucle de remplissage zéro est intelligent, on dirait qu'il est plus court de prendre une liste 2D: a=[0]*5 for r in input():a=r+[0]+a. Peut-être existe-t-il une solution de tranchage de cordes encore plus courte qui ne nécessite pas d'itération.
xnor

8

Python 2 , 111 octets

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)

Essayez-le en ligne!

Méthode et cas de test adaptés de Bubbler . Prend une liste plate sur STDIN.

Le code vérifie si deux index plats iet jreprésentent les cellules en contact en vérifiant que la différence de ligne i/4-j/4et de colonne i%4-j%4est strictement comprise entre -2 et 2. Cette vérification réussit automatiquement au premier passage, de sorte que la plus grande entrée soit trouvée sans tenir compte de la contiguïté.


8

MATL , 50 49 47 octets

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

L'entrée est une matrice, utilisant ;comme séparateur de lignes.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

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, mais pouvez-vous économiser un peu si vous appuyez sur -136 au lieu de +136?
Titus

@Titus Hm je ne vois pas comment
Luis Mendo

ou l’inverse: je pensais au lieu de 1) appuyer sur 136 2) appuyer sur chaque valeur consommée 3) résumer les valeurs mangées 4) soustraire de 136 -> 1) appuyer sur 136 2) appuyer sur le négatif de la valeur mangée 3) résumer la pile. Mais comme ce n'est évidemment qu'un octet chacun; ce n'est probablement pas un gain.
Titus

@ Titus Ah, oui, je pense que cela utilise le même nombre d'octets. En outre, j'ai besoin de chaque valeur consommée (pas son négatif) pour la différence définie; la négation devrait être faite à la fin
Luis Mendo

6

PHP, 177 174 171 octets

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;

Courez avec -nr, fournissez des éléments de matrice comme arguments ou essayez-le en ligne .


5

JavaScript, 122 octets

J'ai fait plus que quelques mauvais tours sur celui-ci et maintenant je n'ai plus de temps pour jouer au golf, mais au moins ça marche. Je reviendrai demain (ou, me connaissant, dans le train ce soir!), Si je peux trouver une minute.

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]))

Essayez-le en ligne


3
+1 pour flatMap(): p
Arnauld

: Je pense que c'est la première fois que je l'utilise pour le golf! Par intérêt (et pour me donner une cible quand j'y reviens), quel a été votre score lorsque vous l'avez essayé?
Shaggy

Je n'ai pas eu une minute pour revenir à cela aujourd'hui. Espérons que cela signifie que je pourrai recommencer demain avec des yeux complètement nouveaux.
Shaggy

J'ai posté ma solution.
Arnauld

5

R , 128 124 123 112 110 octets

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)}

Essayez-le en ligne!

Il crée une matrice 4x4 (ce qui m'a aidé à visualiser les choses), la remplit de 0, puis commence à 16 et cherche dans les "piles" environnantes la plus grande suivante, et ainsi de suite.

En conclusion, il émet un avertissement, mais cela n’a aucune conséquence et ne change pas le résultat.

EDIT: -4 octets en compressant l'initialisation de la matrice en 1 ligne.

EDIT: -1 merci à Robert Hacken

EDIT: -13 octets combinant les suggestions de Giuseppe et Robin Ryder.


Vous pouvez enregistrer un octet de changement r==16pour r>15.
Robert Hacken

1
117 octets - changez-le en une fonction prenant une matrice et faites un alias avec le which.
Giuseppe

2
112 octets améliorant les suggestions de @Giuseppe: vous pouvez stocker en mtant que logique plutôt qu’un entier, et n’avez donc besoin d’appeler whichqu’une fois au lieu de deux.
Robin Ryder

110 octets utilisant @RobinRyder 's golf et jouant avec la compression de la matrice de voisinage.
Giuseppe

1
@ Sumner18 X%o%Yest un alias pour outer(X,Y,'*'). outerest l’une des fonctions les plus pratiques car elle peut fonctionner comme la fonction "broadcast" d’Octave / MATLAB / MATL avec des opérateurs aribtrary (vectorisés). Voir ici ; Ce kroneckerqui est également lié dans cette page est également pratique .
Giuseppe

4

Charbon de bois , 47 octets

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

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

EA⭆ι§αλ

Convertissez les nombres entrés en caractères alphabétiques (A = 0 .. Q = 16) et imprimez-les sous forme de grille 4x4.

≔Qθ

Commencez par manger le Q, soit 16.

W›θA«

Répétez pendant qu'il y a quelque chose à manger.

≔⌕KAθθ

Trouvez où se trouve la pile. Il s’agit d’une vue linéaire par rangée majeure.

J﹪θ⁴÷θ⁴

Convertir en coordonnées et aller à cet endroit.

≔⌈KMθ

Trouvez la plus grande pile adjacente.

Mangez la pile actuelle.

≔ΣEKA⌕αιθ

Convertissez les piles en entiers et prenez la somme.

⎚Iθ

Efface le canevas et affiche le résultat.


3

Powershell, 143 141 136 130 122 121 octets

$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

Script de test moins joué:

$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"
}

Sortie:

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

Explication:

Tout d’abord , ajoutez les bordures supérieure et inférieure de 0 et créez un tableau à une dimension:

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

     ↓

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

Powershell renvoie $nullsi vous essayez d'obtenir la valeur derrière la fin du tableau.

Deuxièmement , la boucle a biggest neighbor piledémarré de 16 à maximum non nul. Et annulez-le (la souris affamée le mange).

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

Troisièmement , la somme des piles restantes.


3

SAS, 236 219 octets

Entrée sur des cartes perforées, une ligne par grille (séparées par des espaces), sortie imprimée dans le journal.

Ce défi est légèrement compliqué par certaines limitations des tableaux dans SAS:

  • Il n’existe aucun moyen de renvoyer les index de ligne et de colonne d’un élément correspondant à partir d’un tableau multidimensionnel: vous devez traiter le tableau comme 1D, puis vous en occuper vous-même.
  • Si vous sortez des limites, SAS génère une erreur et interrompt le traitement plutôt que de renvoyer null / zero.

Mises à jour:

  • Déclaration supprimée infile cards;(-13)
  • Caractère générique utilisé a:pour la définition d'un tableau plutôt que a1-a16(-4)

Golfé:

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

Ungolfed:

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 pour l'utilisation de cartes perforées dans PPCG :)
GNiklasch

3

Haskell , 163 octets

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#)

Essayez-le en ligne!

La ffonction prend l'entrée sous forme de liste de 4 listes de 4 nombres entiers.

Légèrement non-golfé

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

Prend les entrées sous forme de tableau aplati.

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

Essayez-le en ligne!

Commenté

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

Oui, je n'aurais jamais pu me rapprocher de ça!
Shaggy


3

Java 10, 272 248 octets

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

Les cellules sont vérifiées de la même manière que dans ma réponse au défi Tous les célibataires .
-24 octets grâce à @ OlivierGrégoire .

Essayez-le en ligne.

Explication:

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

Pourriez-vous ne pas utiliser r = c = X = Y = 0, R = 4, M = 1, x, y; ?
Serverfrog

@Serverfrog Je crains que ce ne soit pas possible lors de la déclaration des variables en Java. Votre suggestion m'a néanmoins donné l'idée de sauvegarder un octet en l'utilisant int r,c,R=4,M=1,x,y,X,Y;for(r=c=X=Y=0;, alors merci. :)
Kevin Cruijssen

1

J, 82 octets

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

Essayez-le en ligne!

Je prévois de jouer au golf encore plus demain et d’écrire peut-être une solution plus semblable à celle- ci , mais j’ai pensé que j’essaierais l’approche aplatie puisque je ne l’avais pas fait auparavant.


Avez-vous vraiment besoin du plus ]à gauche g?
Galen Ivanov

1
Merci Galen, tu as raison. C'est le moindre des problèmes avec ce code :) J'ai une solution bien meilleure que je mettrai en œuvre lorsque j'aurai le temps.
Jonas

1

Rouge , 277 octets

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]

Essayez-le en ligne!

C'est une très longue solution et je n'en suis pas content, mais j'ai passé beaucoup de temps à la réparer pour qu'elle fonctionne dans TIO (apparemment, il y a beaucoup de différences entre les versions stables de Win et Linux de Red), alors je la publie quand même ...

Plus lisible:

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

Jelly ,  31 30  29 octets

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

Comme la méthode est beaucoup trop lente pour fonctionner dans les 60s avec la souris, 16cela la commence à 9et limite ses capacités, de sorte qu'elle ne peut manger que 9s ou moins Essayez-le en ligne! (donc ici elle mange en 9, 2, 7, 4, 8, 6, 3partant 97).

Comment?

³œ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 oui, le pouvoir ne suffit pas!
Jonathan Allan

2
@Arnauld - j'ai enfin eu un peu de temps pour jouer au golf: D Cela devrait fonctionner, mais sera trop lent pour fonctionner avec TIO avec le scénario de test que vous avez utilisé auparavant.
Jonathan Allan

Est-ce que l'électeur baissier pourrait donner quelques commentaires? Cela fonctionne, a une explication complète et claire, et est également l'entrée la plus courte à l'heure actuelle.
Jonathan Allan

J'ai voté, mais étant donné le O ((n ^ 2)!) De cette réponse, j'aimerais que le défi ait nécessité un temps polynomial.
lirtosiast

1

Pas mon meilleur travail. Il y a certaines améliorations à apporter, certaines probablement fondamentales pour l'algorithme utilisé - je suis sûr qu'il peut être amélioré en utilisant seulement un int[], mais je ne pouvais pas comprendre comment énumérer efficacement les voisins de cette façon. J'aimerais beaucoup voir une solution PowerShell n'utilisant qu'un seul tableau à une dimension!

PowerShell Core , 348 octets

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}

Essayez-le en ligne!


Version plus lisible:

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
}


Oh ouais, ce que j'ai remarqué de bizarre, c'est d'essayer de faire le travail au (array|sort)[-1]lieu de Measure -maxfonctionner en PSv5, mais d'obtenir des résultats incorrects dans le noyau. Aucune idée pourquoi.
Veskah

Ouais, c'est bizarre. Je l'ai testé (0..10|sort)[-1]mais il retourne 10 sur PSv5 mais 9 sur PS Core. C'est parce qu'il le traite dans l'ordre lexicographique au lieu de numérique. Dommage que.
Jeff Freeman

Microsoft classique change les choses importantes.
Veska le

Je suis d'accord dans ce cas. Je ne suis pas sûr pourquoi PS Core Sort jette un tableau d'int32 à un tableau de chaînes. Mais, ceci est en train de s'égarer, alors je vais faire une digression. Merci pour la restructuration!
Jeff Freeman le

1

C (gcc), 250 octets

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

Essayez-le en ligne!

Remarque: cette soumission modifie le tableau d'entrée.

s()est la fonction à appeler avec un argument d'un mutable int[16](qui est le même en mémoire comme un int[4][4], ce qui est g()l'interprète comme).

s()trouve l'emplacement de la 16dans le tableau, puis transmet cette information à g, qui est une fonction récursive qui prend un emplacement, définit le nombre à cet emplacement sur 0, puis:

  • Si un nombre positif est adjacent, indiquez à nouveau l'emplacement du plus grand nombre adjacent.

  • Sinon, renvoyer la somme des nombres dans le tableau.


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

si g renvoie la somme de ce que vous avez mangé, vous n'avez pas besoin de la calculer. Il suffit de retourner 16 * 17/2-g () à la fin de s
RiaD

pouvez-vous utiliser au niveau des bits ou plutôt si logique ou?
RiaD



1

Ajouter ++ , 281 octets

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

Essayez-le en ligne!

Oof, c'est compliqué.

Vérifier tous les cas de test

Comment ça fonctionne

Pour cette explication, nous allons utiliser l'entrée

M=[37105681213159114141162]

x1x16M4x4

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

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

    Ceci implémente les deux fonctions d'assistance:

    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

Enfin, la sortie t , c’est-à-dire les valeurs restantes non collectées.


1

C # (.NET Core) , 258 octets

Sans LINQ. L'utilisation de System.Collections.Generic est destinée au formatage suivant - la fonction ne l'exige pas.

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

Essayez-le en ligne!


1

Perl 6 , 151 136 126 125 119 octets

{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}

Super solution minable. Prend les entrées sous forme de tableau aplati.

Essayez-le en ligne!


1

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

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

Essayez-le en ligne!


1

K (ngn / k) , 49 octets

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

Essayez-le en ligne!

l'entrée ( x) est un tableau 1d

(+!4 4)!x un dictionnaire qui mappe des paires de coordonnées aux valeurs de x

h:: assigner à une variable globale h

*> la clé correspondant à la valeur maximale

{ }\ répéter jusqu'à la convergence, en collectant les valeurs intermédiaires dans une liste

h[,x]:0 mettre à zéro la position actuelle

+x+0,'1-!3 3 positions voisines

( )#hfiltrez-les hcomme un petit dictionnaire

*>quel voisin a la valeur maximale? il devient la position actuelle pour la nouvelle itération

+/henfin, renvoyer la somme des hvaleurs restantes de


1

Wolfram Language (Mathematica) , 124 115 octets

(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)&

Essayez-le en ligne!

Cela prend un tableau 2D, le remplit de chaque côté, puis l'aplatit immédiatement afin que nous n'ayons pas à passer d'octets d'indexation. Le seul coût pour cela est Join@@d'aplatir. Ensuite, cela se passe comme ci-dessous.

Version 124 octets pour un tableau 2D: essayez-le en ligne!

Principalement mon propre travail, avec un peu dérivé de la réponse de 149 octets de J42161217 .

Ungolfed:

(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.
)&
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.