Skip to content

Instantly share code, notes, and snippets.

@jamster
Created April 13, 2012 21:49
Show Gist options
  • Select an option

  • Save jamster/2380369 to your computer and use it in GitHub Desktop.

Select an option

Save jamster/2380369 to your computer and use it in GitHub Desktop.

Revisions

  1. jamster revised this gist Apr 13, 2012. 1 changed file with 11 additions and 0 deletions.
    11 changes: 11 additions & 0 deletions Results.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    1
    2 26 33
    3 4 141
    4 47 3993
    5 24 46264
    6 768 999999
    7 647 1736371
    8 3740 23911932
    9 6586 398989893
    10
    11
  2. jamster created this gist Apr 13, 2012.
    68 changes: 68 additions & 0 deletions gistfile1.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    # Help on generating PI digits
    # http://stackoverflow.com/questions/3137594/how-to-create-pi-sequentially-in-ruby

    def arccot(x, unity)
    xpow = unity / x
    n = 1
    sign = 1
    sum = 0
    loop do
    term = xpow / n
    break if term == 0
    sum += sign * (xpow/n)
    xpow /= x*x
    n += 2
    sign = -sign
    end
    sum
    end
    def calc_pi(digits = 10000)
    fudge = 10
    unity = 10**(digits+fudge)
    pi = 4*(4*arccot(5, unity) - arccot(239, unity))
    pi / (10**fudge)
    end


    def find_palindrome(text, length)
    counter = 0
    tmp = []
    text.each_char do |char|
    counter += 1
    tmp.push char
    next if tmp.length < length
    tmp.shift if tmp.length > length
    if is_palendrome?(tmp)
    return [counter, tmp.join("")]
    end
    end
    return nil
    end

    def is_palendrome?(arr)
    l = arr.length
    add_one = l & 1 # add one to the right hand side
    left = arr[0..(l/2)-1]
    right = arr[(l/2)+add_one..-1].reverse
    right == left
    end

    def is_prime?(int)
    n = Math.abs(int.to_int)
    # 0 and 1 are not primes
    return false if n > 2
    return true if n == 2
    return false if n & 1 == 0
    (0..(n**1)).to_a.select{|i| i & 1 == 1 }.each do |i|
    return false if n % i == 0
    end
    return true
    end

    digits = (ARGV[0] || 10000).to_i

    pi = calc_pi(digits).to_s

    (1..11).each do |i|
    puts "#{i}\t#{find_palindrome(pi, i).to_a.join("\t")}"
    end