def lfsr(taps, fb, value, steps, t = 0)
return if t > steps
val = value.chars.map(&:to_i)
puts "#{t} #{val.join}"
val.unshift(feedback(val, taps, fb)).pop
lfsr(taps, fb, val.join, steps, t + 1)
end
def feedback(val, taps, fb)
sel = ->(val, taps) { val.select.with_index { |v, idx| taps.include?(idx) } }
return sel[val, taps].reduce { |t, v| t ^ v } if fb == 'XOR'
return sel[val, taps].reduce { |t, v| 1 - (t ^ v) } if fb == 'XNOR'
raise ArgumentError.new('Invalid feedback')
end
lfsr([0,2], 'XOR', '001', 7)
lfsr([0,2], 'XNOR', '001', 7)
lfsr([1,2,3,7], 'XOR', '00000001', 16)
lfsr([1,5,6,31], 'XOR', '00000000000000000000000000000001', 16)
ZGVmIGxmc3IodGFwcywgZmIsIHZhbHVlLCBzdGVwcywgdCA9IDApCiAgcmV0dXJuIGlmIHQgPiBzdGVwcwogIHZhbCA9IHZhbHVlLmNoYXJzLm1hcCgmOnRvX2kpCiAgcHV0cyAiI3t0fSAje3ZhbC5qb2lufSIKICB2YWwudW5zaGlmdChmZWVkYmFjayh2YWwsIHRhcHMsIGZiKSkucG9wCiAgbGZzcih0YXBzLCBmYiwgdmFsLmpvaW4sIHN0ZXBzLCB0ICsgMSkKZW5kCgpkZWYgZmVlZGJhY2sodmFsLCB0YXBzLCBmYikKICBzZWwgPSAtPih2YWwsIHRhcHMpIHsgdmFsLnNlbGVjdC53aXRoX2luZGV4IHsgfHYsIGlkeHwgdGFwcy5pbmNsdWRlPyhpZHgpIH0gfQogIHJldHVybiBzZWxbdmFsLCB0YXBzXS5yZWR1Y2UgeyB8dCwgdnwgdCBeIHYgfSBpZiBmYiA9PSAnWE9SJwogIHJldHVybiBzZWxbdmFsLCB0YXBzXS5yZWR1Y2UgeyB8dCwgdnwgMSAtICh0IF4gdikgfSBpZiBmYiA9PSAnWE5PUicKICByYWlzZSBBcmd1bWVudEVycm9yLm5ldygnSW52YWxpZCBmZWVkYmFjaycpCmVuZAoKbGZzcihbMCwyXSwgJ1hPUicsICcwMDEnLCA3KQpsZnNyKFswLDJdLCAnWE5PUicsICcwMDEnLCA3KQpsZnNyKFsxLDIsMyw3XSwgJ1hPUicsICcwMDAwMDAwMScsIDE2KQpsZnNyKFsxLDUsNiwzMV0sICdYT1InLCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCAxNik=