카운터 피보나치 시퀀스


13

감안 세 숫자 해요 , NP는 , 사용자의 작업이 길이의리스트 / 배열 인쇄하는 P를 시작으로 mn은 이후 각 요소 (P)이 그 전에 2 수의 차이를 나타내고, MN (카운터 - 피보나치 서열 )

이 문제를 해결하기 위해 함수를 사용하여 결과를 반환하거나 전체 프로그램을 인쇄 할 수 있습니다.

입력

언어가 지원하는 것과 상관없이 개행 / 공백 / 쉼표로 구분 된 세 개의 정수 m , np 는 입력 형식을 지정해야합니다. 코드 삽입이 허용되지 않습니다.

산출

Counter-Fibonacci Sequence에 포함 된 숫자는 다음 형식 중 하나입니다 (이 예 :) m = 50, n = 40, p = 6.

  • 50,40,10,30,-20,50 (또는 쉼표 뒤에 공백이 있음)
  • [50,40,10,30,-20,50] (또는 쉼표 뒤에 공백이 있음)
  • 50 40 10 30 -20 50(또는 \n공백 대신 (줄 바꿈) 사용)
  • {50,40,10,30,-20,50} (또는 쉼표 대신 공백으로)

Input => Output

50,40,10 => 50,40,10,30,-20,50,-70,120,-190,310
-100,-90,7 => -100,-90,-10,-80,70,-150,220
250,10,8 => 250,10,240,-230,470,-700,1170,-1870

규칙

  • p 가 1보다 높다는 것을 보장합니다
  • 가능하면 프로그램을 테스트하는 방법을 제공해야합니다
  • 주의를 타고 이 허점을 금지하고 코드 삽입이 허용되지 위에서 언급 한 바와 같이,

채점 및 리더 보드

이므로 는 가능한 짧아야합니다 . 이 과제는 골프 언어에 대한 부당한 이점을 피하면서 언어별로 가장 짧은 답변을 찾기위한 것이므로 대답이 허용되지 않습니다 .


관련 질문 ETHproductions : Monday Mini-Golf # 1 : Reverse Fibonacci Solver


관련, 가능한 중복. 기본적 으로이 도전과 동일하지만 시퀀스의 특정 지점에서 역순으로 출력합니다.
ETHproductions

@ETHproductions은 속는 간주하지만, 이것은입니다 수 있습니다 비트 각 언어의 짧은 솔루션 보려고, 다른
씨 Xcoder

예, 당시 언어 불평등에 대해 걱정하지 않았습니다. ;-) 큰 차이가 있다고 생각하지 않습니다. 여기서 가장 큰 차이점은이 과제를 해결하는 데 사용했던 알고리즘의 첫 단계를 거의 생략 할 수 있다는 것입니다 (시작점을 찾기 위해 거꾸로 작업)
ETHproductions

@ETHproductions는 실제로 작은 차이가 있습니다. 이 도전 과제를 제거하려면 완전히하겠습니다.
Mr. Xcoder

개인적으로는 괜찮다고 생각합니다. 옆에 구분 기호를 사용할 수 있습니까?
ETHproductions

답변:


9

하스켈, 29 바이트

a#b=a:b#(a-b)
(.(#)).(.).take

길이 p는 첫 번째 매개 변수입니다. 사용 예 : ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. 온라인으로 사용해보십시오! .

목록을 p요소로 줄이면 생성하는 것보다 더 많은 바이트가 필요합니다.


6

젤리 , 6 바이트

_@С+Ṗ

온라인으로 사용해보십시오!

작동 원리

_@С+Ṗ  Main link. Left argument: m. Right argument: n. Third argument: p

    +   Yield (m + n), the term that comes before m.
  С    Execute the link to the left p times, starting with left argument m and
        right argument (m + n). After each execution, replace the right argument
        with the left one and the left argument with the previous return value.
        Yield all intermediate values of the left argument, starting with m.
_@          Subtract the left argument from the right one.
        This yields the first (p + 1) terms of the sequence, starting with m.
    Ṗ   Pop; discard the last term.


5

자바 스크립트 (ES6), 33 바이트

f=(m,n,p)=>p?m+[,f(n,m-n,p-1)]:[]

문자열을 1,2,3,사용하지 않고 형식의 문자열을 반환합니다 !

스 니펫 테스트


5

펄 6 , 25 바이트

{($^m,$^n,*-*...*)[^$^p]}

시도 해봐

넓히는:

{  # bare block lambda with placeholder parameters 「$m」 「$n」 「$p」
  (
    $^m, $^n,  # declare first two params, and use them

    * - *      # WhateverCode lambda which subtracts two values

    ...        # keep using that to generate values

    *          # never stop (instance of type Whatever)

  )[ ^ $^p ]   # declare last param, and use it to grab the wanted values
               # 「^ $^p」 is short form of range op
               # 「0 ..^ $^p」 which excludes the 「$p」
}

5

CJam , 15 바이트

q~2-{1$1$-}*]S*

CJam은 당연히 허용 된 출력 형식 중 하나를 사용하지 않기 때문에 1 바이트 추가> _ <

온라인으로 사용해보십시오!

설명

q~               e# Read and eval the input
  2-             e# Subtract 2 from p (to account for m and n being in the list)
    {            e# Run this block p-2 times:
     1$1$-       e#   Copy the top values and subtract
          }*     e# (end of block)
            ]    e# Wrap the stack in an array
             S*  e# Join with spaces


3

로다 , 38 바이트

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}

온라인으로 사용해보십시오!

설명 :

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}
f i,a,b{                             } /* Function declaration */
        seq 1,i                        /* Push numbers 1..i to the stream */
               |{|_|               }_  /* For each number in the stream: */
                    [a];               /*   Push the current value of a */
                        b=a-b;         /*   Set b = the next number */
                              a=a-b    /*   Set a = the previous value of b */

3

하스켈 , 33 바이트

(m!n)0=[]
(m!n)p=m:(n!(m-n))(p-1)

을 사용하여 전화하십시오 (m!n)p. 정의하여 서지 !걸린 중위 함수 mn및 취하는 함수 리턴 p과 원하는 결과를 반환한다.


좋은! 나는 함수를 삽입하는 것을 생각하지 않았으므로 haskell을 사용하는 가장 좋은 시도는 34였습니다. BTW 줄 바꿈을 대신하여 줄 바꿈으로 바꿀 수 ;있으므로 좀 더 코드가 골치가 보입니다.
AlexJ136

2

루비, 31 바이트

->m,n,p{p.times{m,n=n,(p m)-n}}

간단한 솔루션


2

PHP, 76 바이트

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c---2;)$r[]=-end($r)+prev($r);print_r($r);

PHP, 84 바이트

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c>$d=count($r);)$r[]=$r[$d-2]-end($r);print_r($r);

2

Pyth, 18 바이트

JEKEVEJ=N-JK=JK=KN

온라인으로 사용해보십시오!

입력과 출력 모두 줄 바꿈으로 구분됩니다.

작동 방식 :

JEKE                Read two lines of input to J and K
    VE              Read another line and loop that many times:
      J               Print J
       =N-JK          Set N to J - K (Pyth uses prefix notation)
            =JK       Set J to K
               =KN    Set K to N

1

Mathematica, 26 바이트

{-1,1}~LinearRecurrence~##

내장을 사랑하십시오. 형식으로 입력을 {{m, n}, p}받습니다. LinearRecurrence이전 요소의 선형 조합 계수를 알고 새 요소를 생성하는 데 사용하려고 {-1,1}합니다.


1

QBIC , 35 33 바이트

:::?'a;b;`[c-2|e=a-b?e';`┘a=b┘b=e

첫 번째 PRINT코드 리터럴에 첫 번째 를 배치하여 2 바이트를 절약했습니다 .

설명 (35 바이트 버전) :

:::         Get parameters a, b, c from the cmd-line
  ';`       This suppresses a newline when printing
?a   b';`   PRINT a and b
[c-2|       FOR x=1; x<=(c-2); x++
  e=a-b       calculate the next term of the sequence
  ?e';`       Print it, suppressing newline
  ┘a=b        ┘ denotes a syntactic linebreak; shove the numbers one over
  ┘b=e        dito
            FOR-loop is auto-closed

이것을 테스트하기 위해 온라인 통역사에 대한 아이디어가 있습니까?
Mr. Xcoder

@ Mr.Xcoder 아직 온라인 통역사가 없습니다. 죄송합니다. QBasic을 실행하고 QBIC을 실행하는 DOSBOX 프로젝트 인 인터프리터에 대한 링크를 추가했습니다.
steenbergh

1
설명은 @steenbergh 통역사보다 가치가 있습니다. 답변 해 주셔서 감사합니다!
Mr. Xcoder

1

C, 128 바이트

m,n,p,z;main(c,v)char**v;{m=atoi(v[1]);n=atoi(v[2]);p=atoi(v[3])-2;printf("%d,%d",m,n);while(p--)z=m,m=n,n=z-m,printf(",%d",n);}

이 프로그램은 세 개의 인수를 구문 분석 m, np명령 줄에서, 그리고 지정된 출력을 인쇄합니다.

최신 C 컴파일러를 사용하면 기본 가져 오기를 생략 할 수 있으므로 s를 사용 printf하거나 사용 atoi하지 않고 사용할 수 있습니다 #include.

전역 변수는 int기본적으로 유형없이 선언 될 때 많은 공간을 절약합니다.


1

자바, 66 바이트

한 번 들어, 람다 인해에 골프에 비효율적 인 방법이다 매우 그들에게 재귀를 적용하는 로터리 방식으로 추가 바이트를 많이 필요로한다.

골프 :

String f(int m,int n,int p){return""+m+(p>1?","+f(n,m-n,p-1):"");}

언 골프 드 :

public class CounterFibonacciSequences {

  private static final int[][] INPUTS = new int[][] { //
      { 50, 40, 10 }, //
      { -100, -90, 7 }, //
      { 250, 10, 8 } };

  private static final String[] OUTPUTS = new String[] { //
      "50,40,10,30,-20,50,-70,120,-190,310", //
      "-100,-90,-10,-80,70,-150,220", //
      "250,10,240,-230,470,-700,1170,-1870" };

  public static void main(String[] args) {
    for (int i = 0; i < INPUTS.length; ++i) {
      final int m = INPUTS[i][0];
      final int n = INPUTS[i][1];
      final int p = INPUTS[i][2];
      System.out.println("M: " + m);
      System.out.println("N: " + n);
      System.out.println("P: " + p);
      System.out.println("Expected: " + OUTPUTS[i]);
      System.out.println("Actual:   " + new CounterFibonacciSequences().f(m, n, p));
      System.out.println();
    }
  }

  String f(int m, int n, int p) {
    return "" + m + (p > 1 ? "," + f(n, m - n, p - 1) : "");
  }
}

1

AHK, 68 바이트

m=%1%
n=%2%
3-=2
Send %m%`n%n%`n
Loop,%3%
{
n:=m-n
m-=n
Send %n%`n
}

정말 모르고 피곤 '얻는 방법 / 전달 된 인수를 사용할 수있는 ( %1%, %2%, ...) 직접 수학 함수에


1

파이썬 2 , 93 90 바이트

u,t=int,input;m,n,p=u(t()),u(t()),u(t());l=[m,n]
for i in range(p-2):l.append(l[-2]-l[-1])

온라인으로 사용해보십시오!

@ Mr.Xcoder 덕분에 3 바이트 절약

숫자를 입력으로 사용하고 올바르게 형식을 지정한 다음 for 루프를 사용하여 입력 한 숫자를 기반으로 목록을 생성합니다.


해당 범위에서 쉼표 뒤에 공백을 제거하여 1 바이트를 절약 할 수 있습니다.
Xcoder

입력을 int와 input.split으로 매핑하면 짧아 질 수 있습니다.
Mr. Xcoder

@ Mr.Xcoder 분할을 시도했지만 결국 더 길어졌습니다.
스파클 포니 동지

좋아, 나는 그것을 시험 할 수 없었다. 어쨌든 좋다.
Mr. Xcoder

그리고 범위는 첫 번째 논쟁이 필요하지 않습니다
Mr. Xcoder

0

스위프트-85 바이트

func y(x:Int,y:Int,z:Int){var m=x,n=y,p=z,c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

용법: y(x:50,y:40,x:6)

스위프트-84 바이트

func z(l:[Int]){var m=l[0],n=l[1],p=l[2],c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

용법: z(l: [50,40,6])


산출:

50
40
10
30
-20
50

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.