Haskell 해커이기 때문에 나는 뾰족한 것보다 pointfree 표기법을 선호합니다. 불행히도 일부 사람들은 포인트 프리 표기법을 읽기가 어려워서 포인트를 쓸 때 올바른 수의 괄호를 얻는 것이 어렵다는 것을 알게되었습니다. pointfree로 작성된 코드를 pointful 표기법으로 변환 할 수 있도록 도와주세요!
약
포인트 프리 표기법에서는 포인트 (예, 실제로)를 사용하여 한 함수의 출력을 다른 함수에 공급합니다. 말, 당신은 함수가 있다면 succ
, 숫자를 받아 여기에 1을 추가하고 대신이 일을, 숫자 3을 추가하는 기능을 확인하고 싶었 :
\x -> succ(succ(succ(x)))
당신은 이것을 할 수 있습니다 :
succ.succ.succ
Pointfree는 우리의 기능은 아니었다 그렇다면, (어쨌든이 문제에) 그러나 하나의 매개 변수를 사용 기능을 작동하는 succ
것이 아니라 add
이 개 번호를 가지고 함께 추가되는, 우리가 하나가 남아있을 때까지 그것을 인수를 공급해야합니다 :
pointful: \x -> add 1(add 1(add 1 x))
pointfree: add 1 . add 1 . add 1
마지막으로 함수는 다른 함수를 인수로 사용할 수 있습니다.
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))
입력 및 예상 출력
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)))
규칙
- 출력이 균형을 유지하는 한 필요한 것보다 더 많은 공백이나 괄호가있을 수 있습니다
- 생성 한 변수의 이름
\x
이 코드의 다른 곳에서 사용되지 않았 는지 확인할 필요 는 없습니다. - 함수를 만들 것인지 전체 프로그램을 만들 것인지 선택하십시오
- 이것은
codegolf
바이트 단위의 가장 짧은 코드입니다!
당신은 무딘 유용한 것을 발견 할 수 있습니다, 그것은 두 표기법 사이에서 변환합니다 (그러나 가능한 경우 코드를 분해합니다) : https://blunt.herokuapp.com
답변
하스켈, 163142133 바이트
p(x:r)|[a,b]<-p r=case[x]of"("->["(\\x->"++a++p b!!0,""];"."->['(':a++")",b];")"->[" x)",r];_->[x:a,b]
p r=[r,r]
f s=p('(':s++")")!!0
언 골프 드 :
p('(':r)|(a,b)<-p r = ("(\\x->"++a++(fst(p b)),"")
p('.':r)|(a,b)<-p r = ('(':a++")", b)
p(')':r) = (" x)", r)
p(x :r)|(a,b)<-p r = (x:a, b)
p _ = ("", "")
f s=fst(p('(':s++")"))
답변
하스켈, 402 289 바이트
꽤 길지만 작동한다고 생각합니다 ..
(!)=elem
n%'('=n+1
n%')'=n-1
n%_=n
a?n=a!"."&&n<1
a#n=a!" ("&&n<1||a!")"&&n<2
q a='(':a++")"
p s o n[]=[s]
p s o n(a:b)|o a n=[t|t@(q:r)<-s:p""o(n%a)b]|0<1=p(s++[a])o(n%a)b
k=foldr((++).(++" ").f)"".p""(#)0
f t|not$any(!"(. ")t=t|l@(x:r)<-p""(?)0t=q$"\\x->"++foldr((.q).(++).k)"x"l|0<1=k t