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