Hi Roelof,

I presume its working since you only asked for code smells.
It looks pretty good to me with methods generally being small and doing one
thing.

The way your class-side-method "IntComputer class >> solution" just creates
an instance and sends #process is good.
I'm a little curious that it doesn't return a value.  #process returns a
value but nothing is done with it.  I guess the test-frame doesn't require
it.

The way zero-index ram access is encapsulated by  #at:  and   #at:put:  is
good.

Possible cleanup,  #in and #in: don't seem required since variable "in" is
used directly in the rest of the code, which is fine.

The hardcoded  #masses  return value is fine, except it makes the "masses"
class variable redundant.

Your various #processXXX methods are succinct and consume the stream neatly.

However its curious your  #processData and #processData:  methods have
identical code, since the latter has an argument that is then not used.
So your code is working a bit by accident. At line 59 (
https://github.com/rwobben/intComputer/blob/master/AOC%202019/IntComputer.class.st#L59
)
its just lucky that the "self ram" you pass there to #processData:  is the
same as the "ram" variable referenced
on line 82 (
https://github.com/rwobben/intComputer/blob/master/AOC%202019/IntComputer.class.st#L82
)

Well done.
cheers -ben





On Thu, 2 Jan 2020 at 23:37, Roelof Wobben via Pharo-users <
pharo-users@lists.pharo.org> wrote:

> Op 1-1-2020 om 17:27 schreef Roelof Wobben via Pharo-users:
>
> Hello,
>
> I made some changes. Is this better or are there still some code smells.
> Code :
> https://github.com/rwobben/intComputer/blob/master/AOC%202019/IntComputer.class.st
>
> if so, can someone help me to solve the code smells.
>
> Here is the challenge I try to solve :
>
> On the way to your gravity assist
> <https://en.wikipedia.org/wiki/Gravity_assist> around the Moon, your ship
> computer beeps angrily about a "1202 program alarm
> <https://www.hq.nasa.gov/alsj/a11/a11.landing.html#1023832>". On the
> radio, an Elf is already explaining how to handle the situation: "Don't
> worry, that's perfectly norma--" The ship computer bursts into flames
> <https://en.wikipedia.org/wiki/Halt_and_Catch_Fire>.
>
> You notify the Elves that the computer's magic smoke
> <https://en.wikipedia.org/wiki/Magic_smoke> seems to have escaped. "That
> computer ran *Intcode* programs like the gravity assist program it was
> working on; surely there are enough spare parts up there to build a new
> Intcode computer!"
>
> An Intcode program is a list of integers
> <https://en.wikipedia.org/wiki/Integer> separated by commas (like
> 1,0,0,3,99). To run one, start by looking at the first integer (called
> position 0). Here, you will find an *opcode* - either 1, 2, or 99. The
> opcode indicates what to do; for example, 99 means that the program is
> finished and should immediately halt. Encountering an unknown opcode means
> something went wrong.
>
> Opcode 1 *adds* together numbers read from two positions and stores the
> result in a third position. The three integers *immediately after* the
> opcode tell you these three positions - the first two indicate the
> *positions* from which you should read the input values, and the third
> indicates the *position* at which the output should be stored.
>
> For example, if your Intcode computer encounters 1,10,20,30, it should
> read the values at positions 10 and 20, add those values, and then
> overwrite the value at position 30 with their sum.
>
> Opcode 2 works exactly like opcode 1, except it *multiplies* the two
> inputs instead of adding them. Again, the three integers after the opcode
> indicate *where* the inputs and outputs are, not their values.
>
> Once you're done processing an opcode, *move to the next one* by stepping
> forward 4 positions.
>
> For example, suppose you have the following program:
>
> 1,9,10,3,2,3,11,0,99,30,40,50
>
> For the purposes of illustration, here is the same program split into
> multiple lines:
>
> 1,9,10,3,
> 2,3,11,0,
> 99,
> 30,40,50
>
> The first four integers, 1,9,10,3, are at positions 0, 1, 2, and 3.
> Together, they represent the first opcode (1, addition), the positions of
> the two inputs (9 and 10), and the position of the output (3). To handle
> this opcode, you first need to get the values at the input positions:
> position 9 contains 30, and position 10 contains 40. *Add* these numbers
> together to get 70. Then, store this value at the output position; here,
> the output position (3) is *at* position 3, so it overwrites itself.
> Afterward, the program looks like this:
>
> 1,9,10,*70*,
> 2,3,11,0,
> 99,
> 30,40,50
>
> Step forward 4 positions to reach the next opcode, 2. This opcode works
> just like the previous, but it multiplies instead of adding. The inputs are
> at positions 3 and 11; these positions contain 70 and 50 respectively.
> Multiplying these produces 3500; this is stored at position 0:
>
> *3500*,9,10,70,
> 2,3,11,0,
> 99,
> 30,40,50
>
> Stepping forward 4 more positions arrives at opcode 99, halting the
> program.
>

Reply via email to