플립 핀 스퀘어


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수단은 아래쪽에서 두 번째 행을 F뒤집고 수단은 여섯 번째 열을 뒤집습니다.

해결책이없는 경우, 아무것도 출력하지 않고 프로그램을 종료해야합니다.

입력:

987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

산출:

1

이 경우 상단 행만 뒤집어 목표 상태로 돌아갑니다.

입력:

123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679

산출:

I

이 경우 I목표 상태를 다시 만들려면 마지막 열 (column ) 만 뒤집어 야합니다.

입력:

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

산출:

2I

이 경우 목표 상태로 돌아가려면 행 2을 뒤집은 다음 열 I을 뒤집어 야 합니다.

노트:

  • 답변에 사용 예를 포함하십시오.
  • 주어진 결과는 목표 상태를 반환하는 가장 짧은 시퀀스 일 필요는 없습니다. 목표 상태를 반환하는 시퀀스는 작동하는 한 (즉, 테스트 할 수있는 한) 수행됩니다.
  • 각 답변을 테스트하고 골프를하려고 노력했던 모든 사람들을 찬양하기 위해 노력할 것입니다.
  • 이것은 개방형 경쟁입니다. 다음 주 언젠가는 가장 짧은 답을 받아 들일 것입니다. 그러나 새로운 유효한 답변이 나오면 향후 어느 시점에서든 더 짧은 답변을 받아 들일 것입니다 .
  • 바운티는 2014 년 1 월 26 일 23:59:59 (GMT)에 의해 가장 짧은 답변으로 200 명으로 설정되었습니다 . 바운티는 Howard268 자 GolfScript 솔루션 으로 수여되었습니다 .

테스팅

다음 세 가지 테스트 그리드에 대한 프로그램의 출력에 답을 제공하십시오.

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 만 뒤집기 만하면 됨). 이 문제에 대한 임의성은 유용한 해결책이 아닙니다!
Josh

3
@ 조쉬 놀라운 일이 아닙니다. 이 문제는 루빅스 큐브를 푸는 것과 매우 유사합니다. 어떤 종류의 너비 우선 탐색이 가장 무차별 한 힘이라고 생각합니다. 즉, 랜덤 알고리즘은 이론적으로 결국 종료해야하며 지정된 규칙에 맞는 것으로 보입니다.
Cruncher

4
무차별 대입이 필요하지 않습니다. 각 그리드 타일은 올바른 위치, 뒤집힌 X, 뒤집힌 X 또는 뒤집힌 XY 의 4 가지 위치 중 하나에서만 끝날 수 있습니다 . 그리드를 (0,0)이 가장 중앙 타일 인 것으로 정신적으로 취급하는 데 도움이 될 수 있습니다. 당신은 (-2, 4) 타일을 해결하는 경우 유일한 위치는 대상의 수는 수 (-2, 4), (2, 4), (2, -4), 또는 (-2, -4).
Mr. Llama

2
@Cruncher : 전체 행 / 열 뒤집기를 사용하면 불가능합니다. 예를 들어, 가장 왼쪽 상단 1 ( A1) 을 가져 와서 로 이동하십시오 B1. 1의 위치를 얻을 수 B1있지만의 타일이 B9아닌의 타일이됩니다 A1. 전체 행 / 열 뒤집기 만 허용되므로 가장 왼쪽 상단 1은 가장 바깥 쪽 4 개의 모서리 중 하나에 만 있습니다. 규칙을 틀리면 알려주십시오.
Mr. Llama

7
축하합니다, 가레스 이것은 매우 잘 설계된 문제입니다. 또한 매우 도전적입니다.
DavidC

답변:


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 일 동안 코드를 역 추적하거나 복구 할 수 없었습니다. 따라서 어쨌든 더 짧은이 try-and-check 버전을 제작했습니다.

위에 주어진 퍼즐에 대한 답변 :

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

글쎄, 그것은 이길 때리기 힘든 노력이 될 것입니다 ...
Gareth

내가 틀린 것 같다 ...
Gareth

@Gareth 나는 이것이 수학과 같은 골프 스크립트와 함께 어려운 도전이라는 것을 알고 있었다.
Howard

1
@Howard-어떤 접근법을 사용하셨습니까? 언급 한 '체크 앤 체크 버전'이란 무엇입니까?
SergeyS

24

매쓰 582 575 503 464 282

golfscripters와 싸우려면 무거운 포병을 사용해야합니다!

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)

영리한 내장 함수와 런타임 4ms가없는 경우 :

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

다른 두 테스트 그리드 :

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도 (= 사면체의 회전 그룹)의 교차 그룹을 형성합니다 . 이 그룹의 모든 요소는 2 개의 생성 요소로 구성됩니다. 따라서 초기 위치와 최종 위치를 알면 간단한 뒤집기의 조합으로 해당 변환을 분해 할 수 있습니다.

세부

스포츠맨십을 위해 현상금이 끝나기 전에 세부 정보를 게시합니다!

M=ToCharacterCode@StringSplit@i-48;

문자열 i을 행렬로 변환합니다 M.

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

에 문자를 추가합니다 S. 이제 빈 문자열입니다. H[i,j]문자 i( 1,2,3,...,9)와 문자 j( a,b,c,...,i기준 36)을 추가합니다.

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

나는 요소를

여기에 이미지 설명을 입력하십시오

다음과 같은 형태로 목표 행렬을 얻기 위해

여기에 이미지 설명을 입력하십시오

내 알고리즘에는 두 가지 주요 단계가 있습니다.

  1. 대상 행렬에서와 같이 서명을 얻으려면 반전을 찾습니다 (예 : {-7,-1,1,7}is 1및 signature {-6,2,-2,6}is 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. 올바른 순서를 얻으려면 모든 "사분면"을 회전하십시오.

    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}. 두 개의지도가 있습니다

    {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 출력에 작은 문자를 사용할 수 있습니까? 그것은 많은 문자를 저장합니다.
ybeltukov

예, 출력에 소문자를 사용할 것입니다 (이 질문에 유의하여 변경하십시오). Mathematica가 없으므로 다른 Mathematica 사용자가 코드가 실제로 출력을 생성하는지 확인할 수 있습니까? 세 가지 테스트 솔루션의 유효성을 검사했으며 모두 정확하므로 +1입니다. 좋은 작업!
Gareth

궁금한 점이 있습니다. 접근 방식의 성과는 무엇입니까? 수천 번의 플립으로 생성 된 입력을 테스트 했습니까?
SergeyS

@SergeyS 네, 약 50ms가 소요됩니다 :)
ybeltukov

@Gareth 프로그램을 다시 작성하는데 결과를 확인할 수 있습니까? 내 테스트에서 모든 것이 올바른 것으로 나타났습니다.
ybeltukov

7

제이 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 줄 바꿈을 다시 가정합니다.


축하합니다, 당신은 선두에 섰습니다. :-)
Gareth

규칙에서 요구하는대로 입력이 하나의 문자열이 아닌 것 같습니다.
SergeyS

@SergeyS : 혼란 스러울 수 있습니다. 내가 아는 한 J는 문자열 리터럴에 이스케이프 (예 : 줄 바꿈)를 넣을 방법이 없습니다. J의 구성 'a', LF, 'b'는 +가 문자열을 추가하는 언어의 "a"+ "\ n"+ "b"와 유사합니다.
AlliedEnvy

고마워요.
SergeyS

방금 1962 APL 책의 파일 섹션을 읽었으며 @AlliedEnvy가 맞다고 생각합니다. 질문 형식으로 파일에서 읽을 경우 데이터가 프로그램에 표시되는 방식입니다. LF의 대표 파티션 순차 파일을.
luser droog

5

씨# 540 399

음, 성능이 저하되고 (지금은 최대 30 초 소요) 동적 변수가 도입되었으며 솔루션의 논리가 약간 변경되었습니다. 그리고 네, 이제 줄 바꿈이있는 하나의 문자열로 입력을 기대합니다 (규칙에서 필요에 따라).

물론 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를 다운로드하여 프로그램 자체를 테스트 할 수 있지만 주어진 그리드에서 주어진 솔루션을 실행하고 솔루션이 해당 그리드에 유효한 솔루션인지 알려주는 유효성 검사기가 이미 있습니다. 당신이 나에게 준 세 가지 예제 솔루션이 유효하지 않다고 말하십시오. 나는 지금 왜 그런지 조사하고 있습니다.
Gareth

아하! 나는 여기서 무슨 일이 있었는지 알아 냈습니다! 주어진 답변은 세 가지 테스트 그리드가 아닌 3 가지 예제에 대한 답변 인 것 같습니다 (질문에서 아래에 있음). 그들은 꽤 이상 있습니다 만, 실제로 그 그리드에 대한 올바른 솔루션입니다 1, A하고 2I있는 가장 간단한 솔루션입니다 -하지만 난 그리드 솔루션 길이에 판단 아니에요 이후 그 사실은 중요하지 않습니다 :-) 당신이 편집 할 수있는 경우 3 개의 테스트 그리드에 대한 답변을 제공합니다 (지금 Mac에서이 기능을 사용할 수 있는지 확인하겠습니다). +1을 줄 수 있습니다.
Gareth

@Gareth-죄송합니다. 테스트 사각형에 대한 답변을 놓쳤습니다. 나는 지금 내 대답에 추가했습니다.
SergeyS

훌륭합니다. 감사합니다. 그들은 모두 잘 검증되었습니다. Xamarin은 어떤 이유로 든 Mac에서 실행되지 않으므로 몇 시간 안에 직장에서 프로그램을 테스트해야합니다.
Gareth

@Gareth-실제로 그 코드에는 C #에 특정한 것이 없습니다. 아마도 많은 고통없이 Java 또는 C ++로 변환하고 일부 문자를 골프화 할 수 있습니다 :) 또한 GolfScript 등으로 변환하십시오 간결한-이것은 두 번 이상 짧게 나타날 수 있습니다;)
SergeyS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.