Guest User

Untitled

a guest
Dec 14th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.71 KB | None | 0 0
  1. class FerryComputer
  2.   def initialize(program = [])
  3.     @program = program
  4.     @mem = {}
  5.     @bitmask = []
  6.   end
  7.  
  8.   def run
  9.     @program.each do |instruction|
  10.       if instruction.start_with? 'mask'
  11.         @bitmask = instruction.split[2].chars
  12.       else
  13.         addresses = address_combinations(thirty_six_bit(instruction.split[0]))
  14.                     .map! { |address| address.to_i(2) }
  15.  
  16.         addresses.each do |address|
  17.           @mem[address.to_i] = instruction.split[2].to_i
  18.         end
  19.       end
  20.     end
  21.   end
  22.  
  23.   def load_from_file(filename)
  24.     @program = File.readlines(filename, chomp: true)
  25.   end
  26.  
  27.   def sum_memory
  28.     @mem.values.sum
  29.   end
  30.  
  31.   private
  32.  
  33.   def thirty_six_bit(value)
  34.     value.scan(/\d*/)
  35.          .join
  36.          .to_i
  37.          .to_s(2)
  38.          .rjust(36, '0')
  39.   end
  40.  
  41.   def partially_masked(address)
  42.     @bitmask.each_with_index do |bit, index|
  43.       next if bit == '0'
  44.  
  45.       address[index] = bit
  46.     end
  47.     address
  48.   end
  49.  
  50.   def address_combinations(address)
  51.     addresses = []
  52.     address = partially_masked(address)
  53.     bits_list = %w[0 1].repeated_permutation(address.count('X')).to_a
  54.  
  55.     bits_list.each do |bits|
  56.       addresses.append(floating_bitmasked_address(address, bits))
  57.     end
  58.     addresses
  59.   end
  60.  
  61.   def floating_bitmasked_address(address, bits)
  62.     current_address = ''
  63.     x_index = 0
  64.     address.chars.each do |current_bit|
  65.       if current_bit == 'X'
  66.         current_address += bits[x_index]
  67.         x_index += 1
  68.       else
  69.         current_address += current_bit
  70.       end
  71.     end
  72.     current_address
  73.   end
  74. end
  75.  
  76. computer = FerryComputer.new
  77.  
  78. computer.load_from_file('input')
  79.  
  80. computer.run
  81.  
  82. puts computer.sum_memory
Advertisement
Add Comment
Please, Sign In to add comment