pengantar
Para pegolf kode yang berpengetahuan mempersiapkan kami untuk banjir kiamat . Daerah yang berisiko dievakuasi, dan penduduk pindah ke tempat tinggi.
Kami meremehkan banjir (atau mungkin ada bug dalam kode @ user12345). Beberapa daerah dataran tinggi dengan cepat mendekati permukaan laut. Dinding harus didirikan untuk memastikan kelangsungan hidup perkemahan yang sekarang berpenduduk padat. Sayangnya, pemerintah memiliki persediaan tembok yang terbatas.
Masalah
Skenario kiamat kami dijelaskan oleh dua angka pada satu baris, n
dan m
. Mengikuti garis itu adalah n
garis dengan m
nilai per baris, hanya dipisahkan oleh satu spasi. Setiap nilai akan menjadi satu dari empat karakter.
x
Tidak bisa dilewati. Air tidak bisa mengalir di sini. Dinding tidak dapat didirikan di sini.-
Tidak stabil. Air dapat mengalir melalui ini di sini. Dinding tidak dapat didirikan di sini..
Stabil. Air bisa mengalir lewat sini. Dinding dapat didirikan di sini.o
Perkemahan. Air bisa mengalir lewat sini. Jika ya, semua orang mati. Dinding tidak dapat dibangun di sini.
Air akan mengalir dari semua tepi peta, kecuali jika tepinya tidak bisa dilewati atau dinding dibangun di atas ubin. Tulis program yang dapat menampilkan jumlah dinding minimum yang diperlukan untuk melindungi perkemahan.
Contoh Input
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Contoh Output
3
Asumsi
- Air hanya mengalir secara orthogonal
- Perkemahan hanya ada sebagai satu blok yang berdekatan secara ortonagon per skenario
- Sebuah solusi akan selalu ada (walaupun mungkin membutuhkan banyak dinding)
- Perkemahan tidak dapat ditemukan di tepi, karena skenario kemudian tidak memiliki solusi
- 2
n
<<16 - 2
m
<<16 - Masukan dapat diberikan dari stdin, baca dari "city.txt", atau diterima sebagai argumen tunggal
Kode terpendek menang!
Jawaban:
Mathematica,
257253 karakterInput dibaca dari
"city.txt"
.Penjelasan:
Mathematica memiliki banyak fungsi untuk menangani grafik.
Pertama, saya membaca data dari
"city.txt"
.Lalu saya membangun grafik kotak dengan 'm' * 'n' simpul (
GridGraph@d[[1,{2,1}]]
), dan menambahkannya "titik di infinity" yang terhubung ke setiap titik di "tepi" grafik. Vertex ini adalah tempat air mengalir.Dan
o
,x
dans
menunjukkan posisi "o", "x" dan "." masing-masing.Kemudian untuk setiap bagian
w
daris
(himpunan bagian diurutkan menurut panjang), saya menghapus simpul dix
danw
darig
(VertexDelete[g,x⋃w]
), dan menemukan panjang jalur terpendek dari "titik di infinity" untuk perkemahano
. Jika panjangnya tak terbatas, maka perkemahan akan aman. Jadi panjang yang pertamaw
adalah jumlah minimum dinding yang dibutuhkan untuk melindungi perkemahan.sumber
C,
827 799522Golf:
Input diberikan dengan tinggi dan dengan sebagai argumen baris perintah, dan kemudian grid dibaca sebagai string tunggal pada stdin seperti: di
./a.out 6 7 < input
mana input berada dalam bentuk ini (kiri ke kanan, atas ke bawah):"Dapat dibaca":
Tidak ada yang sesingkat solusi oleh @Claudiu, tetapi berjalan sangat cepat. Alih-alih mengisi banjir dari tepi, ia menemukan perkemahan dan bekerja keluar dari token 'o'.
Contoh penempatan dinding:
sumber
@
). Saya mencoba menjalankan kode Anda sendiri tetapi tampaknya tidak berhasilPython,
553525512449414404387368 karakter (+4? Untuk doa)Saya terlalu senang bermain golf ini. Ini 82 byte lebih besar jika Anda mencoba mengompres! Nah, itu ukuran kekompakan dan kurangnya pengulangan.
Level indentasi adalah spasi, tab.
Pemakaian :
Baca dari
city.txt
:Ajukan sebagai berikut:
Itu
2>X
adalah untuk menyembunyikan stderr sejak keluar program dengan menaikkan pengecualian. Jika ini dianggap tidak adil, jangan ragu untuk menambahkan 4 karakter untuk doa.Penjelasan :
Kekuatan kasar sederhana.
C
melakukan pengisian banjir dan mengembalikan true jika mencapai perkemahan. Tidak ada bantalan tambahan karena terlalu banyak ruang untuk memasang bantalan dengan benar.D
, diberi satu set dinding untuk diisi, panggilanC
dari setiap titik di tepi sedemikian rupa sehinggaC
menyumbang dinding itu, dan mencetak panjang dan keluar jika tidak ada yang mencapai perkemahan. Daftar dinding juga digunakan untuk melacak banjir, jadi tidak perlu menyalin papan! Trickily,C
juga menambahkan setiap tempat kosong yang ditemukan ke daftar,S
sehingga fungsiD
tersebut juga digunakan untuk membangun pertama daftar tempat kosong. Untuk alasan ini, saya menggunakansum
alih-alihany
, untuk memastikan semua data.
dikumpulkan pada run-through pertama.Saya memohon
D
sekali, lalu menyalin daftar tempat kosong keZ
karenaS
akan terus ditambahkan (tidak efisien, tetapi lebih murah pada jumlah karakter). Lalu saya gunakanitertools.combinations
untuk memilih masing-masing kombo tempat kosong, dari 0 tempat ke atas. Saya menjalankan setiap kombo melaluiD
dan mencetak panjang yang pertama yang berhasil, menimbulkan pengecualian untuk keluar dari program. Jika tidak ada jawaban yang ditemukan maka tidak ada yang dicetak.Perhatikan bahwa saat ini, program tidak berfungsi jika tidak diperlukan dinding. Ini akan menjadi +3 karakter untuk menangani kasus ini; tidak yakin apakah itu perlu.
Perhatikan juga bahwa ini adalah
O(2^n)
algoritma, di manan
jumlah tempat kosong. Jadi, untuk papan berukuran 15x15 yang benar-benar kosong dengan satu perkemahan di tengahnya, ini akan membutuhkan2^(15*15-1)
=2.6959947e+67
iterasi untuk diselesaikan, yang akan menjadi waktu yang sangat lama!sumber
Groovy:
841805754Tidak Terkumpul:
Banyak lagi golf yang akan datang ...
Mengembalikan 2E9 jika tidak ada solusi.
sumber
Dyalog APL , 91 byte
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
mengasumsikan
⎕IO=0
, menggunakan fitur dari v16.0 (@
dan⍸
), waktu yang berjalan eksponensial dalam jumlah.
-s⎕
input dievaluasi, harus menjadi matriks karakter'xo.'⍳
gantix
dengan 0,o
dengan 1,.
dengan 2, dan yang lainnya dengan 3s←(4,4,⍨⍉)⍣2
fungsi yang mengelilingi matriks dengan 4sa←
menetapkan matriks numerik yang dikelilingi dengan 4s ke sebuah variabela
b←⍸2=
b
adalah daftar pasangan coord di mana 2s (yaitu.
-s) berada(,⍳2⊣¨b)/¨⊂b
menghasilkan semua kombinasi elemenb
c[⍋≢¨c←...]
urutkan berdasarkan ukuran{... :⍬⋄≢⍵}¨
untuk setiap kombinasi, periksa sesuatu dan kembalikan baik panjangnya atau daftar kosong⊃∊
hasil non-kosong pertamad←0@⍵⊢a
d
adalaha
dengan beberapa elemen diganti dengan 04=
buat boolean matrix - di mana 4s? yaitu perbatasan yang kami tambahkan{...}⍣≡
terus menerapkan fungsi{}
sampai hasilnya stabil3∨/3∨⌿⍵
"Boolean atau" setiap elemen dengan tetangganyas
hasilnya akan lebih kecil, jadi mari kita buat kembali perbatasan(×d)∧
menerapkan elemen non-nold
(non-dinding) sebagai topeng booleana[⍸× ...]
apa yanga
sesuai dengan 1 dalam matriks boolean kami?1∊
apakah ada 1, yaituo
, perkemahan?sumber