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 keB1
. Anda bisa mendapatkan1
ke posisi ituB1
, tetapi itu akan menjadi ubin dariB9
, bukan ubin dariA1
. 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.Jawaban:
GolfScript,
300279268 karakterPerhatikan bahwa kode ini sangat lambat (juga karena manipulasi blok-kode yang berat) dan mungkin berjalan beberapa menit. Kode ini sangat un-golfscript-ish dengan banyak variabel dan loop eksplisit.
Saya telah menulis solusi yang lebih analitik yang berjalan kurang dari satu detik. Saya benar-benar mematahkan yang selama golf. Sayangnya, saya tidak dapat mundur atau memperbaiki kode dalam dua hari terakhir. Karenanya, saya membuat versi coba-dan-periksa yang lebih pendek.
Jawaban untuk teka-teki yang diberikan di atas:
sumber
Mathematica
582575503464282Untuk bertarung dengan penulis naskah golf saya harus menggunakan artileri berat!
Keluaran:
Di sini
PermutationGroup[...]
mengatur kemungkinan membalik danGroupElementToWord[...]
memecahkan masalah (sekitar0.2
detik). Masalah utama adalah bahwa sulit untuk mengidentifikasi korespondensi antara posisi9
di grid awal dan akhir. Untuk bermain golf saya melakukannya secara acak (butuh beberapa detik). Ada beberapa peringatan tetapi orang bisa mengabaikannya.Lainnya untuk menguji kisi:
Ini sepenuhnya mereproduksi contoh:
Solusi sebelumnya (464)
tanpa fungsi bawaan yang pintar dan dengan runtime 4 ms:
Semua baris baru di sini tidak perlu.
Keluaran:
Dua kisi uji lainnya:
Visualisasi:
String input
i
dapat dihasilkan secara acak olehDiskusi singkat
Membalik hanya dapat menukar elemen-elemen ini ("quadruple"):
Dimungkinkan untuk menukar elemen-elemen ini secara terpisah dari elemen-elemen lain hanya jika urutan awal dan akhir memiliki tanda tangan yang sama.
Membalik keempat elemen ini membentuk kelompok bolak - balik derajat 4 (= kelompok rotasi tetrahedral). Setiap elemen dari grup ini adalah komposisi 2 elemen pembangkit. Jadi jika kita mengetahui posisi awal dan akhir kita dapat menguraikan transformasi yang sesuai sebagai kombinasi dari membalik sederhana.
Detail
Untuk sportif saya memposting rincian sebelum akhir hadiah!
Konversikan string
i
ke matriksM
.Kami akan menambahkan karakter ke
S
. Sekarang ini adalah string kosong.H[i,j]
akan menambahkan karakteri
(1,2,3,...,9
) dan karakterj
(a,b,c,...,i
di base-36).Saya mengonversi elemen sebagai
untuk mendapatkan matriks target dalam bentuk berikut
Lalu ada dua langkah utama dalam algoritma saya
Temukan flip untuk mendapatkan tanda tangan seperti pada matriks target (mis. Tanda tangan
{-7,-1,1,7}
is1
dan tanda tangan{-6,2,-2,6}
is-1
):Putar setiap "empat kali lipat" untuk mendapatkan urutan yang benar:
Ini adalah bagian paling tidak trivial dari algoritma. Misalnya, transformasi
1b1b
akan dikonversi{-7,-1,1,7}
menjadi{-1,1,-7,7}
. Transformasi9h9h
akan dikonversi{-7,-1,1,7}
menjadi{-7,7,-1,1}
. Jadi kami punya dua petadan kami ingin mengonversi pemesanan acak
{x,y,z,w}
ke{1,2,3,4}
. Metode sederhana adalah (kecuali pencarian acak)Saya tidak bisa membuktikannya, tetapi berhasil!
Langkah terakhir adalah
Itu melakukan membalik sepele dari baris tengah dan kolom tengah dan mengembalikan hasilnya.
sumber
J
487438d
adalah kata kerja yang mengambil string grid dalam format yang ditentukan dan mengembalikan string solusi dalam format yang ditentukan.Contoh penggunaan:
Sekarang menerima salah satu jenis baris baru.
Solusi untuk kisi uji:
Saya cukup baru di J; ini mungkin bisa bermain golf lebih jauh.
Memeriksa kisi yang tidak valid / tidak terpecahkan menimbulkan penalti 123 karakter. Saya tidak berpikir jawaban lain sampai saat ini memiliki pengecekan kesalahan tersebut.
Untuk melakukannya, ubah baris pertama
d
menjadi ini:dan baris terakhir untuk ini:
Saya telah memilih untuk mengembalikan
0
kesalahan seperti mengembalikan string kosong tidak dapat dibedakan dengan menyelesaikan kisi yang sepenuhnya terpecahkan. Perhatikan bahwa ini mengasumsikan baris baru UNIX (lagi).sumber
LF
s mewakili partisi dari file sekuensial.C #
540399Nah, kinerja yang dikorbankan (sekarang membutuhkan waktu hingga 30 detik), memperkenalkan variabel dinamis, logika solusi yang sedikit berubah. Dan ya, sekarang mengharapkan input sebagai satu string dengan jeda baris (seperti yang disyaratkan dalam aturan).
Tentu saja C # tidak memiliki fungsi matematika yang sudah ditentukan, sehingga akan sulit untuk bertarung dengan Mathematica guys. Namun demikian, ini adalah tantangan besar, terima kasih kepada penulis!
Kisi uji:
Solusi Lama (540)
Bekerja kurang dari satu detik pada input apa pun (diuji pada ribuan kisi yang dihasilkan secara acak). Panjang maksimum string output adalah 165 (awalnya semua grid diselesaikan dalam tidak lebih dari 82 membalik, tetapi selama golf saya mengorbankan ini).
Jawab misalnya 1:
Jawab misalnya 2:
Jawab misalnya 3:
Jawaban untuk kotak tes:
sumber
1
,,A
dan2I
yang merupakan solusi paling sederhana - tetapi itu sebenarnya tidak masalah karena saya tidak menilai panjang solusi kisi :-) Jika Anda bisa mengedit dan berikan jawaban untuk 3 kisi pengujian (saya akan melihat apakah saya bisa menjalankan ini di Mac saya sekarang) saya bisa memberi Anda +1 Anda.