Створіть програму або функцію, щоб розкреслити квадрат цифр, гортаючи (обертаючи навколо центральної точки) лише рядки та стовпці.
Вхідні дані
Введеним буде 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))
(-2, 4)
, (2, 4)
, (2, -4)
або (-2, -4)
.
A1
) і перемістити його B1
. Ви можете дістати а 1
до позиції B1
, але це буде плитка з B9
, а не плитка з A1
. Оскільки нам дозволено відкидати лише цілі рядки / стовпці, крайній верхній лівий 1 буде колись лише в одному з чотирьох зовнішніх кутів. Якщо я помилився з правилами, будь ласка, повідомте мене про це.