Masalah
Skenario kiamat digambarkan oleh tiga angka pada satu baris, n
, m
, dan p
. Mengikuti garis itu adalah n
garis dengan m
nilai per baris. Setiap nilai mewakili total unit air yang dapat ditahan oleh setiap sel.
Baris berikut p
menjelaskan cuaca untuk p
hari-hari berikutnya . 1 unit hujan jatuh di satu sel setiap hari. Jika jumlah air dalam sel melebihi jumlah yang bisa dipegangnya, sel itu akan banjir. Jika beberapa sel yang berdekatan berada pada kapasitas penuh, mereka diperlakukan sebagai satu sel yang berbagi tetangga yang sama (pikirkan Minesweeper ketika Anda mengklik pada sekelompok kosong).
- Sel tengah tunggal memiliki 4 tetangga
- Dua sel tengah yang berdekatan dan berkapasitas penuh diperlakukan sebagai satu sel yang memiliki 6 tetangga
- Sel sudut tunggal memiliki 2 tetangga
- Satu sel dinding memiliki 3 tetangga
Ketika sel banjir, peristiwa banjir terjadi. Semua kelebihan air didistribusikan secara merata ke tetangganya. Jika itu menyebabkan satu atau lebih tetangga banjir, maka peristiwa banjir lainnya terjadi. Ini berlanjut sampai air telah mengendap, atau kota telah sepenuhnya banjir.
Contoh Input
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
0 0
berarti hujan di baris 1, kolom 11 2
berarti hujan di baris 2, kolom 3 (yang dapat menampung nol air dan segera banjir!)
Setelah p
berhari-hari hujan, jika kota benar-benar banjir, keluaran Sink . Jika tidak, hasilkan Swim .
Contoh Output
Berenang
Asumsi
- Masukan dapat diberikan melalui stdin, baca dari "city.txt", atau diterima sebagai argumen. Ketiganya diizinkan agar tidak membatalkan jawaban yang sudah diposting.
- Kapasitas air adalah bilangan bulat non-negatif.
40+ tim mahasiswa sarjana (dari A&M, UT, LSU, Rice, Baylor, dll.) Yang bersaing dalam kontes pemrograman dengan berbagai bahasa yang tersedia tidak dapat menyelesaikan masalah ini dalam 5 jam. Karena itu, saya tidak dapat membantu tetapi menyebutkan bahwa ada masalah dengan teka-teki ini yang membuat solusinya sepele. Kode terpendek masih menang, karena saya sangat yakin bahwa kode terpendek juga akan memecahkan teka-teki.
n
garism
nilai atau sebaliknya? Contoh Anda tidak sesuai dengan spesifikasi tertulis.0.25
unit misalnya untuk setiap sel yang berdekatan (dengan asumsi sel banjir tengah tunggal)?Jawaban:
Golfscript,
3730 karakterBaru dan lebih baik, terima kasih kepada PeterTaylor untuk tips:
Penjelasan :
Program kemudian berakhir, mengeluarkan tumpukan.
Versi lama + penjelasan:
Pendekatan yang sama seperti Fors , just Golfscripted =). Kemungkinan bisa dibuat lebih efisien. Masukan dari stdin.
Penjelasan :
Program kemudian mengeluarkan tumpukan, yang hanya jawabannya.
sumber
]
tanpa pencocokan[
akan mengumpulkan seluruh tumpukan ke dalam array, sehingga inisial[~]
dapat disederhanakan~]
. Untuk mendapatkangrid_size
elemen pertama dari sebuah array, gunakan<
, jadi<{+}*
hampir pasti bisa menghemat sedikit untuk menambah kapasitas total.0>"Sink""Swim"if
dapat0>"SinkSwim"4/=
~]
? Saya mencobanya dan sepertinya tidak berhasil. Retas terakhir bagus meskipun harus"SwimSink"
- akan menggunakannya. dan hal array juga tampaknya menjanjikan, akan mulai bekerja pada itu.ruby golfscript.rb
dan itu masih tidak berhasil ... dapatkah Anda memverifikasi bahwa itu berhasil pada Anda? Saya mendapatkan kesalahan yang sama pada keduanya:undefined method '+' for nil:NilClass (NoMethodError)
C:
1009695 karakterLima jam? Butuh waktu lima menit. :)
Aragaer, terima kasih atas penyederhanaannya! Namun saya mengatur ulang deklarasi variabel dan argumen ke utama, mengingat Dentang melempar kesalahan jika argumen kedua ke utama adalah dari jenis lain selain
char **
.sumber
p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}
. Saya juga bermain dengan iden-=scanf
, tetapi tidak yakin apakah program akan benar setelah itu. Pertamascanf
dapat dipindahkan ke depanfor
tanpa mengubah jumlah karakter.n-=scanf...
tidak akan bekerja, karenan-=1
pada dasarnya adalah kenaikan sebelum, sehingga akan kehilangan sudut tenggara. Perubahan lainnya sangat bagus.Python, 4 baris, 175 karakter
Lol, saya ingin tahu apakah 40+ tim akhirnya menemukan tangkapan ... setelah menyelesaikannya dengan keras.
sumber
#
.input()
danmap()
:n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
Fitur ganda J (50 char) dan K (40)
Ternyata, seperti biasa, keduanya memiliki struktur yang sama persis dalam solusi mereka, jadi mereka berdua ada di sini. K jauh lebih pendek, yang merupakan kejutan yang menyenangkan.
Penjelasan:
".1!:1]1
- Baca di baris pertama, dan konversikan ke bilangan bulat.(...)/0 2{
- Ambil item pada indeks 0 dan 2 (n
danp
masing - masing), dan gunakan masing - masing sebagai argumen kiri dan kanan pada kata kerja(...)
.+1!:1@#1:
- Bacan+p
sejalan.[+/@".@$
- Ambil ($
)n
baris pertama ([
), buang sisanya, lalu konversikan ke integer (".
) dan jumlahkan pada setiap baris (+/
).]<[:+/
- Tambahkan bersama jumlah baris, lalu bandingkan nilai ini dengan argumen yang tepatp
,. Kami menghasilkan benar jikap
kurang dari jumlah.>Sink`Swim{~
- PilihSwim
jika perbandingan di atas menghasilkan true, atauSink
jika false.Pemakaian:
Dan sekarang K:
Dijelaskan:
. 0:`
- Baca di jalur input, dan konversi ke array bilangan bulat.{...}.
- Gunakan tiga angka inin m p
sebagai argumenx y z
untuk fungsi ini.0::'(x+z)#`
- Buatx+z
salinan pegangan file input`
, dan kemudian baca dalam satu baris untuk masing-masingnya (0::'
).:'x#
- Ambilx
item pertama , dan konversi masing-masing ke vektor angka.z<+//
- Jumlah seluruh matriks bersama-sama, dan kemudian tes untuk melihat apakah itu lebih besar dariz
.`Sink`Swim@
- KembaliSink
atauSwim
sesuai dengan apakah tes tersebut kembali benar.Pemakaian:
sumber
APL, 35
Tidak yakin apakah diizinkan tetapi berhenti menerima input setelah "kota"
x←⎕
Mengambil input dan menyimpannya dalam variabelx
(angka-angka terbatas-ruang ditafsirkan sebagai array numerik)1⌷
Ekstrak indeks 1 (array APL berbasis satu)⍳
Hasilkan array dari 1 hingga argumen (1⌷x←⎕
dalam hal ini)¨
"Peta" operasi{+/⎕}
Ambil array dari masukan dan kembalikan jumlah+/
Jumlah array yang dihasilkan oleh operasi peta4×x[3]>
Uji jika jumlah <x[3]
(mengembalikan 1 atau 0), kemudian gandakan 4'SwimSink'⌽⍨
Putar string'SwimSink'
dengan jumlah itu4↑
Akhirnya, ekstrak 4 karakter pertama dari stringsumber
⎕IO←0
, lalu ganti4↑'SwimSink'⌽⍨4×
dengan'Swim' 'Sink'⊃⍨
,x[3]
denganx[2]
, dan1⌷x
dengan⊃x
untuk menyimpan dua byte.AWK, 70
Ini adalah perbaikan oleh yang laindir pada kiriman saya (86):
sumber
NR<=h
seharusnyaNR<=h+1
, jika tidak, Anda akan mendapatkan Sink palsu karena baris terakhir kapasitas dilewati. Ini juga dapat disingkat menjadi 70 sebagain{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
CoffeeScript -
128113Fungsi yang menggunakan string sebagai satu-satunya argumen:
sumber
`p>x?"Sink":"Swim"`
bukanif p>x then"Sink"else"Swim"
. Parens untuk pernyataan ketiga juga tidak diperlukan.SED, 128
Sangat menyenangkan untuk menulis
sed
versi ini. Ini memiliki kedatangan singkat berikut:Diasumsikan kota memiliki lebih dari dua kolom, untuk dengan mudah mengenali garis hujan.
Diasumsikan bahwa kapasitas masing-masing kota berada pada kisaran 0-9.
Ini dia:
Panggil dengan
-n
bendera.sumber
SWI-Prolog 79
Jika Anda tidak keberatan dengan kenyataan bahwa jawaban ini membutuhkan input dari kueri, bukan melalui stdin:
Jawabannya tidak memvalidasi format input, tapi saya rasa itu bukan masalah, karena kontes pemrograman juga tidak mengharuskan Anda melakukannya.
Permintaan sampel (menggunakan contoh dalam pertanyaan):
sumber
Python - 152
sumber
,
, sebelum dan sesudah'
, setelah)
...Scala - 128
Mungkin saja untuk menghilangkan beberapa tanda kurung atau sesuatu, tetapi Scala benar-benar berubah-ubah tentang tanda baca dan gaya bebas-titik dan () vs {} dan yang lainnya.
sumber
Javascript - 73 Karakter
Mengasumsikan input dalam variabel
s
dan outputSwim
atauSink
.Contoh:
Dari pertanyaan awal - memasukkan ini ke konsol browser:
Output:
sumber