Skip to content

Instantly share code, notes, and snippets.

@andreapavoni
Created January 9, 2012 08:42
Show Gist options
  • Save andreapavoni/1581987 to your computer and use it in GitHub Desktop.
Save andreapavoni/1581987 to your computer and use it in GitHub Desktop.
therubygame palindrome solution
def find_longest_palindrome(string)
(string.size/2).downto(1) do |n|
if m = string.match(Regexp.new("#{'(.)' * (n+1)}?\\#{n.downto(1).to_a.join('\\')}"))
return m
end
end
end
@dhedlund
Copy link

Wow, I didn't realise Ruby supported backrefs > 9. Anyway, it looks like your code might be failing on longer strings. I was able to get it to fail with runtime errors for two different reasons depending on the version of Ruby used:

Code to exercise the failure:

(1..1000).each do |i|
  s = "a" * i
  puts "#{i}: #{find_longest_palindrome(s)}"
end

Ruby 1.9.{2,3}

 ...
398: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
399: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
./test.rb:5:in `initialize': invalid multibyte escape: /(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)?\200\199\198\197\196\195\194\193\192\191\190\189\188\187\186\185\184\183\182\181\180\179\178\177\176\175\174\173\172\171\170\169\168\167\166\165\164\163\162\161\160\159\158\157\156\155\154\153\152\151\150\149\148\147\146\145\144\143\142\141\140\139\138\137\136\135\134\133\132\131\130\129\128\127\126\125\124\123\122\121\120\119\118\117\116\115\114\113\112\111\110\109\108\107\106\105\104\103\102\101\100\99\98\97\96\95\94\93\92\91\90\89\88\87\86\85\84\83\82\81\80\79\78\77\76\75\74\73\72\71\70\69\68\67\66\65\64\63\62\61\60\59\58\57\56\55\54\53\52\51\50\49\48\47\46\45\44\43\42\41\40\39\38\37\36\35\34\33\32\31\30\29\28\27\26\25\24\23\22\21\20\19\18\17\16\15\14\13\12\11\10\9\8\7\6\5\4\3\2\1/ (RegexpError)
    from ./test.rb:5:in `new'
    from ./test.rb:5:in `block in find_longest_palindrome'
    from ./test.rb:4:in `downto'
    from ./test.rb:4:in `find_longest_palindrome'
    from ./test.rb:13:in `block in <main>'
    from ./test.rb:11:in `each'
    from ./test.rb:11:in `<main>'

Ruby 1.8.7

...
504: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
505: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
./test.rb:5:in `initialize': regular expression too big: /(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)?\253\252\251\250\249\248\247\246\245\244\243\242\241\240\239\238\237\236\235\234\233\232\231\230\229\228\227\226\225\224\223\222\221\220\219\218\217\216\215\214\213\212\211\210\209\208\207\206\205\204\203\202\201\200\199\198\197\196\195\194\193\192\191\190\189\188\187\186\185\184\183\182\181\180\179\178\177\176\175\174\173\172\171\170\169\168\167\166\165\164\163\162\161\160\159\158\157\156\155\154\153\152\151\150\149\148\147\146\145\144\143\142\141\140\139\138\137\136\135\134\133\132\131\130\129\128\127\126\125\124\123\122\121\120\119\118\117\116\115\114\113\112\111\110\109\108\107\106\105\104\103\102\101\100\99\98\97\96\95\94\93\92\91\90\89\88\87\86\85\84\83\82\81\80\79\78\77\76\75\74\73\72\71\70\69\68\67\66\65\64\63\62\61\60\59\58\57\56\55\54\53\52\51\50\49\48\47\46\45\44\43\42\41\40\39\38\37\36\35\34\33\32\31\30\29\28\27\26\25\24\23\22\21\20\19\18\17\16\15\14\13\12\11\10\9\8\7\6\5\4\3\2\1/ (RegexpError)
    from ./test.rb:5:in `new'
    from ./test.rb:5:in `find_longest_palindrome'
    from ./test.rb:4:in `downto'
    from ./test.rb:4:in `find_longest_palindrome'
    from ./test.rb:13
    from ./test.rb:11:in `each'
    from ./test.rb:11

@andreapavoni
Copy link
Author

Argh! thank you for the explanation. For ruby 1.9.x looks like it's a sort of bug (even if I know it's almost weird to use very long regex). I know it's not as fast as other ways, but it was fun to test alternatives ;)

cheers!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment