Golf uma trança crescente numérica

23

Descrição da trança

Nesta trança, quando um fio passa por cima de outro fio, ele adiciona o valor do outro fio a si próprio e todos os outros valores de fio passam. A trança tem três fios e cada fio começa em 1. O primeiro cruzamento é o fio mais à esquerda que cruza o fio médio. O próximo cruzamento é o fio mais à direita que cruza o novo fio do meio (anteriormente o fio mais à esquerda). Esses dois passos dos crossovers se repetem. Em outras palavras, o primeiro cruzamento é [a, b, c] -> [b, a+b, c]e o segundo é [a, b, c] -> [a, b+c, b]. Usando essas regras aqui estão os seis primeiros níveis da trança:

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

Sua tarefa

Escreva um programa ou função golfed que aceite um número inteiro como o nível da trança e produza os três valores para esse nível da trança. Você deve indicar se seus níveis são baseados em zero ou um. A entrada e a saída podem vir em qualquer formato razoável e o espaço em branco à direita é permitido.

Casos de teste (com base em 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19
Robert Hickman
fonte

Respostas:

7

MATL , 18 17 16 bytes

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

A entrada é baseada em 0.

Experimente online! Ou verifique todos os casos de teste .

Explicação

Dado um vetor de linha [a b c], o próximo vetor é obtido após a multiplicação da matriz por

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

ou

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

dependendo se o índice de iteração é ímpar ou par. Por exemplo, o produto da matriz [1 3 2]*[0 1 0; 1 1 0; 0 0 1]fornece [3 4 2]. Então [3,4,2]*[1 0 0; 0 1 1; 0 1 0][3 6 4], e assim por diante.

Observe também que a segunda matriz é igual à primeira rotação de 180 graus, que pode ser explorada para salvar alguns bytes.

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
fonte
Você já pensou em emparelhar as etapas? Dessa forma, você tem uma matriz [[0, 1, 0], [1, 1, 1], [1, 1, 0]]e as diferentes posições iniciais são bastante semelhantes para pares e ímparesn
Peter Taylor
@ PeterTaylor Obrigado pela ideia. Neste caso, variando o vector inicial e dividindo a entrada por 2 parece ser mais caro byte
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)!!)

Isso usa indexação baseada em 0. Exemplo de uso: (f(1,1,1)!!) 10-> (28,60,41).

fcria a lista infinita de triplos trançados e (f(1,1,1)!!)escolhe o enésimo. fem si é uma recursão simples que faz uma lista de seus argumentos, seguida pelo cruzamento à esquerda e uma chamada recursiva com o cruzamento à esquerda e à direita.

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

Os níveis são baseados em 1.

Com base na seguinte fórmula:

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
}

Agradeço a Neil por 3 bytes de folga com algumas travessuras bacanas.

Maçaneta da porta
fonte
1
Operadores bit a bit FTW: [f[n-2|1],f[n],f[n-1&-2]].
Neil
@ Neil Isso é muito legal, obrigado!
Maçaneta
4

Python 2 , 57 bytes

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

Experimente online!

Dennis
fonte
3

Gelatina , 14 bytes

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

Experimente online!

Como funciona

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
fonte
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
Timtech
fonte
Como são esses 58 bytes? Eu conto 114 .. estou faltando alguma coisa?
Briantist
Os comandos do @briantist TI-Basic têm um ou dois bytes. por exemplo, Prompté um comando de 2 bytes.
JungHwan Min
@JungHwanMin legal, não percebi. Tive a sensação de que havia algo que não estava vendo. Vou deixar meu comentário para outras pessoas que não estão familiarizadas.
Briantist
2
Para ver quais tokens têm um ou dois bytes, verifique tibasicdev.wikidot.com/tokens
Timtech
@JungHwanMin Prompt é apenas um byte. Mas obrigado por explicar o conceito de tokens :)
Timtech
2

PowerShell 2 ou mais, 75 bytes

Índice baseado em 1

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

Experimente online! ou Experimente todos os casos de teste!

O loop sempre é executado uma vez, então, no caso do nível de trança, 1eu simplesmente começo com uma matriz de, 1,1,0portanto, o resultado do algoritmo com make 1,1,1.

$a[1]é sempre o meio, então apenas determino se o outro elemento index ( $d) será 0ou com 2base em se o nível atual é par ou ímpar. O PowerShell suporta várias atribuições de uma só vez, para que a troca se torne tão fácil quanto $x,$y=$y,$xé basicamente o que estou fazendo com os elementos da matriz, apenas incorporando a adição nessa atribuição.

briantist
fonte
2

Javascript (ES6), 55 bytes

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

repl.it

Baseado em 1

Esta é apenas uma parte da resposta Ruby da @ Maçaneta da porta com o impressionante golfe bit a bit da @ Neil.

Robert Hickman
fonte
1

Befunge, 64 bytes

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

Experimente online!

Explicação

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
fonte
1

Java 8, 121

Isso usa níveis baseados em um:

(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, com programa de teste:

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

Saída:

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


fonte
0

Idioma do GameMaker, 113 bytes

Um indexado, com base na solução recursiva da Maçaneta da porta. Por favor, não pergunte por que você não pode inicializar uma matriz primitiva de uma só vez no GameMaker, eu realmente não sei ...

Programa principal (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

Subprograma a(46 bytes):

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

Perl 6 , 60 bytes

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

Baseado em zero.

Diretamente gerou a sequência infinita preguiçosa e depois a indexa.
Provavelmente existem abordagens melhores.

smls
fonte
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]])))

Mantém o controle do valor atual ve de quais posições o somatório deve ser feito para a próxima rodada. Inicia um estado antes da [1 1 1]indexação baseada em 1.

NikoNyrh
fonte
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;

Explicação

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 - Restabelecer Monica
fonte
0

Mathematica, 68 bytes

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

Definição recursiva direta de uma função sem nome, usando um argumento inteiro positivo e retornando uma lista ordenada de três números inteiros.

Greg Martin
fonte