Buat program atau fungsi untuk menguraikan satu angka dengan membalik (membalikkan sekitar titik tengah) hanya baris dan kolom.
Memasukkan
Input akan berupa grid digit 9x9 dalam bentuk string 9 baris seperti berikut:
986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378
Format input ini tidak dapat dinegosiasikan - solusi apa pun yang "kreatif" dengan format input akan dianggap tidak valid.
Keluaran
Output harus berupa daftar gerakan flip yang, bila diterapkan pada input dalam urutan yang diberikan, harus membuat ulang kisi target.
Contoh output (bukan solusi untuk contoh input sebelumnya):
28IF5D3EAB9G3
Format output ini juga tidak bisa dinegosiasikan. Seharusnya tidak ada baris baru atau spasi di output, hanya karakter 1
- 9
dan A
- I
(karakter huruf kecil dapat diterima sebagai pengganti karakter huruf besar jika Anda mau).
Kisi target (kondisi yang harus Anda buat ulang) adalah sebagai berikut:
123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Angka 1
- angka - 9
harus digunakan sebagai instruksi untuk membalikkan baris, dan huruf A
- I
harus digunakan untuk kolom. Ini ditunjukkan di bawah ini dengan grid dalam keadaan dipulihkan.
ABCDEFGHI
|||||||||
vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678
Jadi 8
cara membalik baris kedua dari bawah, dan F
cara membalik kolom keenam.
Dalam hal tidak ada solusi yang mungkin, program harus berakhir tanpa mengeluarkan apa pun.
Contohnya
Memasukkan:
987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678
Keluaran:
1
Dalam hal ini hanya baris teratas yang perlu dibalik untuk kembali ke status sasaran.
Memasukkan:
123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Keluaran:
I
Dalam hal ini hanya kolom akhir (kolom I
) yang perlu dibalik untuk membuat ulang kondisi tujuan.
Memasukkan:
123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679
Keluaran:
2I
Dalam hal ini kita perlu membalik baris 2
dan kemudian membalik kolom I
untuk kembali ke status sasaran.
Catatan:
- Harap sertakan contoh penggunaan dalam jawaban Anda.
- Output yang diberikan tidak harus menjadi urutan terpendek yang akan mengembalikan status tujuan - urutan apa pun yang mengembalikan status tujuan akan dilakukan selama ia bekerja (yaitu selama saya bisa mengujinya)
- Saya akan berusaha untuk menguji setiap jawaban dan memilih semua yang berhasil dan jelas telah berusaha bermain golf.
- Ini adalah kompetisi terbuka - saya akan menerima jawaban terpendek minggu depan, tetapi jika jawaban yang lebih baru berlaku yang lebih pendek di setiap titik di masa depan saya akan mengubah jawaban yang diterima untuk mencerminkan itu .
Bounty telah ditetapkan pada 200 reputasi untuk jawaban terpendek yang diterima pada 23:59:59 (GMT) pada 26/01/2014Bounty diberikan kepada Howard untuk solusi GolfScript 268 karakternya .
Pengujian
Berikan jawaban program Anda untuk tiga kisi pengujian berikut dengan jawaban Anda:
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
Saya telah membuat program Python kecil untuk menghasilkan grid yang valid untuk tujuan pengujian:
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)
, atau (-2, -4)
.
A1
) dan pindahkan ke B1
. Anda bisa mendapatkan 1
ke posisi itu B1
, tetapi itu akan menjadi ubin dari B9
, bukan ubin dari A1
. Karena kita hanya diperbolehkan membalik seluruh baris / kolom, angka 1 paling atas hanya akan berada di salah satu dari empat sudut terluar. Jika saya salah aturan, tolong beri tahu saya.