how can I improve this

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

how can I improve this

Pharo Smalltalk Users mailing list
Hello,

I have solved the hamming challenge of exercism where I have to find in
how many places two strings are different.

my solution is :

distanceStrand1: aString strand2: aString2
     aString size == aString2 size
         ifFalse: [ DomainError signal: (self messageFor: aString
strand2: aString2) ].
     ^ (1 to: aString size)
         sumNumbers: [ :index |
             (aString at: index) == (aString2 at: index)
                 ifTrue: [ 0 ]
                 ifFalse: [ 1 ] ]


messageFor: aString strand2: aString2
     aString notEmpty & aString2 notEmpty
         ifTrue: [ ^ 'left and right strands must be of equal length' ].
     aString ifEmpty: [ ^ 'left strand must not be empty' ].
     ^ 'right strand must not be empty'


Can this be improved?

Roelof
Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

hernanmd
Hi Roelof,

Maybe something like this:
String>>hammingDistanceTo: aString
	" Answer the amount of substitutions between the receiver and aString. Both must be of equal length "

	^ (1 to: self size) count: [ : i | (self at: i) ~= (aString at: i) ]

El lun., 14 sept. 2020 a las 16:15, Roelof Wobben via Pharo-users (<[hidden email]>) escribió:
Hello,

I have solved the hamming challenge of exercism where I have to find in
how many places two strings are different.

my solution is :

distanceStrand1: aString strand2: aString2
     aString size == aString2 size
         ifFalse: [ DomainError signal: (self messageFor: aString
strand2: aString2) ].
     ^ (1 to: aString size)
         sumNumbers: [ :index |
             (aString at: index) == (aString2 at: index)
                 ifTrue: [ 0 ]
                 ifFalse: [ 1 ] ]


messageFor: aString strand2: aString2
     aString notEmpty & aString2 notEmpty
         ifTrue: [ ^ 'left and right strands must be of equal length' ].
     aString ifEmpty: [ ^ 'left strand must not be empty' ].
     ^ 'right strand must not be empty'


Can this be improved?

Roelof
Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

Pharo Smalltalk Users mailing list
Nice one but I learned I can never trust the input of a user
but I think I can use that code instead of my big code.

I will try it tomorrow after some good sleep.

Roelof



Op 14-9-2020 om 22:19 schreef Hernán Morales Durand:
Hi Roelof,

Maybe something like this:
String>>hammingDistanceTo: aString
	" Answer the amount of substitutions between the receiver and aString. Both must be of equal length "

	^ (1 to: self size) count: [ : i | (self at: i) ~= (aString at: i) ]

El lun., 14 sept. 2020 a las 16:15, Roelof Wobben via Pharo-users (<[hidden email]>) escribió:
Hello,

I have solved the hamming challenge of exercism where I have to find in
how many places two strings are different.

my solution is :

distanceStrand1: aString strand2: aString2
     aString size == aString2 size
         ifFalse: [ DomainError signal: (self messageFor: aString
strand2: aString2) ].
     ^ (1 to: aString size)
         sumNumbers: [ :index |
             (aString at: index) == (aString2 at: index)
                 ifTrue: [ 0 ]
                 ifFalse: [ 1 ] ]


messageFor: aString strand2: aString2
     aString notEmpty & aString2 notEmpty
         ifTrue: [ ^ 'left and right strands must be of equal length' ].
     aString ifEmpty: [ ^ 'left strand must not be empty' ].
     ^ 'right strand must not be empty'


Can this be improved?

Roelof

Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

Pharo Smalltalk Users mailing list
In reply to this post by hernanmd
Op 14-9-2020 om 22:19 schreef Hernán Morales Durand:
^ (1 to: self size) count: [ : i | (self at: i) ~= (aString at: i) ]


With that code I get a few problems but this is working

distanceStrand1: aString strand2: aString2
    aString size == aString2 size
        ifFalse: [ DomainError signal: (self messageFor: aString strand2: aString2) ].
    ^ (1 to: aString size)
        count: [ :i | (aString2 at: i) ~= (aString at: i) ]

Roelof


Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

Richard O'Keefe
SequenceableCollection has with:do:.
Add
    with: other count: testBlock
        |r|
        r := 0.
        self with: other do: [:x :y |
            (testBlock value: x value: y) ifTrue: [r := r + 1]].
        ^r

I have this in my library anyway.  Now

distanceStrand1: a strand2: b
    ^a with: b count: [:x :y | x ~= y]

#with:do: already checks that the sequences have the same size;
it's too confusing if the error reported in this case is different
from the error for #with:do:.

On Tue, 15 Sep 2020 at 16:59, Roelof Wobben via Pharo-users <[hidden email]> wrote:
Op 14-9-2020 om 22:19 schreef Hernán Morales Durand:
^ (1 to: self size) count: [ : i | (self at: i) ~= (aString at: i) ]


With that code I get a few problems but this is working

distanceStrand1: aString strand2: aString2
    aString size == aString2 size
        ifFalse: [ DomainError signal: (self messageFor: aString strand2: aString2) ].
    ^ (1 to: aString size)
        count: [ :i | (aString2 at: i) ~= (aString at: i) ]

Roelof


Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

Pharo Smalltalk Users mailing list
Oke,

I can try this but im afraid the test which test a particular error il fail.
The error messages are given.

And I miss you.  yes, SequenceableCollection has with do:
but should I add the with count to it ?

Roelof


Op 15-9-2020 om 15:23 schreef Richard O'Keefe:
SequenceableCollection has with:do:.
Add
    with: other count: testBlock
        |r|
        r := 0.
        self with: other do: [:x :y |
            (testBlock value: x value: y) ifTrue: [r := r + 1]].
        ^r

I have this in my library anyway.  Now

distanceStrand1: a strand2: b
    ^a with: b count: [:x :y | x ~= y]

#with:do: already checks that the sequences have the same size;
it's too confusing if the error reported in this case is different
from the error for #with:do:.

On Tue, 15 Sep 2020 at 16:59, Roelof Wobben via Pharo-users <[hidden email]> wrote:
Op 14-9-2020 om 22:19 schreef Hernán Morales Durand:
^ (1 to: self size) count: [ : i | (self at: i) ~= (aString at: i) ]


With that code I get a few problems but this is working

distanceStrand1: aString strand2: aString2
    aString size == aString2 size
        ifFalse: [ DomainError signal: (self messageFor: aString strand2: aString2) ].
    ^ (1 to: aString size)
        count: [ :i | (aString2 at: i) ~= (aString at: i) ]

Roelof



Reply | Threaded
Open this post in threaded view
|

Re: how can I improve this

Pharo Smalltalk Users mailing list
Op 15-9-2020 om 15:42 schreef Roelof Wobben via Pharo-users:
with: other count: testBlock
        |r|
        r := 0.
        self with: other do: [:x :y |
            (testBlock value: x value: y) ifTrue: [r := r + 1]].
        ^r


nope, all the test on a error are yellow and this two test on  counting are yellow.

test03_SingleLetterDifferentStrands
    | result |
    result := hammingCalculator distanceStrand1: 'G' strand2: 'T'.
    self assert: result equals:

gives 0 instead of 9.

and this one fails :

test05_LongDifferentStrands
    | result |
    result := hammingCalculator
        distanceStrand1: 'GGACGGATTCTG'
        strand2: 'AGGACGGATTCT'.
    self assert: result equals: 9

also this one gives 0 instead of 9.