Перевернути квадрати


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 . Баунт був присуджений Говарду за рішення 266 символів 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
Я щойно написав коротке рішення, яке випадковим чином перевертало рядки / стовпці до завершення сортування. Після 500 мільйонів ітерацій вона все ще не вирішила першої головоломки, яку ви подали (де потрібно лише перегорнути рядок 1). Випадковість не видається корисним рішенням цієї проблеми!
Джош

3
@Josh Не дивно. Ця проблема, схоже, дуже схожа на вирішення куба рубіка. Я думаю, що якийсь пошук у ширину був би найкращою грубою силою. При цьому, випадковий алгоритм теоретично повинен припинятися з часом і, здається, відповідає заданим правилам.
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

Зауважте, що цей код надзвичайно повільний (також через сильну маніпуляцію з блоком коду) і може працювати декілька хвилин. Код дуже un-golfscript-ish з великою кількістю змінних і явних циклів.

Я написав більш аналітичне рішення, яке пробігло менше секунди. Я цілком зламав цю під час гольфу. На жаль, я не зміг відхилити або відремонтувати код протягом останніх двох днів. Тому я створив цю пробну версію, яка в будь-якому випадку коротша.

Відповіді на загадки, наведені вище:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

Що ж, це буде дуже важка робота над цим ...
Гарет

Здається, я помилявся ...
Гарет

@Gareth Я знав, що це складне завдання з голфскриптом, наприклад, з математики.
Говард

1
@Howard - який підхід ти використав? Що таке "тестувальна версія", яку ви згадали?
СергійС

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}є 1та підпис {-6,2,-2,6}є -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. Хороша робота!
Гарет

Просто цікаво - що таке ваш підхід? Ви перевіряли на входах, генерованих тисячами фліп?
СергійС

@SergeyS Так, це займає близько 50 мс :)
ybeltukov

@Gareth Я переписав свою програму, чи можете ви перевірити результати? Мої тести показали, що все правильно.
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: Вас можуть збентежити. Наскільки я знаю, J не має можливості розміщувати вхідні рядки (такі як новий рядок) у рядкових літералах. Побудова 'a', LF, 'b' в J схожа на "a" + "\ n" + "b" в мовах, де + працює, щоб додати рядки.
AlliedEnvy

Гаразд, це має сенс, ніж, дякую.
СергійС

Я просто читав розділ про файли з книги APL 1962 року, і вважаю, що @AlliedEnvy є правильним. Ось так дані з’являться в програмі, якщо вони читаються з файлу у форматі запитання. В LFs представляють розділи з послідовного файлу.
luser droog

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 - ой, я пропустив відповіді на тестові квадрати, дякую, що вказав на це. Я додав їх зараз до своєї відповіді.
СергійС

Відмінно, дякую за це. Всі вони підтвердили штраф. Xamarin чомусь не працює на моєму Mac, тому мені доведеться перевірити програму на роботі через пару годин.
Гарет

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