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