Rompi la cassaforte!


10

Ispirato da /puzzling/24334/to-catch-a-thief

Ti viene data una griglia nby n(di per nsé è un input opzionale) riempita con 0s e 1s (o qualsiasi altro personaggio di tua scelta). Il tuo obiettivo è quello di rendere ogni cella uguale (o 0o 1). È possibile effettuare una serie di mosse come definito di seguito (notare la dissomiglianza con il collegamento Puzzling SE):

  • Seleziona una cella.
  • Ogni cella nella stessa riga e colonna (tranne la cella stessa) viene cambiata nel suo opposto. 0verso 1e 1verso 0.

Emette il numero minimo di mosse richieste per completare l'attività. Se irrisolvibile, emette qualcosa tranne un numero intero non negativo. Il codice più corto vince.

Dati di esempio

1 0 0
0 0 0
0 0 0

-1

1 1 1
1 1 1
1 1 1

0

1 0 1
0 1 0
1 0 1

1

1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1

2

0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1

2


3
Cosa fare se il puzzle è irrisolvibile? Ad esempio 1000(riorganizzato come un quadrato, non importa come).
orlp,


@orlp Qualsiasi output che non è un numero farà.
ghosts_in_the_code

Dobbiamo analizzare l'input o può essere un tipo di dati array già riempito?
coredump,

1
Qual è la soluzione per il primo caso di test? Non sto ottenendo soluzioni per questo.
cardboard_box

Risposte:


4

Matlab 171 byte

L'input dovrebbe essere una matrice 2d, quindi la chiameresti come c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])(i punti e virgola iniziano una nuova riga). Questa funzione rinforza semplicemente tutte le mosse possibili, quindi otteniamo un tempo di esecuzione di O(2^(n^2)).

Come è fatto

Questo viene fatto scegliendo tutti i modi possibili per riempire un'altra matrice della stessa dimensione con una e zero, questo in pratica conta in binario, dove ogni voce della matrice rappresenta una certa potenza di 2.

Quindi eseguiamo le mosse su quelle celle che sono 1, questo viene fatto dalla somma (mod 2) di una convoluzione bidimensionale con un vettore di dimensioni 1xn e nx1.

Alla fine decidiamo se quelle mosse hanno effettivamente prodotto il risultato desiderato, calcolando la deviazione standard su tutte le voci. La deviazione standard è zero solo se tutte le voci sono uguali. E ogni volta che abbiamo effettivamente trovato il risultato desiderato lo confrontiamo con il numero di mosse delle soluzioni precedenti. La funzione tornerà infse il problema indicato non è risolvibile.

Matematica?

In realtà vale la pena notare che tutte quelle mosse insieme generano un gruppo abeliano! Se qualcuno riesce effettivamente a verificare quei gruppi, per favore fatemelo sapere.

Versione golfizzata:

function M=c(a);n=numel(a);p=a;M=inf;o=ones(1,n);for k=0:2^n-1;p(:)=dec2bin(k,n)-'0';b=mod(conv2(p,o,'s')+conv2(p,o','s'),2);m=sum(p(:));if ~std(b(:)-a(:))&m<M;M=m;end;end

Versione completa (con l'output delle mosse effettive.)

function M = c(a)
n=numel(a);
p=a;
M=inf;                                               %current minimum of number of moves
o=ones(1,n);
for k=0:2^n-1;
    p(:) = dec2bin(k,n)-'0';                         %logical array with 1 where we perform moves
    b=mod(conv2(p,o,'same')+conv2(p,o','same'),2);   %perform the actual moves
    m=sum(p(:));                                     %number of moves;
    if ~std(b(:)-a(:))&m<M                           %check if the result of the moves is valid, and better
        M=m;
        disp('found new minimum:')
        disp(M)                                      %display number of moves of the new best solution (not in the golfed version)
        disp(p)                                      %display the moves of the new best solution                               (not in the golfed version)
    end
end

1

Perl 5, 498 byte

Questo accetta 'n' e il risultato desiderato e genera il conteggio, o 'X' se nessuno.

Per esempio:

perl ./crack.golf.pl 3 000111111

2. Funzionerà solo quando n ^ 2 <= 64, quindi n <= 8. Anche se è piuttosto lento anche con n a partire da 5. Costruisce un array ^ 3 bit e ordina in anticipo un array 2 ^ (n ^ 2), perché perché no ?

Ho sprecato un paio di avanzamenti di riga qui per leggibilità :

$n=shift;$y=shift;$p=$n*$n;@m=(0..$n-1);@q=(0..$p-1);@v=(0..2**$p-1);@d=map{0}(@q);@b=map{$r=$_;map{$c=$_;$d[$r*$n+$_]^=1 for(@m);$d[$_*$n+$c]^=1 for(@m);$j=0;$k=1;
map{$j|=$k*$d[$_];$k<<=1;}@q;@d=map{0}(@q);$j;}@m}@m;for$k(sort{$a->[0]<=>$b->[0]}map{$z=0;map{$z+=$_}split(//,sprintf"%b",$_);[$z,$_]}@v){$l=sprintf"%0${p}b",$k->[1];
@m=map{$_}split(//,$l);$s=0;for(@q){$s^=$b[$_]if$m[$_];}$z=0;map{$z+=$_}split(//,sprintf"%b",$_);if($y eq sprintf"%0${p}b",$s){print"$k->[0]\n";exit 0;}}print"X\n";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.