#!/usr/bin/sed -f
# Script to do a weird thing asked for on IRC:
# output lines
# 3 5 7 9 13 35 57 79 135 357 579 1357 3579 13579
# a broken, weird sequence.
# insane version.
# We split up the hold space into several fields, it looks like:
# aaa-bb:ccccccc
# where aaa counts the number of digits at which we are in the sequence (3),
# bb counts the number of sequence members of this amount of digits we still have (2)
# and the c's count the number of lines until the next line to be printed.
# Initialization
1 {
s/.*/a-bbbb:cc/
h
d
}
x
s/c//
/:$/ ! {
x
d
}
# Yay, we need to print this line. Fun starts here.
s/b//
# Do we need to skip to the next higher-digit number?
/-:/ b muchinc
# else
# This loop is run as many times as we have a's
:addcs
s/a/A/
# c += 2
s/$/cc/
/a/ {
# c *= 10
# Is \{1,\} posix RE?
s/c\{1,\}/&&&&&&&&&&/
b addcs
}
s/A/a/g
# Phew, done.
x
b
# Done? Not quite. We still have to clobber the case of higher-digit.
:muchinc
s/^/a/
# Stop if we're getting out of range
/^aaaaaa/ {
x
q
}
# First, the easy part. Reinitialize number of b's.
# This is 6 - number of a's.
s/-:/-bbbbbb:/
:loop
s/a\(A*\)-b/A\1-/
tloop
s/A/a/g
# Now, the really fun part. At a number-of-digits change, we need to skip
# first 3, then 55, then 777, then 9999 lines.
# We use A->E to track how often we need to multiply by 10
# minus one. Think about it.
s/a/E/
# a/e times, c += 2
:compc
# e is the new a.
s/$/cc/
/a/ {
s/a/A/
b compc
}
/e/ {
s/e/E/
b compc
}
# minus one. Gets us 3/5/7/9.
s/c$//
s/E/e/g
s/A/a/g
s/a/E/
/a/ {
s/c\{1,\}/&&&&&&&&&&/
b compc
}
# End of loop.
s/[eE]/a/g
# Add one for the line we just printed.
s/$/c/
# Ooohkay. We should be all set.
x
b