Hi, I'm trying to complete all the tasks on advent of code (https://adventofcode.com/) with 42 (https://L42.is)
The first challenge is solved as follows:
reuse [L42.is/AdamsTowel]
Fs = Load:{reuse[L42.is/FileSystem]}
Main = (
fs = Fs.Real.#$of()
input = fs.read(\"input")
var last = Math.maxI()
res = Match.Count()(for s in input.split(S.nl()) (
e = I(string=s)
\add(e>last)
last:=e
))
Debug(res)
)
The same code, with line by line comments:
//you should always know where your towel is
reuse [L42.is/AdamsTowel]
//importing the file system library; based on object capabilities
Fs = Load:{reuse[L42.is/FileSystem]}
Main = (
//creating an object connected with the real file system
fs = Fs.Real.#$of()
//read the file as a string
input = fs.read(\"input")
//we need to check when the dept grows, but not count
//the first reading as growing from no-info
var last = Math.maxI()
//Here we use a string spliterator and Count
//we split the input on newlines
res = Match.Count()(for s in input.split(S.nl()) (
e = I(string=s)//convert string->int32
\add(e>last)//if e>last, it counts!
last:=e //update last
))
Debug(res)//the result!
)
I noticed later, we have a part two. I think the solution for part 2 is much more interesting:
LessNoise = Data:{
var Num a=0\
var Num b=0\
var Num c=0\
read method Num tot() = \a+\b+\c
mut method Void push(Num that) = ( \a(\b), \b(\c), \c(that) )
}
Main = (
fs = Fs.Real.#$of()
input = fs.read(\"input")
readings = LessNoise()
res = Match.Count()(
for r in Range.endless(), s in input.split(S.nl()) {
if r<3I ( readings.push(Num(string=s)) return void )
(tot0) = readings
readings.push(Num(string=s))
(tot1) = readings
return \add(tot1>tot0)
}
)
Debug(res)
)
Commenting the new interesting parts below:
LessNoise = Data:{//A class to store the last 3 recordings
var Num a=0\ //using Num is better then using I, so that
var Num b=0\ //even if the reading is larger then Math.maxI
var Num c=0\ //we would still get the right result!
read method Num tot() = \a+\b+\c
mut method Void push(Num that) = ( \a(\b), \b(\c), \c(that) )
//push allows us to simply add a new one.
//the core idea is that push moves from one window to
//the next one, so we do not need to store a list of windows
}
Main = (
fs = Fs.Real.#$of()
input = fs.read(\"input")
readings = LessNoise() //starting point
res = Match.Count()(
//range+return avoids checking the first 3 readings
for r in Range.endless(), s in input.split(S.nl()) {
if r<3I ( readings.push(Num(string=s)) return void )
(tot0) = readings //old window total
readings.push(Num(string=s))
(tot1) = readings //new window total
return \add(tot1>tot0)
}
)
Debug(res)
)
The second challenge is solved as Follows (I'm showing part 2 directly):
reuse [L42.is/AdamsTowel]
Fs = Load:{reuse[L42.is/FileSystem]}
ProcessTrait = Trait:Data.Relax:{
Num val
class method S name() //the only difference between commands!
class method Bool fits(S that) = that.startsWith(this.name())
class method Num extract(S that) =
\(string=that.subString(this.name().size()+1I to=\size))
class method This (S that) = \(val=\extract(that))
}
Forward = Class:ProcessTrait:{class method S name() = S"forward" }
Down = Class:ProcessTrait:{class method S name() = S"down" }
Up = Class:ProcessTrait:{class method S name() = S"up" }
//as you can see, in 42 it is easy to declare many similar
//data types. This is different from inheritance, since there
//is no subtyping relation between Forward Down and Up.
Submarine = Data:{
var Num aim =0\
var Num depth = 0\
var Num forward = 0\
mut method Void process(S that) = (
if Down.fits(that) ( \aim(\aim+Down(that).val()) )
if Up.fits(that) ( \aim(\aim-Up(that).val()) )
if Forward.fits(that) (
\forward(\forward+Forward(that).val())
\depth(\depth+(\aim*Forward(that).val()))
)
)
}
Main = (
fs = Fs.Real.#$of()
input = fs.read(\"input")
submarine = Submarine()
for s in input.split(S.nl()) ( submarine.process(s) )
Debug(submarine.depth()*submarine.forward())
)
As you can see, I'm using traits to make a 'template implementation' for the commands, and then I just switch on the commands in Submarine.process
Top comments (0)