Was ist der kürzeste Weg, um die Funktion auszudrücken
f(a,b)(c,d)=(a+c,b+d)
in punktloser Notation?
pointfree.io gibt uns
uncurry (flip flip snd . (ap .) . flip flip fst . ((.) .) . (. (+)) . flip . (((.) . (,)) .) . (+))
was mit ein wenig arbeit gekürzt werden kann
uncurry$(`flip`snd).((<*>).).(`flip`fst).((.).).(.(+)).flip.(((.).(,)).).(+)
für 76 Bytes. Aber für eine so einfache Aufgabe scheint das immer noch sehr lang und komplex zu sein. Gibt es eine Möglichkeit, die paarweise Addition als kürzere punktfreie Funktion auszudrücken?
Um klar zu sein, was ich unter Punktfrei verstehe, bedeutet eine Punktfreie Deklaration einer Funktion, dass vorhandene Funktionen und Operatoren so übernommen und aufeinander angewendet werden, dass die gewünschte Funktion erstellt wird. Backticks, Klammern und Literalwerte ( []
, 0
, [1..3]
, usw.) sind erlaubt , aber Schlüsselwörter wie where
und let
sind es nicht. Das heisst:
Sie dürfen keine Variablen / Funktionen zuweisen
Sie dürfen keine Lambdas verwenden
Sie dürfen nicht importieren
(+)***(+)
.(+)<$>([1],2)<*>([3],4)
gibt([1,3],6)
.Antworten:
44 Bytes
Habe das von
\x y -> (fst x + fst y, snd x + snd y)
Probieren Sie es online!
quelle
44 Bytes
-8 Bytes dank Ørjan Johansen. -3 Bytes dank Bruce Forte.
Probieren Sie es online!
Wird übersetzt in:
67 Bytes
-8 Bytes dank Ørjan Johansen. -1 Byte dank Bruce Forte.
Wenn eine Tupelausgabe erforderlich ist:
Probieren Sie es online!
Ja, wenn ich es manuell mache, entstehen keine reifen Früchte. Ich bin aber mit der
[a] → (a, a)
Umstellung zufrieden .Nun, wenn es eine kurze Funktion mit gab
m (a → b) → a → m b
.quelle
mapM id[fst,snd]
ist kürzer.mapM id
ist die golfed Version der Funktion sind Sie wahrscheinlich auf der Suche nach,sequence
.(<*>)
die Unterschrift, die istm (a → b) → m a → m b
. So nah dran ...Control.Lens.??
, die möglicherweise für die Aufnahme in die Basis irgendwann vorgeschlagen wurden.(.mapM id[fst,snd])
wielet r=(.mapM id[fst,snd]) in r(r.zipWith(+))
, aber ich habe nicht die typechecker bekommen konnte eine pointfree Version zu übernehmen.54 Bytes
Ich habe ehrlich gesagt Zweifel daran , dass wir @ H.PWiz die 44 Bytes Lösung schlagen wird, aber niemand wurde mit der Tatsache , dass
(,)
Geräte der TypenklasseFunctor
, so ist hier eine andere interessant , die nicht so schlecht ist:Probieren Sie es online!
Erläuterung
Die Implementierung der Typklasse
Functor
für 2 -Tupel ist der vonEither
(ab base-4.10.1.0 ) sehr ähnlich :Für diese Herausforderung bedeutet dies, dass die folgende Funktion die zweiten Elemente hinzufügt, während das erste Element des zweiten Arguments beibehalten wird:
Wenn wir nur einen kleinen Helfer hätten
helpPlz = \a b -> (fst a+fst b,snd b)
, könnten(helpPlz<*>).flip(fmap.(+).snd)
und würden wir es tun . Zum Glück haben wir das Werkzeug,pointfree
das uns gibt:Wenn Sie diese Funktion einfach wieder einstecken, gelangen Sie zu der obigen Lösung (beachten Sie,
(<*>) = ap
welche in der Basis ist ).quelle
60 Bytes
Ich sehe
uncurry
hier keine Liebe, also dachte ich mir, ich schaue vorbei und repariere das.Ich dachte, mit all dem
fst
undsnd
, dass das Auspacken der Argumente mituncurry
einigen Ergebnissen führen könnte. Offensichtlich war es nicht so fruchtbar, wie ich gehofft hatte.quelle
uncurry
ist so wortreich. :( Aber Sie können die äußersten Klammern durch ersetzen$
.