· Nov 20, 2017 3m read

Advent of Code 2016 Day 20: Firewall Rules

This is a series of programming challenges for beginners and experienced Caché programmers.

For an introduction : go to article

We are almost there : after this challenge, only 5 days left till the end of this advent of code (I cannot wait to get my life back !) .


The challenge of day 20 is about a list of integer ranges. Some ranges overlap,  but there are also values that are outside any range.

You have to find out what is the lowest integer that is outside any range.

More explanation (there is not much more to say) can be found on, with the link to your puzzle input.

The puzzle input is a list of ranges, with values in 0-4294967295, start and end value in each range is inclusive.


The second part of the challenge is to find all integers values that are not included in any ranges.


Here is the code that will do both challenges at once, explanation is inline :


Class AOC2016.Day20 Extends AOC2016.Utils

ClassMethod Part1(file As %String = "day20.txt")
  #dim input as %String
  #dim iInput, lowest, allowed, found as %Integer
  #Dim from, to, ip as %String
  #Dim sort as Array of %String

  Try {
    Do ..Input(file, .input)
    //Put all integer value ranges in array, sort by lowest
    For iInput=1:1:input {
      Set from=$P(input(iInput),"-",1)
      Set to=$P(input(iInput),"-",2)
      Set sort(from,to)=""
    Set found=""  //lowest integer value in total array (first lowest)
    Set lowest=0 //lowest integer value in array, move forward in loop outside range
    Set from=""   //track position in sort array
    Set allowed = 0 //total amount of integer values that are outside range
    For {
      Set from=$Order(sort(from)) If from="" Quit
      If lowest<from {  //lowest so far is outside range : everything upto from not included is not in range
        If found="" Set found=lowest  //first lowest found ever
        For ip=lowest:1:from-1 set allowed=allowed+1
        set lowest=from
      Set to = "" For {
        Set to=$Order(sort(from,to)) If to="" Quit
        If (lowest '< from) & (lowest '>to) {  //lowest outside range is always 1 bigger than to
          Set lowest = to+1
    Write "lowest : ",found,!
    Write "allowed : ",allowed,!
Catch {
    Write "Error : ",$ZError,!



Look here for all our solutions so far : and

Here is the list of all Advent of Code 2016 articles  :

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25 

Discussion (0)1
Log in or sign up to continue