Golf một bím tóc phát triển số


23

Mô tả bím tóc

Trong bím tóc này, khi một sợi đi qua đầu sợi khác, nó sẽ thêm giá trị của sợi kia vào chính nó và tất cả các giá trị sợi khác đi qua. Bện có ba sợi và mỗi sợi bắt đầu từ 1. Sự giao nhau đầu tiên là sợi ngoài cùng bên trái qua sợi giữa. Sự giao nhau tiếp theo là dải ngoài cùng bên phải trên dải giữa mới (trước đây là sợi ngoài cùng bên trái). Hai bước chéo này lặp lại. Nói cách khác, sự giao nhau đầu tiên là [a, b, c] -> [b, a+b, c]và thứ hai là [a, b, c] -> [a, b+c, b]. Sử dụng các quy tắc ở đây là sáu cấp độ đầu tiên của bím tóc:

1,1,1
1,2,1
1,3,2
3,4,2
3,6,4
6,9,4

Nhiệm vụ của bạn

Viết chương trình hoặc chức năng đánh gôn chấp nhận một số nguyên là cấp độ bện và xuất ra ba giá trị cho cấp độ của bím tóc đó. Bạn phải cho biết nếu cấp độ của bạn là không hoặc dựa trên một. Đầu vào và đầu ra có thể có bất kỳ định dạng hợp lý nào và khoảng trắng được cho phép.

Các trường hợp thử nghiệm (dựa trên 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

Câu trả lời:


7

MATL , 18 17 16 byte

7Bi:"2:4PB@EX!Y*

Đầu vào là 0 dựa trên.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Cho một vectơ hàng [a b c], vectơ tiếp theo thu được sau ma trận nhân với nó

[1 0 0;
 0 1 1;
 0 1 0]

hoặc là

[0 1 0;
 1 1 0;
 0 0 1]

tùy thuộc vào chỉ số lặp là lẻ hay chẵn. Ví dụ, sản phẩm ma trận [1 3 2]*[0 1 0; 1 1 0; 0 0 1]cho [3 4 2]. Sau đó [3,4,2]*[1 0 0; 0 1 1; 0 1 0]cho [3 6 4], và như vậy.

Cũng lưu ý rằng ma trận thứ hai bằng 180 độ xoay đầu tiên, có thể được khai thác để lưu một vài byte.

7        % Push 7
B        % Convert to binary. Gives [1 1 1]. This is the initial level
i        % Take input n
:        % Push range [1 2 ... n]
"        % For each
  5      %   Push 5
  I:     %   Push range [1 2 3]
  -      %   Subtract, element-wise: gives [4 3 2]
  B      %   Convert to binary. This gives the matrix [1 0 0; 0 1 1; 0 1 0]
  @      %   Push current iteration index
  E      %   Multiply by 2. Gives 2 in the firt iteration, 4 in the second etc
  X!     %   Rotate matrix 90 degrees either 2 or 0 times
  Y*     %   Matrix multiply
         % End. Implicitly display

Bạn đã xem xét việc ghép các bước? Bằng cách đó, bạn có một ma trận [[0, 1, 0], [1, 1, 1], [1, 1, 0]]và các vị trí bắt đầu khác nhau khá giống nhau cho lẻ và lẻn
Peter Taylor

@PeterTaylor Cảm ơn ý kiến. Trong trường hợp này, việc thay đổi vectơ ban đầu và chia đầu vào cho 2 dường như tốn nhiều byte hơn
Luis Mendo

5

Haskell, 51 byte

f p@(a,b,c)=p:(b,a+b,c):f(b,a+b+c,a+b)
(f(1,1,1)!!)

Điều này sử dụng lập chỉ mục dựa trên 0. Ví dụ sử dụng: (f(1,1,1)!!) 10-> (28,60,41).

ftạo ra danh sách vô hạn của bộ ba bện và (f(1,1,1)!!)chọn cái thứ n. fchính nó là một đệ quy đơn giản tạo ra một danh sách các đối số của nó, theo sau là chéo chéo trái và một lệnh gọi đệ quy với chéo chéo trái và phải.


4

Ruby, 60 57 byte

->n{f=->x{x<2?1:f[x-1]+f[x-3]};[f[n-2|1],f[n],f[n-1&-2]]}

Các cấp độ dựa trên 1.

Dựa trên công thức sau:

f(-1) = 1
f(0)  = 1
f(1)  = 1
f(x)  = f(x-1) + f(x-3)

braid(x) = {
    [f(x-1), f(x), f(x-2)]  if x is even,
    [f(x-2), f(x), f(x-1)]  if x is odd
}

Cảm ơn Neil vì đã giảm 3 byte với một số shenanigans tiện lợi.


1
Toán tử bit FTW : [f[n-2|1],f[n],f[n-1&-2]].
Neil

@Neil Điều đó khá gọn gàng, cảm ơn!
Doorknob


3

Thạch , 14 byte

Ḋ+\;Ḣ
6BÇ⁸¡Ṛ⁸¡

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

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

6BÇ⁸¡Ṛ⁸¡  Main link. Argument: n (integer)

6B        Convert 6 to binary, yielding [1, 1, 0], which is the braid at index 0.
  Ç⁸¡     Call the helper link n times.
     Ṛ⁸¡  Reverse the resulting array n times.


Ḋ+\;Ḣ     Helper link. Argument: [a, b, c] (integer array)

Ḋ         Dequeue, yielding [b, c].
 +\       Cumulative sum, yielding [b, b+c].
   ;Ḣ     Concatenate with the head of [a, b, c], yielding [b, b+c, a].

2

TI-Basic, 58 byte

Một dựa trên.

Prompt N
{1,1,1
For(I,1,Ans
If fPart(I/2
Then
{Ans(2),Ans(1)+Ans(2),Ans(3
Else
{Ans(1),Ans(2)+Ans(3),Ans(2
End
End

58 byte này như thế nào? Tôi đếm 114 .. tôi có thiếu thứ gì không?
briantist

Các lệnh @briantist TI-Basic dài một hoặc hai byte. ví dụ: Promptlệnh 2 byte.
JungHwan Min

@JungHwanMin tuyệt, không nhận ra. Tôi có cảm giác có thứ gì đó tôi không nhìn thấy. Tôi sẽ để lại bình luận của tôi cho những người không quen thuộc.
briantist

2
Để xem mã thông báo nào là một hoặc hai byte, bạn có thể kiểm tra tibasicdev.wikidot.com/tokens
Timtech

@JungHwanMin Prompt chỉ là một byte. Nhưng cảm ơn vì đã giải thích khái niệm về mã thông báo :)
Timtech

2

PowerShell 2+, 75 byte

Chỉ số dựa trên 1

$a=1,1,0;1..$args[0]|%{$d=(0,2)[$_%2];$a[1],$a[$d]=($a[1]+$a[$d]),$a[1]};$a

Hãy thử trực tuyến! hoặc Thử tất cả các trường hợp thử nghiệm!

Vòng lặp luôn chạy một lần vì vậy đối với trường hợp cấp độ bện, 1tôi chỉ cần bắt đầu với một mảng 1,1,0vì vậy kết quả của thuật toán tạo ra nó 1,1,1.

$a[1]luôn luôn là giữa, sau đó tôi chỉ xác định xem chỉ số phần tử khác ( $d) sẽ là 0hay 2dựa trên mức hiện tại là chẵn hay lẻ. PowerShell hỗ trợ nhiều bài tập cùng một lúc để việc hoán đổi trở nên dễ dàng như $x,$y=$y,$xvề cơ bản là những gì tôi đang làm với các phần tử mảng, chỉ cần nhúng phần bổ sung trong phần gán đó.


2

Javascript (ES6), 55 byte

x=>(f=y=>y<2?1:f(y-1)+f(y-3),[f(x-2|1),f(x),f(x-1&-2)])

thay thế

1 dựa

Đây chỉ là một cổng của câu trả lời Ruby của @ Doorknob với môn đánh gôn bitwise tuyệt vời của @ Neil.


1

Befunge, 64 byte

110p100p1&v
01:\_v#:-1<\p00<v\+g
..g.@>_10g
\1-:!#^_\:00g+\v>10p

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

Giải trình

110p                Initialise a to 1 (at location 1;0).  
    100p            Initialise c to 1 (at location 0;0).
        1           Initialise b to 1 (on the stack, since it'll be most frequently used).
         &v         Read n from stdin and turn down.

          <         The main loop starts here, executing right to left.
        -1          Decrement n.
    _v#:            Duplicate and check if zero; if not, continue left.
   \                Swap b to the top of the stack, leaving n below it.
01:            g    Make a duplicate copy, and read a from memory (at location 1;0). 
              +     Add a to b, the result becoming the new b.
            v\      Swap the original b to the top of the stack and turn down.
            >10p    Turn around and save the original b as a (at location 1;0).
\1-                 Swap n back to the top of the stack and decrement.
   :!#^_            Duplicate and check if zero; if not continue right.
        \           Swap b to the top of the stack, leaving n below it.
         :00g       Make a duplicate copy, and read c from memory (at location 0;0).
             +      Add c to b, the result becoming the new b.
              \v    Swap the original b to the top of the stack and turn down.
            p00<    Turn around and save the original b as c (at location 0;0).
           \        Swap n back to the top of the stack.
          <         And repeat the loop from the beginning.

      >             If either of the zero tests succeed, we end up on line 3 going right.
       _            This just drops the n that is now zero, and continues to the right.
        10g         Read the final value of a (at location 1;0).
..                  Output a along with the b that was already on the stack.
  g                 Read the final value of c (the 0;0 location is implied).
   .@               Output c and exit.


1

Java 8, 121

Điều này sử dụng các cấp độ dựa trên một:

(int l)->{int a=1,b=a,c=a,i=a;while(i<l)if(i++%2>0){b^=a;a^=b;b=(a^b)+a;}else{b^=c;c^=b;b=(c^b)+c;}return a+","+b+","+c;}

Ungolfed, với chương trình thử nghiệm:

import java.util.function.IntFunction;

public class GolfANumericalGrowingBraid {

  public static void main(String[] args) {
    for (int level : new int[] { 1, 2, 5, 10 }) {
      output((int l) -> {
        int a = 1, b = a, c = a, i = a;
        while (i < l) {
          if (i++ % 2 > 0) {
            b ^= a;
            a ^= b;
            b = (a ^ b) + a;
          }
          else {
            b ^= c;
            c ^= b;
            b = (c ^ b) + c;
          }
        }
        return a + "," + b + "," + c;
      } , level);
    }
  }

  private static void output(IntFunction<String> function, int level) {
    System.out.println(function.apply(level));
  }
}

Đầu ra:

1,1,1
1,2,1
3,6,4
28,41,19


0

Ngôn ngữ GameMaker, 113 byte

Một chỉ mục, dựa trên giải pháp đệ quy của Doorknob. Xin đừng hỏi tại sao bạn không thể khởi tạo một mảng nguyên thủy cùng một lúc trong GameMaker, tôi thực sự không biết ...

Chương trình chính (69 byte):

a=argument0 if a mod 2c=1b[0]=a(a-c-1)b[1]=a(a)b[2]=a(a+c-2)return b

Chương trình con a(46 byte):

a=argument0 if a<2return 1return a(a-1)+a(a-3)

0

Perl 6 , 60 byte

{(1 xx 3,->[\a,\b,\c]{$++%2??(a,b+c,b)!!(b,b+a,c)}...*)[$_]}

Không dựa trên.

Thẳng tiến tạo ra chuỗi vô hạn lười biếng, và sau đó lập chỉ mục nó.
Có khả năng tiếp cận tốt hơn.


0

Clojure, 98 byte

#(ffirst(drop %(iterate(fn[[v[a b c d]]][[(v a)(+(v b)(v c))(v d)][b a d c]])[[1 1 0][0 1 2 1]])))

Theo dõi giá trị hiện tại vvà từ đó vị trí tổng kết nên được thực hiện cho vòng tiếp theo. Bắt đầu một trạng thái trước khi [1 1 1]lập chỉ mục dựa trên 1.


0

C # 88 86 byte

f(int n,int a=1,int b=1,int c=1)=>n>1?n--%2>0?f(n,b,a+b,c):f(n,a,b+c,b):a+","+b+","+c;

Giải trình

f(int n,int a=1,int b=1,int c=1)=>  //Using an expression bodied function to allow for defaults and remove return statement
    n>1?                            //recurse or return result
        n--%2>0?                    //get odd or even then decrement n
            f(n,b,a+b,c)            //odd recursion
           :f(n,a,b+c,b)            //even recursion
       :a+","+b+","+c;              //build output

0

Toán học, 68 byte

If[#<3,{1,#,1},{{#,+##2,#2}&,{#2,#+#2,#3}&}[[Mod[#,2,1]]]@@#0[#-1]]&

Định nghĩa đệ quy đơn giản của một hàm không tên, lấy một đối số nguyên dương và trả về một danh sách có thứ tự gồm ba số nguyên.

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.