Golf una treccia a crescita numerica


23

Descrizione della treccia

In questa treccia, quando un filo attraversa la parte superiore di un altro filo, aggiunge il valore dell'altro filo a se stesso e tutti gli altri valori del filo passano attraverso. La treccia ha tre fili e ogni filo inizia da 1. Il primo crossover è il filo più a sinistra che attraversa il filo medio. Il crossover successivo è il filo più a destra che attraversa il nuovo filo medio (precedentemente il filo più a sinistra). Si ripetono questi due passaggi di crossover. In altre parole, il primo crossover è [a, b, c] -> [b, a+b, c]e il secondo è [a, b, c] -> [a, b+c, b]. Usando queste regole qui ci sono i primi sei livelli della treccia:

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

Il tuo compito

Scrivi un programma o una funzione golfizzata che accetta un numero intero come livello di treccia e genera i tre valori per quel livello di treccia. Devi indicare se i tuoi livelli sono zero o basati su uno. L'input e l'output possono avere qualsiasi formato ragionevole e sono consentiti spazi vuoti finali.

Casi di test (basati su 1)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

Risposte:


7

MATL , 18 17 16 byte

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

L'input è basato su 0.

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Dato un vettore di riga [a b c], il vettore successivo si ottiene dopo la matrice moltiplicandolo per entrambi

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

o

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

a seconda che l'indice di iterazione sia pari o dispari. Ad esempio, il prodotto matrice [1 3 2]*[0 1 0; 1 1 0; 0 0 1][3 4 2]. Quindi [3,4,2]*[1 0 0; 0 1 1; 0 1 0][3 6 4], e così via.

Si noti inoltre che la seconda matrice è uguale alla prima ruotata di 180 gradi, che può essere sfruttata per salvare alcuni 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

Hai preso in considerazione l'associazione dei passaggi? In questo modo hai una matrice [[0, 1, 0], [1, 1, 1], [1, 1, 0]]e le diverse posizioni di partenza sono abbastanza simili per pari e disparin
Peter Taylor,

@PeterTaylor Grazie per l'idea. In questo caso, variare il vettore iniziale e dividere l'ingresso per 2 sembra essere più costoso in byte
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)!!)

Questo utilizza l'indicizzazione basata su 0. Esempio di utilizzo: (f(1,1,1)!!) 10-> (28,60,41).

fcrea la lista infinita di triple treccia e (f(1,1,1)!!)sceglie l'ennesima. fdi per sé è una semplice ricorsione che fa un elenco dei suoi argomenti, seguito dal crossover sinistro e da una chiamata ricorsiva con crossover sinistro e destro.


4

Rubino, 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]]}

I livelli sono basati su 1.

Basato sulla seguente formula:

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
}

Grazie a Neil per 3 byte di sconto con alcuni shenanigans bit a bit.


1
Operatori bit per bit FTW [f[n-2|1],f[n],f[n-1&-2]].
Neil,

@Neil È abbastanza pulito, grazie!
Maniglia della porta


3

Gelatina , 14 byte

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

Provalo online!

Come funziona

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 byte

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

Come sono questi 58 byte? Conto 114 .. mi sto perdendo qualcosa?
Briantist

I comandi @briantist TI-Basic sono lunghi uno o due byte. ad es. Promptè un comando a 2 byte.
JungHwan Min

@JungHwanMin cool, non me ne sono reso conto. Ho avuto la sensazione che ci fosse qualcosa che non stavo vedendo. Lascerò il mio commento per gli altri che non hanno familiarità.
Briantist,

2
Per vedere quali token sono uno o due byte, puoi controllare tibasicdev.wikidot.com/tokens
Timtech

@JungHwanMin Prompt è solo un byte. Ma grazie per aver spiegato il concetto di token :)
Timtech,

2

PowerShell 2+, 75 byte

1 indice basato

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

Provalo online! oppure prova tutti i casi di test!

Il ciclo funziona sempre una volta, quindi per il caso del livello di treccia 1ho semplicemente iniziare con un array di 1,1,0così il risultato dell'algoritmo con farlo 1,1,1.

$a[1]è sempre al centro, quindi determino solo se l'altro elemento index ( $d) sarà 0o in 2base al livello attuale è pari o dispari. PowerShell supporta più assegnazioni contemporaneamente, quindi lo scambio diventa facile come $x,$y=$y,$xquello che sto facendo con gli elementi dell'array, semplicemente incorporando l'aggiunta all'interno di tale assegnazione.


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-based

Questa è solo una porta della risposta Ruby di @ Doorknob con il fantastico golf bit a bit di @ Neil.


1

Befunge, 64 byte

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

Provalo online!

Spiegazione

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

Questo utilizza livelli a una base:

(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, con programma di 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));
  }
}

Produzione:

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


0

Lingua GameMaker, 113 byte

One-indexed, basato sulla soluzione ricorsiva di Doorknob. Per favore, non chiederti perché non puoi inizializzare un array primitivo tutto in una volta in GameMaker, davvero non lo so ...

Programma principale (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

Sottoprogramma a(46 byte):

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

0

Perl 6 , 60 byte

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

Zero-based.

Ha generato in modo diretto la sequenza infinita pigra e quindi la indicizza.
Probabilmente ci sono approcci migliori.


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

Tiene traccia del valore corrente ve da quali posizioni dovrebbe essere fatta la somma per il prossimo round. Avvia uno stato prima [1 1 1]dell'indicizzazione basata su 1.


0

C # 88 86 byte

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;

Spiegazione

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 byte

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

Definizione ricorsiva semplice di una funzione senza nome, prendendo un argomento intero positivo e restituendo un elenco ordinato di tre numeri interi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.