En yakın Fibonacci numarasını bulun


30

Biz tüm ünlü aşina Fibonacci dizisi , bununla başlar 0ve 1ve her eleman bir önceki ikisinin toplamıdır. İşte ilk birkaç terim ( OEIS A000045 ):

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584

Olumlu bir tamsayı verildiğinde , Fibonacci dizisinin en yakın sayısını şu kurallara göre döndürün:

  • En yakın Fibonacci sayısı , verilen tamsayı ile en küçük mutlak farkı olan Fibonacci sayısı olarak tanımlanır. Örneğin, 34en yakın Fibonacci sayı olduğu 30için, |34 - 30| = 4ikinci yakın bir daha küçük olan 21, için |21 - 30| = 9.

  • Verilen tamsayı Fibonacci dizisine aitse, en yakın Fibonacci sayısı tam olarak kendisidir. Örneğin, Fibonacci sayısı 13tam olarak en yakındır 13.

  • Beraberlik durumunda, her ikisi de girişe en yakın olan Fibonacci sayılarından birini çıkarmayı veya her ikisini de çıkarmayı seçebilirsiniz. Girişidir Örneğin, 17aşağıdakilerden her geçerlidir: 21, 13veya 21, 13. İkisini de iade etmeniz durumunda, lütfen formattan bahsedin.

Varsayılan Loopholes uygulanır. Herhangi bir standart yöntemle girdi alabilir ve çıktı alabilirsiniz . Programınız / fonksiyonunuz sadece 10 8'e kadar olan değerleri kullanmalıdır .


Test Kılıfları

Giriş -> Çıkış

1 -> 1
3 -> 3
4 -> 3 veya 5 veya 3, 5
6 -> 5
7 -> 8
11 -> 13
17 -> 13 veya 21 veya 13, 21
63 -> 55
101 -> 89
377 -> 377
467 -> 377
500 -> 610
1399 -> 1597

puanlama

Bu , yani her dilde byte cinsinden en kısa kod kazanır!



FWIW, burada SO üzerinde bazı Python kodları, büyük girişler için verimli bir şekilde yapmak için ve çeşitli algoritmaları zamanlamak için kullanılabilecek bir betik.
PM 2Ring

0 pozitif bir tamsayı olarak kabul edilir mi?
Alix Eisenhardt,

@AlixEisenhardt No. Olumlu tamsayın ima eder n ≥ 1.
Bay Xcoder,

Yanıtlar:


21

Python 2 , 43 bayt

f=lambda n,a=0,b=1:a*(2*n<a+b)or f(n,b,a+b)

Çevrimiçi deneyin!

(a,b)Girdilerin norta noktadan az olduğu bir sayıya ulaşana kadar ardışık Fibonacci sayıları çiftleriyle yinelenir ve (a+b)/2ardından geri döner a.

Bir program olarak yazılmış (47 bayt):

n=input()
a=b=1
while 2*n>a+b:a,b=b,a+b
print a

Aynı uzunluk :

f=lambda n,a=0,b=1:b/2/n*(b-a)or f(n,b,a+b)

15

Neim , 5 bayt

f𝐖𝕖S𝕔

Açıklama:

f       Push infinite Fibonacci list
 𝐖                     93
  𝕖     Select the first ^ elements
        This is the maximum amount of elements we can get before the values overflow
        which means the largest value we support is 7,540,113,804,746,346,429
   S𝕔   Closest value to the input in the list

Neim'in en yeni sürümünde bu, 3 byte'a kadar oynanabilir:

fS𝕔

Sonsuz listeler yalnızca maksimum değerlerine çıkabilmek için elden geçirildiği için.

Çevrimiçi deneyin!


Orada 2 karakter varken bu 5 bayt nasıl? Ve birinci ve ikinci çözüm arasındaki fark nedir?
caird coinheringaahing

1
Bayt mı yoksa karakter mi sayıyorsunuz? İlk 15 bayt ve ikinci 7 bayt görünmektedir.
Nateowami

Bu muhtemelen, her bir karakterin kendi baytı olduğu, birincisinin 5 bayt olduğu ve ikincisi 3 bayt olduğu bir tür kendi kod sayfasına sahiptir. İkisi arasındaki fark, birincisinin ilk 93 el kitabını seçmesidir; ikinci versiyonda ise yeni sürümdeki diller int boyutlarının kullanabileceği en yüksek değeri otomatik olarak seçer
Roman Gräf

1
@cairdcoinheringaahing Programlarımı göremeyen insanlarla sık sık sorunlar yaşadım. Ekran Görüntüsü
Okx,

1
@Okx Oh Tamam, ilginç, tahmin edemezdim.
Nateowami


8

R , 70 67 64 62 60 bayt

Djhurio sayesinde -2 bayt!

Djhurio sayesinde -2 bayt daha (oğlan golf oynayabilir!)

F=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]

Sadece değerlerle başa çıkmamız gerektiğinden 10^8, bu işe yarar.

Çevrimiçi deneyin!

Stdin'den okur n. whiledöngü Fibonacci sayıları üretir F(azalan sırada); beraberlik durumunda, daha büyük döndürülür. Bu, bazı uyarıları tetikleyecektir, çünkü while(F<1e8)sadece ilk Fuyarının uyarısını bir uyarıyla değerlendirir.

Başlangıçta F[which.min(abs(F-n))], naif yaklaşımı kullandım, ancak @djhurio (F-n)^2, siparişin eşdeğer olacağını ve orderbunun yerine olacağını önerdi which.min. ordergirdilerini artan düzene sokmak için endekslerin bir permütasyonunu döndürür, ancak [1]sonunda sadece ilk değeri elde etmemiz gerekir .

daha hızlı sürüm:

F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][‌​1]

sadece son iki fibonacci sayısını saklar


1
Güzel bir. -2 baytF=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
djhurio

1
Ve aynı sayıda bayt ile hızlı sürümF=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
djhurio

1
@ djhurio güzel! çok teşekkür ederim.
Giuseppe

1
Bunu severim. -2 bayt yineF=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
djhurio

Fibnumları oluşturmak için bir yapı kullanmak daha kısadır:numbers::fibonacci(x<-scan(),T)
JAD

6

JavaScript (ES6), 41 bayt

f=(n,x=0,y=1)=>y<n?f(n,y,x+y):y-n>n-x?x:y
<input type=number min=0 value=0 oninput=o.textContent=f(this.value)><pre id=o>0

Tercihinize göre yukarı yuvarlar.


Üzerinde çalıştığım sürümle neredeyse aynı. En azından aynı değişken isimlerini kullanmadın yoksa çıldırırdım.
Grax32

@Grax Huh, şimdi sizden bahsediyorsunuz, Business Cat beni dövdü ...
Neil

(Peki, neredeyse ... Versiyonumu 0 ile çalıştım, çünkü neden olmasın?)
Neil

f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)0 ile çalışmak zorunda olmadığınızdan, biraz daha golf oynayabilirsiniz.
Alix Eisenhardt,

6

Jöle , 9 7 bayt

@EriktheOutgolfer sayesinde -2 bayt

‘RÆḞạÐṂ

Çevrimiçi deneyin!

Golf ipuçları hoşgeldiniz :). Giriş için bir int alır ve bir int listesi döndürür.

            ' input -> 4
‘           ' increment -> 5
 R          ' range -> [1,2,3,4,5]
  ÆḞ        ' fibonacci (vectorizes) -> [1,1,2,3,5,8]
     ÐṂ     ' filter and keep the minimum by:
    ạ       ' absolute difference -> [3,3,2,1,1,4]
            ' after filter -> [3,5]

Kaldırabilirsiniz µḢ.
Outgolfer Erik

@EriktheOutgolfer: "Eğer düşünürseniz bunu yapmanın bir yolu var mı?" Veya "Kelimenin tam anlamıyla sadece geri alırsanız hala çalışıyor" mu?
nmjcman101,

"Kurallara izin veriliyor" gibi. : P
Outgolfer Erik,

Ah. Teşekkür ederim! (Dolgu metni)
nmjcman101,


5

x86-64 Makine Kodu, 24 bayt

31 C0 8D 50 01 92 01 C2 39 FA 7E F9 89 D1 29 FA 29 C7 39 D7 0F 4F C1 C3

Yukarıdaki kod baytları, belirtilen giriş değerine en yakın Fibonacci numarasını bulan 64-bit x86 makine kodundaki bir işlevi tanımlar n.

İşlev, System V AMD64 çağrı kuralını (Gnu / Unix sistemlerinde standarttır) izler, böylece tek parametre ( n) EDIkayıt defterine iletilir ve sonuç EAXkayıt defterine döndürülür .

Ungolfed montaj anımsatıcıları:

; unsigned int ClosestFibonacci(unsigned int n);
    xor    eax, eax        ; initialize EAX to 0
    lea    edx, [rax+1]    ; initialize EDX to 1

  CalcFib:
    xchg   eax, edx        ; swap EAX and EDX
    add    edx, eax        ; EDX += EAX
    cmp    edx, edi
    jle    CalcFib         ; keep looping until we find a Fibonacci number > n

    mov    ecx, edx        ; temporary copy of EDX, because we 'bout to clobber it
    sub    edx, edi
    sub    edi, eax
    cmp    edi, edx
    cmovg  eax, ecx        ; EAX = (n-EAX > EDX-n) ? EDX : EAX
    ret

Çevrimiçi deneyin!

Kod temel olarak üç bölüme ayrılır:

  • İlk bölüm çok basittir: çalışma kayıtlarımızı başlatır. EAX0 EDXolarak ayarlanır ve 1 olarak ayarlanır.
  • Bir sonraki kısım, giriş değerinin her iki tarafındaki Fibonacci sayılarını yinelemeli olarak hesaplayan bir döngüdür n. Bu kod, önceki Fibonacci uygulamamı çıkarma işlemine dayanıyor , ancak… um… çıkarma işlemiyle değil. :-) Özellikle, Fibonacci sayısını iki değişken kullanarak hesaplamak için aynı numarayı kullanır - burada, bunlar EAXve EDXkayıtlar. Bu yaklaşım burada son derece kullanışlıdır, çünkü bize bitişik Fibonacci sayılarını verir. Aday potansiyel olarak daha az n tutulur EAXiken, potansiyel aday daha büyük n tutulurEDX. Bu döngünün içindeki kodu ne kadar sıkıştırabildiğimden gurur duyuyorum (ve daha bağımsız bir şekilde keşfettiğimden daha da gıdıklandım ve daha sonra yukarıda verilen çıkarma yanıtına ne kadar benzer olduğunu fark ettim).

  • Biz aday aldıktan sonra Fibonacci mevcuttur değerleri EAXve EDXbunun bir daha yakın (mutlak değer açısından) için hangi endam bir kavramsal olarak basit bir konudur, n. Aslında mal olacağını mutlak bir değer alarak yolu biz sadece subtractions bir dizi yapmak, böylece, çok fazla bayt. Sonlu koşullu-hareket komutunun sağındaki yorum, mantığı burada açıklar. Bu, ya hareket EDXhalinde EAXya da yapraklar EAXtek başına, yani fonksiyonu zaman bu RETkutular, en yakın Fibonacci sayı döndürülür EAX.

Eşitlik durumunda , seçim yapmak yerine kullandığımızdan, iki aday değerden daha küçük olanı döndürülür . Diğer davranışları tercih ederseniz önemsiz bir değişim söz konusudur. Her iki değeri de döndürmek başlangıçsızdır; sadece bir tam sayı sonucu, lütfen!CMOVGCMOVGE


NASM listeleri kod yazarı cevapları için iyidir, çünkü makine kodu baytlarını orijinal yorumlanmış kaynakla biraz sıkıştırırlar. Ben kullanılan nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-bir son cevap makine kodu ve kaynak arasındaki bazı sütunları kırpmaya.
Peter Cordes,

1
32-bit kodda xor eax,eax/ cdq/ ile eax = 0 ve edx = 1 komutunu 5 yerine 4 baytta alabilirsiniz inc edx. Böylece bir bayt kaydedilen 32 bit özel arama-kongre sürümünü yapabilirsiniz.
Peter Cordes

Bunu daha önce @Peter yaptım, fakat burada "meclis" veya "makine kodunda" olduğu için çok fazla kafa karışıklığı var. Anlaşılan tecrübeli kullanıcılardan bazıları, bir fark olduğunu savunuyorlar ve montaj hatırlatıcıları kullanılarak sunulan bir cevap için makine kodunun baytını saymalarına itiraz ediyorum. Doğal olarak, bunun aptalca olduğunu düşünüyorum, çünkü "montaj" sadece makine baytlarının anımsatıcı bir temsilidir, ancak oyum aşıldı. Ayrı sunumun kişisel olarak hoşuma gitmese de daha az sürtünme yarattığını buldum.
Cody Gray,

Diğer numara güzel - teşekkürler. Bunu düşünmeliydim, cdqkod-golf cevaplarında çok kullanırım . Özel bir arama sözleşmesi gerekli değildir. Genellikle Microsoft __fastcallarama kuralını 32 bitlik kod için kullanırım. Bu konuda güzel olan şey GCC tarafından bir ek açıklama ile desteklenmesidir, bu nedenle hala herkesin görmek istediği TIO servisini kullanabilirsiniz.
Cody Gray,

Ah evet, herhangi bir eski kayıt çağıran kongre sizin için çalışıyor. Benim en son codegolf cevap içinde işaretçileri gerekli edi/ ' esiiçin lodsb/ stosbve sadece X86-64 SysV ki (eğlenceli gerçeğini yapar: bu nedenle bilerek, bazı işlevler memset / memcpy onların args geçmek çünkü ben sevdim anda gcc tahmin dize ops satır içi için).
Peter Cordes,

4

PowerShell , 80 74 bayt

param($n)for($a,$b=1,0;$a-lt$n;$a,$b=$b,($a+$b)){}($b,$a)[($b-$n-gt$n-$a)]

(Çevrimiçi deneyin! Geçici olarak yanıt vermiyor)

Yinelemeli çözüm. Giriş Alır $n, setleri $a,$bolmak 1,0kadar ve sonra Fibonacci ile döngüler $agirdi daha büyüktür. Bu noktada, ($b,$a)Boolean'a göre, birinci element ile ikinci element $narasındaki farktan büyük olup olmadığına göre indeksleriz $n. Boru hattında kalan, çıktının kapalı olduğu.


4

JavaScript (ES6), 67 bayt

f=(n,k,y)=>(g=k=>x=k>1?g(--k)+g(--k):k)(k)>n?x+y>2*n?y:x:f(n,-~k,x)

Test durumları


4

JavaScript (Babel Düğümü) , 41 bayt

f=(n,i=1,j=1)=>j<n?f(n,j,j+i):j-n>n-i?i:j

Dayalı Ovs'ın harika Python cevabına

Çevrimiçi deneyin!

Ungolfed

f=(n,i=1,j=1)=> // Function f: n is the input, i and j are the most recent two Fibonacci numbers, initially 1, 1
 j<n?           // If j is still less than n
  f(n,j,j+i)    //  Try again with the next two Fibonacci numbers
 :              // Else:
  j-n>n-i?i:j   //  If n is closer to i, return i, else return j

Bu benim cevabımı yorumladı ama çalışmayı bırakacaktı 0(ihtiyacım olması gerekmiyor; sadece istiyorum):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Neil

4

Python, 74 bayt

import math
r=5**.5
p=r/2+.5
lambda n:round(p**int(math.log(n*2*r,p)-1)/r)

Çevrimiçi deneyin!

Nasıl çalışır

Hepsi için k beri ≥ 0, | φ - k / √5 | <1/2, F k = φ k / √5 + φ - k / √5 = yuvarlak (φ k / √5). Dönüş değeri geçer Yani F k - 1 için F k tam olarak nerede k = log φ ( n ⋅2√5) - 1, ya da N = φ k + 1 1/4 içinde / (2√5), F k + 1/2 = ( F k - 1 + F k ) / 2.


Kahretsin, böyle bir şeyin mümkün olması gerektiğini biliyordum. Aferin! (+1)
SteamyRoot




3

Python 3 , 103 bayt

import math
def f(n):d=5**.5;p=.5+d/2;l=p**int(math.log(d*n,p))/d;L=[l,p*l];return round(L[2*n>sum(L)])

Çevrimiçi deneyin!

Ne yazık ki, lambda yerine def kullanmak zorunda kaldım ... Muhtemelen burada iyileştirilmesi için çok yer var.

Orijinal (yanlış) cevap:

Python 3 , 72 bayt

lambda n:r(p**r(math.log(d*n,p))/d)
import math
d=5**.5
p=.5+d/2
r=round

Çevrimiçi deneyin!

İlk PPCG gönderim. Fibonacci sayılarını yinelemeli olarak hesaplamak veya önceden tanımlamak yerine, bu kod, n. İnci Fibonacci sayısının, altın oranın 5'in kökü ile bölünmüş altın oranının n'inci gücüne en yakın tam sayı olduğunu kullanır.


İyi iş! PPCG'ye Hoşgeldiniz :)
musicman523

Kodunuzun bayt sayısını hesaplamak için, diğer Python cevaplarında gösterildiği gibi, lambda atamanız gerektiğini düşünüyorum. Bununla birlikte, bu algoritma her zaman n aralığında (1, 1 + 10 ** 8) doğru çalışmaz. Örneğin, n = 70, 89 değerini döndürür, ancak 55 değerini döndürmelidir. İşte, <120 için n değerleri şunlardır: (27, 44, 70, 71, 114, 115, 116). Test amacıyla, nearest_fib_PM2Rsoru hakkındaki yorumumda bağladığım işlevi kullanmak isteyebilirsiniz .
PM 2Ring

@ PM2Ring Haklısınız, aptal bir hata yaptım ... Artık doğru bir çözümüm var, ama daha çok bayt ile. Lambda gelince, yanıldığına inanıyorum. Ben lambda atanan cevapların sadece özyinelemeyi kullandıkları için yaptıklarına inanıyorum. Diğer Python 3 cevapları, örneğin ilk lambdayı atamaz.
SteamyRoot

3

Taksi, 2321 bayt

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Trunkers.Go to Trunkers:n 1 l 1 l.0 is waiting at Starchild Numerology.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 1 l 2 l.Pickup a passenger going to Bird's Bench.Pickup a passenger going to Cyclone.Go to Cyclone:w 1 r 4 l.[a]Pickup a passenger going to Rob's Rest.Pickup a passenger going to Magic Eight.Go to Bird's Bench:n 1 r 2 r 1 l.Go to Rob's Rest:n.Go to Trunkers:s 1 l 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:w 2 r.Pickup a passenger going to Trunkers.Pickup a passenger going to Magic Eight.Go to Zoom Zoom:n.Go to Trunkers:w 3 l.Go to Magic Eight:e 1 r.Switch to plan "b" if no one is waiting.Pickup a passenger going to Firemouth Grill.Go to Firemouth Grill:w 1 r.Go to Rob's Rest:w 1 l 1 r 1 l 1 r 1 r.Pickup a passenger going to Cyclone.Go to Bird's Bench:s.Pickup a passenger going to Addition Alley.Go to Cyclone:n 1 r 1 l 2 l.Pickup a passenger going to Addition Alley.Pickup a passenger going to Bird's Bench.Go to Addition Alley:n 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Switch to plan "a".[b]Go to Trunkers:w 1 l.Pickup a passenger going to Cyclone.Go to Bird's Bench:w 1 l 1 r 1 l.Pickup a passenger going to Cyclone.Go to Rob's Rest:n.Pickup a passenger going to Cyclone.Go to Cyclone:s 1 l 1 l 2 l.Pickup a passenger going to Sunny Skies Park.Pickup a passenger going to What's The Difference.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 l.Pickup a passenger going to Magic Eight.Go to Sunny Skies Park:e 1 r 1 l.Go to Cyclone:n 1 l.Pickup a passenger going to Sunny Skies Park.Pickup a passenger going to What's The Difference.Go to Sunny Skies Park:n 1 r.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 1 r 1 l.Pickup a passenger going to Magic Eight.Go to Magic Eight:e 1 r 2 l 2 r.Switch to plan "c" if no one is waiting.Go to Sunny Skies Park:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to Cyclone:n 1 l.Switch to plan "d".[c]Go to Cyclone:w 1 l 2 r.[d]Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Çevrimiçi deneyin!
Yorumlarla çevrimiçi olarak deneyin!

Yorumsuz golf oyunu:

[ Find the Fibonacci number closest to the input ]
[ Inspired by: https://codegolf.stackexchange.com/q/133365 ]


[ n = STDIN ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Trunkers.
Go to Trunkers: north 1st left 1st left.


[ Initialize with F0=0 and F1=1 ]
0 is waiting at Starchild Numerology.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 1st left 2nd left.
Pickup a passenger going to Bird's Bench.
Pickup a passenger going to Cyclone.
Go to Cyclone: west 1st right 4th left.


[ For (i = 1; n > F(i); i++) { Store F(i) at Rob's Rest and F(i-1) at Bird's Bench } ]
[a]
Pickup a passenger going to Rob's Rest.
Pickup a passenger going to Magic Eight.
Go to Bird's Bench: north 1st right 2nd right 1st left.
Go to Rob's Rest: north.
Go to Trunkers: south 1st left 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: west 2nd right.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Magic Eight.
Go to Zoom Zoom: north.
Go to Trunkers: west 3rd left.
Go to Magic Eight: east 1st right.
Switch to plan "b" if no one is waiting.

[ n >= F(i) so iterate i ]
Pickup a passenger going to Firemouth Grill.
Go to Firemouth Grill: west 1st right.
Go to Rob's Rest: west 1st left 1st right 1st left 1st right 1st right.
Pickup a passenger going to Cyclone.
Go to Bird's Bench: south.
Pickup a passenger going to Addition Alley.
Go to Cyclone: north 1st right 1st left 2nd left.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Bird's Bench.
Go to Addition Alley: north 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left.
Switch to plan "a".


[b]
[ F(i) > n which means n >= F(i-1) and we need to figure out which is closer and print it]
Go to Trunkers: west 1st left.
Pickup a passenger going to Cyclone.
Go to Bird's Bench: west 1st left 1st right 1st left.
Pickup a passenger going to Cyclone.
Go to Rob's Rest: north.
Pickup a passenger going to Cyclone.
Go to Cyclone: south 1st left 1st left 2nd left.
Pickup a passenger going to Sunny Skies Park.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to What's The Difference.
[ Passengers:n, n, F(i-1) ]
Go to What's The Difference: north 1st left.
Pickup a passenger going to Magic Eight.
[ Passengers:n, n-F(i-1) ]
Go to Sunny Skies Park: east 1st right 1st left.
Go to Cyclone: north 1st left.
Pickup a passenger going to Sunny Skies Park.
Pickup a passenger going to What's The Difference.
[ Passengers: n-F(i-1), F(i-1), F(i) ]
Go to Sunny Skies Park: north 1st right.
Pickup a passenger going to What's The Difference.
[ Passengers: n-F(i-1), F(i), n ]
Go to What's The Difference: north 1st right 1st left.
[ Passengers: n-F(i-1), F(i)-n ]
Pickup a passenger going to Magic Eight.
Go to Magic Eight: east 1st right 2nd left 2nd right.
Switch to plan "c" if no one is waiting.

[ If no one was waiting, then {n-F(i-1)} < {F(i)-n} so we return F(i-1) ]
Go to Sunny Skies Park: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to Cyclone: north 1st left.
Switch to plan "d".

[c]
[ Otherwise {n-F(i-1)} >= {F(i)-n} so we return F(i) ]
[ Note: If we didn't switch to plan c, we still pickup F(i) but F(i-1) will be the *first* passenger and we only pickup one at The Babelfishery ]
[ Note: Because of how Magic Eight works, we will always return F(i) in the event of a tie ]
Go to Cyclone: west 1st left 2nd right.
[d]
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

2

Python 3 , 84 bayt

lambda k:min(map(f,range(2*k)),key=lambda n:abs(n-k))
f=lambda i:i<3or f(i-1)+f(i-2)

Çevrimiçi deneyin!

İşe yarayabilir, ama kesinlikle hızlı değil ...

TrueBunun yerine çıktılar 1, ancak Python'da bunlar eşdeğerdir.


2

dc, 52 bayt

si1d[dsf+lfrdli>F]dsFxli-rlir-sdd[lild-pq]sDld<Dli+p

Çevrimiçi deneyin!

Kullanarak girişinde giriş alır ?

Yığın tepesini giriş değeri olarak kabul edecek şekilde düzenlenmiştir, -1 bayt.

Giriş, kayıt defterinde saklanır i. Sonra Fibonacci dizisini başlatmak için yığına 1 ve 1 koyduk ve diziden daha büyük bir değere ulaşana kadar üretiyoruz i. Bu noktada, yığındaki Fibonacci dizisinde iki sayı var: biri daha küçük veya eşit i, biri büyük i. Bunları kendi farklılıklarına dönüştürüyoruz ive sonra farkları karşılaştırıyoruz. Sonunda, Fibonacci sayısını farkı ekleyerek veya çıkararak yeniden yapılandırırız i.

Hata! İki kaydı yanlış sırayla yüklüyordum ve sonra onları değiştirerek bir bayt harcıyordum.


İşlevlere izin verilir.
Hesap MakinesiFeline

Teşekkürler, meydan okuma metninde defalarca bunu özledim.
brhfl



2

Altıgen , 37 bayt

?\=-${&"*.2}+".|'=='.@.&}1.!_|._}$_}{

Çevrimiçi deneyin!

ungolfed:

   ? \ = - 
  $ { & " * 
 . 2 } + " .
| ' = = ' . @
 . & } 1 . !
  _ | . _ }
   $ _ } { 

Bozuldu:

start:
? { 2 ' * //set up 2*target number
" ' 1     //initialize curr to 1

main loop:
} = +     //next + curr + last
" -       //test = next - (2*target)
branch: <= 0 -> continue; > 0 -> return

continue:
{ } = &   //last = curr
} = &     //curr = next


return:
{ } ! @   //print last

Diğer bazı posterlerde olduğu gibi, son ve akıntının orta noktası hedeften daha büyük olduğunda, ikisinin en küçüğünün en yakın veya en yakınına bağlı olduğunu fark ettim.

Orta nokta (son + curr) / 2'dir. Bir sonraki zaten en son + curr olduğundan ve bunun yerine hedef tamsayımızı 2 ile çarptığımız zaman kısaltabiliriz, yalnızca şunu kontrol etmemiz gerekir (sonraki - 2 * hedef)> 0, sonra sonuncu.


2

Brachylog , 22 bayt

;I≜-.∧{0;1⟨t≡+⟩ⁱhℕ↙.!}

Çevrimiçi deneyin!

Gerçekten burada yaptığım tek şey bir araya yapıştırmak Fatalize'in klasikliği En yakın asal sayı çözümünü ve benim kendime ait bir Fibonacci numarası mıyım? çözüm. Neyse ki, ikincisi çıkış değişkeninde zaten çalışıyor; Bu atar tek seçenek bir nokta bu nedenle, ne yazık ki, o da, + 2 bayt izole edilmesi gerekmektedir gerekli bir kesim içerir bırakarak sağlam.



1

Java 7, 244 234 Bayt

 String c(int c){for(int i=1;;i++){int r=f(i);int s=f(i-1);if(r>c && s<c){if(c-s == r-c)return ""+r+","+s;else if(s-c > r-c)return ""+r;return ""+s;}}} int f(int i){if(i<1)return 0;else if(i==1)return 1;else return f(i-2)+f(i-1);}

Neden Java 8 kullanıp bunu lambda yapmıyorsun? Ayrıca staticJava 7'ye bağlı kalmak istiyorsanız kaldırabilirsiniz .
Okx

Sen (Kodunuzdaki iki hata var r>c&&s<colmalıdır r>=c&&s<=c, s-colması gerektiği c-s, Sen boşluk, kullanımı gerekli değildir kaldırmak olabilir) int f(int i){return i<2?i:f(--i)+f(--i);}c üçlü operatör ile tek return deyiminin kullanılması ve için özel işlem kaldırmak c-s==r-cya değerini dönen izin verilir.
Nevay

@Nevay Hatayı görmüyorum, başarısız olmadan test ettim
0x45




1

Perl 6 , 38 bayt

{(0,1,*+*...*>$_).sort((*-$_).abs)[0]}

Dene

{   # bare block lambda with implicit parameter 「$_」

  ( # generate Fibonacci sequence

    0, 1,  # seed the sequence
    * + *  # WhateverCode lambda that generates the rest of the values
    ...    # keep generating until
    * > $_ # it generates one larger than the original input
           # (that larger value is included in the sequence)

  ).sort(           # sort it by
    ( * - $_ ).abs  # the absolute difference to the original input
  )[0]              # get the first value from the sorted list
}

Potansiyel bir hızlandırmak için .tail(2)önce ekleyin .sort(…).

Eşitlik durumunda, her zaman iki değerin küçüğüne döner, çünkü sortsabit bir sıralamadır. (aynı sıralamada iki değer sırasını korur)


1

Pyth, 19 bayt

JU2VQ=+Js>2J)hoaNQJ

Burada dene

açıklama

JU2VQ=+Js>2J)hoaNQJ
JU2                  Set J = [0, 1].
   VQ=+Js>2J)        Add the next <input> Fibonacci numbers.
              oaNQJ  Sort them by distance to <input>.
             h       Take the first.

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.