We're a place where coders share, stay up-to-date and grow their careers.
It doesn't need to be pretty! As long as it does the job right? It was a fun exercise. Here is mine in Ruby:
require 'benchmark' class PasswordPolicy def self.from_line(line) length, char, password = line.split(' ') first, second = length.split('-').map(&:to_i) char = char.delete(':') PasswordPolicy.new(positions: [first - 1, second - 1], char: char, password: password) end def initialize(positions:, char:, password:) self.positions = positions self.char = char self.password = password end def valid? positions.count { |i| password[i] == char } == 1 end private attr_accessor :positions, :char, :password end lines = File.readlines('input.txt') valids = 0 Benchmark.bm do |x| x.report do valids = lines.count do |line| PasswordPolicy.from_line(line).valid? end end end puts valids
And for comparison, here is the inlined version:
entries = File.readlines('input.txt').map do |line| positions, char, password = line.split left, right = positions.split(?-).map(&:to_i) [left, right, char.first, password.chomp] } puts entries.count do |left, right, char, password| (password[left - 1] == char) != (password[right - 1] == char) }
It doesn't need to be pretty! As long as it does the job right? It was a fun exercise. Here is mine in Ruby:
And for comparison, here is the inlined version: