pengantar
Gaith Arithmetic adalah fasilitas khusus yang memenjarakan bilangan bulat positif. Namun, baru-baru ini, bilangan bulat positif telah mencoba melarikan diri. Oleh karena itu sipir telah memutuskan untuk, um, menghilangkan beberapa bilangan bulat positif untuk mengirim pesan ke bilangan bulat lainnya. Mereka telah menyewa seorang insinyur perangkat lunak untuk menulis sebuah program untuk mencari tahu bilangan bulat mana yang harus dihilangkan untuk efek maksimum.
Deskripsi Input
Input diberikan melalui STDIN, argumen baris perintah, atau fungsi input pengguna (seperti raw_input
). Anda tidak dapat memilikinya sebagai argumen fungsi atau variabel yang sudah diinisialisasi (mis. Program ini mengharapkan input dalam variabel x
).
Baris input pertama berisi bilangan bulat positif tunggal di n
mana 8 >= n >= 3
. Berikut ini adalah n
baris yang berisi n
karakter dari set [1,2,3,4,5,6,7,8,9]
. Berikut ini contoh input:
5
22332
46351
65455
24463
65652
Deskripsi Output
Sipir ingin menghilangkan angka sehingga kondisi berikut terpenuhi:
- Di setiap baris dan kolom dari kisi yang dihasilkan, tidak ada angka yang akan muncul dua kali;
- Tidak ada dua angka yang dihilangkan yang dapat berdekatan secara horizontal atau vertikal;
- Angka yang masih hidup harus membentuk kelompok yang berdekatan secara ortogonal - akan memungkinkan untuk melakukan perjalanan dari nomor yang masih hidup ke nomor yang masih hidup lainnya yang hanya bergerak secara horizontal dan vertikal dan tidak pernah melewati angka yang dihilangkan.
Keluarkan input (minus baris pertama), dengan angka yang dihilangkan diganti dengan #
.
Mungkin ada lebih dari satu solusi. Jika itu masalahnya, Anda dapat mengeluarkan solusi apa pun.
Mungkin juga tidak ada solusi. Jika itu masalahnya, keluarkan string no answer
.
Berikut ini adalah kemungkinan output untuk input contoh:
#2#3#
46351
6#4#5
24#63
#56#2
Contoh Input dan Output
Ada beberapa output untuk setiap input, jadi output ini hanyalah contoh.
Memasukkan:
5
46551
51565
32654
14423
43244
Keluaran:
46#51
#156#
326#4
1#423
#324#
Memasukkan:
7
7183625
1681563
5238564
8786268
1545382
3814756
5325345
Keluaran:
71#362#
#6815#3
5238#64
#7#62#8
154#382
3814756
#325#4#
Memasukkan:
8
21534768
75196287
68392184
96244853
44865912
76516647
89751326
43698979
Keluaran:
21#34768
#5196287
683#21#4
9#24#853
#4865912
7#51#64#
89751326
436#8#7#
Memasukkan:
4
2222
2331
3112
1322
Keluaran:
no answer
prompt
tidak mengizinkan input multi baris.Jawaban:
Ruby,
346344329316 bytes, sl∞∞∞∞∞∞wIni kode-golf, bukan kode-cepat, jadi ...
Gunakan seperti:
Bendera
-W0
tidak diperlukan, tetapi saya sarankan Anda menambahkannya untuk menonaktifkan peringatan atau mengalihkanstderr
...Katakan jika Anda memiliki cukup kesabaran untuk menjalankannya pada contoh untuk n = 6,7,8
Changelog
each
⇨map
, terima kasih kepada @NotThatCharlesregexp
s, mirip dengan apa yang disarankan @NotThatCharlessumber
\d
lebih pendek dari[^#]
pada garis kedua dari belakang;M.times.to_a
lebih lama dari(0..M-1).to_a
M.times.to_a
1 byte lebih pendek dari(0..M-1).to_a
;)(0...M).to_a
berfungsi juga dan memiliki panjang yang sama.Ruby -
541 ...,394Algoritma dasar adalah pencarian duplikat kedalaman-pertama rekursif untuk memilih, melihat melalui baris 1, kemudian kolom 1, kemudian baris 2, dll, dan memeriksa bahwa dua tetangga tidak terbunuh dan bahwa grid terhubung (itulah
break if
klausa dalam di sana, dan bit yang datang sebelumnya).Beberapa trik rapi:
if w[1]
jauh lebih pendek daripadaif !w.one?
dan jika Anda tahu setidaknya ada satu anggota, itu adalah hasil yang sama.Demikian pula,
[0]
lebih pendek daripadaany?
jika tidak ada blok, dans[j]
merupakan jalan pintas yang lucu untukj<s.size
(secara teknis, ini lebih sepertij.abs<s.size
)Dan
y%N+(y/N).i
jauh lebih pendek dariComplex(y%N,y/N)
Juga, ketika ada dua persyaratan rumit untuk menghasilkan string, mungkin lebih pendek untuk dilakukan
[cond1?str1a:str1b,cond2?str2a:str2b]*''
daripada menambahkan semua parens atau#{}
s.Tidak ada komentar dan penjelasan:
(Ini dari versi 531 byte. Saya telah membuat perubahan. Terutama, sejak itu saya menghilangkan panggilan ke produk - hanya menyelesaikan satu digit per baris / kolom pada suatu waktu, dan J sekarang hanya sebuah array, diindeks oleh bilangan bulat. Semua koordinat hanyalah bilangan bulat.)
H
menghitung tetanggaN
adalah ukuran gridK
adalah kunci untuk peta (bilangan kompleks)J
adalah peta input (penjara)k
adalah kunci yang tidak terbunuhQ
adalah metode rekursif utamaKode dijalankan dengan:
Changelog
394 menambahkan saran @ blutorange di bawah ini, dan memotong lebih banyak manipulasi
408 hasil revisi sekali lagi. Juga gunakan
.min
daripada.inject(:+)
karena saya hanya mengambil satu baris saja.417 perhitungan output lebih pendek
421 menjatuhkan bilangan kompleks. Cukup gunakan bilangan bulat. Simpan bundel
450 lebih banyak masukan perbaikan
456 peningkatan input
462 peningkatan tambahan - esp.
find
tidakselect
475 menjatuhkan
u
dan menghancurkan pembangun baris / col dupe503 hanya menyelesaikan satu digit duplikat per baris / kolom pada suatu waktu.
530 digunakan
map &:pop
sebagai gantinyavalues
531 mengeluarkan lambda yang membuat array dupes
552 oops! melewatkan persyaratan
536 populasi yang sedikit meningkat dari array dupes (apa yang sebelumnya
d
)541 awal
sumber
break
dapat digunakan sebagai penggantireturn
, mungkin menghemat satu byte lagi. Saya sangat suka yang ini, banyak trik dan lebih cepat.a
hanya digunakan sekali, Anda bisa membuatnyaJ=gets(p).split*''
. Sudahkah Anda mencoba argumen cli, lihat jawaban saya?HTML + JavaScript ( ES6 ) 459
Menggunakan textarea HTML untuk mendapatkan input multiline.
Untuk mengujinya, jalankan snippet di Firefox. Perbesar textarea jika Anda suka, rekatkan input di dalam textarea (waspadalah: input tepat, tidak ada spasi tambahan pada baris apa pun), dan tab menjauh. Hasilnya ditambahkan.
Metode: seorang Depth First Serarch yang rekursif. Ia menemukan solusi yang tidak optimal untuk semua kasus uji dalam hitungan detik (itu golf golf, tetapi jawaban yang valid harus diakhiri untuk kasus uji umum)
Percobaan pertama
Metode: Server Kedalaman Pertama, non-rekursif, menggunakan tumpukan pengguna.
Fungsi dapat dengan mudah diubah dalam Breadth First Search, chaging
l.pop
untukl.shift
, sehingga menggunakan antrian bukannya tumpukan, tapi itu terlalu lambat dan aku tidak yakin ia dapat menemukan solusi yang optimal pula.Tampilkan cuplikan kode
sumber