Golfçü sabit nokta birleştirici


9

Seçtiğiniz dilde mümkün olduğunca az karakterle sabit noktalı bir birleştirici yazın .

  • serbest biçim ( yani , en kısa olanı ne olursa olsun): tüm program, gerçek işlev, kod snippet'i
  • varsa standart kitaplıklarınızı kullanamazsınız
  • ancak bunu temellerden inşa etmekten ziyade yapmak istediğiniz diğer üst düzey işlevlerden çıkarabilirsiniz.

Lütfen özyinelemeli bir faktöriyel veya demo olarak kullanan Fibonacci'yi ekleyin.

Bu soruda, öz referans kabul edilebilir, amaç yalnızca uygulanacağı özyinelemeli işlevden kaldırmaktır.


Tembel bir uygulama iyi mi? ( (define Y(lambda(f)(f(Y f))))
Kabul

İstenen örneklerden biriyle gösterebileceğiniz herhangi bir uygulama tamam.
JB

1
Eğer yanılmıyorsam, açık konuşmak gerekirse, "Y birleştirici" terimi özel olarak Haskell Curry, λf. (Λx.f (xx)) (λx.f (xx)) tarafından keşfedilen tek bir düzeltme noktası birleştiricisini ifade eder.
Joey Adams

@Eelvex: Açıkçası her iki cevap da (OP'nin kendi cevabı dahil) hile yöntemini kullanıyor, bu yüzden sanırım bu iyi oluyor. :-P Şahsen, @ Joey'in yaklaşımını tercih ederim ve sadece gerçek (kendine referans olmayan) Y birleştiricisinin yapacağını söylerim. ;-)
Chris Jester-Young

@Chris: Ah benim. Aklıma ilk başta gelen buydu ve sonra ... yol boyunca unuttum. Şimdi değiştirmek için biraz geç, başka bir soru açmamız gerekecek.
JB

Yanıtlar:


13

Haskell: 10 karakter

y f=f$y f

Faktöriyel veya n. Fibonacci'nin özyinelemeli tanımlarını oluşturmak için kullanım örneği:

> 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]

Bununla birlikte, kullanımın daha yaygın bir yolu, ybu dizileri işlevler yerine doğrudan oluşturmaktır:

> 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]

Tabii ki, Haskell ile, bu bir varil içinde balık çekmek gibi! Data.FunctionKütüphane adı verilen bu işlevi vardır fixdaha verbosely biraz uygulanan olsa.


4

Perl, 37

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

Faktöriyel gösteri:

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

Fibonacci gösterisi:

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

GNU C - 89 karakter

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

Misal:

#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 karakter

Açıkça kendini referans alan uygulama en kısa olanıdır. Bu, iyi dil tasarımının bir işaretidir. Maalesef, K tembel değil, bu yüzden sadece telefonla değer bazında yönetebiliyoruz.

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

Bu tanım ayrıca k4 ve q'da sorunsuz çalışmalıdır, ancak aşağıdaki örnekler için k2 olduğunu varsayıyorum.

  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

Daha mütevazı bir 18 karakter (λx. x x) (λxyz. y (x x y) z)K'ye tam olarak yazmamızı sağlar .

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

Belki bir gün (k7?), Bu gibi görünebilir Y:{x Y x}.


0

Python 3, 30 Bayt

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

Demo:

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]))

Kredi: https://gist.github.com/WoLpH/17552c9508753044e44f


Python 3'te filtre var. Ayrıca bu yorumu bir şaka olarak işaretlemeyi de ihmal ettim
Cyoce

Python 3'ün filtresi bir liste değil bir filtre nesnesi döndürür. Filtreyi kullanmak daha az okunabilir veya pitoniktir.
Labo

daha az Pythonic olurdu, ama daha çok işlevsel programlama oldu , bu benim açımdan
Cyoce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.