กอล์ฟถักเปียตัวเลขการเติบโต


23

ถักเปียคำอธิบาย

ในการถักเปียนี้เมื่อ strand ข้ามผ่านด้านบนของ strand อื่นมันจะเพิ่มมูลค่าของ strand อื่น ๆ ให้กับตัวเองและค่าอื่น ๆ ทั้งหมดของ strand ผ่าน การถักเปียมีสามเส้นและแต่ละเส้นเริ่มต้นที่ 1 ครอสโอเวอร์แรกคือการข้ามเส้นด้านซ้ายสุดเหนือเส้นกลาง ครอสโอเวอร์ถัดไปคือการข้ามฝั่งขวาสุดข้ามเส้นกลางใหม่ (ก่อนหน้านี้คือเกลียวด้านซ้ายสุด) ครอสโอเวอร์สองขั้นตอนเหล่านี้ซ้ำ ในคำอื่น ๆ ครอสโอเวอร์แรกคือและที่สองคือ[a, b, c] -> [b, a+b, c] [a, b, c] -> [a, b+c, b]การใช้กฎเหล่านี้เป็นหกระดับแรกของการถักเปีย:

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

งานของคุณ

เขียนโปรแกรมหรือฟังก์ชั่นกอล์ฟที่รับจำนวนเต็มเป็นระดับถักเปียและส่งออกค่าสามค่าสำหรับระดับถักเปียนั้น คุณต้องระบุว่าระดับของคุณเป็นศูนย์หรือแบบอิง อินพุตและเอาต์พุตอาจมาในรูปแบบที่เหมาะสมและอนุญาตให้ใช้พื้นที่สีขาวต่อท้าย

กรณีทดสอบ (1-based)

1 -> 1,1,1

2 -> 1,2,1

5 -> 3,6,4

10 -> 28,41,19

คำตอบ:


7

MATL , 18 17 16 ไบต์

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

อินพุตเป็นแบบ 0

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

รับเวกเตอร์แถวเวกเตอร์[a b c]ถัดไปจะได้รับโพสต์เมทริกซ์คูณมันด้วย

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

หรือ

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

ขึ้นอยู่กับว่าดัชนีซ้ำเป็นคี่หรือคู่ ยกตัวอย่างเช่นผลิตภัณฑ์แมทริกซ์จะช่วยให้[1 3 2]*[0 1 0; 1 1 0; 0 0 1] [3 4 2]จากนั้น[3,4,2]*[1 0 0; 0 1 1; 0 1 0]ให้[3 6 4]และอื่น ๆ

โปรดทราบว่าเมทริกซ์ที่สองเท่ากับหมุนครั้งแรก 180 องศาซึ่งสามารถใช้ประโยชน์เพื่อบันทึกไม่กี่ไบต์

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

คุณพิจารณาการจับคู่ขั้นตอนแล้วหรือยัง ด้วยวิธีนี้คุณจะมีเมทริกซ์หนึ่งตัว[[0, 1, 0], [1, 1, 1], [1, 1, 0]]และตำแหน่งเริ่มต้นที่แตกต่างกันนั้นค่อนข้างคล้ายคลึงกันและแปลก ๆn
Peter Taylor

@ PeterTaylor ขอบคุณสำหรับความคิด ในกรณีนี้การเปลี่ยนแปลงเวกเตอร์เริ่มต้นและการหารอินพุทด้วย 2 ดูเหมือนว่าจะมีค่าใช้จ่ายมากขึ้น
Luis Mendo

5

Haskell, 51 ไบต์

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

สิ่งนี้ใช้การจัดทำดัชนีแบบ 0 ตัวอย่างการใช้งาน: ->(f(1,1,1)!!) 10(28,60,41)

fสร้างรายการที่ไม่มีที่สิ้นสุดของเปียอเนกประสงค์และ(f(1,1,1)!!)เลือกที่หนึ่ง fตัวเองคือการเรียกซ้ำแบบง่ายซึ่งทำให้รายการอาร์กิวเมนต์เป็นไปตามด้วยครอสโอเวอร์ด้านซ้ายและการเรียกซ้ำด้วยครอสโอเวอร์ซ้ายและขวา


4

Ruby, 60 57 ไบต์

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

ระดับจะขึ้นอยู่กับ 1

ขึ้นอยู่กับสูตรต่อไปนี้:

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 เป็นเวลา 3 ไบต์ด้วยความแม่นยำในระดับบิต


1
ผู้ประกอบการ Bitwise [f[n-2|1],f[n],f[n-1&-2]]FTW:
Neil

@ Neil ที่ค่อนข้างเรียบร้อยขอบคุณ!
ลูกบิดประตู


3

เยลลี่ขนาด 14 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

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 ไบต์

หนึ่งตาม

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

58 ไบต์นี้เป็นอย่างไร ฉันนับ 114 .. ฉันขาดอะไรไปหรือเปล่า
นักเทศน์

คำสั่ง @briantist TI-Basic มีความยาวหนึ่งหรือสองไบต์ เช่นPromptเป็นคำสั่ง 2 ไบต์
JungHwan Min

@JungHwanMin เจ๋งไม่รู้อะไรเลย ฉันมีความรู้สึกว่ามีบางอย่างที่ฉันไม่เห็น ฉันจะแสดงความคิดเห็นของฉันสำหรับคนอื่นที่ไม่คุ้นเคย
นักเทศน์

2
หากต้องการดูว่าโทเค็นใดมีขนาดหนึ่งหรือสองไบต์คุณสามารถตรวจสอบtibasicdev.wikidot.com/tokens
Timtech

@JungHwanMin Prompt มีเพียงหนึ่งไบต์ แต่ขอขอบคุณที่อธิบายแนวคิดของโทเค็น :)
Timtech

2

PowerShell 2+, 75 ไบต์

ดัชนีแบบ 1

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

ลองออนไลน์! หรือลองกรณีทดสอบทั้งหมด!

ห่วงเสมอทำงานครั้งเดียวดังนั้นสำหรับกรณีของระดับถักเปีย1ผมก็เริ่มต้นด้วยอาร์เรย์ของเพื่อผลของอัลกอริทึมที่มีให้มัน1,1,01,1,1

$a[1]อยู่ตรงกลางเสมอจากนั้นฉันเพิ่งตรวจสอบว่าดัชนีองค์ประกอบอื่น ๆ ( $d) จะเป็นไปตาม0หรือ2ขึ้นอยู่กับว่าระดับปัจจุบันเป็นคู่หรือคี่ PowerShell รองรับการมอบหมายหลายรายการพร้อมกันเพื่อให้การแลกเปลี่ยนกลายเป็นเรื่องง่ายเหมือนกับ$x,$y=$y,$xที่ฉันกำลังทำกับองค์ประกอบอาร์เรย์


2

Javascript (ES6), 55 ไบต์

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

นี่เป็นเพียงแค่พอร์ตของคำตอบ Ruby ของ @ Doorknob กับสนามกอล์ฟระดับบิตที่น่ากลัวของ @ Neil


1

Befunge ขนาด 64 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

สิ่งนี้ใช้ระดับพื้นฐานเดียว:

(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 ด้วยโปรแกรมทดสอบ:

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

เอาท์พุท:

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


0

GameMaker Language, 113 ไบต์

ดัชนีหนึ่งดัชนีขึ้นอยู่กับโซลูชันแบบเรียกซ้ำของ Doorknob โปรดอย่าถามว่าทำไมคุณไม่สามารถเริ่มต้นอาร์เรย์ดั้งเดิมทั้งหมดใน GameMaker ได้ฉันไม่รู้จริงๆ ...

โปรแกรมหลัก (69 ไบต์):

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

โปรแกรมย่อยa(46 ไบต์):

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)}...*)[$_]}

Zero-based

สร้างลำดับอนันต์ขี้เกียจตรงไปข้างหน้าแล้วสร้างดัชนี
มีแนวทางที่ดีกว่า


0

Clojure 98 ไบต์

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

ติดตามค่าปัจจุบันvและตำแหน่งที่ควรรวมยอดรวมสำหรับรอบต่อไป เริ่มต้นหนึ่งสถานะก่อนที่[1 1 1]จะมีการจัดทำดัชนีแบบ 1


0

C # 88 86 ไบต์

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;

คำอธิบาย

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 ไบต์

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

นิยามการเรียกซ้ำแบบตรงไปตรงมาของฟังก์ชันที่ไม่มีชื่อโดยรับอาร์กิวเมนต์จำนวนเต็มบวกและส่งคืนรายการที่เรียงลำดับของจำนวนเต็มสามจำนวน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.