交替斐波那契


17

在交替的斐波那契数列中,您首先像往常一样从1和开始1

但是,您不必总是将最后两个值相加以获得下一个数字,而是从加法开始,每隔一次减去就代替。

序列开始如下:

1
1
2    # 1 + 1
-1   # 1 - 2
1    # 2 + -1
-2   # -1 - 1
-1   # 1 + -2
-1   # -2 - -1
-2   # -1 + -1
1    # -1 - -2
-1   # -2 + 1
2    # 1 - -1
1    # -1 + 2
1    # 2 - 1

等等

请注意,它开始了之后,一旦到达11一次。

给定数字N,打印交替斐波那契数列的第N个项。

请记住,这是,所以字节数最少的代码将获胜。


序列是0索引还是1索引(或两者之一)?
Doorknob

@Doorknob之一。在您的答案中指定。
奥利弗·尼

我们可以返回true1
ETHproductions 2016年

前两个1值是否算作输出的初始值?还是我们直接从开始2
路易斯·门多

@LuisMendo前两个计数。
奥利弗·倪

Answers:


17

JavaScript(ES6),25个字节

n=>"334130110314"[n%12]-2

0索引。您可以使用稍微递归的版本来缩短字符串,尽管它会增加6个字节:

f=n=>"3341301"[n]-2||f(13-n%12)

它仍然比确定的递归公式短:

f=n=>n<2||f(n-2)+f(n-1)*(-n%2|1)

8

Python,31个字节

lambda n:2-33107256/5**(n%12)%5

不必费心尝试计算值。只需在periodic length-12列表中查找,该列表[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]在基数5中被压缩。

与带有的递归解决方案(37个字节)进行比较True

f=lambda n:n<2or(-1)**n*f(n-1)+f(n-2)

或字符串存储

lambda n:int('334130110314'[n%12])-2

或尝试算术表达式。

lambda n:4**n%7%3*(-1)**((n+n%2*4)/6)

7

绿洲,10字节

提醒我实施更多内置功能:p。输入为0索引

码:

n>2%x<*c+V

翻译版本:

a(n) = (2*((n+1)%2)-1) * a(n-1) + a(n-2)
a(1) = 1
a(0) = 1

并计算第n项。

在线尝试!




4

果冻,12个字节

“½Ġ⁻S’b5_2⁸ị

TryItOnline!

基于1,假设第一个和第二个值是 1

不知道这是否更短,但是为此,我注意到该系列的周期为12:
[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]

因此,我接受了这一点,并添加了2
[3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
然后将其作为一个基数转换为5base 250,得到:(
[11, 197, 140, 84]
184222584)。

“½Ġ⁻S’b5_2⁸ị - Main link: n
“½Ġ⁻S’       - base 250 number      184222584
      b5     - convert to base 5   [3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
        _2   - subtract 2          [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]
          ⁸  - left argument, n
           ị - index into (1-based and modular)


3

Mathematica,40个字节

只需创建一个查询表并循环访问它,就像ETHproductions的答案一样。未命名函数,1索引。

Join[s={2,1,1,2,-1,1},-s][[#~Mod~12+1]]&

3

MATL17 16 15字节

'"Bl)e'F5Za2-i)

输入基于1。

在线尝试!

说明

序列有句号[1 1 2 -1 1 -2 -1 -1 -2 1 -1 2]

'"Bl)e     % Compressed array [1 1 2 -1 1 -2 -1 -1 -2 1 -1 2] with source 
           % alphabet [-2 -1 0 1 2]
F5Za       % Decompress with target alphabet [0 1 2 3 4]
2-         % Subtract 2 to transform alphabet into [-2 -1 0 1 2]
i)         % Input N and use as (modular, 1-based) index into the sequence

3

WinDbg,26个字节

?(85824331b>>@$t0%c*3&7)-2

输入通过伪寄存器传递$t0。0索引。序列中每项的+2以3位存储85824331b

怎么运行的:

? (85824331b >> @$t0 % c * 3 & 7) - 2 ;*? Evalutes the expression. Shifts 85824331b to get
                                       *the 3 bits for the @$t0'th term (mod c (12) when
                                       *the sequence repeats). Bitwise AND by 7 to get the
                                       *desired 3 bits, finally subtract 2 since the terms
                                       *where stored as +2.

样本输出,循环打印序列的前14个值:

0:000> .for(r$t0=0;@$t0<e;r$t0=@$t0+1){?(85824331b>>@$t0%c*3&7)-2}
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001
Evaluate expression: 2 = 00000002
Evaluate expression: -1 = ffffffff
Evaluate expression: 1 = 00000001
Evaluate expression: -2 = fffffffe
Evaluate expression: -1 = ffffffff
Evaluate expression: -1 = ffffffff
Evaluate expression: -2 = fffffffe
Evaluate expression: 1 = 00000001
Evaluate expression: -1 = ffffffff
Evaluate expression: 2 = 00000002
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001

3

Java,32个字节

n->"334130110314".charAt(n%12)-50

由于这是Java,因此答案是0索引。

测试和取消高尔夫:

class Ideone {
  public static void main (String[] args) throws Exception {
    java.util.function.IntFunction f = n->"334130110314".charAt(n%12)-50;
    for (int i = 0; i < 12; i++) {
      System.out.printf("%d -> %d%n", i, f.apply(i));
    }
  }
}

测试Ideone


2

Mathematica,45 41 38字节

感谢@MartinEnder提供了3个字节。

±0=±1=1;±n_:=±(n-2)+±(n-1)(1-2n~Mod~2)

0索引。

用法

±5

-2


2
通过定义一元运算符±而不是函数,可以节省三个字节a
Martin Ender


1

C#,117字节

打高尔夫球:

int A(int n){var f=new List<int>{0,1,1};for(int i=3;i<=n;i++){f.Add(i%2>0?f[i-1]+f[i-2]:f[i-2]-f[i-1]);}return f[n];}

取消高尔夫:

public int A(int n)
{
  var f = new List<int> { 0, 1, 1 };

  for (int i = 3; i <= n; i++)
  {
    f.Add(i % 2 > 0 ? f[i - 1] + f[i - 2] : f[i - 2] - f[i - 1]);
  }

  return f[n];
}

测试:

var alternatingFibonacci = new AlternatingFibonacci();
Console.WriteLine(alternatingFibonacci.B(10));
1

编译到函数求<INT,INT>所以public int A(int n)现在n=>,你可以删除周围的大括号的声明节省2个字节,可以预先增量i的循环,即++i <= n和一套i = 2节省3个字节,因为它消除了i++在声明的结尾
TheLethalCoder

另请参阅我的回答如果你保持跟踪先前的变量,而不是创建他们全部的列表是短了很多
TheLethalCoder

1

R,38个字节

使用受@ETHproductions JS答案启发的查找表解决方案。

c(s<-c(2,1,1,2,-1,1),-s)[scan()%%12+1]

编辑:忘记提及这是1索引。


1

其实 22个位元组

34*@%"334130110314"E≈¬

在线尝试!

说明:

34*@%"334130110314"E≈¬
34*@%                   input % 12
     "334130110314"E    get that character in the string
                    ≈¬  convert to int, subtract 2

1

爪哇7,88 82 79字节

打高尔夫球:

int f(int n){int c,i=0,a=1,b=1;for(;i<n;){c=i++%2>0?a-b:a+b;a=b;b=c;}return b;}

松散:

int f(int n)
{
    int c, i = 0, a = 1, b = 1;
    for (; i < n;)
    {
        c = i++ % 2 > 0 ? a - b : a + b;
        a = b;
        b = c;
    }
    return b;
}

在线尝试


1
由于您采用“逻辑”方式,因此有一些提示:1.您忘记声明int为返回类型。2.您可以通过将0的赋值移动到i:int c,i=0和的声明来节省字节for(;i<n;){。3.您可以删除三元运算符条件附近的括号。
奥利维尔·格雷戈尔(

1
@OlivierGrégoire感谢花花公子:)已修复。不错的解决办法
peech

1

DC,55字节

?sd[ln1+snly[[+2Q]sEln2%1=E-]xlyrsylnld>r]sr1sy0sn1lrxp

0索引。

?sd                                                     takes input and stores
                                                        it in register d

                                            1sy0sn1     stores 1 in register y
                                                        and 0 in register n and
                                                        appends 1 to the stack

   [ln1+snly                                            adds 1 to register n and
                                                        appends the value of
                                                        register y to the stack

            [[+2Q]sEln2%1=E-]                           adds or subtracts the
                                                        the two values on the
                                                        stack depending on
                                                        parity of n

                             xlyrsylnld>r]              does the rest of the
                                                        stuff required to store
                                                        the new values properly
                                                        and quits if it has
                                                        done enough iterations

                                          sr            stores the main macro
                                                        in register r

                                                   lrxp executes the macro and
                                                        prints the stack

寄存器d存储该值的索引。寄存器n计算完成的迭代次数。寄存器r存储主宏。寄存器y将序列中的后一个值存储起来,而堆栈中包含序列中的前一个值。

大循环中发生的情况的可视化解释(假设添加):

register: y=1     y=1   y=1    y=1   y=1    y=2
stack:     1      1 1    2     2 1   1 2     1
               ly     +     ly     r     sy

确定是加还是减的检查将计数器取模2,并使用此技巧进行if if else构造。

最后,堆栈包含一个单一的数字,即所需的值,并用印刷p

(我是的新手dc,所以我希望可以在这里进行一些明显的改进。)


0

ForceLang,153个字节

def s set
s a 1
s b 1
s p 1
s k io.readnum()
if k=0
goto b
label a
s c b.mult p
s c a+c
s a b
s b c
s p p.mult -1
s k k+-1
if k
goto a
label b
io.write a

0

Turtlèd,35个字节

#112-1_--_1-2#?:[*l+].(-r'1)(_"-2")

0索引

说明:

#112-1_--_1-2#                      the 12 values of sequence. - is -1, _ is -2
              ?:                    input a number and move right that many
                [*l+]               move back to the asterisk on start cell, 
                                    increment sting pointer by amount moved
                     .              write pointed char
                      (-r'1)        if it was -, move right, write 1
                            (_"-2") if it was _, write "-2"
      [print grid]

在线尝试!


0

ABCR,43个字节

)AAB)ABB..A))A..A)AA(ABB.)A+A)))AiB5aAb(Bxo

说明:第一部分()AAB)ABB..A))A..A)AA(ABB.)A+A)))A)将队列A设置为包含[1、1、2,-1、1,-2,-1,-1,-2、1,-1、2],并保持所有其他队列为空。 iB存储我们所需的条件,然后循环5aAb(Bx在队列中循环多次。 o将队列的前部打印为数字,这将是我们想要的答案。


0

批处理,49字节

@cmd/cset/a"n=%1%%12,~!(n%%3)*(1|-!(n%%5*(n/4)))"

将输入作为命令行参数。说明:闭合形式使用以下观察结果:

  • 序列为周期12
  • 每三项为±2,其他项为±1
  • 第三位之后的项为负数,但5的倍数除外(对12取模后)

因此,我们从减少模数12开始(以节省2个字节)。然后,我们对三取模,并将结果取反,对于3的倍数,结果为1,否则为0。然后,我们按位不是那个值,否则给我们-3或-1的倍数。然后,我们减少模5并分别除以4,得出项1,2,3,5,10和12(0)为零。取反和求反得到的值是-1,其他值是0。然后,我们按位或与1相乘,然后与先前的计算相乘。


0

TI-Basic,26个字节

不幸的是,这很无趣。我找不到更短的东西。该列表为1索引。

Input :{1,1,2,-1,1,-2:augment(Ans,-Ans:Ans(X

0

C#,73 71个字节

这使用0的n索引值。

n=>{int a=1,b=1,i=0,r;for(;++i<n;){r=i%2>0?a+b:a-b;a=b;b=r;}return b;};

格式化版本:

Func<int, int> f = n =>
{
    int a = 1, b = 1, i = 0, r;

    for(; ++i < n;)
    {
        r = i % 2 > 0 ? a + b : a - b;
        a = b;
        b = r;
    }

    return b;
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.