Golf a Numerical Growing Braid

23

Deskripsi Braid

Dalam jalinan ini, ketika sebuah untai melintas di atas untai lain, itu menambah nilai untai lain untuk dirinya sendiri dan semua nilai untai lainnya melewati. Jalinan memiliki tiga untai dan setiap untai dimulai pada 1. Crossover pertama adalah untai paling kiri yang melintasi untai tengah. Crossover berikutnya adalah untai paling kanan melintasi untai tengah baru (sebelumnya untai paling kiri). Kedua langkah crossover ini diulang. Dengan kata lain, crossover pertama adalah [a, b, c] -> [b, a+b, c]dan yang kedua adalah [a, b, c] -> [a, b+c, b]. Menggunakan aturan-aturan ini di sini adalah enam tingkat kepang pertama:

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

Tugas Anda

Tulis program atau fungsi golf yang menerima integer sebagai tingkat kepang dan output tiga nilai untuk tingkat kepang itu. Anda harus menunjukkan apakah level Anda berbasis nol atau satu. Input dan output dapat datang dalam format apa pun yang masuk akal dan ruang kosong tambahan diperbolehkan.

Kasus Uji (berbasis 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19
Robert Hickman
sumber

Jawaban:

7

MATL , 18 17 16 byte

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

Input berbasis 0.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Diberikan vektor baris [a b c], vektor berikutnya diperoleh pasca-matriks-mengalikannya dengan baik

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

atau

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

tergantung pada apakah indeks iterasi aneh atau genap. Sebagai contoh, produk matriks [1 3 2]*[0 1 0; 1 1 0; 0 0 1]memberi [3 4 2]. Kemudian [3,4,2]*[1 0 0; 0 1 1; 0 1 0]memberi [3 6 4], dan seterusnya.

Perhatikan juga bahwa matriks kedua sama dengan 180 derajat pertama yang diputar, yang dapat dieksploitasi untuk menghemat beberapa 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
Luis Mendo
sumber
Sudahkah Anda mempertimbangkan untuk memasangkan langkah-langkahnya? Dengan begitu Anda memiliki satu matriks [[0, 1, 0], [1, 1, 1], [1, 1, 0]]dan posisi awal yang berbeda cukup mirip untuk genap dan ganjiln
Peter Taylor
@PeterTaylor Terima kasih atas idenya. Dalam hal ini memvariasikan vektor awal dan membagi input dengan 2 tampaknya lebih mahal
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)!!)

Ini menggunakan pengindeksan berbasis 0. Contoh penggunaan: (f(1,1,1)!!) 10-> (28,60,41).

fmenciptakan daftar tiga kali lipat kepang yang tak terbatas dan (f(1,1,1)!!)mengambil yang ke-n. fitu sendiri adalah rekursi sederhana yang membuat daftar argumennya, diikuti oleh crossover kiri dan panggilan rekursif dengan crossover kiri dan kanan.

nimi
sumber
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]]}

Levelnya berbasis 1.

Berdasarkan rumus berikut:

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
}

Terima kasih kepada Neil untuk 3 byte off dengan beberapa shenanigans bitwise bagus.

Gagang pintu
sumber
1
Operator bitwise FTW: [f[n-2|1],f[n],f[n-1&-2]].
Neil
@ Neil Itu cukup rapi, terima kasih!
Gagang Pintu
4

Python 2 , 57 byte

f=lambda n,a=1,b=1,c=1:1/n*(c,b,a)or f(n-1,b,b+c,a)[::-1]

Cobalah online!

Dennis
sumber
3

Jelly , 14 byte

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

Cobalah online!

Bagaimana itu bekerja

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].
Dennis
sumber
2

TI-Basic, 58 byte

Berbasis satu.

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
Timtech
sumber
Bagaimana ini 58 byte? Saya menghitung 114 .. apakah saya kehilangan sesuatu?
briantis
@briantist Perintah TI-Basic panjangnya satu atau dua byte. mis. Promptadalah perintah 2-byte.
JungHwan Min
@JungHwanMin keren, tidak sadar. Saya merasa ada sesuatu yang tidak saya lihat. Saya akan meninggalkan komentar saya untuk orang lain yang tidak terbiasa.
briantist
2
Untuk melihat token mana yang satu atau dua byte, Anda dapat memeriksa tibasicdev.wikidot.com/tokens
Timtech
@JungHwanMin Prompt hanya satu byte. Tetapi terima kasih telah menjelaskan konsep token :)
Timtech
2

PowerShell 2+, 75 byte

Indeks berbasis 1

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

Cobalah online! atau Coba semua Uji Kasus!

Loop selalu berjalan sekali jadi untuk kasus tingkat kepang 1saya cukup mulai dengan array 1,1,0sehingga hasil dari algoritma dengan membuatnya 1,1,1.

$a[1]selalu di tengah, maka saya hanya menentukan apakah indeks elemen lainnya ( $d) akan menjadi 0atau 2berdasarkan pada apakah level saat ini genap atau ganjil. PowerShell mendukung banyak tugas sekaligus sehingga bertukar menjadi semudah $x,$y=$y,$xyang pada dasarnya apa yang saya lakukan dengan elemen array, hanya menyematkan penambahan dalam tugas itu.

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

repl.it

Berbasis 1

Ini hanyalah port dari jawaban Ruby @ Doorknob dengan golf bitwise @ Neil yang luar biasa.

Robert Hickman
sumber
1

Befunge, 64 byte

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

Cobalah online!

Penjelasan

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.
James Holderness
sumber
1

Java 8, 121

Ini menggunakan tingkat berbasis satu:

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

Tidak disatukan, dengan program uji:

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

Keluaran:

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


sumber
0

Bahasa GameMaker, 113 byte

Satu diindeks, berdasarkan solusi rekursif Doorknob. Tolong jangan tanya mengapa Anda tidak bisa menginisialisasi array primitif sekaligus di GameMaker, saya benar-benar tidak tahu ...

Program utama (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

Subprogram a(46 byte):

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

Perl 6 , 60 byte

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

Berbasis nol.

Terus-menerus menghasilkan urutan malas yang tak terbatas, dan kemudian mengindeksnya.
Kemungkinan ada pendekatan yang lebih baik.

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

Melacak nilai saat ini vdan dari posisi mana penjumlahan harus dilakukan untuk putaran selanjutnya. Mulai satu status sebelum [1 1 1]pengindeksan berbasis 1.

NikoNyrh
sumber
0

C # 88 86 Bytes

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;

Penjelasan

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
JustinM - Pasang kembali Monica
sumber
0

Mathematica, 68 byte

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

Definisi rekursif langsung dari fungsi yang tidak disebutkan namanya, mengambil argumen bilangan bulat positif dan mengembalikan daftar tiga bilangan bulat yang dipesan.

Greg Martin
sumber