Golf - rosnący warkocz numeryczny

23

Opis warkocza

W tym warkoczu, gdy nić przecina się nad drugą nicią, dodaje do niej wartość drugiej nici i wszystkie inne wartości nici przechodzą. Warkocz ma trzy pasma, a każdy z nich zaczyna się od 1. Pierwszy skrzyżowanie to pasmo skrajnie lewe przecinające pasmo środkowe. Kolejnym skrzyżowaniem jest pasmo skrajnie prawe przecinające nowy pas środkowy (poprzednio pasmo najbardziej lewe). Te dwa etapy zwrotnicy powtarzają się. Innymi słowy, pierwszy crossover jest, [a, b, c] -> [b, a+b, c]a drugi jest [a, b, c] -> [a, b+c, b]. Korzystając z tych reguł tutaj, jest sześć pierwszych poziomów warkocza:

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

Twoje zadanie

Napisz program w golfa lub funkcję, która przyjmuje liczbę całkowitą jako poziom plecionki i wyświetla trzy wartości dla tego poziomu plecionki. Musisz wskazać, czy Twoje poziomy są zerowe czy oparte na jednym. Dane wejściowe i wyjściowe mogą mieć dowolny rozsądny format i dozwolona jest końcowa spacja.

Przypadki testowe (oparte na 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19
Robert Hickman
źródło

Odpowiedzi:

7

MATL , 18 17 16 bajtów

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

Dane wejściowe są oparte na 0.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Biorąc pod uwagę wektor rzędu [a b c], następny wektor jest uzyskiwany po pomnożeniu go przez jedno z nich

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

lub

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

w zależności od tego, czy indeks iteracji jest nieparzysty czy parzysty. Na przykład [1 3 2]*[0 1 0; 1 1 0; 0 0 1]daje produkt matrycowy [3 4 2]. Potem [3,4,2]*[1 0 0; 0 1 1; 0 1 0]daje [3 6 4]i tak dalej.

Zauważ też, że druga matryca jest równa pierwszemu obróconemu o 180 stopni, które można wykorzystać do zaoszczędzenia kilku bajtów.

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
źródło
Czy zastanawiałeś się nad parowaniem kroków? W ten sposób masz jedną matrycę, [[0, 1, 0], [1, 1, 1], [1, 1, 0]]a różne pozycje początkowe są dość podobne dla parzystych i nieparzystychn
Peter Taylor
@PeterTaylor Dzięki za pomysł. W tym przypadku zmiana wektora początkowego i podzielenie danych wejściowych przez 2 wydaje się bardziej kosztowne bajtowo
Luis Mendo
5

Haskell, 51 bajtów

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

Korzysta z indeksowania opartego na 0. Przykład użycia: (f(1,1,1)!!) 10-> (28,60,41).

ftworzy nieskończoną listę potrójnych plecionek i (f(1,1,1)!!)wybiera n-ty. fsama w sobie jest prostą rekurencją, która tworzy listę jej argumentów, po której następuje lewy crossover i rekurencyjne wywołanie z lewym i prawym crossoverem.

nimi
źródło
4

Rubinowy, 60 57 bajtów

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

Poziomy są oparte na 1.

Oparty na następującej formule:

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
}

Dzięki Neilowi za 3 bajty mniej z kilkoma fajnymi bitowymi shenaniganami.

Klamka
źródło
1
Operatory bitowe FTW: [f[n-2|1],f[n],f[n-1&-2]].
Neil,
@Neil To całkiem miłe, dzięki!
Klamka
3

Galaretka , 14 bajtów

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

Wypróbuj online!

Jak to działa

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
źródło
2

TI-Basic, 58 bajtów

One-based.

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
źródło
Jak to jest 58 bajtów? Liczę 114 .. czy coś mi brakuje?
briantist
Komendy @ briantist TI-Basic mają długość jednego lub dwóch bajtów. np. Promptjest poleceniem 2-bajtowym.
JungHwan Min.
@JungHwanMin cool, nie zdawałem sobie sprawy. Miałem wrażenie, że czegoś nie widziałem. Zostawię swój komentarz innym, którzy są nieznani.
briantist
2
Aby sprawdzić, które tokeny mają jeden lub dwa bajty, możesz sprawdzić tibasicdev.wikidot.com/tokens
Timtech
@JungHwanMin Prompt to tylko jeden bajt. Ale dziękuję za wyjaśnienie koncepcji tokenów :)
Timtech
2

PowerShell 2+, 75 bajtów

Indeks oparty na 1

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

Wypróbuj online! lub Wypróbuj wszystkie przypadki testowe!

Pętla zawsze działa raz, więc w przypadku poziomu oplotu 1po prostu zaczynam od tablicy, 1,1,0więc wynik algorytmu z make to 1,1,1.

$a[1] jest zawsze środkiem, po prostu ustalam, czy indeks drugiego elementu ($d ) będzie, 0czy 2na podstawie tego, czy bieżący poziom jest parzysty czy nieparzysty. PowerShell obsługuje wiele przypisań jednocześnie, więc zamiana staje się tak łatwa, jak w $x,$y=$y,$xzasadzie to, co robię z elementami tablicy, po prostu osadzając dodatek w tym zadaniu.

briantist
źródło
2

JavaScript (ES6), 55 bajtów

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

repl.it

Na podstawie 1

To tylko część odpowiedzi Ruby @ Doorknob z niesamowitym bitowym golfem @ Neila.

Robert Hickman
źródło
1

Befunge, 64 bajty

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

Wypróbuj online!

Wyjaśnienie

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
źródło
1

Java 8, 121

Wykorzystuje poziomy oparte na jednym:

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

Bez golfa, z programem testowym:

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

Wydajność:

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


źródło
0

GameMaker Language, 113 bajtów

Indeksowane, oparte na rekurencyjnym rozwiązaniu Doorknob. Nie pytaj, dlaczego nie możesz zainicjować prymitywnej tablicy jednocześnie w GameMaker, naprawdę nie wiem ...

Główny program (69 bajtów):

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

Podprogram a(46 bajtów):

a=argument0 if a<2return 1return a(a-1)+a(a-3)
Timtech
źródło
0

Perl 6 , 60 bajtów

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

Zero.

Prosto wygenerowano leniwą nieskończoną sekwencję, a następnie indeksuje ją.
Prawdopodobnie istnieją lepsze podejścia.

smls
źródło
0

Clojure, 98 bajtów

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

Śledzi bieżącą wartość vi pozycje, z których należy dokonać podsumowania dla następnej rundy. Uruchamia jeden stan przed [1 1 1]indeksowaniem 1.

NikoNyrh
źródło
0

C # 88 86 bajtów

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;

Wyjaśnienie

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 - Przywróć Monikę
źródło
0

Mathematica, 68 bajtów

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

Prosta rekurencyjna definicja funkcji bez nazwy, przyjmując argument liczby całkowitej dodatniej i zwracając uporządkowaną listę trzech liczb całkowitych.

Greg Martin
źródło