フリッピンスクエア


34

行または列のみを反転(中心点を中心に反転)することにより、数字の正方形を混乱させるプログラムまたは関数を作成します。

入力

入力は、次のような9行の文字列の形式の9x9の数字グリッドです。

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

この入力形式は交渉不可能です。入力形式で「創造的」なソリューションは無効と見なされます。

出力

出力は、指定された順序で入力に適用されたときにターゲットグリッドを再作成する必要があるフリップ移動のリストである必要があります。

出力例(前の入力例の解決策ではありません):

28IF5D3EAB9G3

この出力形式も交渉不可です。出力には改行やスペースがなく、文字1- 9A- のみがI必要です(必要に応じて、大文字の代わりに小文字を使用できます)。

ターゲットグリッド(再作成する必要がある状態)は次のとおりです。

123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

数字1- 9行を反転するための指示として使用する必要があり、文字A- Iは列に使用する必要があります。これは、グリッドが復元された状態で以下に示されています。

     ABCDEFGHI
     |||||||||
     vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678

したがって、8手段は下から2行目をF反転し、手段は6列目を反転します。

解決策がない場合、プログラムは何も出力せずに終了する必要があります。

入力:

987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

出力:

1

この場合、目標の状態に戻るには、一番上の行のみを反転する必要があります。

入力:

123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679

出力:

I

この場合、最終状態の列(column I)のみを反転して、目標状態を再作成する必要があります。

入力:

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

出力:

2I

この場合、行2を反転してから列Iを反転して目標状態に戻す必要があります。

ノート:

  • 回答に使用例を記入してください。
  • 指定された出力は、目標状態を返す最短のシーケンスである必要はありません-目標状態を返すシーケンスは、機能する限り(つまり、テストできる限り)実行されます
  • 私は、それぞれの答えをテストし、機能し、明らかにゴルフに挑戦したことがあるすべての回答に賛成するよう努めます。
  • これは自由競争です。来週中に最短の回答を受け入れますが、将来のいずれかの時点でより短い新しい有効な回答が来た場合は、それを反映するために受け入れられた回答を変更します
  • 報奨金は、2014年1月26日23時59分59秒(GMT)までに受け取った最短回答で200評判に設定されています。報奨金は268文字のGolfScriptソリューションでハワードに授与されました。

テスト中

次の3つのテストグリッドのプログラムの出力と回答を提供してください。

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

927354389
194762537
319673942
351982676
567891234
523719844
755128486
268534198
812546671

813654789
738762162
344871987
341989324
567891234
576217856
619623552
194435598
926543271

テスト用の有効なグリッドを生成する小さなPythonプログラムを作成しました。

import random

def output(array):
  print '\n'.join([''.join(row) for row in array])

def fliprow(rownum, array):
  return [row[::1-2*(rownum==idx)] for idx,row in enumerate(array)]

def flipcol(colnum, array):
  return zip(*fliprow(colnum, zip(*array)))

def randomflip(array):
  op=random.randint(0,1)
  row=random.randint(0,9)
  if(op==1):
    return fliprow(row, array)
  else:
    return flipcol(row, array)

def jumble(array):
  arraycopy=array
  for i in range(10, 1000):
    arraycopy=randomflip(arraycopy)
  return arraycopy

startarray=[
['1','2','3','4','5','6','7','8','9'],
['2','3','4','5','6','7','8','9','1'],
['3','4','5','6','7','8','9','1','2'],
['4','5','6','7','8','9','1','2','3'],
['5','6','7','8','9','1','2','3','4'],
['6','7','8','9','1','2','3','4','5'],
['7','8','9','1','2','3','4','5','6'],
['8','9','1','2','3','4','5','6','7'],
['9','1','2','3','4','5','6','7','8']]

print output(jumble(startarray))

8
並べ替えが完了するまで、行/列をランダムに反転させる短いソリューションを作成しました。5億回の反復後、最初に与えたパズル(行1を反転するだけでよい)をまだ解決していませんでした。ランダム性は、この問題の有効な解決策ではないようです!
ジョシュ14年

3
@ジョシュ驚くことではありません。この問題は、ルービックキューブの解決と非常に似ているようです。ある種の幅優先検索が最高のブルートフォースになると思います。とはいえ、ランダムアルゴリズムは理論的には最終的に終了する必要があり、指定されたルールに適合するように見えます。
ランチャー14年

4
ブルートフォースは必要ありません。各グリッドタイルは、正しい場所、Xの反転、Yの反転、XYの反転の4つの位置のいずれかでしか終了できないという事実を考慮してください。これは、グリッドを(0,0)が最も中央のタイルであると精神的に扱うのに役立つ場合があります。あなたは(-2、4)タイルを解決している場合、唯一の場所は、目標数がある可能性があり(-2, 4)(2, 4)(2, -4)、または(-2, -4)
ラマ氏

2
@Cruncher:行/列全体のフリップを使用すると、それが不可能になります。たとえば、左上の1(A1)を取得してに移動してみてくださいB11位置に到達できB1ますが、それはからのタイルでありB9、からのタイルではありませんA1。行/列全体のフリップのみが許可されているため、左上の1は、最も外側の4つのコーナーのいずれかにのみ存在します。ルールを間違えた場合はお知らせください。
ラマ氏

7
おめでとう、ガレス。これは非常によく設計された問題です。また、非常に挑戦的です。
DavidC 14年

回答:


7

GolfScript、300 279 268文字

n%`{\5,{.9+}%{;.2/\2%},\;''{1${.9/7+7*+}%+:z;}:?~{{.9<77*{\zip\9-}>:Z~{1$!{-1%}*\(\}@%\Z;}/}:E~{:^;{:c;.`{[\E[.^=\8^-=]{.c=\8c-=}%[^c+^8c-+8^-c+16c-^-]{9%49+}%=}+[[]]:K[[8^- 17c-][^9c+]1$]{:s;{[[]s.+.2$+]{1$+}/}%.&}/\,K+0=z?E}5,/}5,/{{+9%)}+9,%''*}9,%={z:u;}*}+1024,/u

このコードは非常に遅く(コードブロックの操作が重いため)、数分かかる場合があります。コードは、多くの変数と明示的なループを備えた非常に非ゴルフスクリプト風です。

1秒未満で実行される、より分析的なソリューションを作成しました。ゴルフ中にそれを完全に壊しました。残念ながら、過去2日間でコードをバックトラックしたり修復したりすることはできませんでした。したがって、とにかく短いこの試着確認バージョンを作成しました。

上記のパズルの答え:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

まあ、...これを破って、かなり大変な作業になるだろう
ギャレス

...私が間違っていたようだ
ギャレス

@Garethこれは、ゴルフスクリプトでは数学などに対して難しい課題であることを知っていました。
ハワード14年

1
@Howard-どのアプローチを使用しましたか?あなたが言った「トライアンドチェックバージョン」とは何ですか?
セルゲイ14年

24

Mathematicaの582 575 503 464 282

ゴルフスクリプターと戦うには、重砲を使用しなければなりません!

i = "986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378";

a=Array;h@M_:=Join@@a[9(M〚##〛/. 9->9⌈2Random[]⌉)+Abs[{##}-5]&,n={9,9}];
For[i_~t~j_:=i{#2,10-#2}+j#-9&~a~{9,4},!ListQ[e=GroupElementToWord[
PermutationGroup[Cycles/@Join[1~t~9,9~t~1]],
h[ToCharacterCode@StringSplit@i-48]~FindPermutation~h@a[Mod[8+##,9,1]&,n]]],];
e~IntegerString~36<>""

出力:

g69g69g8g8g7g7gd96d96d8d8d7d7dh6h64a6a46d6d4g4g6b6b7h7h7c7c2a8a27b7bd8db8b7f7fg8g82c2c94a4a3a3aigfdc91

ここPermutationGroup[...]で、可能なフリップをセットアップしGroupElementToWord[...]、問題を解決します(約0.2秒)。主な問題は9、初期グリッドと最終グリッドの位置の対応を特定することが難しいことです。ゴルフのために私はランダムにそれをします(数秒かかります)。警告がいくつかありますが、無視できます。

グリッドをテストするその他:

g69g69g8g8g7g7gh89h89h7h7h6h6hf6f6g6g64f4f4h4hg7g73g3g2a8a28d8db8b83d3dg8g82c2c9a3a643a3a2g9f9d9c9ga
h89h89h7h7h6h6h6h6h6f6f6g6g6d6d3a7a37g7g7h7h3c3c2a8a27b7b8d8d2f2f8b8b3f3f2b2ba2a764a8aih9g9c9gb1i

例が完全に再現されます。

1
i
2i

以前のソリューション(464)

巧妙な組み込み関数なしで、ランタイム4ミリ秒で:

M=ToCharacterCode@StringSplit@i-48;
S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;
A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};
u=s/@Join@@A;
H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

ここのすべての新しい行は必要ありません。

出力:

3b9i9i1a1a1a1a9i9i1a1a9h9h1b1b1b1b9h9h9g9g1c1c9g9g9f9f1d1d9f9f8h8h2b2b8f8f8f8f7i7i7h7h3b3b3b3b7h7h3b3b7h7h7g7g3c3c7g7g3c3c7f7f6i6i4a4a6h6h4b4b4b4b6g6g4c4c6g6g4c4c6f6f4d4d4d4d6f6f4d4d6f6f4d4d

他の2つのテストグリッド:

13ab9i9i1a1a9i9i9h9h1b1b1b1b9h9h9f9f8i8i8i8i8h8h2b2b2b2b8h8h8h8h8g8g8g8g8f8f2d2d2d2d8f8f2d2d7i7i3a3a3a3a7i7i7h7h3b3b7h7h3b3b7g7g3c3c3c3c7g7g3c3c7f7f3d3d3d3d7f7f7f7f6i6i4a4a6i6i6h6h4b4b4b4b6h6h4b4b6g6g4c4c4c4c6f6f4d4d4d4d6f6f4d4d6f6f
2bc9i9i1a1a9i9i9g9g1c1c9g9g1c1c9f9f1d1d1d1d8i8i8i8i8h8h2b2b2b2b8f8f2d2d7i7i7h7h3b3b3b3b7h7h3b3b7g7g3c3c7f7f3d3d3d3d7f7f3d3d6i6i4a4a4a4a6h6h4b4b6g6g6g6g6f6f4d4d

可視化:

anim = Reap[Fold[Function[{m, i}, 
 If[i > 9, (Sow@Grid[#, Background -> {i - 9 -> Pink, None}] & /@ {m, #}; #) &@
   Transpose@MapAt[Reverse, Transpose@m, i - 9], (Sow@Grid[#, 
         Background -> {None, i -> Pink}] & /@ {m, #}; #) &@
   MapAt[Reverse, m, i]]], M, IntegerDigits[FromDigits[S, 36], 36]]];

ListAnimate[Join[{#, #} &@Grid@M, anim[[2, 1]], {#, #} &@Grid@anim[[1]]], 5]

ここに画像の説明を入力してください

入力文字列iは、次の方法でランダムに生成できます

M = Array[Mod[8 + ##, 9, 1] &, {9, 9}];
(M[[#]] = Reverse@M[[#]]; M[[All, #2]] = Reverse@M[[All, #2]];) & @@@
   RandomInteger[{1, 9}, {10000, 2}];
i = ToString /@ # <> "\n" & /@ M <> ""

簡単な議論

  • フリップはこれらの要素のみを交換できます(「4倍」):

    ここに画像の説明を入力してください

  • 初期順序と最終順序の署名が同じ場合にのみ、これらの要素を他の要素とは別に交換できます。

  • これらの4つの要素のフリップは、次数4の交互グループ(=四面体の回転グループ)を形成します。このグループのすべての要素は、2つの生成要素の構成です。したがって、初期位置と最終位置がわかれば、対応する変換を単純なフリップの組み合わせとして分解できます。

詳細

スポーツマンシップについては、賞金の終了前に詳細を投稿します!

M=ToCharacterCode@StringSplit@i-48;

文字列iを行列に変換しますM

S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;

に文字を追加しますS。これは空の文字列です。H[i,j]文字i1,2,3,...,9)と文字ja,b,c,...,ibase-36内)を追加します。

A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};

要素を次のように変換します

ここに画像の説明を入力してください

次の形式でターゲット行列を取得するには

ここに画像の説明を入力してください

次に、私のアルゴリズムには2つの主要なステップがあります

  1. 検索は、ターゲットマトリックス(例えば、の署名と署名を得るために、反転{-7,-1,1,7}1の署名{-6,2,-2,6}IS -1):

    u=s/@Join@@A;
    H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
    A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
    
  2. 正しい順序を取得するために、すべての「4倍」を回転させます。

    MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
    If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
    

    これは、アルゴリズムの最も重要な部分です。たとえば、変換1b1bはに変換さ{-7,-1,1,7}{-1,1,-7,7}ます。変換9h9hはに変換さ{-7,-1,1,7}{-7,7,-1,1}ます。したがって、2つのマップがあります

    {1,2,3,4} -> {2,3,1,4}
    {1,2,3,4} -> {1,4,2,3}
    

    そして、任意の順序{x,y,z,w}をに変換し{1,2,3,4}ます。簡単な方法は(ランダム検索を除く)

    repeat   
    {x, y, z, w} -> If[z < 3, {y, z, x, w}, {x, w, y, z}]
    until {1,2,3,4}
    

    私はそれを証明することはできませんが、うまくいきます!

最後のステップは

M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

中央の行と中央の列の簡単なフリップを実行し、結果を返します。


@Gareth出力で小さな文字を使用できますか?それは私に多くのキャラクターを救います。
イベルツコフ14年

はい、出力では小文字を使用します(これを確認するために質問を変更します)。私はMathematicaを持っていないので、他のMathematicaユーザーはコードが実際に出力を生成することを確認できますか?3つのテストソリューションを検証しましたが、すべて正しいので、+ 1です。良くやった!
ガレス

好奇心が強い-あなたのアプローチのパフォーマンスは何ですか?数千のフリップによって生成された入力でテストしましたか?
SergeyS 14年

@SergeySはい、約50ミリ秒かかります:)
ybeltukov 14年

@Gareth私はプログラムを書き直しました、結果を確認してもらえますか?私のテストでは、すべてが正しいことが示されました。
イベルトゥコフ14年

7

J 487 438

q=:3 :'(>:9|+/~i.9)=/&((,{;/(,.8&-)y){])g'
l=:2 :0
:
o=:o,(m+x){a.
x&(|.@{`[`]})&.v y
)
r=:49 l]
c=:97 l|:
w=:2 :'g=:4 v^:(4=(<m){g)g'
p=:_1=C.!.2@,@:I.@q
t=:2 :'for_i.>:i.3 do.g=:i v^:(p m*i)g end.'
z=:2 :0
'i j I J'=.y,8-y
g=:".'(',(,' ',.,(I.m{q y){,;._1 n),'])^:2 g'
)
d=:3 :0
g=:9 9$".,_ list,' ',.y
o=:''
0 4 w c
4 0 w r
0 1 t c
g=:0 c^:(-.(p 1 0)=p 1 2)g
1 0 t r
for_k.>,{;~i.4 do.0 z';;jcir;irjc;Irjc'k
3 z';;IrJc;JcIr;'k end.o
)

d は、指定された形式のグリッド文字列を取得し、指定された形式のソリューション文字列を返す動詞です。

使用例:

   d '987654321',LF,'234567891',LF,'345678912',LF,'456789123',LF,'567891234',LF,'678912345',LF,'789123456',LF,'891234567',LF,'912345678'
bcda2341a1a1b1b1c1c1d1da2a2b2b2c2c2d2d2a3a3b3b3c3c3d3d3a4a4b4b4c4c4d4d4

いずれかの改行タイプを受け入れるようになりました。

テストグリッドのソリューション:

b3a1a11b1bc9c99g9gd9d99f9fb8b8f8f87i7i7h7hc3c3g7g77f7fa6a64b4bh6h6c4c4g6g6d6d6f6f6
cd24a9a91c1c1d1d9f9fa2a2i8i88h8hc2c2g8g82d2d3b3bh7h7d3d37f7fa6a64b4bg6g64d4d6f6f
bc2a9a99i9ic1c1g9g91d1df9f9i8i8b2b2h8h82c2cd8d87i7ib3b3c7c7d3d34a4ai6i6b6b6g6g6d6d6

私はJが初めてです。これはおそらくさらにゴルフをすることができます。


無効/解決不可能なグリッドをチェックすると、123文字のペナルティが発生します。今までの他の答えには、このようなエラーチェックがあるとは思わない。

これを行うには、最初の行を次のように変更dします。

if.-.+./89 90=#y do.0 return.end.if.-.*./(/:~y)=/:~(#y)$'123456789',LF do.0 return.end.g=:9 9$".,_ list,' ',.y

そしてこれの最後の行:

3 z';;IrJc;JcIr;'k end.if.*./,g=>:9|+/~i.9 do.o return.end.0

0空の文字列を返すことは、完全に解決されたグリッドを正しく解決することと見分けがつかないようなエラーで返すことを選択しました。これはUNIXの改行(再び)を想定していることに注意してください。


おめでとうございます、あなたは先導者になりました。:-)
ガレス14年

入力がルールで必要な1つの文字列ではないように見えますか、何か見落としていますか?
SergeyS 14年

@SergeyS:混乱するかもしれません。私の知る限り、Jには文字列リテラルにエスケープ(改行など)を配置する方法がありません。Jの 'a'、LF、 'b'の構造は、+が文字列を追加するように機能する言語の "a" + "\ n" + "b"に似ています。
AlliedEnvy

わかりました、ありがとう。
セルゲイ14年

私はちょうど1962年のAPL本からファイルに関するセクションを読んでいた、と私は@AlliedEnvyが正しいと思う。これは、質問の形式のファイルから読み取られた場合にプログラムにデータが表示される方法です。LFsが表すパーティションシーケンシャルファイルのを。
luserはドローグ

5

C# 540 399

さて、パフォーマンスが犠牲になり(現在では最大30秒かかります)、動的変数が導入され、ソリューションのロジックがわずかに変更されました。そして、はい、今では(ルールで要求されるように)改行を含む1つの文字列として入力を期待しています。

もちろん、C#には事前定義された数学関数がないため、Mathematicaの仲間と戦うのは難しいでしょう。それにもかかわらず、これは著者のおかげで大きな挑戦でした!

string S(string _){for(i=0,e=1>0;e;){
for(h=v=j=0;j<89;)m[j/10,j%10+9]=_[j++]-49;a="";
for(j=i++;j>0;v++,j/=2)if(j%2>0)F(v);
for(;h<9&(h<4|!e);h+=j/36,j%=36)if((e=m[h,g=j++%9+9]!=(t=(h+g)%9))|m[v=8-h,g]==t){F(v);F(g);F(v);F(g);}
}return a;}void F(int z){for(f=z<9;++l<9;)m[0,l]=m[f?z:l,f?9+l:z];for(;l-->0;)m[f?z:l,f?9+l:z]=m[0,8-l];a+=(char)(z+=f?49:56);}
dynamic h,v,i,j,e,t,l=-1,g,a,m=new int[9,19],f;

テストグリッド:

3B9A9A9B9B9C9C9D9D9F9F9G9G9H9H9I9I9B9B9C9C9D9D9F9F9G9G9H9H9C9C9D9D9C9C9D9D8B8B8F8F8H8H8B8B8F8F8B8B8H8H7B7B7C7C7F7F7H7H7I7I7H7H6A6A6B6B6C6C6D6D6F6F6H6H6A6A6B6B6D6D6F6F6D6D6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

13AB9A9A9B9B9F9F9H9H9A9A9B9B9H9H9I9I8B8B8D8D8F8F8G8G8H8H8I8I8B8B8G8G8H8H8I8I8H8H7A7A7B7B7C7C7D7D7F7F7G7G7I7I7A7A7D7D7F7F7I7I7F7F6A6A6B6B6C6C6D6D6F6F6G6G6H6H6I6I6A6A6C6C6F6F6I6I6A6A6A6A5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

2BC9A9A9C9C9D9D9F9F9A9A9D9D9I9I8B8B8D8D8H8H8I8I8B8B8D8D8I8I7B7B7C7C7D7D7F7F7G7G7H7H7I7I7C7C7C7C7G7G6A6A6B6B6D6D6F6F6G6G6I6I6A6A6B6B6D6D6G6G6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

古いソリューション(540)

任意の入力で1秒未満で動作します(ランダムに生成された数千のグリッドでテスト)。出力文字列の最大長は165です(最初は、グリッドは82回以下のフリップで解決されましたが、ゴルフ中にこれを犠牲にしました)。

string S(string[]_){for(i=0;i<1<<18;){
for(j=0;j<81;)m[j/9+49,j%9+65]=_[j/9][j++%9]-49;a="";char g,h='1',v='9',b,x=h,y;
for(j=i;j>0;x=x==v?'A':++x,j/=2)if(j%2>0)F(x);j=i+1;
for(i+=1<<19;h<58;h++,v--)for(g='A',b='I';g<74;g++,b--){
t=(h+g-6)%9;e=m[h,g];q=m[v,g];i=h>52&t!=e?j:i;
if(e!=t|q==t){x=q==t?v:g;y=q==t?g:v;
if(m[h,b]==t){x=b;y=h;}
F(x);F(y);F(x);F(y);}}}return a;}
void F(char z){var f=z<65;for(l=0;l<4;l++){n=m[d=f?z:49+l,s=f?65+l:z];m[d,s]=m[o=f?z:57-l,u=f?73-l:z];m[o,u]=n;}a+=z;}
int i,j,q,e,t,l,s,d,n,u,o;int[,]m=new int[99,99];string a;

例1の回答:

15A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

例2の回答:

19AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5D
5DE5E55F5F5G5G5H5H5I5I

例3の回答:

129AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5
D5DE5E55F5F5G5G5H5H5I5I

テストスクエアの回答:

346B9A9AH1H1C9C9D9D99F9F9G9GH9H99I9IB8B8F8F87B7B7C7C7F7FH7H77I7I6A6A6B6BC6C66D6DG6G6H6H66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

1346ABA9A9H1H19F9FH9H99I9IH2H28D8D8F8FG8G8I8I8I3I37B7B7C7CF3F37G7GI7I7H4H4D6D66F6F5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

2BCA9A99C9CF1F19F9F9I9IH2H2D8D88H8HI8I87B7BC7C77D7D7F7F7H7H7I7II4I4B6B6D6D6G6G66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

現在、MacにMonoをダウンロードしているので、プログラム自体をテストできますが、特定のグリッドで特定のソリューションを実行し、そのソリューションがそのグリッドの有効なソリューションであるかどうかを確認するバリデーターを既に持っています。あなたが私に与えた3つのソリューション例は無効であると言っています。私は今、その理由を調査しています。
ガレス14年

あぁ!ここで何が起こっているのかがわかりました!与えられた回答は、3つのテストグリッド(問題の下の方)ではなく、3つの例に対する回答のようです。それらは確かにそれらのグリッドの正しい解決策ですが、それらは1Aおよび2I最も簡単な解決策、グリッド解決策の長さを判断していないので、実際には問題ではありません:-) 3つのテストグリッドの回答をお送りします(これをMacで実行できるかどうかを確認します)+1をお送りします。
ガレス14年

@Gareth-おっと、テストスクエアの回答を逃しました。指摘してくれてありがとう。回答に追加しました。
セルゲイ14年

素晴らしい、ありがとう。すべて正常に検証されています。何らかの理由でXamarinがMacで実行されないため、数時間後に職場でプログラムをテストする必要があります。
ガレス14年

@Gareth-実際、そのコードにはC#に特化したものは何もありません。おそらく、多くの苦痛を伴わずにJavaまたはC ++に変換することができます。簡潔-これは2回以上短く見える場合があります;)
SergeyS 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.