Misalkan Anda diberi beberapa huruf besar berbeda yang tersebar dalam array persegi panjang sel-sel sebaliknya. Setiap sel dalam array milik huruf terdekat darinya, didefinisikan sebagai huruf yang dapat dijangkau dalam jumlah terkecil dari langkah horizontal dan / atau vertikal - tidak ada langkah diagonal. (Jika sel berjarak sama dari dua atau lebih huruf terdekat, itu milik mana dari huruf-huruf itu yang pertama dalam urutan abjad. Sebuah sel dengan huruf besar di dalamnya adalah milik huruf itu.) Batas- sel adalah mereka yang secara horizontal atau vertikal. berdekatan dengan satu atau lebih sel yang bukan milik surat milik mereka sendiri.
Tulis subprogram prosedur dengan perilaku berikut, menghasilkan semacam diagram Voronoi ...
Input : Setiap string ASCII yang hanya terdiri dari titik, huruf besar, dan baris baru, sehingga ketika dicetak akan menampilkan array persegi panjang dari jenis yang dijelaskan di atas, dengan titik-titik yang bertindak sebagai kosong.
Keluaran : Cetakan string input dengan masing-masing sel batas kosong digantikan oleh versi huruf kecil dari surat itu. (Subprogram melakukan pencetakan.)
Contoh 1
Memasukkan:
......B..
.........
...A.....
.........
.......D.
.........
.C.......
.....E...
.........
Keluaran:
...ab.B..
....ab.bb
...A.abdd
aa...ad..
cca.ad.D.
..caeed..
.C.ce.edd
..ce.E.ee
..ce.....
Sebuah sketsa yang menyoroti batas-batas:
Contoh 2
Memasukkan:
............................U...........
......T.................................
........................................
.....................G..................
..R.......S..........F.D.E............I.
.........................H..............
.....YW.Z...............................
......X.................................
........................................
........................................
......MN...........V....................
......PQ................................
........................................
.............L...............J..........
........................................
........................................
....C...........K.......................
........................................
..................................A.....
...........B............................
Keluaran:
..rt.....ts...sg......gduu..U.....ui....
..rt..T..ts...sg......gddeu......ui.....
...rt...ts....sg......gddeeu....ui......
....rttts.....sggggggGgdde.euuuui.......
..R.rywss.S....sfffffFdDdEeeeeeei.....I.
...ryywwzs.....sf....fddhHhhhhhhhi......
..ryyYWwZzs..sssffff.fddh.......hi......
..rxxxXxzzs.sllvvvvvffddh....hhhhi......
rrrxxxxnzzssl.lv....vfddh...hjjjjii.....
mmmmmmmnnnnnl.lv.....vvdh..hj....jai....
mmmmmmMNnnnnl.lv...V...vvhhj.....jaai...
ppppppPQqqql...lv.......vhj......ja.ai..
ppppp.pq.ql....lkv.....vjj.......ja..aii
cccccppqql...L.lkkv...vj.....J...ja...aa
.....cpqqlll..lk..kvvvvj........ja......
......cccbbbllk....kkkkj.......ja.......
....C...cb..bk..K......kj.....ja........
.......cb....bk........kjjjjjja.........
......cb......bk.......kaaaaaa....A.....
.....cb....B...bk......ka...............
Peningkatan warna:
Jawaban:
GolfScript,
138144137 karakterInput diberikan ke subprogram sebagai string tunggal pada tumpukan. Sayangnya saya harus menggunakan
puts
karena persyaratan bahwa rutin harus mencetak hasilnya.Penjelasan kode
Blok luar dasarnya loop atas semua posisi (x, y) sesuai dengan ukuran persegi panjang input. Dalam lingkaran, koordinat x dan y dibiarkan di tumpukan setiap kali. Setelah setiap baris selesai, hasilnya dicetak ke konsol.
Kode yang dieksekusi dalam loop pertama-tama mengambil karakter input yang sesuai.
Maka pada dasarnya kita periksa, jika kita punya
.
, yaitu jika kita (mungkin) harus mengganti karakter.Sekali lagi, kode bagian dalam dimulai dengan satu lingkaran, sekarang atas semua koordinat (x, y) (x, y + 1) (x + 1, y) (x, y-1) (x-1, y)
Cuplikan kode dalam baru-baru ini hanya mengembalikan huruf (huruf kecil) dari titik terdekat, mengingat dua koordinat.
Jadi dari lima huruf terdekat untuk koordinat (x, y) (x, y +1) (x +1, y) (x, y-1) (x-1, y) ambil yang pertama, jika tidak semua sama, jika tidak ambil a
.
.sumber
Python 3 -
424422417332295 karakter:Ada tiga bagian, yang masing-masing harus pada jalurnya sendiri karena sintaks Python:
w
adalah lebar baris papan (termasuk baris baru di akhir, yang akan didaur ulang sebagai kolom pengisi).r
adalahrange
objek yang mengindeks semua karakter dis
.n
adalah tuple indeks offset untuk mendapatkan tetangga karakter (jadi jika Anda ingin membiarkan surat menyebar secara diagonal, Anda hanya perlu menambahkan-w-1,-w+1,w-1,w+1
tuple).x
adalah nama pendek untukstr.replace
metode ini, yang digunakan beberapa kali dalam kode selanjutnya (panggilan akan terlihat aneh, karena saya gunakanx(s,*"xy")
untuk menyimpan karakter, daripada yang konvensionals.replace("x", "y")
). Thes
parameter string dimodifikasi sedikit pada saat ini juga, dengan.
karakter dan baris baru digantikan oleh~
karakter (karena mereka mengurutkan setelah semua huruf). Nilai baris~
karakter padding juga ditambahkan ke bagian akhir.t
nantinya akan digunakan sebagai referensi ke versi "lama"s
, tetapi perlu diinisialisasi ke sesuatu yang tidak sama dengans
di awal, dan nol hanya mengambil satu karakter (nilai yang lebih Pythonic akan menjadiNone
, tetapi itu tiga karakter tambahan) .s
menggunakan pemahaman daftar. Sebagai pemahaman yang berulang pada indekss
,~
karakter digantikan olehmin
tetangga mereka. Jika~
karakter sepenuhnya dikelilingi oleh karakter lain~
, ini tidak akan melakukan apa-apa. Jika itu adalah sebelah satu atau lebih huruf, itu akan menjadi yang terkecil dari mereka (mendukung"a"
lebih"b"
, dll). Baris baru yang diubah menjadi~
karakter dipertahankan dengan mendeteksi indeks mereka dengan operator modulus. Baris padding di bagian akhir tidak diperbarui dalam pemahaman daftar (karena rentang indeks,,r
dihitung sebelum ditambahkan kes
). Alih-alih, barisan baru~
karakter ditambahkan setelah pemahaman dilakukan. Catatan yangs
menjadi daftar karakter daripada string setelah melewati pertama dari loop (tetapi karena Python fleksibel tentang tipe kita masih dapat mengindeks untuk mendapatkan karakter dengan cara yang sama).~
karakter dari padding) akan diganti.
. Selanjutnya, semua karakter digabung menjadi satu string. Akhirnya,~
karakter padding dikonversi kembali ke baris baru dan string dicetak.sumber
r=range
seharusnya berada di dalam fungsi tubuh dianggap sebagai bagian dari prosedur yang dapat dipanggil, tetapi Anda dapat menyimpan karakter dengan menulisr=range;s=[l.replace
. Anda juga dapat memeras lebih banyak karakter dengan menulisif"~"==s[y][x]else
danif"~"==s[y][x]else
, dengan total 422. (Btw, ini berjalan untuk saya dengan Python 2.7)r=range
di akhir baris fungsi pertama (di mana saya mengatur variabel lain), dan memotong beberapa ruang yang saya lewatkan sebelumnya. Saya tidak yakin apakah saya mendapatkan kedua yang Anda maksudkan, karena Anda tampaknya telah menyebutkan hal yang sama dua kali. Dan, dalam Python 2.7 itu bisa menjadi dua karakter lebih pendek, karena Anda tidak perlu tanda kurung setelahprint
(biasanya yang hanya menyimpan 1 karakter, tetapiprint"\n".join(...)
berfungsi).s[y][x]for
(menghapus ruang), tetapi Anda tampaknya telah menemukannya.Python,
229226 karakterApakah mengisi banjir untuk menghitung hasilnya. Trailing
for
/zip
combo menghasilkan arrayx
untuk setiap sel yang berisi nilai dalam sel itu dan empat tetangganya. Lalu kami menggunakan trik Blckknght danmin
banyak kemungkinan untuk setiap sel. Itu adalah nilai sel asli, tetangga mana pun jika sel belum dikunjungi, atau.
jika telah dikunjungi dan semua tetangga adalah.
atau sama dengan sel itu sendiri.sumber
return s
menjadiprint s
. Juga, tidaky!=b
dapat diubahy>b
? Itu akan membuat 226 karakter, saya pikir.Ini dia. Ini adalah program F # pertama saya. Jika saya melewatkan fitur bahasa, harap beri tahu saya karena saya masih belajar.
Ini adalah input sampel saya
Ini outputnya
Ini kodenya. Nikmati.
Sekarang kita perlu mengkonversi data itu ke array dimensi ganda sehingga kita dapat mengaksesnya melalui pengindeks.
Mari kita buat matriks yang mewakili kepemilikan setiap sel
Mari kita memiliki metode utilitas untuk melihat apa yang terjadi.
Mari kita membuat catatan untuk mewakili di mana huruf kapital tertentu berada.
Sekarang kami ingin menemukan semua huruf kapital.
Ketika kita bergerak, kita membutuhkan konsep arah.
Saat kita bergerak, kita perlu tahu tentang ukuran. Ini akan membantu kita memantau apakah kita bergerak keluar dari batas.
Pola Aktif: cocok dengan kriteria sel yang diberikan.
Sekarang kita mulai membayar pajak. Ini mengklaim sel!
Menggunakan pola aktif, klaim sel ini jika tidak diklaim, dan kembalikan koordinat sel yang berdekatan.
Kami mulai membuat daftar kantong data ini, mari kita buat jenis untuk membuat hal-hal lebih jelas.
Diberikan daftar kriteria untuk mengklaim sel, kami akan mengulangi daftar yang mengembalikan sel berikutnya untuk mengklaim dan muncul kembali ke dalam daftar itu.
Untuk setiap modal, buat kriteria klaim di setiap arah dan kemudian klaim secara sel-sel tersebut.
Setiap program membutuhkan program utama.
sumber