পয়েন্টফ্রিকে পয়েন্টফুলিতে রূপান্তর করুন


9

হাস্কেল হ্যাকার হওয়ার কারণে আমি পয়েন্টফ্রি চেয়ে বেশি পয়েন্টফ্রি নোটকেই বেশি পছন্দ করি। দুর্ভাগ্যক্রমে কিছু লোক পয়েন্টফ্রি নিবন্ধটি পড়া কঠিন বলে মনে হয় এবং আমি যখন বিন্দুতে লিখি তখন সঠিক বন্ধনীগুলির সঠিক সংখ্যা পাওয়া আমার পক্ষে কঠিন find আমাকে পয়েন্টফ্রি তে লিখিত কোডটি পয়েন্টফুলিটি নোটেশনে রূপান্তর করতে সহায়তা করুন!

সম্পর্কিত

বিন্দু বিন্যাসে আমরা একটি ফাংশনের আউটপুটটিকে অন্যটিতে ফিড করতে পয়েন্টগুলি (হ্যাঁ, সত্যই) ব্যবহার করি। বলুন, আপনার যদি এমন কোনও ফাংশন থাকে succযা একটি সংখ্যা নেয় এবং এতে 1 যোগ করে এবং আপনি এমন একটি ফাংশন তৈরি করতে চেয়েছিলেন যা এটি করার পরিবর্তে একটি সংখ্যায় 3 যোগ করে:

\x -> succ(succ(succ(x)))

আপনি এটি করতে পারে:

succ.succ.succ

পয়েন্টফ্রি শুধুমাত্র সেই ফাংশনগুলির সাথে কাজ করে যা একটি প্যারামিটার নেয় তবে (যাইহোক এই চ্যালেঞ্জে), সুতরাং যদি আমাদের ফাংশনটি না হয়ে succবরং add2 নম্বর নেয় এবং তাদের একসাথে যুক্ত করে থাকে, তবে কেবলমাত্র একটি মাত্র বাকি না থাকলে আমাদের এটিকে যুক্তিগুলি খাওয়াতে হবে:

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


15
বিন্দুগুরু স্বরলিপিতে আমরা একটি ফাংশনের আউটপুটটিকে অন্যটিতে খাওয়ানোর জন্য পয়েন্টগুলি ব্যবহার করি এটি স্পষ্টভাবে প্রমাণ করার চেষ্টা যে পয়েন্টফ্রি নিরর্থক নয়
লুইস মেন্ডো

1
"পয়েন্টফ্রি শুধুমাত্র সেই ফাংশনগুলির সাথে কাজ করে যা একক প্যারামিটার নেয়" " : তা সত্য নয় (+).(*3)একই হিসাবে\x y->3*x+y
ডেমিয়েন

2
@ ড্যামিয়েন আমি চ্যালেঞ্জটিকে আরও অ্যাক্সেসযোগ্য করার চেষ্টা করছিলাম। আপনি পেঁচার মতো জিনিসগুলিও করতে পারেন: (.).(.)যা রূপান্তরিত হয়\i b c f -> i (b c f)
ব্ল্যাকক্যাপ

2
সুতরাং যারা হৃদয় দিয়ে হাস্কেলের বাক্য গঠন জানেন না তাদের স্পষ্টতার জন্য: আমাদের প্রথমে ইনপুটটিতে প্রথম বন্ধনীর সাথে মেলে এবং প্রতিটি শীর্ষ স্তরের প্রথম বন্ধনী প্রকাশের পুনরাবৃত্তি করা উচিত; এবং তারপর প্রতিটি প্রতিস্থাপন .একটি সঙ্গে (, শুরুতে যোগ একটি \xআর এর সাথে যোগ xএবং অনেক হিসাবে )হিসাবে প্রয়োজন হয়? নাকি এর চেয়ে জটিল?
পিটার টেলর

1
@ লিনাস \ d->f(\k->f(f d k)), তবে আপনি ধরে নিতে পারেন যে সমস্ত বিন্দু এই চ্যালেঞ্জের জন্য দুটি যুক্তি সরবরাহ করেছে
ব্ল্যাকক্যাপ

উত্তর:



2

হাস্কেল, 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.