Golf une tresse numérique croissante

23

Description de la tresse

Dans cette tresse, lorsqu'un brin traverse le haut d'un autre brin, il ajoute la valeur de l'autre brin à lui-même et toutes les autres valeurs de brin passent à travers. La tresse a trois brins et chaque brin commence à 1. Le premier croisement est le brin le plus à gauche traversant le brin du milieu. Le croisement suivant est le brin le plus à droite traversant le nouveau brin du milieu (auparavant le brin le plus à gauche). Ces deux étapes de croisements se répètent. En d'autres termes, le premier croisement est [a, b, c] -> [b, a+b, c]et le second l'est [a, b, c] -> [a, b+c, b]. En utilisant ces règles, voici les six premiers niveaux de la tresse:

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

Ta tâche

Écrivez un programme ou une fonction golfée qui accepte un entier comme niveau de tresse et génère les trois valeurs pour ce niveau de tresse. Vous devez indiquer si vos niveaux sont à zéro ou à base unique. L'entrée et la sortie peuvent avoir n'importe quel format raisonnable et un espace blanc de fin est autorisé.

Cas de test (basés sur 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19
Robert Hickman
la source

Réponses:

7

MATL , 18 17 16 octets

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

L'entrée est basée sur 0.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

Étant donné un vecteur ligne [a b c], le vecteur suivant est obtenu en le multipliant post-matrice soit par

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

ou

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

selon que l'indice d'itération est impair ou pair. Par exemple, le produit matriciel [1 3 2]*[0 1 0; 1 1 0; 0 0 1]donne [3 4 2]. [3,4,2]*[1 0 0; 0 1 1; 0 1 0]Donne ensuite [3 6 4], et ainsi de suite.

Notez également que la deuxième matrice est égale à la première rotation de 180 degrés, qui peut être exploitée pour économiser quelques octets.

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
la source
Avez-vous envisagé d'associer les étapes? De cette façon, vous avez une matrice [[0, 1, 0], [1, 1, 1], [1, 1, 0]]et les différentes positions de départ sont assez similaires pour les paires et impairesn
Peter Taylor
@PeterTaylor Merci pour l'idée. Dans ce cas, faire varier le vecteur initial et diviser l'entrée par 2 semble être plus coûteux en octets
Luis Mendo
5

Haskell, 51 octets

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

Cela utilise une indexation basée sur 0. Exemple d'utilisation: (f(1,1,1)!!) 10-> (28,60,41).

fcrée la liste infinie de triplets de tresses et (f(1,1,1)!!)sélectionne le nième. flui-même est une simple récursion qui fait une liste de son argument, suivi du croisement gauche et d'un appel récursif avec croisement gauche et droit.

nimi
la source
4

Rubis, 60 57 octets

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

Les niveaux sont basés sur 1.

Basé sur la formule suivante:

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
}

Merci à Neil pour 3 octets de moins avec quelques astucieux manigances au niveau du bit.

Poignée de porte
la source
1
FTW: opérateurs au niveau du bit [f[n-2|1],f[n],f[n-1&-2]].
Neil
@Neil C'est plutôt bien, merci!
Poignée de porte
3

Gelée , 14 octets

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

Essayez-le en ligne!

Comment ça marche

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
la source
2

TI-Basic, 58 octets

Sur une base.

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
la source
Comment sont ces 58 octets? Je compte 114 .. ai-je raté quelque chose?
briantist
Les commandes @briantist TI-Basic font un ou deux octets. par exemple, Promptest une commande de 2 octets.
JungHwan Min
@JungHwanMin cool, ne se rendait pas compte. J'avais le sentiment qu'il y avait quelque chose que je ne voyais pas. Je laisserai mon commentaire à ceux qui ne sont pas familiers.
briantist
2
Pour voir quels jetons font un ou deux octets, vous pouvez consulter tibasicdev.wikidot.com/tokens
Timtech
@JungHwanMin Prompt n'est qu'un octet. Mais merci d'avoir expliqué le concept des tokens :)
Timtech
2

PowerShell 2+, 75 octets

Index basé sur 1

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

Essayez-le en ligne! ou essayez tous les cas de test!

La boucle s'exécute toujours une fois, donc pour le cas du niveau de tresse, 1je commence simplement par un tableau de 1,1,0sorte que le résultat de l'algorithme avec make it 1,1,1.

$a[1]est toujours le milieu, alors je détermine simplement si l'autre élément index ( $d) va être 0ou 2basé sur si le niveau actuel est pair ou impair. PowerShell prend en charge plusieurs affectations à la fois, donc l'échange devient aussi simple que $x,$y=$y,$xce que je fais essentiellement avec les éléments du tableau, en incorporant simplement l'ajout dans cette affectation.

briantiste
la source
2

Javascript (ES6), 55 octets

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 base

Ceci est juste un portage de la réponse Ruby de @ Doorknob avec le golf au niveau du bit impressionnant de @ Neil.

Robert Hickman
la source
1

Befunge, 64 octets

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

Essayez-le en ligne!

Explication

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
la source
1

Java 8, 121

Cela utilise des niveaux à base unique:

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

Non golfé, avec programme de test:

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

Sortie:

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


la source
0

Langue GameMaker, 113 octets

Un index, basé sur la solution récursive de Doorknob. S'il vous plaît, ne demandez pas pourquoi vous ne pouvez pas initialiser un tableau primitif à la fois dans GameMaker, je ne sais vraiment pas ...

Programme principal (69 octets):

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

Sous-programme a(46 octets):

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

Perl 6 , 60 octets

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

Base zéro.

Généré directement la séquence infinie paresseuse, puis l'indexant.
Il existe probablement de meilleures approches.

smls
la source
0

Clojure, 98 octets

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

Garde une trace de la valeur actuelle vet à partir de quelles positions la somme doit être faite pour le prochain tour. Démarre un état avant le [1 1 1]pour avoir une indexation basée sur 1.

NikoNyrh
la source
0

C # 88 86 octets

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;

Explication

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 - Rétablir Monica
la source
0

Mathematica, 68 octets

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

Définition récursive simple d'une fonction sans nom, prenant un argument entier positif et renvoyant une liste ordonnée de trois entiers.

Greg Martin
la source