수치 적으로 성장하는 브레이드 골프


23

브레이드 설명

이 브레이드에서, 스트랜드가 다른 스트랜드의 상단을 가로 지르면 다른 스트랜드의 값을 자체에 추가하고 다른 모든 스트랜드 값이 통과합니다. 브레이드에는 3 개의 스트랜드가 있으며 각 스트랜드는 1에서 시작합니다. 첫 번째 크로스 오버는 중간 스트랜드를 가로 지르는 가장 왼쪽 스트랜드입니다. 다음 교차는 새로운 중간 가닥 (이전에는 가장 왼쪽 가닥)을 가로 지르는 가장 오른쪽 가닥입니다. 이 두 단계의 크로스 오버가 반복됩니다. 즉, 첫 번째 크로스 오버는 [a, b, c] -> [b, a+b, c]두 번째가 [a, b, c] -> [a, b+c, b]입니다. 이 규칙을 사용하면 브레이드의 처음 6 단계가 있습니다.

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

당신의 작업

정수를 브레이드 레벨로 받아들이고 브레이드 레벨에 대한 3 개의 값을 출력하는 골프 프로그램 또는 함수를 작성하십시오. 레벨이 0인지 1인지를 표시해야합니다. 입력 및 출력은 적절한 형식으로 올 수 있으며 후행 공백이 허용됩니다.

테스트 사례 (1 기반)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

답변:


7

MATL , 18 17 16 바이트

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

입력은 0을 기준으로합니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

행 벡터가 주어지면 [a b c]다음 벡터에 행렬을 곱한 후

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

또는

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

반복 인덱스가 홀수인지 짝수인지에 따라 예를 들어, 행렬 곱은을 [1 3 2]*[0 1 0; 1 1 0; 0 0 1]제공합니다 [3 4 2]. 그런 다음을 [3,4,2]*[1 0 0; 0 1 1; 0 1 0]제공합니다 [3 6 4].

두 번째 행렬은 첫 번째 회전 된 180 도와 같으며 몇 바이트를 절약하기 위해 이용할 수 있습니다.

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

단계 페어링을 고려 했습니까? 그렇게하면 하나의 매트릭스를 [[0, 1, 0], [1, 1, 1], [1, 1, 0]]가지며 다른 시작 위치는 짝수와 홀수에 대해 상당히 유사합니다n
Peter Taylor

@PeterTaylor 아이디어 주셔서 감사합니다. 이 경우 초기 벡터를 변경하고 입력을 2로 나누면 바이트 비용이 더 많이 드는 것 같습니다.
Luis Mendo

5

하스켈, 51 바이트

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

0 기반 인덱싱을 사용합니다. 사용 예 : (f(1,1,1)!!) 10-> (28,60,41).

f브레이드 트리플의 무한 목록을 생성하고 (f(1,1,1)!!)n 번째를 선택합니다. f그 자체는 간단한 재귀로, 인수의 목록을 만들고 왼쪽 크로스 오버와 왼쪽 및 오른쪽 크로스 오버를 사용한 재귀 호출이 뒤 따릅니다.


4

루비, 60 57 바이트

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

레벨은 1을 기준으로합니다.

다음 공식을 기반으로합니다.

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
}

비트 단위의 멋진 shenanigans를 사용하여 3 바이트 떨어져 Neil 에게 감사드립니다 .


1
비트 연산자 FTW : [f[n-2|1],f[n],f[n-1&-2]].
Neil

@ Neil 정말 깔끔합니다, 감사합니다!
Doorknob


3

젤리 , 14 바이트

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

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

작동 원리

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 기본, 58 바이트

하나의 기반.

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 바이트는 어떻습니까? 114를 셉니다. 뭔가 빠졌습니까?
briantist

@briantist TI-Basic 명령의 길이는 1-2 바이트입니다. 예를 들어 Prompt2 바이트 명령입니다.
JungHwan Min

@JungHwanMin 멋진, 몰랐다. 보이지 않는 것이 있다는 느낌이 들었습니다. 익숙하지 않은 다른 사람들에 대한 의견을 남길 것입니다.
briantist

2
어떤 토큰이 1-2 바이트인지 확인하려면 tibasicdev.wikidot.com/tokens
Timtech

@JungHwanMin Prompt 은 1 바이트입니다. 그러나 토큰의 개념을 설명해 주셔서 감사합니다 :)
Timtech

2

PowerShell 2 이상, 75 바이트

1 기반 인덱스

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

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 시도하십시오!

루프는 항상 한 번 실행되므로 브레이드 레벨의 경우에는 1단순히 배열로 시작 1,1,0하므로 알고리즘의 결과는 그것을 1,1,1만듭니다.

$a[1]중간은 항상 다음 그냥 다른 요소 인덱스는 (여부를 결정 $d) 될 것입니다 0또는 2현재 수준은 짝수 또는 홀수인지에 따라. PowerShell은 한 번에 여러 대의 할당을 지원하므로 $x,$y=$y,$x기본적으로 배열 요소로 수행하는 작업과 마찬가지로 쉽게 대입을 포함시킬 수 있습니다.


2

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

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

반복

1 기반

이것은 @Neil의 멋진 비트 골프로 @Doorknob의 Ruby 답변 포트입니다.


1

Befunge, 64 바이트

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

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

설명

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

자바 8, 121

이것은 하나의 레벨을 사용합니다 :

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

테스트 프로그램이있는 언 골프 드 :

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

산출:

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


0

GameMaker 언어, 113 바이트

Doorknob의 재귀 솔루션을 기반으로 한 인덱스. GameMaker에서 왜 기본 배열을 한 번에 초기화 할 수 없는지 묻지 마십시오.

메인 프로그램 (69 바이트) :

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

서브 프로그램 a(46 바이트) :

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

0

펄 6 , 60 바이트

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

제로 기반.

게으른 무한 시퀀스를 직접 생성 한 다음 색인을 생성합니다.
더 나은 접근 방식이있을 수 있습니다.


0

클로저, 98 바이트

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

현재 값을 추적 v하고 다음 라운드에 대한 요약 위치를 결정합니다. [1 1 1]1 기반 색인을 생성 하기 전에 하나의 상태를 시작합니다 .


0

C # 88 86 바이트

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;

설명

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

Mathematica, 68 바이트

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

양의 정수 인수를 사용하고 3 개의 정수로 정렬 된 목록을 반환하여 명명되지 않은 함수를 간단하게 재귀 적으로 정의합니다.

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