in reply to Read file text and find fibonacci series

This appears to have been posted to Meditations, but I'm not sure if you meant it to be a question? Anyway, you're describing scanning a string looking for a pattern, which is exactly what regular expressions are good at. Ignoring the duplicate 1's, there are only 29 Fibonacci numbers with 1 to 6 digits, a regex can handle that just fine (and it would have no problem handling much more). See Building Regex Alternations Dynamically.

This code can handle huge numbers too, try changing $DIGITS to e.g. 60. And note that you can use the same regex to find sequences of numbers, e.g. (?:$re){3,} (although that doesn't check if they are consecutive in the sequence).

#!/usr/bin/env perl use warnings; use strict; my $DIGITS = 6; my %fib; { use bigint; for ( my ($f,$t)=(1,1); length($f)<=$DIGITS; ($f,$t)=($t,$f+$t) ) { my $s = "$f"; $fib{$s} = [$s]; while (length $s > 1) { chop $s; push @{$fib{$f}}, $s if exists $fib{$s}; } } } #use Data::Dump; dd \%fib; print "There are ",0+keys(%fib)," fibs with up to $DIGITS digits\n"; my ($re) = map {qr/$_/} join '|', map {quotemeta} sort { length $b <=> length $a or $b cmp $a } keys %fib; print "$re\n"; while (<DATA>) { chomp; print "Searching '$_'\n"; while (/(?=($re))./g) { print "Found ",join(', ',@{$fib{$1}})," at ",$-[0],"\n"; } } __DATA__ 496934634523123433886451447233402467622113 690168906931029935139391829792095612517948949963798093315456

Update: You appear to have edited your node to remove its content, please see How do I change/delete my post? for why you shouldn't do that. Content restored, thanks Athanasius. Also made very minor fixups.

Replies are listed 'Best First'.
Re^2: Read file text and find fibonacci series
by vr (Curate) on Jan 03, 2018 at 00:01 UTC

    Hi, haukex.

    while (/(?=($re))./g) { ... }

    "Look for a fib anywhere ahead, then if found, consume its leftmost digit, then repeat" probably makes no sense, even for this assignment/homework. The %fib was built but not actually used. The "3 element" part of assignment (not addressed in your code) could be either consecutive, or just ascending fibs. But, the way %fib was constructed, it may be to help looking for a fib whose initial digits are a fib too, whose initial digits, ..., etc. While leftmost digit of any 2-digit fib is a fib, -- I wonder if any value of %fib could be an array with more than 3 elements? :)

    P.S. Please, I'm not appealing to rewrite anything, don't waste your time, the task is too much unclear.

    P.P.S. And, I suspect the "PERFECT SQUARE" in OP, in C, won't work for 6-digit numbers and int type, because of overflow?

      The %fib was built but not actually used.

      Well not quite, it is used for what you said:

      to help looking for a fib whose initial digits are a fib too

      This is what I was using it for, since I didn't feel like getting too fancy with the regex. The code I wrote was mostly just an implementation of my interpretation of the description the OP gave:

      "Check 4 is fibonacci number , no , go ahaed 49 is fibonacci number , no, next 496 is fibonacci ,no, 4969 after 44693 [sic] ,after 496934 no.There isnt any fibonacci , go to next digit and do it again 9 , 96,969,9693,96934."
      I wonder if any value of %fib could be an array with more than 3 elements?

      Good question, I didn't try cranking up $DIGITS past 60 yet...

      the task is too much unclear

      Agreed, which is why I just implemented the part I (thought I) understood ;-)