Als Haskell-Hacker bevorzuge ich die punktfreie Notation gegenüber der sinnvollen. Leider fällt es einigen Leuten schwer, eine punktfreie Notation zu lesen, und ich finde es schwierig, die richtige Anzahl von Klammern zu erhalten, wenn ich in Punkt schreibe. Helfen Sie mir, in punktfreier Schreibweise geschriebenen Code in sinnvolle Notation umzuwandeln!
Über
In der punktfreien Notation verwenden wir Punkte (ja, wirklich), um die Ausgabe einer Funktion in eine andere einzuspeisen. Angenommen, Sie hatten eine Funktion succ
, die eine Zahl nimmt und 1 hinzufügt, und Sie wollten eine Funktion erstellen, die einer Zahl 3 hinzufügt, anstatt dies zu tun:
\x -> succ(succ(succ(x)))
Sie könnten dies tun:
succ.succ.succ
Pointfree funktioniert nur mit Funktionen , die jedoch nur einen Parameter übernehmen (in dieser Herausforderung sowieso), so dass , wenn unsere Aufgabe war es nicht , succ
sondern add
die 2 Zahlen nehmen und fügt sie zusammen, hätten wir es Argumente füttern , bis nur noch einer übrig ist:
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
Schließlich können Funktionen andere Funktionen als Argumente verwenden:
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))
Eingabe und erwartete Ausgabe
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)))
Regeln
- Ihre Ausgabe enthält möglicherweise mehr Leerzeichen oder Klammern als erforderlich, sofern diese ausgeglichen sind
- Sie müssen nicht sicherstellen, dass der Name der von Ihnen erstellten Variablen
\x
nicht bereits an einer anderen Stelle im Code verwendet wird - Sie haben die Wahl, ob Sie eine Funktion oder ein vollständiges Programm erstellen möchten
- Dies ist
codegolf
, kürzester Code in Bytes gewinnen!
Möglicherweise ist stumpf nützlich. Es konvertiert zwischen den beiden Notationen (faktorisiert aber auch den Code, wenn möglich): https://blunt.herokuapp.com
(+).(*3)
ist das gleiche wie\x y->3*x+y
(.).(.)
die konvertiert zu\i b c f -> i (b c f)
.
durch a ersetzen (
, a voranstellen \x
und ein entsprechendes x
und so viele )
wie nötig anhängen ? Oder ist es komplizierter?
\ d->f(\k->f(f d k))
, aber Sie können davon ausgehen, dass alle Punkte zwei Argumente in dieser Herausforderung