fork download
  1. def lfsr(taps, fb, value, steps, t = 0)
  2. return if t > steps
  3. val = value.chars.map(&:to_i)
  4. puts "#{t} #{val.join}"
  5. val.unshift(feedback(val, taps, fb)).pop
  6. lfsr(taps, fb, val.join, steps, t + 1)
  7. end
  8.  
  9. def feedback(val, taps, fb)
  10. sel = ->(val, taps) { val.select.with_index { |v, idx| taps.include?(idx) } }
  11. return sel[val, taps].reduce { |t, v| t ^ v } if fb == 'XOR'
  12. return sel[val, taps].reduce { |t, v| 1 - (t ^ v) } if fb == 'XNOR'
  13. raise ArgumentError.new('Invalid feedback')
  14. end
  15.  
  16. lfsr([0,2], 'XOR', '001', 7)
  17. lfsr([0,2], 'XNOR', '001', 7)
  18. lfsr([1,2,3,7], 'XOR', '00000001', 16)
  19. lfsr([1,5,6,31], 'XOR', '00000000000000000000000000000001', 16)
Success #stdin #stdout 0.02s 6160KB
stdin
Standard input is empty
stdout
0 001
1 100
2 110
3 111
4 011
5 101
6 010
7 001
0 001
1 000
2 100
3 010
4 101
5 110
6 011
7 001
0 00000001
1 10000000
2 01000000
3 10100000
4 11010000
5 01101000
6 00110100
7 00011010
8 10001101
9 11000110
10 11100011
11 11110001
12 01111000
13 10111100
14 01011110
15 00101111
16 00010111
0 00000000000000000000000000000001
1 10000000000000000000000000000000
2 01000000000000000000000000000000
3 10100000000000000000000000000000
4 01010000000000000000000000000000
5 10101000000000000000000000000000
6 01010100000000000000000000000000
7 00101010000000000000000000000000
8 10010101000000000000000000000000
9 11001010100000000000000000000000
10 01100101010000000000000000000000
11 00110010101000000000000000000000
12 10011001010100000000000000000000
13 01001100101010000000000000000000
14 00100110010101000000000000000000
15 00010011001010100000000000000000
16 10001001100101010000000000000000