การแปลงตัวเลขจากการแทน Zeckendorf เป็นทศนิยม


18

เกี่ยวกับการเป็นตัวแทนของ Zeckendorf / หมายเลขฐานฟีโบนักชี

นี่คือระบบตัวเลขที่ใช้หมายเลขฟีโบนักชีเป็นฐาน ตัวเลขประกอบด้วย 0 และ 1 และแต่ละ 1 หมายถึงตัวเลขมีหมายเลข Fibonacci ที่สอดคล้องกันและ 0 หมายถึงไม่มี

ตัวอย่างเช่นลองแปลงจำนวนธรรมชาติทั้งหมด <= 10 เป็นเบสฟีโบนักชี

  • 1 จะกลายเป็น 1 เพราะมันคือผลรวมของ 1 ซึ่งเป็นตัวเลขฟีโบนักชี

  • 2 จะกลายเป็น 10 เพราะมันคือผลรวมของ 2 ซึ่งเป็นจำนวนฟีโบนักชีและมันไม่จำเป็นต้อง 1 เพราะเราได้ผลรวมที่ต้องการไปแล้ว

  • 3 จะกลายเป็น 100 เพราะมันคือผลรวมของ 3 ซึ่งเป็นตัวเลขฟีโบนักชีและมันไม่จำเป็นต้อง 2 หรือ 1 เพราะเราได้ผลรวมที่ต้องการแล้ว

  • 4 จะกลายเป็น 101 เพราะเป็นผลรวมของ [3,1] ซึ่งทั้งคู่เป็นตัวเลขฟีโบนักชี
  • 5 จะกลายเป็น 1,000 เพราะมันคือผลรวมของ 5 ซึ่งเป็นตัวเลขฟีโบนักชีและเราไม่ต้องการตัวเลขอื่นใด
  • 6 จะกลายเป็น 1001 เพราะเป็นผลรวมของฟีโบนักชีหมายเลข 5 และ 1
  • 7 จะกลายเป็น 1,010 เพราะเป็นผลรวมของฟีโบนักชีหมายเลข 5 และ 2
  • 8 จะกลายเป็น 10,000 เพราะเป็นหมายเลขฟีโบนักชี
  • 9 จะกลายเป็น 1,0001 เพราะเป็นผลรวมของฟีโบนักชีหมายเลข 8 และ 1
  • 10 จะกลายเป็น 1,1010 เพราะเป็นผลรวมของฟีโบนักชีหมายเลข 8 และ 2

ลองแปลงตัวเลขฐานฟีโบนักชีสุ่มเป็น 10101001010 เป็นทศนิยม: อันดับแรกเราเขียนตัวเลขฟีโบนักชีที่เกี่ยวข้องกัน จากนั้นเราคำนวณผลรวมของตัวเลขที่ต่ำกว่า 1

 1   0   1   0   1   0   0   1   0   1   0
 144 89  55  34  21  13  8   5   3   2   1  -> 144+55+21+5+2 = 227.

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

ตอนนี้คำถาม:

งานของคุณคือการใช้ตัวเลขในการเป็นตัวแทน Zeckendorf และส่งออกค่าทศนิยม

อินพุตเป็นสตริงที่มีเพียง 0 และ 1 เท่านั้น (แม้ว่าคุณจะสามารถป้อนข้อมูลในแบบที่คุณต้องการ)

เอาท์พุทหนึ่งตัวเลขเป็นทศนิยม

กรณีทดสอบ: (ในรูปแบบอินพุต -> เอาต์พุต)

 1001 -> 6
 100101000 -> 73
 1000000000 -> 89
 1001000000100100010 -> 8432
 1010000010001000100001010000 -> 723452

นี่คือโค้ดกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

หมายเหตุ: การป้อนข้อมูลจะไม่ประกอบด้วยผู้นำ 0 หรือ 1 ต่อเนื่องกัน


เราสามารถรับอินพุตเป็นรายการบิตได้หรือไม่?
Wheat Wizard

เช่นเดียวกับใช้อินพุต ascii ที่เข้ารหัสแล้วแปลงเป็นไบนารี่หรืออะไรทำนองนั้น?
คุกกี้ Windmill

4
เราสามารถรับอินพุตตามลำดับแรกของ LSB ได้หรือไม่
Mego

1
กลุ่มย่อยของcodegolf.stackexchange.com/questions/54287/...ผกผันของcodegolf.stackexchange.com/questions/2677/...
user202729

1
@Mego ใช่คุณสามารถ
คุกกี้ Windmill

คำตอบ:


19

รถแท็กซี่ , ปี 1987ปี 1927 ไบต์

-60 ไบต์เนื่องจากการรับรู้ว่าการแพร่กระจายเป็นตัวเลือก

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[B]Switch to plan C if no one is waiting.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 3 l.Pickup a passenger going to Narrow Path Park.Pickup a passenger going to Sunny Skies Park.Go to Zoom Zoom:n.Go to Sunny Skies Park:w 2 l.Go to Narrow Path Park:n 1 r 1 r 1 l 1 r.Go to Chop Suey:e 1 r 1 l 1 r.Switch to plan B.[C]1 is waiting at Starchild Numerology.1 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 3 l 3 l 2 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.[D]Pickup a passenger going to Addition Alley.Pickup a passenger going to Cyclone.Go to Addition Alley:n 2 r 1 r.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Go to Zoom Zoom:n.Go to Narrow Path Park:w 1 l 1 l 1 r.Switch to plan E if no one is waiting.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:e 1 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to Joyless Park.Go to Joyless Park:n 2 l 1 r 1 r.Go to Addition Alley:w 1 r 2 l 1 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Addition Alley.Switch to plan D.[E]Go to Addition Alley:w 1 l 1 r 1 l.Pickup a passenger going to Riverview Bridge.Go to Riverview Bridge:n 1 r.Go to Joyless Park:e 1 r 2 l.Pickup a passenger going to Addition Alley.[F]Switch to plan G if no one is waiting.Pickup a passenger going to Addition Alley.Go to Fueler Up:w 1 l.Go to Addition Alley:n 3 l 1 l.Pickup a passenger going to Addition Alley.Go to Joyless Park:n 1 r 1 r 2 l.Switch to plan F.[G]Go to Addition Alley:w 1 r 2 l 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

ลองออนไลน์!

เพราะฉันไม่กลับไปที่โรงจอดรถแท็กซี่ในตอนท้ายเจ้านายของฉันจึงยิงฉันออกไปดังนั้นจึงมีข้อผิดพลาด


Joyless Parkดูเหมือนจะเป็นสถานที่ที่ดีในการเยี่ยมชม
aloisdg พูดว่า Reinstate Monica

Sunny Skies Parkดีก็เป็นตัวละครที่น้อยกว่า
JosiahRyanW

11

Perl 6 , 28 23 ไบต์

{[+] (1,2,*+*...*)Z*$_}

ลองออนไลน์!

codeblock ที่ไม่ระบุชื่อที่ใช้รายการ1s และ0s ในการสั่งซื้อ LSB และส่งคืนตัวเลข

คำอธิบาย:

{                     }   # Anonymous codeblock
 [+]                      # The sum of
     (1,2,*+*...*)        # The infinite Fibonacci sequence starting from 1,2
                  Z*      # Zip multiplied by
                    $_    # The input list in LSB form



4

Haskell , 38 ไบต์

f=1:scanl(+)2f
sum.zipWith(*)f.reverse

ลองออนไลน์!

รับอินพุตเป็นรายการ 1s และ 0s

คำอธิบาย


f=1:scanl(+)2f

fทำให้รายการของตัวเลขฟีโบนักชีซองแรกหนึ่งในตัวแปร

sum.zipWith(*)f.reverse

ใช้รายการอินพุตreverseเป็นการคูณแต่ละรายการด้วยรายการที่สอดคล้องกันfจากนั้นsumแสดงผลลัพธ์

Haskell 30 ไบต์

f=1:scanl(+)2f
sum.zipWith(*)f

ลองออนไลน์!

หากเราป้อนข้อมูลด้วยบิตที่มีนัยสำคัญน้อยที่สุดก่อนเราไม่จำเป็นต้องใช้reverseเพื่อให้เราสามารถบันทึกได้ 8 ไบต์


4

Python 2 , 43 ไบต์

a=b=0
for x in input():b+=a+x;a=b-a
print b

ลองออนไลน์!

รับอินพุตเป็นรายการ การปรับปรุงเป็นรุ่นที่สั้นลงa,b=b+x,a+b+xซึ่งเป็นเหมือนการปรับปรุง Fibonacci ถ้าคุณไม่สนใจa,b=b,a+bx


Python 2 , 45 ไบต์

f=lambda n,a=1,b=1:n and n%10*b+f(n/10,b,a+b)

ลองออนไลน์!

รับอินพุตเป็นตัวเลขทศนิยม


3

Pyth, 13 ไบต์

ส่วนใหญ่นี้ (8 ไบต์) เป็นเพียงการสร้างตัวเลขฟีโบนักชี

s*V_m=+Z|~YZ1

ลองด้วยชุดทดสอบนี้!

คำอธิบาย:

s*V_m=+Z|~YZ1QQ     Autofill variables
    m=+Z|~YZ1Q      Generate the first length(input) Fibonacci numbers as follows:
       Z             Start with Z=0
         ~YZ         And Y=[] (update it to Y=Z, return old Y)
        |   1        if Y is [], then replace with 1
      +              Sum Z and Y
     =               Replace Z with sum
    m                Repeat process
             Q       once for each element of the input
   _                Reverse the order of the Fibonacci numbers
 *V                 Vectorize multiplication
s                   Sum


3

J , 24 14 ไบต์

#.~2+&%&1~#-#\

ลองออนไลน์!

นำมาลงในรุ่น 24 ไบต์ที่ใช้ฐานผสมสำหรับฟีโบนักชี

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

#.~2+&%&1~#-#\  Example input: y=1 0 0 1 0
          #-#\  Length minus 1-based indices; 4 3 2 1 0
   2     ~      Starting from 2, run the following (4,3,2,1,0) times:
    +&%&1         Given y, compute 1 + 1 / y
                The result is 13/8 8/5 5/3 3/2 2
#.~             Mixed base conversion of y into base above; 2+8=10

J , 21 ไบต์

1#.|.*[:+/@(!~#-])\#\

ลองออนไลน์!

เวอร์ชั่น25 ไบต์ของGalen Ivanov ที่ได้รับการปรับปรุง

ใช้ผลรวมแนวทแยงของสามเหลี่ยม Pascal ซึ่งเทียบเท่ากับผลรวมของสัมประสิทธิ์ทวินาม:

Fn=i=0nniCi

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

1#.|.*[:+/@(!~#-])\#\
                       Example input: 1 0 0 1 0
                   #\  Generate 1-based index; 1 2 3 4 5
      [:          \    For each prefix of above... (ex. 1 2 3)
              #-]        Subtract each element from the length (ex. 2 1 0)
           (!~   )       Compute binomial coefficient (ex. 3C0 + 2C1 + 1C2)
        +/@              Sum
                       The result is Fibonacci numbers; 1 2 3 5 8
   |.*                 Multiply with mirrored self; 0 2 0 0 8
1#.                    Sum; 10

J , 24 ไบต์

3 :'y#.~|.(1+%)^:(<#y)2'

ลองออนไลน์!

คำกริยา Monadic ชัดเจน สร้างฐานผสมที่หมายถึงฐาน Fibonacci #.แล้วฟีดลงไปในแปลงฐาน

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

y#.~|.(1+%)^:(<#y)2  Explicit verb, input: y = Fibonacci digit array, n = length of y
      (1+%)          x -> 1 + 1/x
           ^:(<#y)2  Apply the above 0..n-1 times to 2
                     The result looks like 2/1, 3/2, 5/3, 8/5, 13/8, ...
    |.               Reverse
                     Now, if it is fed into #. on the left, the digit values become
                     ...(8/5 * 5/3 * 3/2 * 2/1), (5/3 * 3/2 * 2/1), (3/2 * 2/1), 2/1, 1
                     which is ... 8 5 3 2 1 (Yes, it's Fibonacci.)
y#.~                 Convert y to a number using Fibonacci base

ทางเลือก

J , 27 ไบต์

}.@(+#{.3#{.)^:(<:@#)@(,&0)

ลองออนไลน์!

ความคิด:

 1  0  0  1  0  1
-1 +1 +1
------------------
    1  1  1  0  1
   -1 +1 +1
------------------
       2  2  0  1
      -2 +2 +2
------------------
          4  2  1
         -4 +4 +4
------------------
             6  5
            -6 +6 +6 <- Add an imaginary digit that has value 1
---------------------
               11  6
              -11+11
---------------------
                  17 <- the answer

J , 30 ไบต์

0.5<.@+(%:5)%~(-:>:%:5)#.,&0 0

ลองออนไลน์!

อันนี้ใช้ความพยายามมากที่สุดในการสร้าง ใช้นิพจน์แบบฟอร์มปิดด้วยเคล็ดลับการปัดเศษ ในนิพจน์ค่าที่ 0 และที่ 1 คือ 0 และ 1 ตามลำดับดังนั้นพลังงานหลักที่แท้จริงต้องเริ่มต้นด้วย 2

0.5<.@+(%:5)%~(-:>:%:5)#.,&0 0  Tacit verb.
                         ,&0 0  Add two zeroes at the end
              (-:>:%:5)#.       Convert to a number using base phi (golden ratio)
       (%:5)%~                  Divide by sqrt(5)
0.5<.@+                         Round to nearest integer

ในขณะที่ข้อผิดพลาด ( ((1-sqrt(5))/2)^nเงื่อนไข) อาจสร้างขึ้นมันไม่เคยเกิน 0.5 ดังนั้นเคล็ดลับการปัดเศษทำงานได้ถึงอนันต์ ศาสตร์:

max(|error|)=151(152)2n=150(152)n=5125<12


ทางออกที่ดี! ฉันดีใจที่ได้เห็นคำกริยาที่ชัดเจนที่เต้นโซลูชันโดยปริยาย
Galen Ivanov

ฉันพยายามหาวิธีแก้ปัญหาโดยปริยายที่สั้นกว่า แต่ไม่ประสบความสำเร็จ 25 ไบต์สำหรับตอนนี้ ฉันใช้ Triange ของ Pascal
Galen Ivanov

@ GalenIvanov กลับมาท้าทายอีกครั้งหลังจากผ่านไปหนึ่งปีฉันได้วิธีการแก้ปัญหาแบบสั้น ๆ ใหม่สุดพิเศษ :)
Bubbler

เยี่ยมมาก! ฉันจะดูรายละเอียดเพิ่มเติมในไม่ช้า
Galen Ivanov

2

MathGolf , 8 6 ไบต์

{î)f*+

ลองออนไลน์!

คำอธิบาย

{        Start block (foreach in this case)
 î)      Push loop index (1-based) and increment by 1
   f     Get fibonacci number of that index
    *    Multiply with the array value (0 or 1)
     +   Add top two elements of stack. This implicitly pops the loop index the first iteration, which makes the addition become 0+a, where a is the top of the stack.

บันทึก 1 ไบต์ด้วย JoKing และอีกหนึ่งไบต์ต้องขอบคุณการสั่งซื้อ LSB


คำสั่งซื้อ LSB ได้รับอนุญาตแน่นอน ยัง-1 ไบต์
Jo King

@ โจกิ้งแน่นอนฉันยังใช้งานการเพิ่มโดยนัยเมื่อสัปดาห์ที่แล้ว ... สัมผัสดีตอนนี้ MathGolf อยู่ในอันดับที่หนึ่งแล้ว!
maxb

2

05AB1E , 11 9 8 ไบต์

vyiNÌÅfO

ลองออนไลน์!

คำอธิบาย:

v             : For each character in input string (implicit) in LSB order
  yi          : If the current character is truthy (1)
    NÌ        : Add 2 to the current index
       ÅfO    : Add the fibonacci of this number to the stack
  • -2 bytes : ขอบคุณ @KevinCruijssen สำหรับการชี้ให้เห็นถึงวิธีการขนาดเล็กเพื่อย่อรหัสนี้!
  • -1 ไบต์ : ขอบคุณ @JonathanAllan สำหรับการชี้ให้เห็นคำสั่ง LSB สำหรับการป้อนข้อมูล!

1
Θคุณสามารถลบ 1เป็นจริงใน 05AB1E แล้ว :) นอกจากนี้ยังสามารถ2+ Ì
Kevin Cruijssen

1
เราสามารถรับอินพุตในรูปแบบ Little-endian (เช่นกลับด้าน) ซึ่งควรบันทึกไบต์ (หรือสอง?)
Jonathan Allan






1

C (gcc) , 63 ไบต์

รับอินพุตเป็นอาร์เรย์ของ1และ0พร้อมกับความยาวของอาร์เรย์ วิธีนี้เป็นวิธีย้อนหลังค่อนข้างตรงไปข้างหน้า

f(_,l,a,b,t)int*_;{a=b=1;for(t=0;l--;b=(a+=b)-b)t+=a*_[l];_=t;}

ลองออนไลน์!



0

เรติน่า 0.8.2 , 23 ไบต์

0?
;
+`1;(1*);
;1$1;1
1

ลองออนไลน์! ลิงค์นั้นรวมถึงกรณีทดสอบที่เร็วกว่า คำอธิบาย:

0?
;

แทรกตัวคั่นทุกที่และลบศูนย์ใด ๆ ยกตัวอย่างเช่นจะกลายเป็น1001;1;;;1;

+`1;(1*);
;1$1;1

ซ้ำแล้วซ้ำอีกแทนที่แต่ละ1ที่มีในแต่ละสถานที่สองต่อไปเป็นผลรวมของค่าของพวกเขาเท่ากับมูลค่าของเดิม1 s จึงย้ายและสะสมจนกว่าจะถึงสองสถานที่ที่ผ่านมาซึ่ง (เนื่องจากคั่นเพิ่มใหม่) ตอนนี้ทั้งสองมีค่า111

1

นับ1s



0

JavaScript (Node.js)ขนาด 41 ไบต์

พอร์ตของคำตอบของ XNOR ใช้อินพุตเป็นตัวอักษร BigInt

f=(n,a=1n,b=a)=>n&&n%10n*b+f(n/10n,b,a+b)

ลองออนไลน์!


JavaScript (ES6), 44 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระตามลำดับแรกของ LSB

s=>s.map(k=>t+=k*(z=x,x=y,y+=z),x=t=0,y=1)|t

ลองออนไลน์!


0

ที่จริงแล้ว 8 ไบต์

;r⌐@░♂FΣ

ลองออนไลน์!

อินพุตถูกใช้เป็นรายการของบิตในลำดับแรกของ LSB

คำอธิบาย:

;r⌐@░♂FΣ
;r        range(0, len(input))
  ⌐       add 2 to every element in range (range(2, len(input)+2))
   @░     filter: take values in range that correspond to 1s in input
     ♂F   Fibonacci number at index of each element in list (Actually uses the F(0)=F(1)=1 definition, which is why we needed to add 2 earlier)
       Σ  sum

0

Powershell, 68 ไบต์

param($s)$b=1
$s[$s.Length..0]|%{$a,$b=$b,($a+$b)
$x+=($_-48)*$b}
$x

สคริปต์ทดสอบ:

$f = {
param($s)$b=1
$s[$s.Length..0]|%{$a,$b=$b,($a+$b)
$x+=($_-48)*$b}
$x
}

@(
    ,("1001", 6)
    ,("100101000", 73)
    ,("1000000000", 89)
    ,("1001000000100100010", 8432)
    ,("1010000010001000100001010000", 723452)
) | % {
    $s,$e = $_
    $r = &$f $s
    "$($r-eq$e): $r"
}

เอาท์พุท:

True: 6
True: 73
True: 89
True: 8432
True: 723452

0

Java (OpenJDK 8) , 65 ไบต์

ค่อนข้างเล็กสำหรับคำตอบของจาวาสำหรับฉันมีความสุขกับเรื่องนี้ รับอินพุตเป็นอาร์เรย์ของ ints ที่สั่งซื้อเป็นครั้งแรกของ LSB

d->{int s=0,f=1,h=1;for(int i:d){s+=i>0?f:0;f=h+(h=f);}return s;}

ลองออนไลน์!

Ungolfed

d->{                        // Lambda function that takes array of ints
    int s=0,f=1,h=1;        // Initialise sum and fibonacci vars
    for(int i:d){           // Loop through each input integer
        s+=i>0?f:0;         // If it's 1 add current fibonacci number to sum
        f=h+(h=f);          // Increase fibonacci number 
    }return s;              // return sum
}

0

Z80Golf , 34 ไบต์

00000000: dde1 f1b7 2819 fe30 2812 4504 aff5 3cf5  ....(..0(.E...<.
00000010: d1f1 82d5 f510 f9c1 f17c 8067 2c18 e3dd  .........|.g,...
00000020: e5c9                                     ..

ตัวอย่างกับอินพุต 1001- ลองออนไลน์!

ตัวอย่างกับอินพุต 100101000- ลองออนไลน์!

สภา:

zeck:		; input=push on stack in MSB order (eg top is LSB) output=reg h
pop ix		; save return addr in ix
f:
pop af		; get next digit
or a
jr z, return	; if current digit==0, return
cp 0x30
jr z, skip	; if current digit=='0' (e.g. not '1'), skip loop
ld b, l		; find fib of counter
fib:
	inc b	; 1-indexing for func to work
	xor a	; set a to 0 (1st fibo num)
	push af
	inc a	; set a to 1 (2nd fibo num)
	push af
	fib_loop:
		pop de
		pop af
		add d
		push de
		push af
		djnz fib_loop
pop bc		; get the fibo num just calculated
pop af		; pop just to reset stack frame
ld a, h
add b		; add current fibo number to sum
ld h, a
skip:
inc l		; increment counter reg
jr f		; repeat loop
return:
push ix		; push the return addr to ret to it
ret
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.