Flippin 'Площади


34

Создайте программу или функцию, чтобы размешать квадрат цифр, переворачивая (обращая вокруг центральной точки) только строки и столбцы.

вход

Ввод будет сетка цифр 9x9 в виде строки из 9 строк, как показано ниже:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

Этот формат ввода не подлежит обсуждению - любые решения, которые являются «творческими» с форматом ввода, будут считаться недействительными.

Выход

Выходными данными должен быть список переворачиваемых движений, которые при применении к входным данным в заданном порядке должны воссоздавать целевую сетку.

Пример вывода (не решение предыдущего примера ввода):

28IF5D3EAB9G3

Этот формат вывода также не подлежит обсуждению. В выводе не должно быть символов новой строки или пробелов, только символы 1- 9и A- 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) нужно перевернуть, чтобы воссоздать состояние цели.

Входные данные:

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

Выход:

2I

В этом случае нам нужно перевернуть строку, 2а затем перевернуть столбец, Iчтобы вернуться к целевому состоянию.

Заметки:

  • Пожалуйста, включите пример использования в вашем ответе.
  • Данный вывод не должен быть самой короткой последовательностью, которая будет возвращать состояние цели - любая последовательность, которая возвращает целевое состояние, будет работать до тех пор, пока она работает (т.е. до тех пор, пока я могу ее проверить)
  • Я постараюсь проверить каждый ответ и оценить всех тех, кто работает и, очевидно, пытался играть в гольф.
  • Это открытый конкурс - я приму кратчайший ответ где-то на следующей неделе, но если появится более новый действительный ответ, который будет короче в любой момент в будущем, я изменю принятый ответ, чтобы отразить это .
  • Награда была установлена ​​на уровне 200 репутации за самый короткий ответ, полученный к 23:59:59 (GMT) 26/01/2014. Награда была присуждена Говарду за его решение GolfScript на 268 символов .

тестирование

Пожалуйста, укажите выходные данные вашей программы для следующих трех тестовых таблиц:

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
Я только что написал короткое решение, которое случайным образом переворачивало строки / столбцы, пока сортировка не была завершена. После 500 миллионов итераций он так и не решил первую заданную вами головоломку (где вам нужно только перевернуть строку 1). Случайность не является подходящим решением этой проблемы!
Джош

3
@ Джош Не удивительно. Эта проблема, похоже, очень похожа на решение кубика Рубика. Я думаю, что какой-то поиск в ширину был бы лучшей грубой силой. Это, как говорится, случайный алгоритм теоретически должен в конечном итоге завершиться, и, кажется, соответствует указанным правилам.
Cruncher

4
Грубая сила не нужна. Примите во внимание тот факт, что каждый фрагмент сетки может оказаться только в одном из четырех положений: его правильное местоположение, перевернутый X, перевернутый Y или перевернутый XY. Это может помочь вам мысленно рассматривать сетку как имеющую (0,0) плитку в центре. Если вы решаете плитки (-2, 4), единственные места целевого число может быть это (-2, 4), (2, 4), (2, -4)или (-2, -4).
Мистер Лама

2
@Cruncher: использование переворота всей строки / столбца делает это невозможным. Например, попробуйте взять самый верхний левый 1 ( A1) и переместить его в B1. Вы можете получить 1позицию B1, но это будет плитка B9, а не плитка A1. Поскольку нам разрешается только переворот строки / столбца, самый верхний левый 1 будет только в одном из четырех крайних углов. Если я ошибся правилами, пожалуйста, дайте мне знать.
Мистер Лама

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

Обратите внимание, что этот код очень медленный (также из-за тяжелых манипуляций с блоками кода) и может выполняться несколько минут. Код очень простой, с множеством переменных и явных циклов.

Я написал более аналитическое решение, которое длилось меньше секунды. Я полностью сломал тот во время игры в гольф. К сожалению, я не смог отследить или восстановить код за последние два дня. Поэтому я создал эту пробную версию, которая в любом случае короче.

Ответы на загадки приведены выше:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

Ну, это будет очень тяжелая работа, победить это ...
Гарет

Кажется, я был неправ ...
Гарет

@Gareth Я знал, что это вызов, который будет сложнее с гольф-скриптом против, например, Mathematica.
Говард

1
@ Ховард - какой подход ты использовал? Что такое «пробная версия», которую вы упомянули?
SergeyS

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

Другие две тестовые сетки:

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 (= группа вращений тетраэдра). Каждый элемент этой группы представляет собой композицию из 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и подпись {-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. Вращайте каждую «четверку», чтобы получить правильный порядок:

    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

Он выполняет тривиальные перевороты центрального ряда и центрального столбца и возвращает результат.


@ Гарет Могу ли я использовать маленькие символы в выводе? Это спасает меня от ряда персонажей.
ybeltukov

Да, я буду принимать символы нижнего регистра в выводе (я поменяю вопрос, чтобы отметить это). У меня нет Mathematica, поэтому может ли какой-нибудь другой пользователь Mathematica подтвердить, что код действительно генерирует вывод? Я проверил три тестовых решения, и все они верны, поэтому +1. Хорошая работа!
Гарет

Просто любопытно - какова производительность вашего подхода? Вы тестировали на входах, генерируемых тысячами сальто?
SergeyS

@SergeyS Да, это занимает около 50 мс :)
ybeltukov

@ Гарет, я переписал свою программу, можешь проверить результаты? Мои тесты показали, что все правильно.
ибельтуков

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 (снова).


Поздравляю, вы только что вышли в лидеры. :-)
Гарет

Похоже, что вы вводите не одну строку, как того требуют правила, или я что-то пропустил?
SergeyS

@SergeyS: Вы можете быть смущены. Насколько я знаю, у J нет способа поместить escape-символы (такие как символ новой строки) в строковые литералы. Конструкция 'a', LF, 'b' в J похожа на "a" + "\ n" + "b" в языках, где + работает для добавления строк.
AlliedEnvy

Хорошо, это имеет смысл, чем, спасибо.
SergeyS

Я просто читал раздел о файлах из книги APL 1962 года, и я думаю, что @AlliedEnvy - это правильно. Вот как данные будут отображаться в программе, если они будут прочитаны из файла в формате вопроса. В LFs представляют разделы из последовательного файла.
Люсер Дрог

5

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

Работает менее чем за секунду на любом входе (проверено на тысячах случайно сгенерированных сеток). Максимальная длина выходной строки составляет 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

Сейчас я просто загружаю Mono для своего Mac, чтобы я мог протестировать саму программу, но у меня уже есть валидатор, который запускает данное решение на заданной сетке и сообщает мне, является ли решение верным решением для этой сетки - и это говоря мне, что три примера решения, которые вы дали мне, не действительны. Я просто сейчас расследую почему.
Гарет

Ага! Я понял, что здесь произошло! Ваши ответы, похоже, являются ответами на 3 примера, а не на три тестовые таблицы (которые находятся ниже в вопросе). Они действительно правильные решения этих сетей, хотя они совсем немного длиннее 1, Aи 2Iкоторые являются наиболее простыми решениями - но это на самом деле не важно , так как я не сужу по длине сеточного решения :-) Если бы вы могли изменить и дать ответы для 3 тестовых таблиц (я собираюсь проверить, смогу ли я запустить это на моем Mac сейчас), я могу дать вам +1.
Гарет

@Gareth - упс, я пропустил ответы на тестовые квадраты, спасибо за указание на это. Я добавил их сейчас к своему ответу.
SergeyS

Отлично, спасибо за это. Они все подтвердили в порядке. Xamarin по какой-то причине не запускается на моем Mac, поэтому мне придется протестировать программу на работе через пару часов.
Гарет

@Gareth - На самом деле в этом коде нет ничего конкретного для C #, возможно, можно без особых проблем конвертировать его в Java или даже в C ++ и ... извлечь из него некоторые символы :) Также не стесняйтесь конвертировать его в GolfScript или что-то еще. кратко - это может выглядеть вдвое или более короче;)
SergeyS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.