--- Begin Message ---
Wouldn't be that hard to implement.  We just need a modulo (like I did) when 
sending #next to wrap around...
Or even better: a "cyclic" iterator, something like #withWrapDo: ?

----------------- 
Benoît St-Jean 
Yahoo! Messenger: bstjean 
Twitter: @BenLeChialeux 
Pinterest: benoitstjean 
Instagram: Chef_Benito
IRC: lamneth 
Blogue: endormitoire.wordpress.com 
"A standpoint is an intellectual horizon of radius zero".  (A. Einstein) 

    On Monday, December 3, 2018, 1:28:09 p.m. EST, phil--- via Pharo-users 
<pharo-users@lists.pharo.org> wrote:  
 
 CyclicReadStream. Not in base Pharo.
I wish.
We have atWrap: but not the best.
Phil

On Mon, Dec 3, 2018 at 1:17 PM Richard O'Keefe <rao...@gmail.com> wrote:

"if I use do:   this ends at the end of the array."True.  But all that means is 
that you have to keen on using #do:.
Processing an array repeatedly is as simple as  [true] whileTrue: [    anArray 
do: [:each |      ...]]
I had intended to twist this into
  [changes anySatisfy: [:change | ...]] whileFalse.
However, in this case your second alternative has much to recommend it.The 
control flow is simple.  There's no magic about it.  It's anunusual setup, so 
no need to get fancy.
  seen := Set new.  frequency := 0.  found := false.  i := changes size.  
[found] whileFalse: [    i := i = changes size ifTrue: [1] ifFalse: [i+1].    
frequency := frequency + (changes at: i).    found := seen includes: frequency. 
   seen add: frequency].

I like this better than what I had.
If we _were_ to get fancy, then introducing a CyclicReadStreamclass and doing   
 seen := Set new.    frequency := 0.    found := false.    stream := 
CyclicReadStream on: self changes.    [found] whileFalse: [      frequency := 
frequency + stream next.      found := seen includes: frequency.      seen add: 
frequency].wouldn't shrink the code much.  Oddly enough, I've 
encounteredproblems in previous Advent of Code exercises where 
CyclicReadStreamwould have been handy.  But just for this case?  No.

On Tue, 4 Dec 2018 at 00:25, Roelof Wobben <r.wob...@home.nl> wrote:

  hello Richard, 
 
 Thanks, I figured that out already.
 What I do not get is how to read the array multiple times. 
 
 if I use do:   this ends at the end of the array.
 
 Or I must use something as this : 
 
 index := 0 
 if index > array length 
     index =:  1 
 else 
 index := index + 1 
 
 
 and then read the number with array at: index 
 
 Roelof
 
 
 Op 3-12-2018 om 10:08 schreef Richard O'Keefe:
  
  Roelof Wobben wrote "I have to reread the file till the adding causes the 
same outcome  as we had already" You have to process the *sequence of changes* 
repeatedly; you DON't have to *reread the file*.  Somebody already made this 
point. Having read the changes into an array, you can iterate repeatedly over 
that array. 
  to find the first repeated frequency given a sequence of changes     make an 
empty Set to hold the sums that have been seen so far.
      set the frequency to 0.     loop forever         for each change in the 
changes             increment the frequency by the change.             if the 
frequency is in the set                 return the frequency            
otherwise add the frequency to the set.
  
   partTwo: aFileName     Transcript print: (self firstRepeatedFrequency: (self 
changesFrom: aFileName)); cr; flush.  
  On Mon, 3 Dec 2018 at 19:31, Roelof Wobben <r.wob...@home.nl> wrote:
  
  Thanks, 
 
 For the second I have to take a good look.
 
 I have to reread the file till the adding causes the same outcome  as we had 
already 
 
 so for example if we have the sequence : 
 
 +3, +3, +4, -2, -4
 
 it has as outcome : 
 
 3 6 10 8 4 
 
 so no outcome is there a second time so we repeat the sequence
 
 
 7 10 
 
 the 10 shows up a second time so there we have our answer. 
 
 
 Roelof
 
 
 
 Op 3-12-2018 om 03:45 schreef Richard O'Keefe:
  
  The key question is "what do you mean by improve"? I'd start by asking "what 
are you doing that you will still have to do in part 2, and what won't you do?" 
 So looking at part 2, you will want to convert the lines to integers, and   
input := Array streamContents: [:lines |     'input.txt' asFileReference 
readStreamDo: [:in |       [in atEnd] whileFalse: [lines nextPut: in nextLine 
asInteger]]]. gives you a chunk of code you can use in both parts.  So you 
might want to have 
  Day1   changesFrom: aFileName     ^Array streamContents: [:changes |       
aFileName asFileReference readStreamDo: [:in |         [in atEnd] whileFalse: 
[changes nextPut: in nextLine asInteger]]]   partOne: aFileName     ^(self 
changesFrom: aFileName) sum   partTwo: aFileName     ... The file name should 
not be wired in because you want some test files. 
  
   
  
  
   
 
  
  
 
 

  

--- End Message ---

Reply via email to