安全をクラック!


10

/puzzling/24334/to-catch-a-thiefに触発されました

sとs(または任意の他の文字)で満たされたnby nnそれ自体はオプションの入力)グリッドが与えられます。すべてのセルを同じにすることを目的としています(または)。以下に定義する一連の動きを行うことができます(Puzzling SEリンクとの相違点に注意してください)。0101

  • セルを選択します。
  • 同じ行と列のすべてのセル(セル自体を除く)は、その反対に変更されます。0110

タスクを完了するために必要な最小移動数を出力します。解決できない場合は、負でない整数以外を出力します。最短のコードが勝ちます。

サンプルデータ

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
パズルが解けない場合はどうしますか?例1000(正方形として再配置され、どのようにしてもかまいません)。
orlp


@orlp数値ではない出力はすべて実行されます。
ghosts_in_the_code

入力を解析する必要がありますか、それともすでに入力済みの配列データ型にすることができますか?
コアダンプ

1
最初のテストケースの解決策は何ですか?解決策はありません。
cardboard_box

回答:


4

Matlab 171バイト

入力は2d行列である必要があるため、次のように呼び出します c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])(セミコロンで新しい行を開始します)。この関数はすべての可能な動きをブルートフォースするだけなので、次のランタイムを取得しますO(2^(n^2))

それがどのように行われるか

これは、同じサイズの別の行列を1と0で埋めるすべての可能な方法を選択することによって行われます。これは基本的に、行列の各エントリが2のべき乗を表すバイナリでカウントされます。

次に、移動を実行します、1であるセルに対して。これは、サイズ1xnとnx1のベクトルとの2つの2次元畳み込みの合計(mod 2)によって行われます。

最後に、すべてのエントリの標準偏差を計算することにより、それらの動きが実際に望ましい結果を生み出したかどうかを判断します。すべてのエントリが同じ場合、標準偏差はゼロのみです。そして、実際に望ましい結果を見つけたときはいつでも、それを以前のソリューションの移動回数と比較します。関数は戻りますinf与えられた問題が解決できない場合、ます。

数学?

これらすべての動きが一緒にアーベル群を生成することは実際に注目に値します!誰かが実際にそれらのグループを沈静化させることができたら、私に知らせてください。

ゴルフ版:

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

フルバージョン(実際の動きの出力を含む)

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バイト

これは「n」と目的の結果を受け入れ、カウントを出力します。カウントがない場合は「X」を出力します。

例えば:

perl ./crack.golf.pl 3 000111111

与え2ます。n ^ 2 <= 64の場合にのみ機能しn <= 8ます。それも5という低nはかなり遅いですが、それは^ 3ビットの配列を作成し、事前に2 ^(N ^ 2)の配列をソートし、理由はなぜ

ここでは、読みやすくするためにいくつかの改行を無駄にしています。

$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";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.