Fibonacci-sekvenssi on numerosarja, jossa jokainen luku järjestyksessä on sitä edeltävien kahden luvun summa. Sarjan kaksi ensimmäistä numeroa ovat molemmat 1.
Tässä ovat ensimmäiset termit
1 1 2 3 5 8 13 21 34 55 89 ...
Kirjoita lyhin koodi että joko:
-
Luo Fibonacci-sekvenssin ilman loppua.
-
Annettu
n
laskee sekvenssinn
kolmannen termin. (Joko 1 tai nolla indeksoitu)
Voit käyttää vakiomuotoisia syöttö- ja tulostusmuotoja.
(Annoin molemmat vaihtoehdot siinä tapauksessa, että yksi on helpompi tehdä valitsemallasi kielellä kuin toinen.)
Funktiolle, joka vie n
, kohtuullisen suuren palautusarvon (suurin Fibonacci-luku, joka on sopii tietokoneesi normaaliin sanakokoon vähintään) on tuettava.
Tulostaulukko
/* Configuration */ var QUESTION_ID = 85; // Obtain this from the url // It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 3; // This should be the user ID of the challenge author. /* App */ var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(";") + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = "<h1>" + c.body.replace(OVERRIDE_REG, "") + "</h1>"; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery("<a>"+lang+"</a>").text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1; if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }
body { text-align: left !important; display: block !important; } #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f"> <div> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody> </tbody> </table> </div> <div> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody> </tbody> </table> </div> <table style="display: none"> <tbody> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>
kommentit
- Odotan tavallaan vastausta, kuten " f ", 1 tavu, matematiikkaperusteisella golfkielelläni.
Vastaa
Perl 6, 10 merkkiä:
Nimetön ääretön fibonacci-sekvenssiluettelo:
^2,*+*...*
Sama kuin:
0, 1, -> $x, $y { $x + $y } ... Inf;
Voit siis määrittää sen matriisiin:
my @short-fibs = ^2, * + * ... *;
tai
my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;
Ja hae ensimmäiset yksitoista arvoa (0-10):
say @short-fibs[^11];
tai:
say @fibs[^11];
Odota, voit saada myös ensimmäiset 50 numeroa itse nimettömästä luettelosta:
say (^2,*+*...*)[^50]
Tämä palauttaa:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049
Ja yksinkertainen vertailuarvo:
real 0m0.966s user 0m0.842s sys 0m0.080s
Kanssa:
$ time perl6 -e "say (^2, *+* ... *)[^50]"
EOF
kommentit
- En edes ajattelisi '
^2
korvaa0,1
. +1 - Tämä ei ole enää voimassa, sinun on kirjoitettava se nimellä
|^2,*+*...*
, joka on sama määrä tavuja kuin0,1,*+*...*
. - Perl on niin outo.
- Mihin Perl 6 -versioon tämä vastaus kirjoitettiin?
- @CalculatorFeline Oli suuri muutos tunnetaan nimellä GLR (Great List Refactor), joka tapahtui vähän ennen ensimmäistä virallista julkaisua, joka oli 25.12.2015. Tämä koodi olisi toiminut siihen asti.
Vastaa
Brainfuck, 22 lyöntiä
+>++[-<<[->+>+<<]>>>+]
Luo Fibonacci-jakson, joka liikkuu vähitellen muistinauhan yli.
Kommentit
Vastaa
Haskell, 17 15 14 merkkiä
f=1:scanl(+)1f
Kommentit
- Miksi ei leikata kahta välilyöntiä
f=0:scanl(+)1 f
? - @Martinho: Muokattu, kiitos.
- Vau, että ' on jopa lyhyempi kuin tavallinen
f@(_:x)=0:1:zipWith(+)f x
! Täytyy muistaa se. - Voit jopa poistaa toisen välilyönnin:
f=0:scanl(+)1f
.
Vastaa
C # 4, 58 tavua
Stream (69; 65, jos kirjoitetaan heikosti IEnumerable
)
(Oletetaan using
-direktiivi System.Collections.Generic
.)
IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}
Yksi arvo (58)
int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}
Kommentit
- Koska
n
onuint
,n==0
voidaan lyhentää muotoonn<1
. Ja virta voi säästää muutaman merkin, kun ojitetaan tila geneerisen tyypin jälkeen ja ilmoitetaanx
laajemmalle alueelle kuin on tarpeen.Itse asiassa ojax
kokonaan:n+=c;c=n-c;
- @Peter: Kiitos, muokkaan, kun saan jonkin aikaa.
- Yksiarvoinen versiosi on niin kauan kuin rekursiivinen lambda-lauseke vastaa … mukavaa!
- @ wizzwizz4 jos en ' en väärin, jos
!n
toimii, niin niin pitäisi olla vainn
, jos käännät ehdollista. - @JonSkeet Aw. Ja tässä ajattelin, että ' lyöin Jon Skeetia C #: ssä 🙂
vastaus
GolfScript, 12
Nyt vain 12 merkkiä!
1.{[email protected]+.}do
Kommentit
- +1 mukavaa työtä. Jos teet sen lyhyemmäksi kuin 13 merkkiä, ' hyväksyn vastauksesi heti (ellei joku vastaa vieläkin lyhyempää vastausta). 😛
- Rakastan haastetta. Tehty! 😉
- Hienoa, voitat. Ainakin, kunnes joku tekee jotain vielä lyhyempää (jos se on ' mahdollista). 😛
- tämä määritelmä on melkein yhtä lyhyt kuin itse nimi ' Fibonacci '! +1
vastaus
J, 10 merkkiä
Sisäänrakennetun laskennan käyttö Taylor-sarjan kertoimet, joten ehkä vähän huijaavia. Opi sen täällä .
(%-.-*:)t. (%-.-*:)t. 0 1 2 3 4 5 10 100 0 1 1 2 3 5 55 354224848179261915075
Kommentit
- @aditsu
(q:^-^:p) 6
on64 729
missä p on tasainen. J on todennäköisesti hyvä mitä se tekee arvoituksille. 🙂 - Vielä parempi:
(<:^-^:>) 4
on81
ja<:^-^:> 4
on53.5982
. - Tässä osoitettu emoji on se, mihin kaikkien J-koodien tulisi pyrkiä. Sivuhuomautuksessa toinen vaihtoehto on
+/@:!&i.-
, jossa käytetään 9 tavua. - @miles Very nice! Sinun tulee lähettää se, koska se on täysin erilainen kuin minun.
Vastaa
> < > – 15 merkkiä
0:nao1v a+@:n:<o
Kommentit
- Vaikka voitkin lyhentää sen muotoon
0:nao1v LF a+@:n:<o
jos haluat. Antaa 15 🙂 Itse asiassa tämä tekee myös lähdön hieman luettavammaksi … - 13 merkkiä:
01r:nao$:@+$r
vastaus
kuusikulmio , 18 14 12
Kiitos Martin 6 tavusta!
1="/}.!+/M8;
Laajennettu:
1 = " / } . ! + / M 8 ; . . . . . . .
Vanha, vastaa. Tämä jätetään sisään, koska kuvat ja selitykset voivat olla hyödyllisiä uusille Hexagony-käyttäjille.
!).={!/"*10;$.[+{]
Laajennettu:
! ) . = { ! / " * 1 0 ; $ . [ + { ] .
Tämä tulostaa Fibonacci-sarjan uusilla viivoilla erotettuna.
Kokeile verkossa! Ole kuitenkin varovainen, online tulkki ei todellakaan pidä äärettömästä ulostulosta.
Selitys
Tässä ohjelmassa on kaksi ”aliohjelmaa”, joista kukin toimii yhdellä kahdesta käytetystä IP: stä. Ensimmäinen rutiini tulostaa uudet rivit , ja toinen suorittaa Fibonaccin laskennan ja tulostuksen.
Ensimmäinen aliohjelma alkaa ensimmäiseltä riviltä ja liikkuu koko ajan vasemmalta oikealle. Tulostaa ensin arvon muistiosoittimessa (alustetaan nollaan), ja lisää sitten muistiosoittimen arvoa 1
. Ei-op-toiminnon jälkeen IP hyppää kolmannelle riville, joka vaihtaa ensin toiseen muistisoluun ja tulostaa sitten uuden rivin. uudella rivillä on positiivinen arvo (sen arvo on 10), th e-koodi siirtyy aina seuraavaan viidenteen riviin. Viides rivi palauttaa muistiosoittimen Fibonacci-numerollemme ja vaihtaa sitten toiseen aliohjelmaan. Kun palaamme tästä aliohjelmasta, IP hyppää takaisin kolmannelle riville suorittaessaan ei-opin.
Toinen aliohjelma alkaa oikeasta yläkulmasta ja alkaa liikkua kaakkoon. Kieltäytymisen jälkeen meidät palautetaan matkustamaan länteen toista linjaa pitkin. Tämä rivi tulostaa nykyisen Fibonacci-numeron ennen muistiosoittimen siirtämistä seuraavaan sijaintiin. Sitten IP hyppää neljännelle riville, jossa se laskee seuraavan Fibonacci-numeron käyttämällä kahta edellistä. Sitten se antaa hallinnan takaisin ensimmäiseen alirutiiniin, mutta kun se saa takaisin ohjelman hallinnan, se jatkuu, kunnes se kohtaa hyppyn, jossa se hyppää yli peilin, jota alun perin käytettiin osoittamaan sitä länteen, kun se palaa toiselle riville.
Alustavat kauniit kuvat!
Kuvan vasen puoli on ohjelma, oikea puoli edustaa muistia. Sininen ruutu on ensimmäinen IP ja molemmat IP osoittavat seuraavaa suoritettavaa käskyä.
Huomaa: Kuvia voi näyttää kauniilta vain ihmisille, joilla on yhtä rajoitetusti taidot kuvankäsittelyohjelmissa: PI lisää vielä vähintään 2 iteraatiota, jotta *
-operaattorin käyttö selkeytyy.
Huomautus 2: Näin vasta alephalpha ”vastauksen kirjoitettuani suurimman osan tästä, ajattelin, että se oli edelleen arvokas erotuksen takia, mutta varsinainen Fibonacci osat ohjelmistamme ovat hyvin samankaltaisia. Lisäksi tämä on pienin Hexagony-ohjelma, jonka olen nähnyt käyttävän useampaa kuin yhtä IP-osoitetta, joten ajattelin, että on silti hyvä pitää joka tapauksessa: P
Kommentit
- Sinun tulee linkittää mihin tahansa tapaan, jolla teit kauniita kuvia, ja laita sitten linkki osoitteeseen esolangs.org/wiki/ Hexagony .
- @ mbomb007 Luoin gimpin avulla kukin kehys manuaalisesti, ja sitten lähetin kuvat joihinkin gi: iin f verkkosivujen tekeminen. Harkitsin useita kertoja prosessin aikana tehdä työkalun sen tekemiseen, ottaen huomioon kuinka tylsiä se oli.
- @FryAmTheEggman Vaikuttava! Tee siitä haaste. ' olen varma, että joku lähettää vastauksen. : D Vielä parempi, jos voisit luoda samanlaisen verkkosivuston kuin kala ' -tulkki.
- @ mbomb007 Se voi olla oivaltava kunnianhimoinen haaste tällä sivustolla , puhumattakaan siitä, että se todennäköisesti kärsisi paljon siitä, että se olisi todella laaja. En ' usko, että lähetän sen, mutta voit tehdä sen itse, jos luulet, että sinulla on hyvä tapa esittää se. Uskon myös, että Timwi loi C # ideen kuusikulmioon, vaikka en ' en ole koskaan käyttänyt sitä, koska en ole ' vaivautunut mustavalkoiseen.
- @ mbomb007 Ide asuu täällä , muuten, unohti linkittää sen viimeksi.
vastaus
COW , 108
MoO moO MoO mOo MOO OOM MMM moO moO MMM mOo mOo moO MMM mOo MMM moO moO MOO MOo mOo MoO moO moo mOo mOo moo
Vastaa
Python 2, 34 tavua
Python, käyttäen rekursiota … tässä tulee StackOverflow!
def f(i,j):print i;f(j,i+j) f(1,1)
Vastaa
Hyytelö , 3 tavua
+¡1
Kuinka se toimii
+¡1 Niladic link. No implicit input. Since the link doesn"t start with a nilad, the argument 0 is used. 1 Yield 1. + Add the left and right argument. ¡ For reasons‡, read a number n from STDIN. Repeatedly call the dyadic link +, updating the right argument with the value of the left one, and the left one with the return value.
‡ ¡
kurkistaa kahta linkkiä vasemmalle. Koska niitä on vain yksi, sen on oltava silmukan runko. Siksi luku luetaan syötteestä. Koska komentoriviargumentteja ei ole, luku luetaan STDIN: stä.
Vastaa
kuusikulmio , 6 tavua
Ei kilpaile, koska kieli on kysymystä uudempi.
1.}=+!
Ungleded:
1 . } = + ! .
Se tulostaa Fibonacci-sekvenssin ilman erottimia.
Kommentit
- Tässä on pieni ongelma, että se ei tulosta ' t erottimia numeroiden väliin. Tämä ei ole ' täsmälleen täsmälleen haasteessa. (Ja olen ' todella onnellinen, että joku käyttää kuusikulmiota. :))
Vastaa
Golfscript – yksi numero – 11/11/10
12 merkkiä stdin-syötteen ottamiseksi:
~0 1@{.@+}*;
11 merkkiä jo pinossa olevalle syötteelle:
0 1@{.@+}*;
10 merkkiä 1: n määrittelemiseksi edelleen 0. Fibonacci-numeroksi:
1.@{.@+}*;
kommentit
- Vaihtoehto on " Laskee n: n n: n Fibonacci-luvun ". Joten ojaa
~
ja sinulla on 11 merkkiä, jotka vievät pinoonn
ja jättävätF_n
pinossa.
Vastaa
Ruby
29 27 25 24 merkkiä
p a=b=1;loop{b=a+a=p(b)}
Muokkaa: teki siitä äärettömän silmukan. 😉
kommentit
- huomasi kukaan
b=a+a=b
on palindromi? 🙂 - kyllä st0le teki 🙂
- tiedän, että ' myöhään juhliin, mutta voisiko joku selittää, miten
b=a+a=b
osa toimii? Ei voi ' näyttää käärittävän pääni sen ympärille. - @GigaWatt, Ajattele sitä tällä tavalla, ohjeet suoritetaan vasemmalta oikealle …joten
newb=olda+(a=oldb)
- voit tallentaa kaksi merkkiä käyttämällä
loop
:p 1,a=b=1;loop{p b=a+a=b}
vastaus
DC (20 tavua)
Bonuksena se ”s jopa hämmentynyt;)
zzr[dsb+lbrplax]dsax
MUOKKAA: Voin huomauttaa, että se tulostaa kaikki fibonacci-sarjan numerot, jos odotat tarpeeksi kauan.
Kommentit
- En halua ' t kutsua sitä hämärtyneeksi – hämmentyneeksi koodiksi oletetaan olevan vaikea ymmärtää, ja niin pitkälle kuin dc menee, koodi on tässä täysin yksinkertainen.
Vastaa
Mathematica, 9 merkkiä
Fibonacci
Jos sisäänrakennettuja toimintoja ei sallita, tässä on nimenomainen ratkaisu:
Mathematica, 33 32 31 merkkiä
#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Kommentit
-
#&@@Nest[{#+#2,#}&@@#&,{0,1},#]&
32 merkkiä. - @chyanog 31:
#&@@Nest[{+##,#}&@@#&,{0,1},#]&
- @ Mr.Wizard 24 merkkiä (26 tavua):
Round[GoldenRatio^#/√5]&
- tai 23 merkkiä (27 tavua):
Round[((1+√5)/2)^#/√5]&
vastaus
Prelude , 12 tavua
Yksi harvoista haasteista, joissa Prelude on todella kilpailukykyinen:
1(v!v) ^+^
Tämä vaatii Python-tulkin , joka tulostaa arvot desimaalilukuina merkkien sijaan.
Selitys
Alkusanassa kaikki rivit suoritetaan rinnakkain, käskyosoittimen kulkiessa ohjelman sarakkeita. Jokaisella rivillä on oma pino, joka alustetaan nollaan.
1(v!v) ^+^ | Push a 1 onto the first stack. | Start a loop from here to the closing ). | Copy the top value from the first stack to the second and vice-versa. | Print the value on the first stack, add the top two numbers on the second stack. | Copy the top value from the first stack to the second and vice-versa.
Silmukka toistuu ikuisesti, koska ensimmäisen pinon yläosassa ei koskaan ole 0
.
Huomaa, että tämä aloittaa Fibonacci-sekvenssin kohdasta 0
.
Vastaa
TI-BASIC, 11
Legendaarinen TI-BASIC-golfaaja Kenneth Hammond (”Weregoose”), tältä sivustolta . Toimii O (1) -ajalla ja pitää 0: ta Fibonacci-sekvenssin 0. terminä.
int(round(√(.8)cosh(Anssinh‾¹(.5
Käyttö:
2:int(round(√(.8)cosh(Anssinh‾¹(.5 1 12:int(round(√(.8)cosh(Anssinh‾¹(.5 144
Kuinka tämä toimii? Jos teet matematiikan, käy ilmi, että sinh‾¹(.5)
on yhtä suuri kuin ln φ
, joten se on muokattu Binet-kaavan versio, joka pyöristää alaspäin (1/φ)^n
-korjauksen sijaan. round(
(pyöristetään 9 desimaaliin) tarvitaan pyöristysvirheiden estämiseksi.
Vastaa
K – 12
Laskee n
ja n-1
Fibonacci-numeron.
{x(|+\)/0 1}
Vain nth
Fibonacci-numero.
{*x(|+\)/0 1}
Kommentit
- +1 Ei paha! Jos pystyt kutistamaan sen vain yhdeksi merkiksi (ja tarjoamaan minulle tapaa testata sitä), hyväksyn vastaukseni '. 🙂
- Ainoa tapa pienentää sitä olisi korvata funktio kutsulla tunnetulle numerolle: n (| + \ ) / 0 1 Testaa se käyttämällä tätä tulkkia .
Vastaa
Java, 55
En voi kilpailla useimpien kielten ytimekkyyden kanssa, mutta voin tarjota olennaisesti toisenlaisen ja mahdollisesti paljon nopeamman (vakioajan) tavan laskea n: s numero:
Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))
n
on tulo (int tai pitkä) alkaen n = 1. Se käyttää Binetin kaava ja pyöristetään vähennyksen sijasta.
Kommentit
- Rakastan tämä ratkaisu
- Tämä ' ei näytä toimivan minulle, mutta se ' on varhaisessa vaiheessa ja olen ehkä jos jotain puuttuu! Oletetaan, että
0
on sekvenssin ensimmäinen numero, mikä antaa0, 0, 1, 1, 3, 4, 8, 12, 21, 33
kuusille t 10 numeroa - @Shaggy Hups! Valitettavasti esitin virheen – korjattu nyt.
Vastaa
Julia, 18 tavua
n->([1 1;1 0]^n)[]
vastaus
Dodot , 26 tavua
dot F F F dip F dip dip
Kuinka se toimii
Toiminto F tekee kaiken raskaan nostamisen; se määritetään rekursiivisesti seuraavasti.
F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )
Aina kun n> 1 | n – 1 | = n – 1 < n ja || n – 1 | – 1 | = | n – 1 – 1 | = n – 2 < n , joten funktio palauttaa (F (n – 1), F (n – 2)) .
Jos n = 0 , sitten | n – 1 | = 1> 0 ; jos n = 1 , niin || n – 1 | – 1 | = | 0 – 1 | = 1 = 1 . Molemmissa tapauksissa rekursiiviset puhelut F (1) herättävät luopuminen -poikkeuksen, joten F (0) palauttaa 0 ja F (1) palauttaa 1 .
Esimerkiksi F (3) = (F (1), F (2)) = (1 , F (0), F (1)) = (1, 0, 1) .
Lopuksi main -funktio määritellään nimellä
main(n) = sum(F(n))
joten se laskee yhteen kaikki palautetun vektorin koordinaatit kirjoittanut F .
Esimerkiksi main (3) = summa (F (3)) = summa (1, 0, 1) = 2 .
Kommentit
- Luin README-tiedostosi (DODOS) ja olen erittäin kiinnostunut; se on todella siisti konsepti! Mutta en löydä sitä Esolangsista tai mistään muualta. Tulitko keksimään sen?
Vastaa
Rubiini, 25 merkkiä
st0le ”vastausta lyhennettiin.
p 1,a=b=1;loop{p b=a+a=b}
Kommentit
- Itse asiassa voit lyhentää sitä entisestään käyttämällä
a=b=1;loop{p a;b=a+a=b}
- Joten estät hänen vastauksensa: P
Vastaa
FAC: Toimiva APL, 4 merkkiä (!!)
Ei minun, siksi lähetetty yhteisöwikiksi. FAC on APL: n murre, jonka Hai-Chen Tu ilmeisesti ehdotti väitöskirjaansa vuonna 1985. Hän kirjoitti myöhemmin yhdessä Alan J. Perlisin kanssa artikkelin nimeltä ” FAC: toiminnallinen APL-kieli ”. Tämä APL: n murre käyttää ”laiska matriiseja” ja Salli äärettömän matriisit. Se määrittelee operaattorin ”iter” (⌼
), jotta tietyt rekursiiviset sekvenssit voidaan määritellä kompaktisti.
Monadic (”unary ”) -tapa ⌼
on periaatteessa Haskell” s , ja se määritellään nimellä (F⌼) A ≡ A, (F A), (F (F A)), …
. Diadinen (”binaarinen”) tapaus määritellään jonkin verran analogisesti kahdelle muuttujalle: A (F⌼) B ≡ A, B, (A F B), (B F (A F B)), …
. Miksi tämä on hyödyllistä? No, kuten käy ilmi, tämä on juuri sellainen toistuminen, jolla Fibonacci-sekvenssi on. Itse asiassa yksi siitä annetuista esimerkeistä on
1+⌼1
tutun sekvenssin tuottaminen 1 1 2 3 5 8 …
.
Joten, tässä on, mahdollisimman lyhyt Fibonacci-toteutus ei-uutuusohjelmointikielellä. : D
kommentit
- Voi, olen vahingossa poistanut yhteisöstä wikisen viestisi osana (manuaalista) joukkoviestintäni. Noh. 😉
vastaus
R, 40 tavua
Haven ei ole nähnyt R-ratkaisu, joten:
f=function(n)ifelse(n<3,1,f(n-1)+f(n-2))
kommentit
- Tiedän, että tämä on vanha vastaus, mutta sinä voi lyhentää 38 tavua
vastaus
05AB1E, 7 tavua
Koodi:
1$<FDr+
Kommentit
- Hei, tervetuloa PPCG: hen! Hieno ensimmäinen viesti!
Vastaus
Vastaa
Desmos , 61 tavua
golfia
Napsauta add slider
-painike mallille n
.
p=.5+.5\sqrt{5} n=0 f=5^{-.5}\left(p^n-\left(-p\right)^{-n}\right)
Viimeinen rivi on tulos.
Ungolfed
Onko funktio.
\phi =\frac{1+\sqrt{5}}{2} f_{ibonacci}\left(n\right)=\frac{\phi ^n-\left(-\phi \right)^{-n}}{\sqrt{5}}
vastaus
Cubix , 10 tavua
Ei kilpaileva vastaus, koska kieli on kysymystä uudempi.
Cubix on uusi 2-ulotteinen kieli, jonka on kirjoittanut @ETHproductions, kun koodi on kääritty sopivaan kokoiseen kuutioon.
;.o.ON/+!)
Tämä kietoutuu 2 x 2 kuutio seuraavalla tavalla
; . o . O N / + ! ) . . . . . . . . . . . . . .
-
O
antaa TOS: n arvon -
N
työnnä uusi rivi pinoon -
/
heijastavat pohjoista -
o
tulosta TOS-merkki -
;
pop TOS -
/
heijastavat itää kuution kiertämisen jälkeen -
+
lisää pinon 2 ylin arvoa -
!
ohita seuraava komento, jos TOS on 0 -
)
lisää TOS: ta 1. Tämä käynnistää sekvenssin olennaisesti.
Tämä on loputon silmukka, joka tulostaa sekvenssin uuden rivin erottimella. Siinä hyödynnetään sitä, että useimmat komennot eivät tue arvoja pinosta.
Jos erotinta ei oteta huomioon, se voidaan tehdä 5 tavulla .O+!)
Vastaa
Brainfuck, 16,15, 14/13 merkkiä
+[[->+>+<<]>]
Luo Fibonacci-sekvenssin eikä tulosta mitään. Lisäksi se on lyhyempi kuin yllä oleva.
+[.[->+>+<<]>]
Tämä yhdessä on 14 merkkiä, mutta se tulostaa ASCII-merkit Fibonacci-sarjan arvoilla.
Kommentit
- Tämä on hyvä, mutta olenko väärä sanomalla, että 14-tavuinen versio tuottaa vain toisesta 1: stä? Kuten " 1 2 3 5 8 " " 1 1 2 3 5 8 "?
- @Charlim Voi sinä ' olen oikeassa. Minulla ei ole aavistustakaan, mitä minä vuodelta 2014 ajattelin. Joka tapauksessa korjasin sen vain movilla tulostusohjeet silmukan etuosaan.
+[[<+>->+>+<<]>]
+[.[>+>+<<-]>]