diff --git a/2016/ruby/day_21.rb b/2016/ruby/day_21.rb index 8b9c137..d24f75f 100644 --- a/2016/ruby/day_21.rb +++ b/2016/ruby/day_21.rb @@ -1,37 +1,48 @@ -input = 'abcdefgh' -ARGF.read.split("\n").each do |instruction| - case instruction - when /swap position (\d+) with position (\d+)/ - x = $1.to_i - y = $2.to_i - input[x], input[y] = input[y], input[x] - when /swap letter (\w+) with letter (\w+)/ - x = $1 - y = $2 - input.tr!("#{x}#{y}", "#{y}#{x}") - when /rotate (left|right) (\d+) steps?/ - steps = $2.to_i - steps = -steps if $1 == 'right' - input = input.chars.rotate(steps).join - when /rotate based on position of letter (\w+)/ - index = input.index($1) - index += 1 if index >= 4 - index += 1 - index = -index - input = input.chars.rotate(index).join - when /reverse positions (\d+) through (\d+)/ - x = $1.to_i - y = $2.to_i - input[x..y] = input[x..y].reverse - when /move position (\d+) to position (\d+)/ - x = $1.to_i - x = input[x] - input[x] = '' +INSTRUCTIONS = ARGF.read.split("\n") - y = $2.to_i - input.insert(y, x) - else - raise "invalid instruction: '#{instruction}'" +def scramble(input) + INSTRUCTIONS.each do |instruction| + case instruction + when /swap position (\d+) with position (\d+)/ + x = $1.to_i + y = $2.to_i + input[x], input[y] = input[y], input[x] + when /swap letter (\w+) with letter (\w+)/ + x = $1 + y = $2 + input.tr!("#{x}#{y}", "#{y}#{x}") + when /rotate (left|right) (\d+) steps?/ + steps = $2.to_i + steps = -steps if $1 == 'right' + input = input.chars.rotate(steps).join + when /rotate based on position of letter (\w+)/ + index = input.index($1) + index += 1 if index >= 4 + index += 1 + index = -index + input = input.chars.rotate(index).join + when /reverse positions (\d+) through (\d+)/ + x = $1.to_i + y = $2.to_i + input[x..y] = input[x..y].reverse + when /move position (\d+) to position (\d+)/ + x = $1.to_i + x = input[x] + input[x] = '' + + y = $2.to_i + input.insert(y, x) + else + raise "invalid instruction: '#{instruction}'" + end + end + input +end + +input = 'abcdefgh'.chars +input.permutation.each do |candidate| + if scramble(candidate.join) == 'fbgdceah' + puts candidate.join + exit end end -puts input