Skip to content

Instantly share code, notes, and snippets.

@djmetzle
Created July 1, 2018 02:15
Show Gist options
  • Save djmetzle/f45baa84ef21ca99183eec8429827f71 to your computer and use it in GitHub Desktop.
Save djmetzle/f45baa84ef21ca99183eec8429827f71 to your computer and use it in GitHub Desktop.
Recaman Sequence Generator
#!/usr/bin/ruby
# Recaman Sequence Generator
HIEGHT=2160
WIDTH=3840
SVG_PREAMBLE = <<~HEREDOC
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="#{WIDTH}px" height="#{HIEGHT}px" viewBox="-1 #{-1 * HIEGHT / 2} #{WIDTH} #{HIEGHT }"
xmlns="http://www.w3.org/2000/svg" version="1.1">
HEREDOC
SVG_FOOTER = <<~HEREDOC
</svg>
HEREDOC
MAX_SEQUENCE_VALUE = 1000000
$current_number = 0
$current_step = 1
$visted_numbers = []
$visted_numbers[0] = true
def iterate_sequence
if can_go_back?
$current_number -= $current_step
$visted_numbers[$current_number] = true
else
$current_number += $current_step
$visted_numbers[$current_number] = true
end
$current_step += 1
end
def can_go_back?
return false if $current_number - $current_step <= 0
return false if $visted_numbers[$current_number - $current_step]
return true
end
puts SVG_PREAMBLE
$last_delta_negative = false
$flag = 0
def flip_flag
if $flag == 0
$flag = 1
else
$flag = 0
end
end
while $current_number < MAX_SEQUENCE_VALUE
last_value = $current_number
iterate_sequence
delta = $current_number - last_value
if delta > 0
unless $last_delta_negative
flip_flag
end
$last_delta_negative = false
else
if $last_delta_negative
flip_flag
end
$last_delta_negative = true
end
puts <<~HEREDOC
<path d="M#{last_value},0 a0.5,0.5 90 0,#{$flag} #{delta},0" fill="none" stroke="black" stroke-width="0.5" />"
HEREDOC
end
puts SVG_FOOTER
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment