Menjadi seorang peretas Haskell, saya lebih suka notasi pointfree daripada pointful. Sayangnya beberapa orang menemukan notasi pointfree sulit dibaca, dan saya merasa sulit untuk mendapatkan jumlah tanda kurung yang benar ketika saya menulis dalam pointful. Bantu saya mengonversi kode yang ditulis dalam pointfree ke notasi pointful!
Tentang
Dalam notasi pointfree kami menggunakan poin (ya, sungguh) untuk memberi makan output dari satu fungsi ke yang lain. Katakanlah, jika Anda memiliki fungsi succ
yang mengambil angka dan menambahkan 1 ke dalamnya, dan Anda ingin membuat fungsi yang menambahkan 3 ke angka, alih-alih melakukan ini:
\x -> succ(succ(succ(x)))
Anda bisa melakukan ini:
succ.succ.succ
Pointfree hanya bekerja dengan fungsi-fungsi yang mengambil parameter tunggal (dalam tantangan ini pula), jadi jika fungsi kita tidak succ
tetapi add
mengambil 2 angka dan menambahkannya bersama-sama, kita harus memberinya argumen sampai hanya ada satu yang tersisa:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Terakhir, fungsi dapat menggunakan fungsi lain sebagai argumen:
Pointfree: map (f a . f b) . id
Pointful: \x -> map (\x -> f a (f b x)) (id x)
Javascript equivalent: x => map (x => f(a,f(b,x)), id(x))
Input dan output yang diharapkan
f . f . f
\x -> f (f (f x))
f a . f b . f c
\x -> f a (f b (f c x))
f (f a . f b) . f c
\x -> f (\x -> f a (f b x)) (f c x)
a b c . d e . f g h i . j k l . m
\x -> a b c (d e (f g h i (j k l (m x))))
a.b(c.d)e.f g(h)(i j.k).l(m(n.o).p)
\x->a(b(\y->c(d y))e(f g h(\z->i j(k z))(l(\q->m(\w->n(o w))(p q))x)))
Aturan
- Output Anda mungkin memiliki lebih banyak spasi atau tanda kurung dari yang dibutuhkan, asalkan seimbang
- Anda tidak harus memastikan bahwa nama variabel yang Anda buat
\x
belum digunakan di tempat lain dalam kode - Ini adalah pilihan Anda apakah akan membuat suatu fungsi atau program penuh
- Ini
codegolf
, kode terpendek dalam byte menang!
Anda mungkin menemukan manfaat yang tumpul, itu mengkonversi antara dua notasi (tetapi juga faktorisasi kode bila mungkin): https://blunt.herokuapp.com
(+).(*3)
sama dengan\x y->3*x+y
(.).(.)
yang mengonversi ke\i b c f -> i (b c f)
.
- masing dengan(
, tambahkan\x
dan tambahkan yang sesuaix
dan sebanyak)
yang diperlukan? Atau lebih rumit dari itu?\ d->f(\k->f(f d k))
, tetapi Anda dapat mengasumsikan bahwa semua titik diberi dua argumen dalam tantangan iniJawaban:
Haskell,
163 142133 byteCobalah di Ideone.
Tidak Disatukan:
sumber
Haskell,
402289 byteCukup lama, tapi saya pikir itu berhasil ..
sumber