Golf ein Zopf mit numerischem Wachstum


23

Beschreibung des Geflechts

Wenn eine Litze in diesem Geflecht die Oberseite einer anderen Litze überquert, addiert sie den Wert der anderen Litze zu sich selbst, und alle anderen Litzenwerte werden durchlaufen. Das Geflecht besteht aus drei Litzen und jede Litze beginnt bei 1. Die erste Überkreuzung ist die am weitesten links liegende Litze, die die mittlere Litze überkreuzt. Die nächste Überkreuzung ist der am weitesten rechts liegende Strang, der den neuen Mittelstrang überkreuzt (zuvor der am weitesten links liegende Strang). Diese beiden Schritte der Überkreuzung wiederholen sich. Mit anderen Worten ist die erste Überkreuzung [a, b, c] -> [b, a+b, c]und die zweite ist [a, b, c] -> [a, b+c, b]. Nach diesen Regeln sind hier die ersten sechs Ebenen des Geflechts:

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

Deine Aufgabe

Schreiben Sie ein Golf-Programm oder eine Golf-Funktion, die eine Ganzzahl als Flechtstufe akzeptiert und die drei Werte für diese Flechtstufe ausgibt. Sie müssen angeben, ob Ihre Level auf Null oder Eins basieren. Die Ein- und Ausgabe kann in jedem vernünftigen Format erfolgen, und nachfolgende Leerzeichen sind zulässig.

Testfälle (1-basiert)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

Antworten:


7

MATL , 18 17 16 Bytes

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

Die Eingabe ist 0-basiert.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Wenn ein Zeilenvektor gegeben ist [a b c], wird der nächste Vektor erhalten, indem er mit einer der beiden multipliziert wird

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

oder

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

abhängig davon, ob der Iterationsindex ungerade oder gerade ist. Zum Beispiel kann das Matrixprodukt [1 3 2]*[0 1 0; 1 1 0; 0 0 1]gibt [3 4 2]. Dann [3,4,2]*[1 0 0; 0 1 1; 0 1 0]gibt [3 6 4]und so weiter.

Beachten Sie auch, dass die zweite Matrix der ersten um 180 Grad gedrehten Matrix entspricht, wodurch einige Bytes eingespart werden können.

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

Haben Sie darüber nachgedacht, die Schritte zu koppeln? Auf diese Weise haben Sie eine Matrix [[0, 1, 0], [1, 1, 1], [1, 1, 0]]und die verschiedenen Startpositionen sind für gerade und ungerade ziemlich ähnlichn
Peter Taylor

@ PeterTaylor Danke für die Idee. In diesem Fall scheint es teurer zu sein, den Anfangsvektor zu variieren und die Eingabe durch 2 zu teilen
Luis Mendo

5

Haskell, 51 Bytes

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

Dies verwendet eine 0-basierte Indizierung. Anwendungsbeispiel: (f(1,1,1)!!) 10-> (28,60,41).

ferstellt die unendliche Liste der dreifachen Geflechte und (f(1,1,1)!!)wählt die n-te aus. fselbst ist eine einfache Rekursion, die eine Liste ihrer Argumente erstellt, gefolgt von der linken Überkreuzung und einem rekursiven Aufruf mit linker und rechter Überkreuzung.


4

Ruby, 60 57 Bytes

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

Die Levels sind 1-basiert.

Basierend auf der folgenden Formel:

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
}

Vielen Dank an Neil für 3 Bytes mit einigen raffinierten bitweisen Spielereien.


1
Bitoperatoren FTW: [f[n-2|1],f[n],f[n-1&-2]].
Neil

@Neil Das ist ziemlich ordentlich, danke!
Türklinke


3

Jelly , 14 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Wie ist das 58 Bytes? Ich zähle 114. Vermisse ich etwas?
Briantist

@briantist TI-Basic-Befehle sind ein oder zwei Bytes lang. zB Promptist ein 2-Byte-Befehl.
JungHwan Min

@JungHwanMin cool, habe nicht realisiert. Ich hatte das Gefühl, dass es etwas gab, das ich nicht sah. Ich werde meinen Kommentar für andere, die nicht vertraut sind, hinterlassen.
Briantist

2
Um zu sehen, welche Token ein oder zwei Bytes sind, können Sie tibasicdev.wikidot.com/tokens
Timtech

@JungHwanMin Prompt ist nur ein Byte. Aber danke für die Erklärung des
Tokenkonzepts

2

PowerShell 2+, 75 Byte

1-basierter Index

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

Probieren Sie es online! oder Probieren Sie alle Testfälle aus!

Die Schleife läuft immer einmal ab, für den Fall der Flechtstufe 1beginne ich also einfach mit einem Array von 1,1,0so dem Ergebnis des Algorithmus mit make it 1,1,1.

$a[1]Ist immer die Mitte, dann bestimme ich einfach, ob der andere Elementindex ( $d) gerade oder ungerade sein soll 0oder 2ob der aktuelle Wert gerade oder ungerade ist. PowerShell unterstützt mehrere Zuweisungen gleichzeitig, so dass das Austauschen so einfach $x,$y=$y,$xwird, wie ich es im Grunde mit den Array-Elementen tue. Der Zusatz wird einfach in diese Zuweisung eingebettet.


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

1-basiert

Dies ist nur eine Portierung von @ Doorknobs Ruby-Antwort mit @ Neils fantastischem bitweisen Golf.


1

Befunge, 64 Bytes

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

Probieren Sie es online!

Erläuterung

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

Dies verwendet einseitige Ebenen:

(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, mit Testprogramm:

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

Ausgabe:

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


0

GameMaker-Sprache, 113 Byte

Einindexiert, basierend auf der rekursiven Lösung von Doorknob. Bitte frage nicht, warum du ein primitives Array nicht auf einmal in GameMaker initialisieren kannst, ich weiß es wirklich nicht ...

Hauptprogramm (69 Bytes):

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

Unterprogramm a(46 Bytes):

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

0

Perl 6 , 60 Bytes

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

Nullbasiert.

Generierte direkt die Lazy Infinite-Sequenz und indizierte sie anschließend.
Es gibt wahrscheinlich bessere Ansätze.


0

Clojure, 98 Bytes

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

Verfolgt den aktuellen Wert vund von welchen Positionen aus die Summierung für die nächste Runde erfolgen soll. Startet einen Zustand vor dem, [1 1 1]um eine 1-basierte Indizierung zu erhalten.


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;

Erläuterung

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 Bytes

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

Einfache rekursive Definition einer unbenannten Funktion, die ein positives Ganzzahlargument verwendet und eine geordnete Liste mit drei Ganzzahlen zurückgibt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.