Advertisement
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.83 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(
  14.           thirty_six_bit(instruction.split[0])
  15.         ).map! { |address| address.to_i(2) }
  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.     partial_address = partially_masked(address).chars
  52.     addresses = []
  53.     bits_list = bit_combinations(@bitmask.count('X'))
  54.  
  55.     bits_list.each do |bits|
  56.       current_address = ''
  57.       bits = bits.chars
  58.       x_index = 0
  59.       partial_address.each do |bit|
  60.         if bit == 'X'
  61.           current_address += bits[x_index]
  62.           x_index += 1
  63.         else
  64.           current_address += bit
  65.         end
  66.       end
  67.       addresses.append(current_address)
  68.     end
  69.     addresses
  70.   end
  71.  
  72.   def bit_combinations(bits)
  73.     combinations = []
  74.     (2**bits).times do |number|
  75.       combinations.append(
  76.         number
  77.         .to_s(2)
  78.         .rjust(bits, '0')
  79.       )
  80.     end
  81.     combinations
  82.   end
  83. end
  84.  
  85. computer = FerryComputer.new
  86.  
  87. computer.load_from_file('input')
  88.  
  89. computer.run
  90.  
  91. puts computer.sum_memory
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement