Dalam dunia 2D fiksi, satu set instruksi pencetakan 2D untuk objek dapat diwakili oleh daftar bilangan bulat sebagai berikut:
1 4 2 1 1 2 5 3 4
Setiap angka mewakili ketinggian objek pada titik tertentu. Daftar di atas diterjemahkan ke objek berikut saat dicetak:
#
# # #
# ###
## ####
#########
Kami kemudian mengisinya dengan air sebanyak yang kami bisa, menghasilkan ini:
#
#~~~~#~#
#~~~~###
##~~####
#########
Kami mendefinisikan kapasitas objek untuk menjadi unit air yang dapat dipegang benda saat sepenuhnya penuh; dalam hal ini, 11.
Sebenarnya, satu unit air ( ~
) dapat ada di lokasi jika dan hanya jika dikelilingi oleh dua blok padat ( #
) di baris yang sama.
Tantangan
Ambil daftar bilangan bulat positif sebagai input (dalam format apa pun), dan keluarkan kapasitas objek yang dicetak saat daftar digunakan sebagai instruksi.
Anda dapat menganggap daftar berisi setidaknya satu elemen dan semua elemen antara 1 dan 255.
Uji Kasus
+-----------------+--------+
| Input | Output |
+-----------------+--------+
| 1 | 0 |
| 1 3 255 1 | 0 |
| 6 2 1 1 2 6 | 18 |
| 2 1 3 1 5 1 7 1 | 7 |
| 2 1 3 1 7 1 7 1 | 9 |
| 5 2 1 3 1 2 5 | 16 |
| 80 80 67 71 | 4 |
+-----------------+--------+
sumber
Jawaban:
Haskell, 54 byte
Ekspresi
scanl1 max l
danscanr1 max l
menghitung maksimum berjalan dari daftar bacaan maju dan mundur, yaitu profil air ditambah tanah jika air akan mengalir satu arah.Orig:
Kiri:
Kanan:
Kemudian, profil gambar keseluruhan adalah yang minimum, yang sesuai dengan di mana air tidak bocor ke arah mana pun.
Minimum:
Akhirnya, jumlah air adalah jumlah daftar ini, yang berisi air dan tanah, dikurangi jumlah daftar asli, yang hanya berisi tanah.
sumber
Jelly, 10 byte
Meskipun APL membutuhkan beberapa tanda kurung, dan simbol dua karakter J, algoritmanya indah di Jelly.
Coba di sini .
sumber
MATL , 14
Jawaban Matlab saya diterjemahkan ke MATL. Algoritma xnor.
Penjelasan
Y>
:cummax()
(input secara implisit didorong pada tumpukan)G
: push input (lagi)P
:flip()
Y>
:cummax()
P
:flip()
2$X<
:min([],[])
(minimum dua argumen)G
: push input (lagi)-
:-
s
:sum()
sumber
Dyalog APL, 17 byte
Ini adalah kereta monadik yang mengambil larik input di sebelah kanan.
Algoritma ini hampir sama dengan xnor, walaupun saya menemukannya secara independen. Ini memindai maksimum di kedua arah (mundur dengan membalikkan array, memindai, dan membalikkan lagi), dan menemukan minimum vektorisasi dari mereka. Kemudian itu mengurangi array asli dan jumlah.
Cara lain untuk melakukan ini adalah dengan membagi array di setiap lokasi, tetapi itu lebih lama.
Coba di sini .
sumber
+/⊢-⍨⌈\⌊⌈\⍢⌽
.Matlab, 47
Juga menggunakan algoritma xnor.
sumber
MATLAB,
116113109106 BytesIni berfungsi dengan menyimpan titik tinggi di sebelah kiri, dan sementara iterasi melalui setiap titik berikutnya, menemukan titik tertinggi di sebelah kanan. Jika titik saat ini kurang dari kedua titik tinggi, maka itu menambah perbedaan minimum ke volume kumulatif.
Kode tidak dikunci:
Pertama kali saya mencoba bermain golf, MATLAB sepertinya bukan yang terbaik untuk melakukannya di ....
sumber
ES6, 101 byte
Port lain dari alghorithm @ xnor.
sumber
Python 2 , 68 byte
Cobalah online!
sumber
Pip
-l
, 19 byteMengambil angka input sebagai argumen baris perintah. Atau, tambahkan
-r
bendera untuk menjadikannya sebagai garis stdin: Cobalah online!Penjelasan
Tidak seperti semua jawaban lain, di Pip sebenarnya lebih pendek untuk membangun (versi modifikasi) seni ASCII dan menghitung unit air.
Kita mulai dengan
g
, daftar argumen.0Xg
menghasilkan daftar string n nol untuk setiap n dalamg
.ZD1
kemudian ritsleting string ini bersama-sama, gunakan1
untuk mengisi setiap celah di daftar bersarang persegi panjang yang dihasilkan:ST
mengubah daftar ini menjadi string. The-l
menspesifikasikan flag yang daftar diformat sebagai berikut: setiap daftar bersarang bergabung bersama tanpa pemisah, dan pada tingkat atas separator adalah baris baru. Jadi kita mendapatkan string multiline ini - pada dasarnya, diagram objek, tetapi terbalik:Kami kemudian menemukan semua kecocokan dari regex
`0.*0`
. Ini cocok dengan dua dinding terluar dan segala sesuatu di antara mereka di setiap baris.J
menggabungkan string-string ini menjadi satu string besar, dan$+
menjumlahkannya, memberikan jumlah1
s - yang sama dengan jumlah air yang bisa dipegang oleh objek.sumber