Thanks all.

This code seems to do the job

santaFloorOnBasement
������ "calculates which step take Santa to the basement"
�������� | index|
�������� index := 1.��
�������� [floor ~= -1 ] whileTrue:��
�������������� [ floor := ((input at: index) = '(' )
������������������������������ ifTrue: [ floor + 1 ]
������������������������������ ifFalse: [ floor - 1 ].
���������������� index := index + 1 ].
������������������
������ ^ index -1


Roelof




Op 9-11-2018 om 09:51 schreef Ben Coman:


On Fri, 9 Nov 2018 at 15:25, Roelof Wobben <r.wobben@home.nl> wrote:
Hello,

I try to solve a adventofcode challenge where I must find out when santa
is first at the basement. the floor is there -1.
So I thought I use a while loop like this :

santaFloorOnBasement
�������� "calculates which step take Santa to the basement"
���������� | index|
���������� index := 1.
���������� ??? when: (floor >=0 ) do:
���������������� [ floor := (input at: index = '(' )
�������������������������������� ifTrue: [ floor + 1 ]
�������������������������������� ifFalse: [ floor - 1 ].
������������������ index := index + 1 ].

but I cannot find out what must be instead of the ??

I've never used #when:do: so I can't comment on that.
I'd be using #whileTrue: which looks like this...�� [ condition block ] whileTrue: [ action block ]
�� ����
<<<�� �� ��??? when: (floor >=0 ) do:
>>>�� �� [floor>=0] whileTrue:��

For further examples review the "senders" of #whileTrue:
i.e. highlight then press <CTRL-N> on MS Windows��

��
index is the index of the string which has to start with a 1.
floor�� and input are both instance variables. floor contains the current
floor and input the input of the challenge.

Can someone help me figure this out so the next time I can do this on my
own.

btw you have a problem here...
�� �� ��floor := (input at: index = '(' )��

Its not doing what you think and you'll get "Error: only integers should be used as indices"
Consider you that two messages are being sent:
�� ��* the keyword message...�� #at:
�� ��* the binary message....�� #=
Homework :)... what is the third type of message and the evaluation priority of all three.

Homework 2...�� Review the "implementors" of message #=
<CTRL-M> on MS Windows

cheers -ben


P.S. As it current stands,�� you'll get a "SubscriptOutOfBounds" error if the input ends before Santa gets to the basement.��
An exercise, fix that using the existing loop.

Then consider using an iterator...
�� �� input do: [ :bracket |��
�� �� �� �� ��(bracket = $( ) ifTrue:�� [ floor := floor + 1 ]�� .
�� �� �� �� ��(bracket = $( ) ifTrue:�� [ floor := floor + 1 ]��������].

and maybe something else for you to experiment with...
�� �� movement := Dictionary new.
�� ����movement����at: $( put: 1.
�� ����movement����at: $) put: -1.
�� �� input do: [ :char |�� floor := floor��+ (movement at: char ifAbsent: [0]) ].��

cheers -ben