Ini adalah tetesan hujan:
! | . " :
Ini adalah partikel awan:
( ) _ @ $ &
Saya ingin Anda memverifikasi, ketika diberi blok teks, apakah hujan atau tidak. Hujan jika, untuk setiap tetesan hujan, ada partikel awan di suatu tempat di atasnya. Harus ada satu partikel awan untuk setiap tetes hujan. Output truthy atau nilai falsy yang menunjukkan kesimpulan Anda.
Contoh yang valid
(@@@@@@)
( $ & )
Q ( )
.. . !
: .
|" !
.
()()()
......
@_$ &
errrr
h_r-5
.:. .
"
Contoh tidak valid
!
()
$$$$$
( )
:::::
.....
Ini adalah kode-golf sehingga program terpendek dalam karakter menang.
Jawaban:
APL (30)
Ini adalah fungsi yang mengambil matriks karakter sebagai input, dan memberikan output boolean.
Uji:
Penjelasan:
⍵∘∊¨'!|.":' '()_@$&'
: untuk kedua set karakter (hujan dan awan), dan setiap karakter dalam ⍵, lihat apakah karakternya adalah anggota set.+⍀¨
: dapatkan jumlah running untuk setiap kolom dan setiap set≤/
: untuk setiap posisi dalam ⍵, periksa bahwa jumlah tetesan hujan tidak melebihi jumlah partikel awan dalam jumlah yang berjalan∧/∊
: kembalikan boolean DAN semua elemen dalam hasilsumber
C ++ 11,
186184 byteTidak disatukan
Pendekatan dasar, menyimpan posisi partikel awan dalam satu baris dan jika partikel hujan dijumpai, ia memeriksa apakah partikel awan berada di atasnya dan mengurangi penghitung partikel awan dalam kolom itu. Program mengembalikan 0 jika valid dan 1 sebaliknya.
sumber
c-m?0:p[i]++
denganp[i]+=c==m
? Atau apakah itu tidak lagi berfungsi di C ++ 11?Siput , 125
Program mengeluarkan area kisi (atau 1 jika luasnya 0) jika hujan; jika tidak, saya hanya menerapkan kelas karakter gaya regex.
Versi tidak dikoleksi Ini berisi instruksi palsu untuk awan atau tetesan hujan alih-alih menuliskan semua omong kosong.
\whatever
(Digantikan dengan.
dalam program nyata) berarti sesuatu yang seharusnya menjadi tetesan hujan, tetapi sebenarnya bisa menjadi apa saja karena tidak masalah jika kita mencocokkan tetesan hujan dengan awan.sumber
Python 2, 121 byte
Diharapkan input akan menjadi persegi panjang.
sumber
JavaScript ES6, 112
Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6 yang menerapkan fungsi panah, operator sebar, dan string templat (saya menggunakan Firefox)
sumber
Perl 5, 80
79, plus satu untuk
-E
bukan-e
sumber
Julia, 90 karakter
Berbeda dengan solusi asli (di bawah), ini menggunakan matematika untuk menentukan solusi.
mapfoldl(collect,hcat,split(s,"\n"))
(ditulis di atas dengan\n
diganti dengan baris baru yang sebenarnya untuk menyimpan karakter) mengubah string menjadi array karakter 2d.map(i->i∈"!|.\":"?-1:i∈"()_@\$&",...)
menciptakan array angka, dengan 1 jika karakternya adalah awan, -1 jika karakternya hujan, dan 0 sebaliknya.cumsum(...')
menghitung jumlah kumulatif dari baris (biasanya akan dituliscumsum(...,2)
, tetapi karena kita tidak peduli tentang orientasi sejak saat ini, mentransposisi hanya biaya satu karakter), dan kemudianall(... .>-1)
memeriksa angka negatif - negatif hanya akan terjadi jika karakter hujan muncul tanpa didahului oleh karakter cloud.Julia,
139136 karakterFungsi ini pertama-tama mentransposisi teks sehingga baris menjadi kolom dan sebaliknya. Perhatikan bahwa baris baru hadir dalam kode dalam bentuk baris baru yang sebenarnya, untuk menyimpan satu karakter per instance.
Fungsi kemudian secara iteratif menggantikan pasangan cloud / droplet dengan spasi, dan setelah semua pasangan tersebut dihapus, ia mengembalikan true jika ada tetesan yang tersisa dan false jika tidak.
r"[()_@$&](.*?)[!|.\":]"
- ini adalah regex yang akan mencocokkan pasangan cloud / droplet dengan cara yang malas, dengan grup 1 berisi segalanya antara cloud dan droplet. Kemudians"\g<1>"
suruh untuk menghapus awan dan tetesan yang cocok, tetapi simpan di antara keduanya (diperlukan karena dapat mengandung awan) -\g<1>
adalah apa pun yang cocok di grup 1 regex.∩("!|.\":",t)==[]
akan menghasilkan persimpangan karakter tetesan dengan string terakhir, dan jika kosong, maka tidak ada karakter tetesan hadir, dan hujan.sumber
h
digunakan dengan fungsi anonim yang sebenarnya. Seperti ini:g((s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n")s->join(foldl(.*,[split(i,"")for i=split(s,"\n")]),"\n"))("()()()\n......"))
- menyebutnyah
hanya membuatnya lebih mudah untuk dipanggil.