Bir mektup yazdırın Fibonacci


28

N (2 <= N ) verildiğinde , Fibonacci dizisinin N satırını bu şekilde yazdırın (yani N = 5) İlk önce ave ile başlayın b:

a
b

Sonra, iki satırı ekleyin.

a
b
ab

Son iki satırı eklemeye devam et.

a
b
ab
bab

Devam et...

a
b
ab
bab
abbab

Ve biz bitti.

Remmeber, bu , bu yüzden en az baytlık kod kazanıyor.



N ye kadar bir terimler listesi döndüren bir işlev olabilir mi?
FlipTack

Sonuç yazdırmak zorunda mıyız yoksa işlevden bir dizi listesi döndürebilir miyiz?
nimi

Bekle, yani n = 1 için çalışmak zorunda kalmayacak mı?
Sokratik Phoenix

Ayrıca, 0 tabanlı indeksleme kullanabilir miyiz?
Sokratik Phoenix

Yanıtlar:


10

Python 2,41 bayt

@Xnor sayesinde 3 bayt kaydedildi

a,b="ab";exec"print a;a,b=b,a+b;"*input()

İdeone Testi

Sadece özyinelemeli tanımı izler.


Bu bir program olarak kısadır: a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor

1
:) piton 2 belirtmek istiyorum Olabilir
FlipTack

8

Haskell, 29 35 32 bayt

a%b=a:b%(a++b)
(`take`("a"%"b"))

Basit özyineleme.

Referans için: eski versiyon ( bu cevabın bir uyarlaması ), dizeleri yanlış sırayla bir flip(...)araya getirdi , bu yüzden onu çok uzun (35 bayt) olan bir tane eklemek zorunda kaldım .

f="a":scanl(flip(++))"b"f
(`take`f)

Çıktı, örnekten farklı (birleşme sırasındaki farklı sıralar):["b","a","ab","aba","abaab"]
Angs

@Angs: Hata! Ne hata! Sabit.
nimi

6

05AB1E , 12 11 bayt

Bir bayt kaydettiğiniz için Emigna için teşekkürler !

'a='b¹GD=Š«

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


1
̓sadece de olabilir GKullanmadığınız olarak N:)
Emigna

@Emigna Oh evet, haklısın! Teşekkürler :)!
Adnan

5

Jöle , 11 10 bayt

”a”bṄ;¥@¡f

Çevrimiçi deneyin!

Nasıl çalışır

”a”bṄ;¥@¡f  Main link. Argument: n

”a          Set the return value to 'a'.
  ”b    ¡   Call the link to the left n times, with left argument 'b' and right
            argument 'a'. After each call, the right argument is replaced with the
            left one, and the left argument with the return value. The final
            return value is yielded by the quicklink.
      ¥       Combine the two atoms to the left into a dyadic chain.
    Ṅ           Print the left argument of the chain, followed by a linefeed.
     ;          Concatenate the left and right argument of the chain.
       @      Call the chain with reversed argument order.
         f  Filter the result by presence in n. This yields an empty string
            and thus suppresses the implicit output.

Ben ”a”b;@Ṅkısım aşağı, ama oradan nereye ben :-) şimdi biliyorum ... çözemedim
ETHproductions

5

Java 7, 69 bayt

String c(int n,String a,String b){return n--<1?"":a+"\n"+c(n,b,a+b);}

ungolfed

 class fibb {


public static void main(String[] args) {
    System.out.println( c( 7, "a" , "b" ) );

}
static String c(int n,String a,String b) {

    return n-- < 1  ? "" : a + "\n" + c(n,b,a + b);

}
}

Gerçekten .. yanıtlarınıza biraz daha fazla ungolfed kodu biçimlendirmek gerekir 1 gerçi xD ve hatta sadece farklı başka bir başlangıç dizeleri için çalışır ave b. Eğer emin değilim "a"ve "b"soru özellikle o kullanmalıdır devletler beri parametreler olsa bayt sayısında hesaba alınmalıdır ave b. Java'nın yine de kazanacağı değil. ;)
Kevin Cruijssen

@KevinCruijssen string parametresi gereklidir, çünkü metot her çağrıldığında değerleri değişir.

Onların gereklidir biliyorum @Snowman .. Ben sadece bayt sayısı belki 75 bayt (için 6 olması gerektiğini söylüyorum "a"ve "b"meydan özellikle istediği için) yerine 69 ave bşu anda kod snipped / yöntem kullanır değişken bir girdi. Kuralların bununla ilgili ne olduğuna emin değilim, ama şahsen sayılması gerektiğini düşünüyorum. Aksi halde, bazı dillerde bir parametre işlevi yürüten bir işleve sahip olabilirsiniz ve ardından parametre içindeki tüm sorgu işlevini bayt saymadan kullanabilirsiniz. Standart bir boşluk deliği kuralı türüne benziyor.
Kevin Cruijssen

1
Java cevaplarını seviyorum. Çok güzel göze çarpıyorlar - burada 12 bayt, 5 orada, 17 burada ... 70 bayt var ... bekle, ne? Ah, yine Java ... +1
RudolfJelin

5

Emacs, 26 , 25-ish tuş vuruşlarını

program

#nrakamları n ile tuş olarak okunacak :

ARETBRETF3UPUPC-SPACEC-EM-WDOWNDOWNC-Y UPC-AC-SPACEC-EM-WDOWNC-EC-YRETF4C-#(n-2)F4

açıklama

command(s)               explanation                      buffer reads (| = cursor aka point)
-----------------------------------------------------------------------------------------------
A<RET> B<RET>            input starting points            "a\nb\n|"
<F3>                     start new macro                  "a\nb\n|"
<UP><UP>                 move point two lines up          "|a\nb\n"
C-<SPACE> C-E M-W        copy line at point               "a|\nb\n"
<DOWN><DOWN>             move point two lines down        "a\nb\n|"
C-Y                      yank (paste)                     "a\nb\na|"
<UP>                     move point one line up           "a\nb|\na"
C-A C-<SPACE> C-E M-W    copy line at point               "a\nb|\na"
<DOWN>                   move point one line down         "a\nb|\na|"
C-E C-Y <RET>            yank (paste) and add new line    "a\nb|\nab\n|"
<F4>                     stop macro recording             "a\nb|\nab\n|"
C-#(n-3) <F4>            apply macro n-3 times            "a\nb|\nab\nbab\nabbab\n|"

N = 10 ile

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Ben ayrılıyorum. Bir yandan, editör-golf'ü her zaman büyütürüm, ancak bir yandan vim kullanıyorum. Ah, yine de +1. :)
DJMcMayhem

@DrMcMoylex sadece Cu Mx ile vim'e dönüştürmek için çevirmek
YSC

5

JavaScript (ES6), 43 42 bayt

@Arnauld sayesinde bir bayt kaydedildi

f=(n,a="a",b="b")=>n&&f(n-!alert(a),b,a+b)

4

CJam, 19 17 bayt

'a'b{_@_n\+}ri*;;

açıklama

"a": Push character literal "a" onto the stack.
"b": Push character literal "b" onto the stack.
{_@_p\+}
    {: Block begin.
    _: duplicate top element on the stack
    @: rotate top 3 elements on the stack
    _: duplicate top element on the stack
    n: print string representation
    \: swap top 2 elements on the stack
    +: add, concat
    }: Block end.
r: read token (whitespace-separated)
i: convert to integer
*: multiply, join, repeat, fold (reduce)
;: pop and discard
;: pop and discard

Bu arada, dizelerin sayısı şu anda bir defa kapalı; Sonuncusu bir polmalı ;. Bunun nyerine kullanırsanız çıktı çevresindeki tırnaklardan kurtulabilirsiniz p. Sonunda, 'a'biki bayttan fazla tasarruf sağlar "a""b".
Dennis

3

V , 18 bayt

ia
bkÀñyjGpgJkñdj

Çevrimiçi deneyin!

Veya daha okunabilir sürüm:

ia
b<esc>kÀñyjGpgJkñdj

Açıklama:

ia
b<esc>          " Insert the starting text and escape back to normal mode
k               " Move up a line
 Àñ       ñ     " Arg1 times:
   yj           "   Yank the current line and the line below
     G          "   Move to the end of the buffer
      p         "   Paste what we just yanked
       gJ       "   Join these two lines
         k      "   Move up one line
           dj   " Delete the last two lines

3

MATL , 14 bayt

97c98ci2-:"yyh

Çevrimiçi deneyin!

97c     % Push 'a'
98c     % Push 'b'
i2-     % Input number. Subtract 2
:"      % Repeat that many times
  yy    %   Duplicate the top two elements
  h     %   Concatenate them

3

Python 2,55 bayt

def f(n):m='a','b';exec'print m[-2];m+=m[-2]+m[-1],;'*n

3

Retina , 33 bayt

.+
$*
^11
a¶b
+`¶(.+?)1
¶$1¶$%`$1

Çevrimiçi deneyin!

@ MartinEnder sayesinde 10 (!) Bayt kaydedildi !

açıklama

Girdiyi birliğe dönüştürür, çıkartır 2ve ekler ave bardından geri kalanı 1s ile önceki iki dizinin bir araya getirilmesiyle tekrarlar .


Gereksiz yakalamalardan kaçınarak birkaç bayt kurtarıldı: retina.tryitonline.net/…
Martin Ender

@MartinEnder Güzel! Gücü görmedim $%` ! ve bu diğer yakalama sadece kötü bir planlamadı ... Şaşırtıcı, teşekkür ederim!
Dom Hastings

2

Toplu iş, 102 93 bayt

@set a=a
@set b=b
@for /l %%i in (2,1,%1)do @call:l
:l
@echo %a%
@set a=%b%&set b=%a%%b%

Neyse ki, atamalar yürürlüğe girmeden önce her satır için değişkenler genişletilir, böylece geçici olarak gerekmeksizin her ikisini de ayarlayabilirim ave beski değerlerini kullanabilirim. Düzenleme: @ nephi12 sayesinde 9 bayt kaydedildi.


:; Bunu yapmak üzereyken) Bu arada, "çıkış / b" kaldırılması ve 2 adresinin döngü başlatarak 8 bayt kaydedebilirsinizfor /l %%i in (2,1,%1) etc..
nephi12

Bir tane daha (yeni satır) set komutlarını @set a=a&set b=bson satırdaki gibi aynı satıra koyarak . gerçi techncally hepsi aynı satırda olabilir ... ama bu çirkin ... hmm ... olurdu
nephi12


2

Perl, 36 35 bayt

İçin +3 içerir -n

STDIN'de sayım verin

perl -M5.010 fibo.pl <<< 5

fibo.pl

#!/usr/bin/perl -n
$_=$'.s/1//.$_,say$`for(a1.b)x$_

2

Perl, 45 + 1 = 46 bayt

-N bayrağı için +1 bayt

$a=a,$b=b;say($a),($a,$b)=($b,$a.$b)for 1..$_

Mevcut 49 baytlık çözüm üzerinde hafif iyileştirme, ancak ayrı ayrı geliştirildi. Parantezler için say($a)gereklidir, çünkü aksi takdirde, bizim ihtiyacımızdan daha fazla önemsiz çıktı $a,($a,$b)=($b,$a.$b)çıktığı argümanı olarak yorumlar say.

Perl, 42 bayt

$b=<>;$_=a;say,y/ab/bc/,s/c/ab/g while$b--

Yukarıdaki çözümden ayrı bir yaklaşım:

$b=<>;                                       #Read the input into $b
      $_=a;                                  #Create the initial string 'a' stored in $_
           say                               #Print $_ on a new line
               y/ab/bc/                      #Perform a transliteration on $_ as follows:
                                   #Replace 'a' with 'b' and 'b' with 'c' everywhere in $_
                        s/c/ab/g             #Perform a replacement on $_ as follows:
                                   #Replace 'c' with 'ab' everywhere in $_
              ,        ,         while$b--   #Perform the operations separated by commas
                                   #iteratively as long as $b-- remains truthy

Henüz ikna olmadım, harf çevirisi ve değiştirmeyi tek, daha kısa bir işlemde birleştiremem. Bir tane bulursam, gönderirim.



1

Perl, 48 bayt

İçin 47 bayt kodu + 1 -n.

Basit bir yaklaşım. Bir dizi dilimini orijinal olarak kullanmaya çalışın, $a[@a]="@a[-2,-1]"ancak bu zorunlu $"=""veya benzer bir işlemdir :(. @ Dada sayesinde 1 byte tasarruf edin !

@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@

kullanım

perl -nE '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5
a
b
ab
bab
abbab

Bunun @;yerine bir bayttan tasarruf edebilirsiniz , @aböylece son noktalı virgül atlayabilirsiniz (ne demek istediğimi anlayın?). (Biliyorum, bir bayt oldukça ucuz ama daha iyi bir fikrim yoktu ..)
Dada

@Dada Evet, denedim, ama makinemde derlenmeyecek, bu yüzden benimkinde garip bir şey olduğunu düşünmüştüm: perl -pe '@;=(a,b);$;[@;]=$;[-2].$;[-1]for 3..$_;say for@' <<< 5 syntax error at -e line 1, at EOF Execution of -e aborted due to compilation errors.ama eğer yapamazsam cevap olarak eklemenin adil olacağını düşünmedim çalışmasını sağla!
Dom Hastings,

-peBunun yerine bununla alakalı olmadığından emin -nEmisin? Her neyse, benim için çalışıyor, bu yüzden muhtemelen sizin perl versiyonunuz veya sisteminizle ilgili ... Ama güven bana, test ettim ve çalışıyor! ;)
Dada

@Dada Ben de aynı -nEşeyi (nereden -pegeldiğini bilmiyorum ! Cuma olmalı ...) bir mo aldığımda bunu güncelleyeceğim! Paylaşım için teşekkürler!
Dom Hastings,

1

SOML , 8 bayt (rekabet etmeyen)

 a b.{;t⁴+

açıklama:

 a b.{;t⁴+                                        stack on 1st cycle
 a              push "a"                               ["a"]
   b            push "b"                               ["a","b"]
    .{          repeat input times                     ["a","b"]
      ;         swap the two top things on the stack   ["b","a"]
       t        output the top thing on the stack      ["b","a"]
        ⁴       copy the 2nd from top thing from stack ["b","a","b"]
         +      join them together                     ["b","ab"]

Bunun rekabet etmemesinin nedeni, bu dilin hala geliştirilme aşamasında olması ve bunu yazarken birkaç yeni fonksiyon eklememdir.

Ayrıca, PPCG'de ilk gönderi!


1
PPCG'ye Hoşgeldiniz! Harika ilk mesaj!
Oliver Ni,

1

05AB1E, 15 bayt

'a'bVUFX,XYUYJV

1

C , 156 bayt (girintisiz)

void f(int n)
{
    char u[999]="a",v[999]="b",*a=u,*b=a+1,*c=v,*d=c+1,*e,i;
    for(i=0;i<n;++i)
    {
        printf("%s\n",a);
        for(e=c;*b++=*e++;);
        e=a;a=c;c=e;e=b+1;b=d;d=e;
    }
}

İki tampon (u & v) son iki satırı saklar. En yeni satır (iki işaretçi ile izlenir: start = c, end = d) en eskisine eklenir (start = a, end = b). (A, b) ve (c, d) yer değiştirip döngü yapın. Çok fazla satır istemeden önce tampon boyutuna dikkat edin. Çok kısa değil (düşük seviyeli bir dilden beklendiği gibi), ancak kodlamak eğlenceliydi.


Sen kodlanmış 5ancak kullanıcı girişi olmalıdır
Karl Napf

Hmm ... "kullanıcı girdisini" bulmacanın bir gereği olarak görmüyorum ... Perl, Python, C ++ ile aynı yolu izleyerek, cevaplar, "int main ()" yerine "void f (int" yazınız. n)".
Phil

Given N (2 <= N), print N lines of the letter Fibonacci series like this (i.e. N = 5)
Karl Napf

Eh, kullanıcı girişi kelime açısından kötü bir seçimdi. Daha çok dinamik Nve sabit değil demek istemiştim . Veya kullanıcı işlevinizi / programınızı kullanan biri olabilir.
Karl Napf

Boş sonlandırıcıyı kopyalamama konusundaki aptalca bir hatayı düzelttim. Ayrıca, işlevi daha okunabilir bir duruma getirdim (bir gömlek komik, ancak kullanışlı değil). Bu fonksiyonu gerçekten test etmek için şunu kullanın: int main (int n, char ** p) {f (n <2 ~ 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 bayt

Özyinelemeli sürümü:

function f($n,$a=a,$b=b){return$n--?"$a
".f($n,$b,$a.$b):'';}

gereksiz beyaz boşluk sonrareturn
Titus

0

Pyth , 17 bayt

J,\a\bjP.U=+Js>2J

Bir tamsayı girişi alan ve sonucu basan bir program.

Çevrimiçi deneyin!

Nasıl çalışır

J,\a\bjP.U=+Js>2J  Program. Input: Q
 ,\a\b             Yield the two element list ['a', 'b']
J                  Assign to J
        .U         Reduce over [0, 1, 2, 3, ..., Q] (implicit input):
          =J+        J = J +
              >2J     the last two elements of J
             s        concatenated
       P           All of that except the last element
      j            Join on newlines
                   Implicitly print


0

APL, 30 bayt.

⎕IOolmalı 1.

{⎕←⍵}¨{⍵∊⍳2:⍵⌷'ab'⋄∊∇¨⍵-⌽⍳2}¨⍳

0

Mathematica, 49 bayt

f@1="a";f@2="b";f@n_:=f[n-2]<>f[n-1];g=f~Array~#&

gTek sayısal girişi alan bir işlevi tanımlar ; dizelerin bir listesini döndürür. Basit bir özyinelemeli uygulama, ipi birleştirme operatörü kullanarak <>.

Mathematica, 56 bayt

NestList[#~StringReplace~{"a"->"b","b"->"ab"}&,"a",#-1]&

Adsız işlev, yukarıdaki ile aynı giriş / çıkış formatı. Bu çözüm dizeleri oluşturmak için alternatif bir yol kullanır: listedeki her dize, eşzamanlı olarak önceki dizgide, "a" nın tüm oluşumlarını "b" ile ve "b" nin tüm oluşumlarını "ab" ile değiştirmenin sonucudur.



0

PHP, 53 bayt

for($a=b,$b=a;$argv[1]--;$a=($_=$b).$b=$a)echo$b.'
';

Çift tırnak kullanarak ve $bdizeye koyarak bir bayt kaydedin .
Titus

0

C ++ 11, 89 98 bayt

Sadece sonuncusu değil, tüm satırlar için +7 bayt . NYazdırılan satır sayısı için +2 bayt , bazı 0 tabanlı şeyler değil.

#include<string>
using S=std::string;S f(int n,S a="a",S b="b"){return n-1?a+"\n"+f(n-1,b,a+b):a;}

Kullanımı:

f(5)

0

Yakut (1.9+) 46 bayt

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
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.