Sayısal Büyüyen Örgü Golf


23

Örgü açıklaması

Bu örgüde, bir iplikçik diğer iplikçiklerin üstünden geçtiğinde diğer iplikçiklerin değerini kendine ekler ve diğer tüm iplikçiklik değerlerinin içinden geçer. Örgü üç tele sahiptir ve her tel 1'de başlar. İlk geçit, orta telin üzerinden geçen en sol teldir. Bir sonraki çaprazlama, yeni orta iplikçikten (en önce en soldaki iplikçikten) en sağdaki iplikçiktir. Geçitlerin bu iki adımı tekrar eder. Başka bir deyişle, ilk geçit [a, b, c] -> [b, a+b, c]ve ikincisi [a, b, c] -> [a, b+c, b]. Buradaki kuralları kullanarak örgütün ilk altı seviyesi:

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

Senin görevin

Örgü seviyesi olarak bir tamsayıyı kabul eden ve örgütün bu seviyesi için üç değeri veren bir golf programı veya işlevi yazın. Seviyelerinizin sıfır mı yoksa bir tabanlı mı olduğunu belirtmelisiniz. Giriş ve çıkış herhangi bir makul formatta gelebilir ve izleyen beyaz boşluğa izin verilir.

Test Durumları (1 tabanlı)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

Yanıtlar:


7

MATL , 18 17 16 bayt

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

Giriş 0 tabanlıdır.

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Bir satır vektörü göz önüne alındığında, bir [a b c]sonraki vektör matris sonrası elde edilir ya da bunu çarparak ya

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

veya

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

yineleme endeksinin tek veya çift olmasına bağlı olarak. Örneğin, matris ürünü [1 3 2]*[0 1 0; 1 1 0; 0 0 1]verir [3 4 2]. Sonra [3,4,2]*[1 0 0; 0 1 1; 0 1 0]verir [3 6 4], vb.

Ayrıca, ikinci matrisin bir kaç bayt tasarruf etmek için kullanılabilecek ilk döndürülmüş 180 dereceye eşit olduğuna dikkat edin.

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

Adımları eşleştirmeyi düşündünüz mü? Bu şekilde bir matrisiniz var [[0, 1, 0], [1, 1, 1], [1, 1, 0]]ve farklı başlangıç ​​pozisyonları eşit ve garip olanlar için oldukça benzern
Peter Taylor

@PeterTaylor Fikir için teşekkürler. Bu durumda, ilk vektörü değiştirme ve girişi 2'ye bölme daha bayt-maliyet gibi görünüyor
Luis Mendo

5

Haskell, 51 bayt

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

Bu 0 tabanlı indeksleme kullanır. Kullanım örneği: (f(1,1,1)!!) 10-> (28,60,41).

fsonsuz örgü üçlü listesini oluşturur ve (f(1,1,1)!!)nt olanı seçer. fkendisi, argümanlarının bir listesini yapan basit bir özyinelemenin ardından sol çapraz geçişi ve sol ve sağ çapraz geçişi olan özyinelemeli bir çağrıdır.


4

Ruby, 60 57 bayt

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

Seviyeler 1 tabanlıdır.

Aşağıdaki formüle göre:

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
}

Neil'e 3 bit bayt için teşekkürler .


1
Bit operatörleri FTW: [f[n-2|1],f[n],f[n-1&-2]].
Neil

@Neil Çok temiz, teşekkürler!
Doorknob


3

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

Tek merkezli.

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

Bu 58 bayt nasıl? 114 sayıyorum .. bir şey mi kaçırıyorum?
briantist

@briantist TI-Basic komutları bir veya iki bayt uzunluğundadır. örneğin Prompt2 baytlık bir komuttur.
JungHwan Min

@JungHwanMin cool, fark etmedi. Görmediğim bir şey olduğunu hissediyorum. Yorumumu, tanıdık olmayan başkaları için bırakacağım.
briantist

2
Hangi belirteçlerin bir veya iki bayt olduğunu görmek için, tibasicdev.wikidot.com/tokens adresini ziyaret
Timtech

@JungHwanMin Prompt sadece bir bayt. Ama belirteçlerin kavramını açıkladığın için teşekkürler :)
Timtech

2

PowerShell 2+, 75 bayt

1 tabanlı dizin

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

Çevrimiçi deneyin! veya Tüm Test Durumlarını Deneyin!

Döngü her zaman bir kez çalışır, böylelikle örgü seviyesi durumunda, 1basitçe bir dizi ile başlar, 1,1,0böylece algoritmanın sonucunu verir 1,1,1.

$a[1]her zaman orta olur, o zaman sadece diğer eleman indeksinin ( $d) olup olmayacağını 0veya 2şu andaki seviyenin çift mi yoksa tek mi olduğunu mu belirleyeceğimi belirlerim. PowerShell aynı anda birden fazla atamayı destekler, böylece takas işlemi $x,$y=$y,$xtemelde dizi elemanları ile yaptığım kadar kolay olur , sadece bu atama içerisine eklenir.


2

Javascript (ES6), 55 bayt

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 tabanlı

Bu sadece @ Doorknob'un Ruby'nin @ Neil'in harika bitsel golfü ile verdiği cevabın bir limanı.


1

Befunge, 64 bayt

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

Çevrimiçi deneyin!

açıklama

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

Bu tek tabanlı seviyeleri kullanır:

(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, test programı ile:

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

Çıktı:

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


0

GameMaker Dili, 113 bayt

Doorknob'un özyinelemeli çözümüne dayanan tek indeksli. Lütfen GameMaker'da neden bir kerede ilkel bir dizi başlatamadığınızı sormayın, gerçekten bilmiyorum ...

Ana program (69 bayt):

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

Alt program a(46 bayt):

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

0

Perl 6 , 60 bayt

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

Sıfır tabanlı.

Doğrudan ileri tembel tembel sonsuz sekansı oluşturdu ve sonra indeksler.
Muhtemelen daha iyi yaklaşımlar vardır.


0

Clojure, 98 bayt

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

Güncel değerin kaydını tutar vve bir sonraki tur için toplamın hangi konumlardan yapılması gerektiğini tutar . [1 1 1]1 tabanlı indekslemeye sahip olmadan önce bir durumu başlatır .


0

C # 88 86 Bayt

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;

açıklama

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 bayt

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

Olumsuz bir tamsayı argümanı alarak ve üç tamsayıdan oluşan bir sıralı liste döndürerek adsız bir fonksiyonun basit özyinelemeli tanımı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.