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
                ].

                ^ 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-boun...@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 
<steph...@free.fr<mailto:steph...@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?

Reply via email to