Utwórz program lub funkcję, aby odłączyć kwadrat cyfr, odwracając (odwracając punkt środkowy) tylko wiersze i kolumny.
Wkład
Dane wejściowe będą siatką cyfr 9 x 9 w postaci ciągu 9 wierszy, jak poniżej:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
Ten format wejściowy nie podlega negocjacji - wszelkie rozwiązania, które są „kreatywne” z formatem wejściowym, zostaną uznane za nieprawidłowe.
Wydajność
Wyjściem powinna być lista ruchów odwracających, które zastosowane do danych wejściowych w podanej kolejności powinny odtworzyć siatkę docelową.
Przykładowe dane wyjściowe (nie rozwiązanie poprzedniego przykładu wprowadzania):
28IF5D3EAB9G3
Ten format wyjściowy również nie podlega negocjacji. Wyjście nie powinno zawierać znaków nowej linii ani spacji, a jedynie znaki 1
- 9
i A
- I
(małe litery są dopuszczalne zamiast wielkich liter, jeśli wolisz).
Siatka docelowa (stan, który należy odtworzyć) jest następująca:
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Liczby 1
- 9
powinny być używane jako instrukcje do odwracania wierszy, a litery A
- I
powinny być używane dla kolumn. Jest to pokazane poniżej z przywróconą siatką.
ABCDEFGHI
|||||||||
vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678
Tak więc 8
środek przewraca drugi rząd od dołu, a F
środek przewraca szóstą kolumnę.
W przypadku, gdy żadne rozwiązanie nie jest możliwe, program powinien zakończyć się bez wypisywania niczego.
Przykłady
Wkład:
987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Wydajność:
1
W takim przypadku tylko górny wiersz wymaga przewrócenia, aby powrócić do stanu docelowego.
Wkład:
123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Wydajność:
I
W takim przypadku tylko ostatnia kolumna (kolumna I
) wymaga odwrócenia, aby odtworzyć stan celu.
Wkład:
123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Wydajność:
2I
W takim przypadku musimy odwrócić wiersz, 2
a następnie odwrócić kolumnę, I
aby powrócić do stanu docelowego.
Uwagi:
- W odpowiedzi podaj przykład użycia.
- Podane dane wyjściowe nie muszą być najkrótszą sekwencją, która zwróci stan celu - każda sekwencja, która zwróci stan celu, będzie działać tak długo, jak to działa (tj. Tak długo, jak mogę to przetestować)
- Postaram się przetestować każdą odpowiedź i głosować za tymi wszystkimi, którzy działają i oczywiście próbowali grać w golfa.
- To są zawody otwarte - zaakceptuję najkrótszą odpowiedź w przyszłym tygodniu, ale jeśli pojawi się nowa, ważniejsza odpowiedź, która będzie krótsza w dowolnym momencie w przyszłości, zmienię zaakceptowaną odpowiedź, aby to odzwierciedlić .
Nagroda została ustalona na 200 reputacji za najkrótszą odpowiedź otrzymaną do 23:59:59 (GMT) w dniu 26.01.2014.Nagroda została przyznana Howardowi za jego 268-znakowe rozwiązanie GolfScript .
Testowanie
Podaj odpowiedź swojego programu dla następujących trzech siatek testowych:
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
Stworzyłem mały program w języku Python do generowania prawidłowych siatek do celów testowych:
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)
, lub (-2, -4)
.
A1
) i przesuń ją do B1
. Możesz dostać 1
pozycję B1
, ale będzie to płytka z B9
, a nie płytka z A1
. Ponieważ wolno nam przewracać tylko cały wiersz / kolumnę, najwyższy lewy 1 będzie zawsze w jednym z czterech najbardziej zewnętrznych narożników. Jeśli popełniłem błąd, daj mi znać.