চার্চ বিয়োগ


13

চার্চ বিয়োগ

লাম্বদা ক্যালকুলাস সর্বদা আমার প্রতি আকর্ষনীয় এবং একে অপরের মধ্যে ফাংশনগুলি পাস করার উদীয়মান আচরণগুলি আনন্দদায়ক জটিল। চার্চের সংখ্যাগুলি হ'ল প্রাকৃতিক সংখ্যার প্রতিনিধিত্ব যা কোনও ক্রিয়াকলাপের পুনরাবৃত্তি প্রয়োগ (সাধারণত ধ্রুবকের অবিচ্ছিন্ন সংযোজন) থেকে নির্ধারিত হয়। উদাহরণস্বরূপ, শূন্য সংখ্যা এক্স প্রদান করে এবং ইনপুট ফাংশনটিকে "উপেক্ষা করে", একটি হ'ল f(x), দুটি হয় f(f(x))এবং আরও:

ident = lambda x: x
zero = lambda f: ident
succ = lambda n: lambda f: lambda x: f(n(f)(x))
one = succ(zero)
add1 = lambda x: x + 1
to_int = lambda f: f(add1)(0)
print(to_int(one))
>>> 1

এটি থেকে আমরা সহজেই দেখতে পাচ্ছি যে এক্সটি প্রথম ফাংশন প্রয়োগ করে এক্সটিতে দ্বিতীয় ফাংশন প্রয়োগ করে সংযোজন সম্পন্ন হয়েছে:

add = lambda m: lambda n: lambda f: lambda x: n(f)(m(f)(x))
print(to_int(add(one)(two)))
>>> 3

সংযোজন বুঝতে অপেক্ষাকৃত সহজ। তবে, একজন নতুন আগত ব্যক্তির পক্ষে চার্চ এনকোডেড নম্বর সিস্টেমে বিয়োগ কীভাবে দেখায় তা ভেবে অবর্ণনীয়। কোনও ফাংশন আন-প্রয়োগ করার সম্ভাব্য অর্থ কী হতে পারে?

চ্যালেঞ্জ

চার্চের এনকোডেড সংখ্যা ব্যবস্থায় বিয়োগ ফাংশনটি প্রয়োগ করুন। যেখানে বিয়োগটি মনাস অপারেশন সম্পাদন করে এবং nফলশ্রুতি বার প্রয়োগ করে যদি ফলাফলটি শূন্য বা শূন্যের চেয়ে বেশি হয় অন্যথায়। এটি কোড-গল্ফ তাই সংক্ষিপ্ততম কোডের জয়।

ইনপুট

দুটি চার্চ সংখ্যা যা আপনার ভাষার পছন্দ অনুসারে এনকোড করা হয়েছে। ইনপুট অবস্থানগত বা তরকারিযুক্ত হতে পারে। এগুলো সত্য চার্চ সংখ্যাসমূহ প্রমাণ তারা কোনো ফাংশনে গ্রহণ করা এবং তাদের বারবার আবেদন করতে হবে ( add1উদাহরণ দেওয়া হয় কিন্তু এটা হতে পারে add25, mult7, বা অন্য কোন ইউনারী ফাংশন।)

আউটপুট

একটি চার্চ সংখ্যা। এটি লক্ষ করা উচিত যে m < nতারপর m - nযদি সর্বদা পরিচয় ফাংশন একই হয়।

উদাহরণ:

minus(two)(one) = one
minus(one)(two) = zero
...

গ্রহণযোগ্য:

minus(two, one) = one
minus(one, two) = zero

ক্রেডিট:

এই গিথুব আমাকে চার্চ সংখ্যার অজগর বাস্তবায়ন দেওয়ার জন্য সূচনা করলেন।


1
(উদ্ধৃতিতে মন্তব্যটি ভুল; অবশ্যই exp(m, n)গণনা করে m^n))
নীল

1
"ইনপুটটি অবস্থানগত বা তরকারিযুক্ত হতে পারে" এর অর্থ কী তা আমি নিশ্চিত নই। মূল ফাংশনটি পরিবর্তে lambda m,n,f:apply f m-n times(বা এমনকি lambda m,n,f,x:apply f m-n times to x) হিসাবে সংজ্ঞায়িত করা কি ঠিক lambda m,n:lambda f:...? অথবা এটি কেবলমাত্র দুটি ইনপুটগুলির জন্য প্রযোজ্য mএবং n?
xnor

এছাড়াও, আমরা কি যুক্তিগুলি mএবং nঅন্য ক্রমে নিতে পারি? এটি তরঙ্গকরণে সহায়তা করবে।
xnor

@ এক্সনোর যতক্ষণ আপনি এটি প্রমাণ করতে পারেন দুটি গির্জার সংখ্যা বিয়োগ করে তারপর আপনি যেভাবে চান ইনপুটগুলি নিতে পারেন।
রায়ান

উত্তর:


9

হাস্কেল , 35 বাইট

(r%s)f x=s(x:)(iterate f x)!!r(+1)0

এটি অনলাইন চেষ্টা করুন!

অর্থাৎ rএবং sজামাত এনকোডিং হয় mএবং n। আমরা কিছু প্রাথমিক r%sমানতে f m-nবার প্রয়োগ করতে চাই x। আমরা প্রথমে অসীম তালিকা তৈরি করি

iterate f x = [x, f x, f (f x), f (f (f x)), ...]

তারপরে অনুলিপিগুলি ব্যবহার s(x:)করার জন্য, অর্থাত প্রতিটি মান সূচককে ডানদিকে স্থানান্তর করুন :nxn

s(x:)(iterate f x) = [x, x, x, ...,  x, f x, f (f x), f (f (f x)), ...]

তারপরে আমরা mসরাসরি হিসাবে গণনা করি r(+1)0এবং mসেই তালিকার 'ম' উপাদানটি গ্রহণ করি !!r(+1)0। এর পরিবর্তে একটি সূচক-মুক্ত সমাধান করতে পারে head$r tail$..., এটি প্রথম উপাদান mবার ফেলে দেয় এবং তারপরে প্রথম উপাদানটি গ্রহণ করে, তবে সূচক বাক্য গঠনটি আরও সংক্ষিপ্ত হয়।

নোট করুন যে ক্লাসিক দ্রবণটি এক্সটেনশন ছাড়াই হাস্কেলে কাজ করে না কারণ এর শক্তিশালী টাইপটি পূর্ববর্তী ক্রিয়াকে প্রতিনিধিত্ব করতে পারে না।


3

পাইথন 2 , 82 80 বাইট

eval('!u:!v:v(!n:!f:!x:n(!g:!h:h(g(f)))(!u:x)(!u:u))(u)'.replace('!','lambda '))

এটি অনলাইন চেষ্টা করুন!

নিক কেনেডি থেকে 2 বাইট থ্যাঙ্কস অপ্রয়োজনীয় জুটি পেরেন not

বেনাম প্রয়োগ করে এমন বেনামে ফাংশন।

বেশিরভাগ ক্ষেত্রে এটি উইকিপিডিয়া পৃষ্ঠায় পাওয়া সংজ্ঞাটি সংকুচিত করে; আমি সত্যিই কোডটি এখনও বুঝতে পছন্দ করি না। তবে মজার!


ওপি উল্লিখিত সংক্ষেপের উপর ভিত্তি করে !u:!v:v(!n:!f:!x:n(!g:!h:h(g(f)))(!y:x)(!x:x))(u)2 বাইট সংরক্ষণ করবে বলে মনে হচ্ছে, তবে আমি কোডটি সত্যই বুঝতে পারি না!
নিক কেনেডি

@NickKennedy gettingsharper.de/2012/08/30/... আপনি আগ্রহী হলে
রায়ান স্কেফের

@ রায়ান স্কেফার: চমৎকার "কৌশল"!
চ্যাস ব্রাউন

3

পাইথন 2 , 77 বাইট

lambda r,s:s(lambda r:lambda f:lambda x:r(lambda(_,x):(x,f(x)))((x,x))[0])(r)

এটি অনলাইন চেষ্টা করুন!

আমরা প্রতিটি পুনরাবৃত্তির জন্য পূর্ববর্তী মানটি ট্র্যাক করে এবং শেষে এটি আউটপুট করে চার্চ হ্রাস করি। কোড দৈর্ঘ্যের 39% হ'ল "lambda"...


চমৎকার! আমি একটি গল্ফ পাইথন উত্তরের জন্য অপেক্ষা করছিলাম যা কেবল গিস্ট বাস্তবায়নের দিকে তাকান না। আপনি আরও গল্ফ এই অন্যান্য উত্তর মত ইওল ব্যবহার সম্পর্কে ভেবেছেন?
রায়ান স্কেফার

@ রায়ানশএফার আমি যখন অন্য উত্তরটি দেখলাম তখন আমি আইভাল / প্রতিস্থাপনের জিনিসটি পরীক্ষা করেছিলাম, তবে এটি প্রতিস্থাপনের জন্য এটি এখানে 2 বাইট বেশি লম্বা এখানে রয়েছে। পাইথন দুর্ভাগ্যক্রমে সংজ্ঞায়িত ফাংশন এবং স্ট্রিং ম্যানিপুলেশন উভয় ক্ষেত্রে সত্যই শব্দযুক্ত। এবং এটিতে অন্তর্নির্মিত "রচনা" নেই, যা ল্যাম্বডাসের একটি স্তর সংরক্ষণ করবে।
xnor

2

সি ++ (ঝনঝন) , 112 বাইট

#define L(x,y)[&](auto x){return y;}
auto m=L(u,L(v,v(L(n,L(f,L(x,n(L(g,L(h,h(g(f)))))(L(u,x))(L(u,u))))))(u)));

এটি অনলাইন চেষ্টা করুন!

এটি এখন পর্যন্ত সর্বাধিক বোধগম্য সি ++ কোড। এটি বলেছিল, আমি মনে করি যে এই কোডটি খালাস করা কেবল এটিকে আরও খারাপ করে দেবে।


2

আন্ডারলোড , 37 বাইট

(~(((!())~):*^(~!:(:)~*(*)*)~^^!)~^^)

এটি অনলাইন চেষ্টা করুন!

ভেতরের (((!())~):*^(~!:(:)~*(*)*)~^^!)হয় predফাংশন, জোড়া মাধ্যমে বাস্তবায়িত:

(               ( start pred function )!
  (
    (!())~      ( push zero below argument )!
  ):*^          ( do that twice )!

  (             ( start pair-increasing function )!
    ~!          ( remove second argument)!
    :           ( duplicate first argument )!
    (:)~*(*)*   ( increment first return value )!
  )
  ~^^           ( run pair-increasing function n times )
  !             ( remove first in returned pair )!
)


1

জাভাস্ক্রিপ্ট (নোড.জেএস) , 87 85 81 76 74 বাইট

f=>g=>h=>x=>f(([x,[g,a]])=>[g(x),a])([x,g(a=>[x=>x,a])(f(a=>[h,a])())])[0]

এটি অনলাইন চেষ্টা করুন! কোনও পুরষ্কার জিততে যাচ্ছি না, তবে আমি ভেবেছিলাম আমি একটি ভিন্ন পদ্ধতির চেষ্টা করব।

a=>[h,a]প্রযোজ্য একটি পর্যায় h, যখন a=>[x=>x,a]একটি পর্যায়ে প্রযোজ্য নয় h। আমরা প্রথম ফাংশন fবার এবং দ্বিতীয় ফাংশনের gসময় প্রয়োগ করি । আমরা তারপরে বিপরীত কার্যের ([f,[g,a]])=>[g(x),a] fসময় প্রয়োগ করি । এটি gদ্বিতীয় পর্যায়ে এড়িয়ে যায় এবং পছন্দসইভাবে f-gপ্রথম পর্যায়ে সম্পাদন করে । এরপরে এটি চূড়ান্ত মানটি বের করতে থাকবে।

টিপলগুলি অবশ্যই ল্যাম্বডা ফাংশনে রূপান্তরিত হতে পারে যার ফলে নিম্নলিখিত অভিব্যক্তির ফলাফল হয়:

f=>g=>h=>x=>f(e=>e(x=>d=>d(g=>a=>e=>e(g(x))(a))))(e=>e(x)(g(a=>e=>e(x=>x)(a))(f(a=>e=>e(h)(a))())))(x=>a=>x)

1

জে , 56 বাইট

c=:3 :0
t=.^:y
5!:1<'t'
)
m=.2 :'c 0>.(>:u 5!:0->:v 5!:0)0'

এটি অনলাইন চেষ্টা করুন!

দ্রষ্টব্য: -3 টিআইও গণনা বন্ধ বাইটm=.

জে উচ্চতর ক্রমের ক্রিয়াকলাপগুলি ক্রিয়াবিধি এবং সংমিশ্রণগুলি ব্যবহার করে অর্জিত হয়। এখানে একটি গির্জার সংখ্যা হ'ল "পাওয়ার" সংমিশ্রণ (যা বারবার একটি ক্রিয়া প্রয়োগ করে) এবং একটি পূর্ণসংখ্যার সমন্বয়ে গঠিত ক্রিয়া ক্রিয়াকলাপের ক্রিয়াকলাপ। নিম্নলিখিত ক্রিয়াটি c("তৈরি" এর জন্য) জেটির পারমাণবিক প্রতিনিধিত্ব ব্যবহার করে কোনও পূর্ণসংখ্যাকে এ জাতীয় প্রবণতায় রূপান্তর করতে:

c=:3 :0
t=.^:y
5!:1<'t'
)

আমাদের "বিয়োগ" অপারেটর (যা একটি সংমিশ্রণ) বাম থেকে ডান গেরুড গির্জার সংখ্যা বিয়োগ করে। এটি অবশ্য আমাদের cক্রিয়াপদের একটি সহ গির্জার সংখ্যাগুলির কোনও নির্দিষ্ট প্রয়োগ বাস্তবায়ন করে না । পরিবর্তে, এটি সাধারণ সংজ্ঞার উপর নির্ভর করে এবং প্রতিটি জেরুন্ড গির্জার সংখ্যাকে ফিরিয়ে দিয়ে একটি ক্রিয়া হিসাবে বিশেষণে পরিণত করে 5!:0এবং তারপরে সেই ক্রিয়াটি ক্রমবর্ধমান ক্রিয়াতে >:প্রয়োগ করে, এবং তারপরে 0 এ প্রয়োগ করে

এরপরে এটি বিয়োগ করে এবং সর্বোচ্চ 0 নিয়ে যায় এবং cচূড়ান্ত ফলাফল পেতে প্রয়োগ হয়: একটি নতুন গেরুন্ড গির্জার সংখ্যা।


1

ওল্ফ্রাম ভাষা (গণিত) , 55 48 47 39 বাইট (33 অক্ষর)

#2[(fx#[g#@g@f&][x&][#&])&]@#&

এটি অনলাইন চেষ্টা করুন!

 চিহ্নটি 0xF4A1, একটি বিশেষ গাণিতিক কোড পয়েন্ট যা ডানদিকের তীরটির জন্য চিহ্নিত করে \[Function]। আরও ব্যাখ্যা জন্য এখানে দেখুন । ম্যাথামেটিকার সামনের প্রান্তে কোডটি দেখতে এমন দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আমরা এটি 40 বাইট / 32 অক্ষরে করতে পারি , যা পরিমাপের স্কিমের উপর নির্ভর করে ছোট হতে পারে:#2[n⟼f⟼x⟼n[g⟼#@g@f&][x&][#&]]@#&

আন-গল্ফ করা সংস্করণটি পূর্বের শাস্ত্রীয় সংজ্ঞার আক্ষরিক অনুবাদ :

pred = n \[Function] f \[Function] x \[Function] n[g \[Function] h \[Function] h[g[f]]][u \[Function] x][u \[Function] u];
subtract[m_, n_] := n[pred][m]

ম্যাথামেটিকার সামনের প্রান্তে যা দেখতে এটির মতো দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

এই বিয়োগ ফাংশনটি চার্চ সংখ্যার সাথে সংজ্ঞায়িত হয়ে কাজ করে

c@0=#& &;c@n_=#@*c[n-1][#]&

(আন-গল্ফড c[0] = Identity &; c[n_] = Function[a, a@*c[n-1][a]]:)

যাতে আমাদের আছে

Table[c[n][f][x], {n, 0, 6}]
(*    {x, f[x], f[f[x]], f[f[f[x]]], f[f[f[f[x]]]], f[f[f[f[f[x]]]]], f[f[f[f[f[f[x]]]]]]}    *)

এবং

subtract[c[7],c[5]][f][x]
(*    f[f[x]]    *)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.