Chuỗi phản kháng


13

Cho ba số m , np , nhiệm vụ của bạn là in một danh sách / mảng có độ dài p bắt đầu bằng mn và mỗi phần tử sau p đại diện cho sự khác biệt của 2 số trước nó, mn ( Chuỗi liên kết ngược )

Đối với thử thách này, bạn có thể sử dụng một hàm để trả về hoặc in kết quả hoặc một chương trình đầy đủ.

Đầu vào

Ba số nguyên, m , np , được phân tách bằng dòng mới / dấu cách / dấu phẩy, bất kể ngôn ngữ của bạn hỗ trợ là gì, nhưng bạn nên chỉ định định dạng đầu vào của mình. Mã chèn không được phép.

Đầu ra

Các số được chứa trong Chuỗi Phản ứng Fibre, theo bất kỳ định dạng nào sau đây (ví dụ này m = 50, n = 40, p = 6:):

  • 50,40,10,30,-20,50 (hoặc với khoảng cách sau dấu phẩy)
  • [50,40,10,30,-20,50] (hoặc với khoảng cách sau dấu phẩy)
  • 50 40 10 30 -20 50(hoặc với \n(dòng mới) thay vì dấu cách)
  • {50,40,10,30,-20,50} (hoặc có dấu cách thay vì dấu phẩy)

Ví dụ

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

Quy tắc

  • Bạn được đảm bảo rằng p cao hơn 1
  • Bạn nên cung cấp một cách để kiểm tra chương trình của bạn, nếu có thể
  • Xin lưu ý rằng các lỗ hổng này bị cấm và việc chèn mã không được phép, như đã đề cập ở trên

Chấm điểm & bảng xếp hạng

Mã của bạn phải càng ngắn càng tốt, vì đây là . Sẽ không có câu trả lời nào được chấp nhận , bởi vì thử thách này có nghĩa là tìm ra câu trả lời ngắn nhất bằng ngôn ngữ, tránh một lợi thế không công bằng cho các ngôn ngữ chơi gôn.


Câu hỏi liên quan của ETHproductions: Thứ hai Mini-Golf # 1: Bộ giải Fibre ngược


Liên quan, có thể trùng lặp. Về cơ bản, đây là thử thách tương tự như thử thách này, nhưng xuất ra theo thứ tự ngược lại từ một vị trí cụ thể trong chuỗi.
Sản phẩm ETH

@ETHproductions có thể được coi là một bản dupe, nhưng điều này hơi khác một chút , cố gắng xem giải pháp ngắn nhất trong mỗi ngôn ngữ
Ông Xcoder

Vâng, hồi đó không có nhiều lo lắng về sự bất bình đẳng ngôn ngữ ;-) Tôi không nghĩ nó tạo ra sự khác biệt lớn. Sự khác biệt chính ở đây là bạn có thể bỏ qua bước đầu tiên của thuật toán mà bạn đã sử dụng để giải quyết thách thức đó (làm việc ngược lại để tìm điểm bắt đầu)
ETHproductions

@ETHproductions thực sự có sự khác biệt nhỏ. Nếu bạn muốn loại bỏ thử thách này, tôi sẽ hoàn toàn làm điều đó.
Ông Xcoder

Cá nhân tôi nghĩ rằng nó ổn Ngoài ra, chúng ta có được phép có dấu phân cách không?
Sản phẩm ETH

Câu trả lời:


9

Haskell, 29 byte

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

Độ dài plà tham số đầu tiên. Ví dụ sử dụng: ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. Hãy thử trực tuyến! .

Việc rút ngắn danh sách pthành các phần tử cần nhiều byte hơn so với việc tạo ra nó.


6

Thạch , 6 byte

_@С+Ṗ

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

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

_@С+Ṗ  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 byte

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

Trả về một chuỗi định dạng 1,2,3,- mà không cần sử dụng chuỗi!

Kiểm tra đoạn


5

Perl 6 , 25 byte

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

Thử nó

Mở rộng:

{  # 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 byte

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

Thêm 1 byte vì CJam không tự nhiên sử dụng một trong các định dạng đầu ra được phép> _ <

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

Giải trình

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 byte

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

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

Giải thích:

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 byte

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

Gọi bằng cách sử dụng (m!n)p. Công trình bằng cách định nghĩa !như một chức năng ghi vào mà mất trong mnvà trả về một chức năng mà mất pvà trả về kết quả mong muốn.


Đẹp! Tôi đã không nghĩ đến việc tạo ra hàm infix, vì vậy, thử nghiệm tốt nhất của tôi với haskell là 34. BTW bạn có thể thay thế dòng mới bằng ;để biến nó thành một dòng, vì vậy nó có vẻ hơi mã hóa hơn.
AlexJ136

2

Ruby, 31 byte

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

Giải pháp đơn giản


2

PHP, 76 byte

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

PHP, 84 byte

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

2

Bình thường, 18 byte

JEKEVEJ=N-JK=JK=KN

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

Đầu vào và đầu ra đều được phân định bởi các dòng mới.

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

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

Toán học, 26 byte

{-1,1}~LinearRecurrence~##

Yêu thương tích hợp. Đưa đầu vào theo mẫu {{m, n}, p}. LinearRecurrencemuốn biết các hệ số của sự kết hợp tuyến tính của các yếu tố trước để sử dụng để tạo ra các yếu tố mới, trong trường hợp này là {-1,1}.


1

QBIC , 35 33 byte

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

Đã lưu 2 byte bằng cách đặt đầu tiên PRINTvào một mã bằng chữ.

Giải thích (phiên bản 35 byte):

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

Có bất kỳ ý tưởng của một thông dịch viên trực tuyến để kiểm tra điều này?
Ông Xcoder

@ Mr.Xcoder chưa có thông dịch viên trực tuyến, xin lỗi. Tôi đã thêm một liên kết đến trình thông dịch, đó là một dự án DOSBOX chạy QBasic, chạy QBIC.
steenbergh

1
Lời giải thích có giá trị hơn người phiên dịch @steenbergh, cảm ơn vì đã phản hồi!
Ông Xcoder

1

C, 128 byte

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

Chương trình này phân tích ba đối số m, nptừ dòng lệnh, và in sản lượng theo quy định.

Trình biên dịch C hiện đại cho phép bạn bỏ qua các nhập khẩu cơ bản, và do đó chúng tôi có thể sử dụng printfatoikhông có #includes.

Các biến toàn cục inttheo mặc định khi được khai báo không có kiểu - điều này giúp tiết kiệm rất nhiều không gian.


1

Java, 66 byte

Lần đầu tiên, lambdas là cách tiếp cận không hiệu quả đối với việc chơi golf do cách rất áp dụng đệ quy cho chúng đòi hỏi nhiều byte bổ sung.

Chơi gôn

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

Ung dung:

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 byte

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

Bắt' thực sự mệt mỏi không biết làm thế nào / có khả năng sử dụng đối số được truyền ( %1%, %2%, ...) trực tiếp trong bất kỳ chức năng toán học


1

Python 2 , 93 90 byte

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

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

Đã lưu 3 byte nhờ @ Mr.Xcoder

Nó hoạt động bằng cách lấy các số làm đầu vào và định dạng chúng một cách chính xác, sau đó sử dụng vòng lặp for để tạo danh sách dựa trên các số được nhập.


Bạn có thể xóa khoảng trắng sau dấu phẩy trong phạm vi đó để tiết kiệm 1 byte
Ông Xcoder

Và nó có thể ngắn hơn nếu bạn ánh xạ đầu vào của mình bằng ints và input.split
Mr.

@ Mr.Xcoder Tôi đã thử phân tách, nhưng cuối cùng nó dài hơn.
Đồng chí SparklePony

Ok, tôi không thể kiểm tra nó. Dù sao nó cũng tốt.
Ông Xcoder

Và phạm vi không cần đối số đầu tiên
Ông Xcoder

0

Swift - 85 byte

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

Sử dụng: y(x:50,y:40,x:6)

Swift - 84 byte

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

Sử dụng: z(l: [50,40,6])


Đầu ra:

50
40
10
30
-20
50

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.