Hi henrik I have the impression that the code is missing something 'aa' isIsogram
true
I wonder how we can set a bit without returning a new integer.
isIsogram
| i |
i := 0.
self asLowercase do: [ :char |
| val |
val := (char asInteger - 96).
(val between: 1 and: 26) ifFalse: [ ^ false ].
(i bitAt: val ) == 1 ifTrue: [ ^ false ].
i bitAt: val put: 1
i := i bitAt: val put: 1
].
^ true
An interesting observation here is that if #asLowercase is moved to each character instead âval := (char asLowercase asInteger - 96).â Then it leads to a 4-5x performance loss .
*From:*Pharo-users [mailto:pharo-users-bounces@lists.pharo.org] *On Behalf Of *Damien Pollet *Sent:* Friday, November 11, 2016 4:14 PM *To:* Any question about pharo is welcome <pharo-users@lists.pharo.org> *Subject:* Re: [Pharo-users] Little challenges for a friday evening
On 11 November 2016 at 12:02, stepharo <stepharo@free.fr <mailto:stepharo@free.fr>> wrote:
String>>#isIsogram | letters | letters := Dictionary new. self do: [ :x | letters at: x ifAbsent: [] ifPresent: [ ^false ].
Yes I did that one too and I was surprised because it was as slow as the bag implementation.
Anyone tried replacing the dictionary with an array of 26 booleans and indexing based on ascii, or even a SmallInteger and bit shifting?