Tanah longsor
Dalam tantangan ini, tugas Anda adalah memperkirakan tingkat kerusakan yang disebabkan oleh tanah longsor besar-besaran. Kami menggunakan model dua dimensi berikut yang disederhanakan untuknya, diparameterisasi dengan tinggi awal h >= 0
dan koefisien kritis c > 0
. Anda mulai dengan tebing tinggi h
, dan diasumsikan bahwa medannya benar-benar datar tak terbatas ke kiri dan ke kanan. Sebab h = 6
, situasinya terlihat seperti ini:
##########
##########
##########
##########
##########
##########
-----------------------
Ini -
adalah batuan dasar yang tidak tergoyahkan, dan #
merupakan tanah yang tidak stabil. Jika perbedaan ketinggian antara dua kolom tetangga lebih dari c
, tanah longsor terjadi: c
unit teratas tanah dari kolom kiri jatuh ke c
kolom berikutnya di sebelah kanan, satu ke masing-masing. Kolom non-kosong paling kanan pada gambar tidak stabil untuk c = 2
, sehingga tanah longsor dipicu:
#########
#########
##########
##########
##########
############
-----------------------
Kolom masih tidak stabil, yang menyebabkan tanah longsor kedua:
#########
#########
#########
#########
############
############
-----------------------
Sekarang, kolom di sebelah kirinya menjadi tidak stabil, sehingga tanah longsor baru dipicu di sana:
########
########
#########
###########
############
############
-----------------------
Setelah ini, tebing kembali stabil. Yang menyenangkan dari model ini adalah urutan pemrosesan tanah longsor tidak menjadi masalah: hasil akhirnya sama.
Tugas
Program Anda diberi parameter bilangan bulat h
dan c
sebagai input (urutannya tidak penting, tetapi Anda harus menentukannya pada jawaban Anda), dan itu akan menampilkan jumlah kolom yang dipengaruhi oleh tanah longsor. Ini berarti jumlah kolom di tebing stabil yang dihasilkan yang tingginya antara 0
dan h
. Dalam contoh di atas, output yang benar adalah 4
.
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji Kasus
Ini diberikan dalam format h c -> output
.
0 2 -> 0
2 3 -> 0
6 2 -> 4
6 6 -> 0
10 1 -> 10
15 1 -> 14
15 2 -> 11
15 3 -> 6
40 5 -> 16
80 5 -> 28
80 10 -> 17
CJam - 70
Cobalah di http://cjam.aditsu.net/
Penjelasan:
The
h
Operator memeriksa nilai terakhir di stack tanpa menghapusnya. Jika terjadi tanah longsor, nilainya adalah array tebing, yang dievaluasi benar karena tidak kosong. Jika tidak, nilai terakhir adalah 0 (salah).Jadi dalam kasus tanah longsor, loop berlanjut dengan array pada stack, jika tidak maka diakhiri dengan 0 didorong setelah array. 0 itu kemudian dihapus dari array oleh
-
operator berikutnya .sumber
Python,
200190174Versi yang diperluas:
Sunting: Setelah beberapa pengoptimalan, saya menghilangkan terminasi loop canggung melalui break (menghemat 1 byte). Juga mengubah slide dari irisan menjadi berbasis loop.
sumber
sum
selama 2 byte. Selain itu, biasanya lebih baik untuk mendefinisikan program lengkap dengan Python, mengambil inputh,c=input()
dan mencetak hasilnya pada akhirnya.sum
dapat menghemat satu:sum(h>i>0for i in q)
.c=0
menghemat satu byte (saya tidak dapat mengomentari jawaban Anda).Python 2 -
194158 byte(Perhatikan bahwa juru bahasa markdown SE mengonversi tab literal menjadi 4 spasi. Baris 7 dan 8 dari program ini hanya memiliki satu tab tunggal [yaitu satu byte] dari lekukan masing-masing.)
Mengambil input pada stdin,
h
pertama. Sebagai contoh:Program ini telah melalui banyak perbaikan. Saya telah mengedit jawaban ini untuk menjelaskan beberapa pengeditan yang lebih utama, tetapi agak lama. Anda dapat memeriksa riwayat edit jika Anda penasaran.
Penjelasan
Pertama,
h
danc
dibaca dari stdin. Dalam Python 2,input()
sama denganeval(raw_input())
, itulah sebabnya saya meminta koma yang memisahkan angka.input()
memberikan pengembalian sejumlah int, tidak perlu konversi.Selanjutnya, daftar bilangan bulat dibuat. Itu
2*h
panjang. Paruh pertama adalahh
dan babak kedua adalah 0. Saya tidak punya alasan untuk menunjukkan bahwa ini cukup untuk mensimulasikan infiniteh
s ke kiri dan 0s ke kanan. Saya hanya semacam tersandung ke dalamnya dan berfungsi untuk semua kasus uji, jadi jika seseorang dapat menemukan input tidak bekerja untuk saya dengan senang hati akan mengubahnya. Pokoknya, daftar ini dipanggill
, tetapi salinan lain dari itu dipanggilb
.b
Nilai sebenarnya tidak penting, yang penting adalah kebenaran. Daftar yang tidak kosong adalah benar dan satu-satunya carab
kosong di sini adalah jikah
0, dalam hal ini jawaban yang benar masih dicetak. Dalam kasus lain,b
harus jujur untuk memastikan kita memasukiwhile b:
loop. Namun, hal pertama yang terjadi di loop adalah pengaturanb
ke 0, nilai falsey. Selama setiap pengulangan loopb
harus secara khusus diatur kembali ke yang benar atau loop akan berakhir.Sisa dari loop adalah simulasi yang sebenarnya. Sangat naif, pada dasarnya hanya menjadi terjemahan kode dari deskripsi masalah. Jika ada elemen
l
lebih dari yangc
lebih besar dari yang mengikutinya, itu dikurangi denganc
danc
elemen berikutnya memiliki 1 ditambahkan ke mereka. (Sihir bitwise yang digunakan di sini hanyalah cara penulisan yang lebih pendeki+1+j
, by the way.) Saat membuat transformasi ini,b
diatur ke 1. Pertama kali tidak ada transformasi yang dibuat,b
akan tetap 0 dan loop berakhir.Ekspresi sejati apa pun dievaluasi
True
, dan ketika Anda mencoba menghitungnya,True
berarti bernilai 1. Hal yang sama juga berlaku padaFalse
0. Baris terakhir program menggunakan setiap elemenl
sepertie
dalam ekspresih>e>0
dan menjumlahkan hasilnya. Ini mendapatkan jumlah kolom lebih besar dari 0 tetapi lebih rendah dari ketinggian tebing asli, yang merupakan nilai yang diminta pertanyaan. Ini dicetak dan program keluar.sumber
c-=c
setara denganc=0
?i+1+j
dapat ditulis sebagaii-~j
Haskell,
163156151 BytesPenggunaan:,
h#c
misalnya6#2
keluaran mana4
.Cara kerjanya: fungsi helper
s
melakukan sekali longsor. Berlaku berulangs
sampai output tidak berubah lagi. Hitung elemen yang terpengaruh.Menemukan fungsi "terapkan sampai keluaran tidak berubah" (yaitu
until=<<((==)=<<)
) di Stackoverflow .sumber
f
sebagai infix (h#c=...
) dan memindahkanwhere
klausa ke baris yang sama. Juga, masih ada beberapa tanda kurung untuk digunakan$
, meskipun saya tidak yakin berapa banyak ...()
dengan$
jejak dan kesalahan bagi saya.Mathematica,
1081041009795Pemakaian:
Contoh:
sumber
C #
303295Berhasil!
Tapi itu ....
Saya harus menemukan bahasa baru;)
Saya akan memeriksa hal CJam ini ...
Ditingkatkan:
sumber
int z=i;int y=i-1;
bisa jadiint z=i,y=i-1;
. Thefor
loop tidak melakukan rumit hal-hal dengan indeks mereka, sehingga misalnyafor(int i=s.Count-1;i>0;i--)
bisafor(int i=s.Count;--i>0;)
.1<0
adalah cara penulisan yang lebih pendekfalse
. Saya menduga ituif(s[s.Count-1]>0)s.Add(0);
bisa kehilangan kondisi tanpa mempengaruhi kebenaran, hanya kecepatan.