গল্ফড ফিক্সড পয়েন্ট কম্বিনেটর


9

আপনার পছন্দের ভাষায় একটি নির্দিষ্ট পয়েন্ট কম্বিনেটরটি যতটা সম্ভব অক্ষরে লিখুন ।

  • ফর্ম ফর্ম ( যেমন , যা সংক্ষিপ্ততম): পুরো প্রোগ্রাম, আসল ফাংশন, কোড স্নিপেট
  • আপনার স্ট্যান্ডার্ড লাইব্রেরির যদি এটি থাকে তবে আপনি এটি ব্যবহার করতে পারবেন না
  • আপনি এটি অন্য উচ্চ-স্তরের ফাংশনগুলি থেকে এটি নিষ্কাশন করতে পারেন এটি বেসগুলি থেকে এটির চেয়ে এটির চেয়ে আপনি এটি করতে চান

দয়া করে একটি পুনরাবৃত্ত ফ্যাক্টরিয়াল বা ফিবোনাচি অন্তর্ভুক্ত করুন যা এটি ডেমো হিসাবে ব্যবহার করে।

এই প্রশ্নে, স্ব-রেফারেন্স গ্রহণযোগ্য, উদ্দেশ্য কেবল এটি পুনরাবৃত্তি ফাংশন থেকে প্রয়োগ করা হবে যা এটি প্রয়োগ করবে।


একটি অলস ভাষা বাস্তবায়ন ঠিক আছে? (আপনি কি গ্রহণ করবেন (define Y(lambda(f)(f(Y f))))?)
ইলেভেক্স

অনুরোধকৃত উদাহরণগুলির মধ্যে যে কোনও একটি প্রয়োগের মাধ্যমে আপনি প্রদর্শিত করতে পারেন তা ঠিক।
জেবি

1
যদি আমি ভুল না হয়ে থাকি, কঠোরভাবে বলতে গেলে, "ওয়াই কম্বিনেটর" শব্দটি বিশেষতঃ হাস্কেল কারি দ্বারা আবিষ্কার করা একক ফিক্সপয়েন্ট সমন্বয়কারীকে বোঝায় .f। (.X.f (xx)) (.x.f (xx))।
জোয়ে অ্যাডামস

@ এলেভেক্স: স্পষ্টতই উভয় উত্তরই এখন পর্যন্ত (ওপি-র নিজস্ব উত্তর সহ) প্রতারণার উপায়টি ব্যবহার করে, সুতরাং, আমার ধারণা এটি ঠিক হয়ে যায়। :- পি ব্যক্তিগতভাবে, আমি বরং @ জোয়ের পদ্ধতির সাথে যাব এবং বলব যে কেবল আসল (স্ব-স্ব-রেফারেন্সিয়াল) ওয়াই সংযুক্তকারীটি করবে will ;-)
ক্রিস জেস্টার-ইয়ং

@ ক্রিস: ওহ আমার। প্রথমদিকে আমার মনে এটি ছিল এবং তারপরে আমি ... পথ ধরে ভুলে গেছি। এখন পরিবর্তন হতে অনেক দেরি হয়ে গেছে, আমাদের আর একটি প্রশ্ন খুলতে হবে।
জেবি

উত্তর:


13

হাস্কেল: 10 টি অক্ষর

y f=f$y f

ফ্যাকটোরিয়াল বা নবম-ফিবোনাকির পুনরাবৃত্ত সংজ্ঞা তৈরি করতে ব্যবহারের উদাহরণ:

> map ( y(\f n->if n <= 1 then 1 else n*f(n-1)) ) [1..10]
[1,2,6,24,120,720,5040,40320,362880,3628800]

> map ( y(\f n->if n <= 1 then 1 else f(n-1)+f(n-2)) ) [0..10]
[1,1,2,3,5,8,13,21,34,55,89]

যদিও, ব্যবহারের আরও সাধারণ উপায় yহ'ল এই ক্রমগুলি ক্রিয়াকলাপ না করে সরাসরি তৈরি করা:

> take 10 $ y(\p->1:zipWith (*) [2..] p)
[1,2,6,24,120,720,5040,40320,362880,3628800]

> take 11 $ y(\f->1:1:zipWith (+) f (tail f))
[1,1,2,3,5,8,13,21,34,55,89]

অবশ্যই, হাস্কেলের সাথে এটি ব্যারেলে মাছের শুটিংয়ের মতো কিছুটা! Data.Functionগ্রন্থাগার এই ফাংশন বলা হয়েছে fixআরো verbosely কিছুটা বাস্তবায়িত যদিও।


4

পার্ল, 37

sub f{my$s=$_[0];sub{$s->(f($s),@_)}}

ফ্যাক্টরিয়াল বিক্ষোভ:

sub fact {
  my ($r, $n) = @_;
  return 1 if $n < 2;
  return $n * $r->($n-1);
}
print "Factorial $_ is ", f(\&fact)->($_), "\n" for 0..10;

ফিবোনাচি বিক্ষোভ:

sub fib {
  my ($r, $n) = @_;
  return 1 if $n < 2;
  return $r->($n-1) + $r->($n-2);
}
print "Fibonacci number $_ is ", f(\&fib)->($_), "\n" for 0..10;

3

জিএনইউ সি - 89 টি চর

#define fix(f,z)({typeof(f)__f=(f);typeof(__f(0,z))x(typeof(z)n){return __f(x,n);}x(z);})

উদাহরণ:

#define lambda2(arg1, arg2, expr) ({arg1;arg2;typeof(expr)__f(arg1,arg2){return(expr);};__f;})

int main(void)
{
    /* 3628800 */
    printf("%ld\n", fix(lambda2(
        long factorial(int n), int n, 
            n < 2 ? 1 : n * factorial(n-1)
        ), 10));

    /* 89 */
    printf("%ld\n", fix(lambda2(
        long fibonacci(int n), int n, 
            n < 2 ? 1 : fibonacci(n-1) + fibonacci(n-2)
        ), 10));

    return 0;
}

1

k2, 12 চর

সুস্পষ্ট স্ব-রেফারেন্সিয়াল বাস্তবায়ন হ'ল সংক্ষিপ্ততম। এটি ভাল ভাষার নকশার লক্ষণ। দুর্ভাগ্যক্রমে, কে অলস নয়, তাই আমরা কেবল কল-বাই-মানটি পরিচালনা করতে পারি।

Y:{x[Y[x]]y}

এই সংজ্ঞাটিও সমস্যা ছাড়াই কে 4 এবং কি-তে কাজ করা উচিত, যদিও আমি নীচের উদাহরণগুলির জন্য কে 2 ধরে নিই।

  Y:{x[Y[x]]y}
  fac: {[f;arg] :[arg>0; arg*f[arg-1]; 1]}
  Y[fac] 5
120
  fib: {[f;arg] :[arg>1; f[arg-1] + f[arg-2]; arg]}
  Y[fib]' !10
0 1 1 2 3 5 8 13 21 34

আরো একটি শালীন 18 অক্ষর আমাদের ঠিক লিপ্যন্তরে দেয় (λx. x x) (λxyz. y (x x y) z)কে বা

{x[x]}{y[x[x;y]]z}

হয়তো একদিন (k7?), এই কেমন দেখাতে পারে Y:{x Y x}


0

পাইথন 3, 30 বাইট

Y=lambda f:lambda a:f(Y(f))(a)

ডেমো:

Y=lambda f:lambda a:f(Y(f))(a)
quicksort = Y(
lambda f:
    lambda x: (
        f([item for item in x if item < x[0]])
        + [y for y in x if x[0] == y]
        + f([item for item in x if item > x[0]])
    ) if x
    else []
)
print(quicksort([1, 3, 5, 4, 1, 3, 2]))

ক্রেডিট: https://gist.github.com/WoLpH/17552c9508753044e44f


পাইথন 3 এর ফিল্টার রয়েছে। এছাড়াও আমি দুঃখিত আমি মন্তব্যটিকে রসিকতা হিসাবে চিহ্নিত করতে অবহেলা করেছি
সাইয়েস

পাইথন 3 এর ফিল্টার একটি ফিল্টার অবজেক্ট ফিরিয়ে দেয় এবং তালিকা নয়। ফিল্টার ব্যবহার করার জন্য এটি কম পঠনযোগ্য বা পাইথোনিক হবে।
ল্যাবো

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