little "challenge"

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
14 messages Options
Reply | Threaded
Open this post in threaded view
|

little "challenge"

Stephane Ducasse-3
#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?
Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Sven Van Caekenberghe-2
The first thing I found:

#(16 17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) groupsOf: 7 atATimeCollect: [ :x | x ]

 "#(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19))"

> On 25 Apr 2017, at 22:08, Stephane Ducasse <[hidden email]> wrote:
>
> #(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20)
>
> ->
>
> { #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}
>
> any code?


Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

nacho
#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) allButFirst groupsOf: 7  atATimeCollect: [ :element | element ].
Nacho Smalltalker apprentice. Buenos Aires, Argentina.
Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Richard Sargent (again)
In reply to this post by Stephane Ducasse-3
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?
Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
In reply to this post by Sven Van Caekenberghe-2
I did not know this one :) 
tx sven


On Tue, Apr 25, 2017 at 10:26 PM, Sven Van Caekenberghe <[hidden email]> wrote:
The first thing I found:

#(16 17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) groupsOf: 7 atATimeCollect: [ :x | x ]

 "#(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19))"

> On 25 Apr 2017, at 22:08, Stephane Ducasse <[hidden email]> wrote:
>
> #(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20)
>
> ->
>
> { #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}
>
> any code?



Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
In reply to this post by nacho
Tx same comments!

On Tue, Apr 25, 2017 at 10:48 PM, nacho <[hidden email]> wrote:
#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20)
allButFirst groupsOf: 7  atATimeCollect: [ :element | element ].



-----
Nacho
Smalltalker apprentice.
Buenos Aires, Argentina.
--
View this message in context: http://forum.world.st/little-challenge-tp4944073p4944079.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.


Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
In reply to this post by Richard Sargent (again)
This is fun because my method was called splitEvery: too :)


On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?

Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
In reply to this post by Richard Sargent (again)
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?

Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Richard Sargent (again)
Sorry, Stephane. Feel free to implement missing methods (or their equivalent).

:-)
On Apr 25, 2017, at 23:39, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?

Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

philippeback
In reply to this post by Stephane Ducasse-3
Doesn't matter as next returns if there is less than required.

groups := OrderedCollection new.
input := (String loremIpsum: 20). 
input readStream in: [ :s | [s atEnd] whileFalse: [ groups add: (s next: 7) ]].
groups.

Interestingly loremIpsum: adds Character cr to from paragraphs (output looked strange at first glance).

Phil

On Wed, Apr 26, 2017 at 8:38 AM, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?


Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

philippeback
In reply to this post by Stephane Ducasse-3
I implemented it for fun and noticed that in your test data, the first 16 is gone. So, groupings are wrong with all methods proposed in a sense.

With Richard's version, we get this in Pharo

#(16 17 17 16 18 17 18 19 19 19 18 19 19 20 19 20 19 20 20 20 19 20)  splitEvery: 7

"an OrderedCollection(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19) #(20))"

splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."

 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream next: chunkSize).
 ].
 
 ^chunks.

Phil


On Wed, Apr 26, 2017 at 8:38 AM, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?


Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
In reply to this post by Stephane Ducasse-3
Now I fully got the implementation


"
#(16 17 17 16 18 17 18   19 19 19 18 19 19 20   19 20 19 20 20 20 19   20) groupsOf: 7 atATimeCollect: [ :x | x ]
>>> #(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19))
"
"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x :y :z | x + y + z] 
>>> #(3 30 300)
"

"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x | x ]  
>>> #(#(1 1 1) #(10 10 10) #(100 100 100))
"

On Wed, Apr 26, 2017 at 8:38 AM, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?


Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

philippeback
So the last 20 is left out.

Correct?

Phil

On Wed, Apr 26, 2017 at 11:20 AM, Stephane Ducasse <[hidden email]> wrote:
Now I fully got the implementation


"
#(16 17 17 16 18 17 18   19 19 19 18 19 19 20   19 20 19 20 20 20 19   20) groupsOf: 7 atATimeCollect: [ :x | x ]
>>> #(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19))
"
"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x :y :z | x + y + z] 
>>> #(3 30 300)
"

"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x | x ]  
>>> #(#(1 1 1) #(10 10 10) #(100 100 100))
"

On Wed, Apr 26, 2017 at 8:38 AM, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?



Reply | Threaded
Open this post in threaded view
|

Re: little "challenge"

Stephane Ducasse-3
splitEvery: n
^ (n
to: self size
by: n)
collect: [:index |
(self copyFrom: index - n + 1 to: index)]

is my solution

On Wed, Apr 26, 2017 at 11:34 AM, [hidden email] <[hidden email]> wrote:
So the last 20 is left out.

Correct?

Phil

On Wed, Apr 26, 2017 at 11:20 AM, Stephane Ducasse <[hidden email]> wrote:
Now I fully got the implementation


"
#(16 17 17 16 18 17 18   19 19 19 18 19 19 20   19 20 19 20 20 20 19   20) groupsOf: 7 atATimeCollect: [ :x | x ]
>>> #(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19))
"
"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x :y :z | x + y + z] 
>>> #(3 30 300)
"

"
#(1 1 1 10 10 10 100  100 100) 
groupsOf: 3 atATimeCollect: [ :x | x ]  
>>> #(#(1 1 1) #(10 10 10) #(100 100 100))
"

On Wed, Apr 26, 2017 at 8:38 AM, Stephane Ducasse <[hidden email]> wrote:
we do not have nextOrLess: in Pharo. 

On Wed, Apr 26, 2017 at 6:19 AM, Richard Sargent <[hidden email]> wrote:
In 2003, I implemented the following method. It is something that comes up from time to time.
 
!SequenceableCollection publicMethods !
splitEvery: chunkSize
 "Answer a collection of sub-collections each of the specified chunk size.
  If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
 
 | chunks stream |
 chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
 
 stream := ReadStream on: self.
 chunks := OrderedCollection new.
 [stream atEnd] whileFalse: [
  chunks add: (stream nextOrLess: chunkSize).
 ].
 
 ^chunks.
! !


From: Pharo-users [mailto:[hidden email]] On Behalf Of Stephane Ducasse
Sent: April 25, 2017 13:08
To: Any question about pharo is welcome
Subject: [Pharo-users] little "challenge"

#(16    17 17 16 18 17 18 19    19 19 18 19 19 20 19   20 19 20 20 20 19 20) 

-> 

{ #(17 17 16 18 17 18 19) . #(19 19 18 19 19 20 19) . #(20 19 20 20 20 19 20)}

any code?