In một chữ cái


28

Cho N (2 <= N ), in N dòng của chuỗi Fibonacci chữ cái như thế này (tức là N = 5) Trước tiên, bắt đầu bằng ab:

a
b

Tiếp theo, thêm hai dòng.

a
b
ab

Tiếp tục thêm hai dòng cuối cùng.

a
b
ab
bab

Tiếp tục đi...

a
b
ab
bab
abbab

Và chúng ta đã hoàn thành.

Remmeber, đây là , vì vậy mã có ít byte nhất sẽ thắng.



Nó có thể là một hàm trả về một danh sách các thuật ngữ lên đến N không?
FlipTack

Chúng ta có phải in kết quả hay chúng ta có thể trả về danh sách các chuỗi từ một hàm không?
nimi

Đợi đã, vậy nó không phải làm việc với n = 1 sao?
Phượng hoàng Socratic

Ngoài ra, chúng ta có thể sử dụng lập chỉ mục dựa trên 0 không?
Socratic Phoenix

Câu trả lời:


10

Python 2, 41 byte

Đã lưu 3 byte nhờ @xnor

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

Thử nghiệm trên Ideone

Đơn giản chỉ cần làm theo định nghĩa đệ quy.


Đây là ngắn hơn như là một chương trình : a,b="ab";exec"print a;a,b=b,a+b;"*input().
xnor

1
Có thể muốn chỉ định python 2 :)
FlipTack

8

Haskell, 29 35 32 byte

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

Đệ quy đơn giản.

Để tham khảo: phiên bản cũ (một phần thích ứng của câu trả lời này ), nối các chuỗi theo thứ tự sai, vì vậy tôi phải thêm một chuỗi flip(...)khiến nó quá dài (35 byte).

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

Đầu ra khác với ví dụ (thứ tự khác nhau trong ghép nối):["b","a","ab","aba","abaab"]
Angs

@Angs: Rất tiếc! Đã sửa.
nimi


5

Thạch , 11 10 byte

”a”bṄ;¥@¡f

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

”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.

Tôi đã có ”a”b;@Ṅmột phần xuống, nhưng tôi không thể tìm ra nơi để đi từ đó ... bây giờ tôi biết :-)
ETHproductions

5

Java 7, 69 byte

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

vô dụng

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

}
}

Mặc dù vậy, bạn thực sự cần định dạng mã không mã hóa hơn một chút trong câu trả lời của mình .. xD +1 và thậm chí nó còn hoạt động cho bất kỳ chuỗi bắt đầu nào khác ngoài chỉ ab. Tôi không chắc chắn nếu các tham số "a""b"nên được tính vào số đếm byte, vì câu hỏi nêu cụ thể nó nên sử dụng ab. Dù sao đi nữa, Java sẽ không bao giờ chiến thắng. ;)
Kevin Cruijssen

@KevinCruijssen các tham số chuỗi được yêu cầu vì giá trị của chúng thay đổi mỗi khi phương thức được gọi.

@Snowman Tôi biết rằng chúng là bắt buộc .. Tôi chỉ nói rằng số byte có thể là 75 byte (+6 cho "a""b") thay vì 69 vì thử thách được yêu cầu cụ thể ab, và phương thức snipped / code hiện đang sử dụng một đầu vào biến. Không chắc chắn những gì các quy tắc liên quan đến một cái gì đó như thế này, nhưng cá nhân tôi nghĩ rằng nó nên được tính. Mặt khác, trong một số ngôn ngữ, bạn có thể thực hiện một hàm thực thi một hàm tham số, và sau đó chỉ cần cung cấp toàn bộ hàm thử thách trong tham số mà không cần đếm byte của nó. Âm thanh như một loại quy tắc lỗ hổng tiêu chuẩn.
Kevin Cruijssen

1
Tôi thích câu trả lời của Java. Chúng rất đẹp - 12 byte ở đây, 5 ở đó, 17 ở đây ... 70 byte ở đó ... chờ đã, cái gì? Ồ, lại là Java ... +1
RudolfJelin

5

Emacs, tổ hợp phím 26 , 25 giờ

Chương trình

#nđược đọc dưới dạng khóa với chữ số (s) n :

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

Giải trình

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

Với n = 10

a
b
ab
bab
abbab
bababbab
abbabbababbab
bababbababbabbababbab
abbabbababbabbababbababbabbababbab
bababbababbabbababbababbabbababbabbababbababbabbababbab

1
Tôi đang bị rách Một mặt, tôi luôn nâng cao trình soạn thảo-golf, nhưng mặt khác tôi sử dụng vim. Ồ tốt, +1 nào. :)
DJMcMayhem

@DrMcMoylex chỉ cần chuyển đổi nó thành vim với Cu Mx convert-to-vim
YSC


4

CJam, 19 17 byte

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

giải trình

"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

Nhân tiện, số chuỗi hiện đang bị tắt bởi một; cuối cùng pnên là a ;. Bạn có thể thoát khỏi các trích dẫn xung quanh đầu ra nếu bạn sử dụng nthay vì p. Cuối cùng, 'a'blưu hai byte qua "a""b".
Dennis

3

V , 18 byte

ia
bkÀñyjGpgJkñdj

Hãy thử trực tuyến!

Hoặc, phiên bản dễ đọc hơn:

ia
b<esc>kÀñyjGpgJkñdj

Giải trình:

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

Python 2, 55 byte

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

3

Võng mạc , 33 byte

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

Hãy thử trực tuyến!

Đã lưu 10 (!) Byte nhờ @ MartinEnder !

Giải trình

Chuyển đổi đầu vào thành unary, trừ 2và thêm ab, sau đó thay thế đệ quy các 1s còn lại bằng cách nối hai chuỗi trước đó.


Đã lưu một vài byte bằng cách tránh các ảnh chụp không cần thiết: retina.tryitonline.net/ từ
Martin Ender

@MartinEnder Đẹp! Không thấy sức mạnh của $%` ! và việc bắt giữ khác chỉ là kế hoạch tồi tệ ... Thật tuyệt vời, cảm ơn bạn!
Dom Hastings

2

Mẻ, 102 93 byte

@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%

May mắn thay, các biến được mở rộng cho mỗi dòng trước khi các bài tập có hiệu lực, vì vậy tôi có thể đặt cả hai absử dụng các giá trị cũ của chúng mà không cần tạm thời. Chỉnh sửa: Đã lưu 9 byte nhờ @ nephi12.


Tôi đã định làm điều này;) Nhân tiện, bạn có thể lưu 8 byte bằng cách xóa "exit / b" và bắt đầu vòng lặp của bạn từ 2:for /l %%i in (2,1,%1) etc..
nephi12

Thêm một (dòng mới) bằng cách đặt các lệnh được đặt trên cùng một dòng @set a=a&set b=bgiống như bạn đã làm với lệnh cuối cùng. mặc dù về mặt kỹ thuật, tất cả họ đều có thể ở trên cùng một dòng ... nhưng điều đó sẽ thật xấu xí ... hmm ...
nephi12


2

Perl, 36 35 byte

Bao gồm +3 cho -n

Hãy đếm trên STDIN

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

fibo.pl

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

2

Perl, 45 +1 = 46 byte

+1 byte cho cờ -n

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

Cải thiện nhẹ so với giải pháp 49 byte hiện có, nhưng được phát triển riêng. Các dấu ngoặc đơn say($a)là cần thiết bởi vì nếu không, nó diễn giải $a,($a,$b)=($b,$a.$b)như là đối số saytạo ra nhiều rác hơn chúng ta cần.

Perl, 42 byte

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

Một cách tiếp cận riêng biệt từ giải pháp trên:

$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

Tôi vẫn chưa tin rằng tôi không thể kết hợp việc chuyển ngữ và thay thế thành một thao tác ngắn hơn. Nếu tôi tìm thấy một, tôi sẽ đăng nó.



1

Perl, 48 byte

Mã 47 byte + 1 cho -n .

Cách tiếp cận đơn giản. Hãy thử sử dụng một lát mảng ban đầu $a[@a]="@a[-2,-1]"nhưng điều đó bắt buộc $"=""hoặc tương tự :(. Lưu 1 byte nhờ @ Dada !

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

Sử dụng

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

Bạn có thể lưu một byte bằng cách sử dụng @;thay vì @avậy bạn có thể bỏ qua dấu chấm phẩy cuối cùng (xem ý tôi là gì?). (Tôi biết, một byte là khá rẻ nhưng tôi không có ý tưởng nào tốt hơn ..)
Dada

@Dada Vâng, tôi đã thử nó, nhưng nó không được biên dịch trên máy của tôi, vì vậy tôi nghĩ có lẽ có điều gì đó kỳ lạ xảy ra với tôi: 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.nhưng tôi không nghĩ sẽ công bằng khi thêm câu trả lời nếu tôi không thể làm cho nó hoạt động
Dom Hastings

Chắc chắn điều này không liên quan đến -pethay vì -nE? Dù sao đi nữa, nó hoạt động với tôi, vì vậy nó có thể liên quan đến phiên bản hoặc hệ thống perl của bạn ... Nhưng tin tôi đi, tôi đã thử nó và nó hoạt động! ;)
Dada

@Dada Tôi cũng nhận được điều tương tự -nE(không biết từ đâu -peđến! Phải là thứ Sáu ...) Tôi sẽ cập nhật điều đó khi tôi nhận được một mo! Cám ơn vì đã chia sẻ!
Dom Hastings

1

SOML , 8 byte (không cạnh tranh)

 a b.{;t⁴+

giải trình:

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

Lý do điều này không cạnh tranh là vì ngôn ngữ này vẫn đang được phát triển và tôi đã thêm một vài chức năng mới trong khi viết này.

Ngoài ra, bài viết đầu tiên trên PPCG!


1
Chào mừng đến với PPCG! Bài đăng đầu tiên tuyệt vời!
Oliver Ni

1

05AB1E, 15 byte

'a'bVUFX,XYUYJV

1

C , 156 byte (không có thụt lề)

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;
    }
}

Hai bộ đệm (u & v) lưu trữ hai dòng cuối cùng. Dòng mới nhất (được theo dõi với hai con trỏ: start = c, end = d) được thêm vào dòng cũ nhất (start = a, end = b). Hoán đổi (a, b) và (c, d) và vòng lặp. Hãy chú ý đến kích thước bộ đệm trước khi yêu cầu quá nhiều dòng. Không quá ngắn (như mong đợi của một ngôn ngữ cấp thấp), nhưng rất vui khi viết mã.


Bạn đã mã hóa 5nhưng nó phải là đầu vào của người dùng
Karl Napf

Hmm ... Tôi không thấy "đầu vào của người dùng" là một yêu cầu trong câu đố ... Theo cùng một đường dẫn như câu trả lời của Perl, Python, C ++, ..., thay thế "int main ()" bằng "void f (int n) ".
Phil

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

Vâng, đầu vào của người dùng là một lựa chọn tồi về mặt từ ngữ. Tôi có nghĩa là giống như năng động hơn Nvà không cố định. Hoặc người dùng có thể là người sử dụng chức năng / chương trình của bạn.
Karl Napf

Tôi đã sửa một lỗi ngu ngốc về việc không sao chép bộ kết thúc không. Tôi cũng đã đặt chức năng ở trạng thái dễ đọc hơn (một lớp lót rất buồn cười, nhưng không tiện dụng). Để thực sự kiểm tra chức năng này, hãy sử dụng chức năng này: int main (int n, char ** p) {f (n <2? 5: atoi (p [1])); return 0;}
Phil

1

PHP, 63 62 byte

Phiên bản đệ quy:

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

khoảng trắng không cần thiết saureturn
Titus

0

Bình thường , 17 byte

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

Một chương trình lấy đầu vào của một số nguyên và in kết quả.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte.

⎕IOphải 1.

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

0

Toán học, 49 byte

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

Xác định hàm glấy đầu vào số đơn; trả về một danh sách các chuỗi. Thực hiện đệ quy đơn giản, sử dụng toán tử nối chuỗi<> .

Toán học, 56 byte

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

Chức năng chưa được đặt tên, định dạng đầu vào / đầu ra giống như trên. Giải pháp này sử dụng một cách khác để tạo các chuỗi: mỗi chuỗi trong danh sách là kết quả của việc thay thế đồng thời, trong chuỗi trước đó, tất cả các lần xuất hiện của "a" bằng "b" và tất cả các lần xuất hiện của "b" bằng "ab".



0

PHP, 53 byte

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

lưu một byte bằng cách sử dụng dấu ngoặc kép và đặt $bchuỗi.
Tít

0

C ++ 11, 89 98 byte

+7 byte cho tất cả các dòng, không chỉ dòng cuối cùng. Hơn 2 byte cho Nsố lượng dòng được in, không phải là một số công cụ dựa trên 0.

#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;}

Sử dụng:

f(5)

0

Ruby (1.9+) 46 byte

a,b=?a,?b;ARGV[0].to_i.times{puts a;a,b=b,a+b}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.