ลำดับ Counter-Fibonacci


13

รับสามตัวเลขm , nและp , งานของคุณคือการพิมพ์รายการ / อาร์เรย์ของความยาวpเริ่มต้นด้วยmและnและแต่ละองค์ประกอบหลังจากpแสดงถึงความแตกต่างของ 2 หมายเลขก่อนหน้านั้นmn ( ลำดับ Counter- Fibonacci ลำดับ )

สำหรับความท้าทายนี้คุณสามารถใช้ฟังก์ชันเพื่อส่งคืนหรือพิมพ์ผลลัพธ์หรือโปรแกรมเต็มรูปแบบ

อินพุต

จำนวนเต็มสามจำนวนคือm , nและpคั่นด้วยบรรทัดใหม่ / ช่องว่าง / จุลภาคไม่ว่าภาษาของคุณรองรับอะไร แต่คุณควรระบุรูปแบบการป้อนข้อมูลของคุณ ไม่อนุญาตให้ใส่รหัส

เอาท์พุต

ตัวเลขที่มีอยู่โดยลำดับ Counter-Fibonacci ในรูปแบบใด ๆ ต่อไปนี้ (ตัวอย่างนี้:) 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 อาจได้รับการพิจารณาว่าเป็นสิ่งล่อใจ แต่สิ่งนี้แตกต่างกันเล็กน้อยพยายามที่จะเห็นวิธีแก้ปัญหาที่สั้นที่สุดในแต่ละภาษา
Mr. Xcoder

ใช่แล้วไม่ต้องกังวลเกี่ยวกับความไม่เท่าเทียมกันทางภาษามากในตอนนั้น ;-) ฉันไม่คิดว่ามันจะสร้างความแตกต่างอย่างใหญ่หลวง ความแตกต่างหลักที่นี่คือคุณสามารถออกจากขั้นตอนแรกของอัลกอริทึมที่คุณจะเคยใช้ในการแก้ปัญหาที่ท้าทาย (ทำงานย้อนหลังเพื่อหาจุดเริ่มต้น)
ETHproductions

@ETHproductions แน่นอนมีความแตกต่างเล็กน้อย หากคุณต้องการลบความท้าทายนี้ฉันจะทำมันทั้งหมด
Mr. Xcoder

โดยส่วนตัวฉันคิดว่ามันดี นอกจากนี้เราได้รับอนุญาตให้มีตัวคั่นต่อท้ายหรือไม่?
ETHproductions

คำตอบ:


9

Haskell, 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

JavaScript (ES6), 33 ไบต์

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

ส่งคืนสตริงของรูปแบบ1,2,3,- โดยไม่ต้องใช้สตริง!

ตัวอย่างการทดสอบ


5

Perl 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*

1 ไบต์พิเศษเนื่องจาก CJam ไม่ได้ใช้รูปแบบเอาต์พุตที่อนุญาตโดยธรรมชาติ> _ <

ลองออนไลน์!

คำอธิบาย

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

Röda , 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

Haskell , 33 ไบต์

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

(m!n)pเรียกใช้ ทำงานโดยการกำหนด!เป็นฟังก์ชั่นที่ใช้มัดในmและnและผลตอบแทนฟังก์ชั่นที่ใช้pและผลตอบแทนที่ต้องการ


ดี! ฉันไม่ได้คิดที่จะสร้างฟังก์ชั่นมัดดังนั้นการลอง Haskell ที่ดีที่สุดของฉันคือ 34 BTW คุณสามารถแทนที่บรรทัดใหม่ด้วย;เพื่อให้เป็นบรรทัดเดียวดังนั้นจึงดู codegolfy เล็กน้อย
AlexJ136


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

Lovin 'ผู้สร้าง {{m, n}, p}จะเข้าในรูปแบบ อยากรู้ว่าค่าสัมประสิทธิ์ของการรวมกันขององค์ประกอบเชิงเส้นก่อนที่จะใช้ในการสร้างองค์ประกอบใหม่ซึ่งในกรณีนี้คือLinearRecurrence{-1,1}


1

QBIC , 35 33 ไบต์

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

บันทึก 2 ไบต์โดยการใส่PRINTรหัสลงในตัวอักษรเดียว

คำอธิบาย (รุ่น 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

มีความคิดเห็นใด ๆ เกี่ยวกับล่ามออนไลน์ในการทดสอบนี้?
นาย Xcoder

@ Mr.Xcoder ยังไม่มีล่ามออนไลน์ขออภัย ฉันได้เพิ่มลิงก์ไปยังล่ามซึ่งเป็นโครงการ DOSBOX ที่ใช้ QBasic ใช้ QBIC
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, nและpจากบรรทัดคำสั่งและพิมพ์ผลลัพธ์ตามที่ระบุไว้

คอมไพเลอร์ C สมัยใหม่อนุญาตให้คุณละเว้นการนำเข้าขั้นพื้นฐานและทำให้เราสามารถใช้printfและatoiไม่ใช้#includes

ตัวแปรโกลบอลเป็นintค่าเริ่มต้นเมื่อมีการประกาศโดยไม่มีชนิดซึ่งจะช่วยประหยัดพื้นที่ได้มาก


1

Java, 66 ไบต์

สำหรับครั้งหนึ่งแลมบ์ดาเป็นวิธีที่ไม่มีประสิทธิภาพในการเล่นกอล์ฟเนื่องจากวิธีการใช้วงเวียนที่ค่อนข้างมาก ในการใช้การเรียกซ้ำกับพวกเขาที่ต้องการจำนวนไบต์เพิ่มมาก

แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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

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

ลองออนไลน์!

บันทึกแล้ว 3 ไบต์ขอบคุณ @ Mr.Xcoder

มันทำงานได้โดยการใส่ตัวเลขเป็นอินพุตและจัดรูปแบบให้ถูกต้องจากนั้นใช้ลูป for เพื่อสร้างรายการตามหมายเลขอินพุต


คุณสามารถลบช่องว่างหลังจากเครื่องหมายจุลภาคในช่วงนั้นเพื่อบันทึก 1 ไบต์
Mr. Xcoder

และอาจสั้นกว่านี้หากคุณจับคู่อินพุตของคุณกับ ints และ input.split
Mr. Xcoder

@ Mr.Xcoder ฉันลองแยกแล้ว แต่มันก็นานขึ้น
สหาย SparklePony

ตกลงฉันไม่สามารถทดสอบได้ มันดีอยู่แล้ว
Mr. Xcoder

และช่วงไม่จำเป็นต้องมีอาร์กิวเมนต์แรก
Mr. Xcoder

0

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

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