See below.

On Thu, Apr 30, 2020 at 10:58 AM Roelof Wobben via Pharo-users <
pharo-users@lists.pharo.org> wrote:
> and also not with this one :
>
> cardNumber := '4539 1488 0343 6467'.
> oddSum := 0.
> evenSum := 0.
> nextIsOdd := false.
>       cardNumber reverseDo: [:digit |
>           digit = Character space ifFalse: [
>           nextIsOdd
>               ifFalse:  [oddSum := oddSum + (digit asString asInteger ) ]
>               ifTrue: [(((digit asString asInteger) * 2) > 9)
>      ifTrue: [evenSum := evenSum + ((digit asString asInteger)  * 2) - 9 ]
>      ifFalse: [ evenSum := evenSum + (digit asString asInteger)  * 2 ]].
>              nextIsOdd := nextIsOdd not]].
> ^ evenSum
>
>
>
>
> Op 30-4-2020 om 18:30 schreef Roelof Wobben:
> > Op 30-4-2020 om 16:16 schreef Roelof Wobben:
> >> nextIsOdd := true.
> >>      aString reverseDo: [:digit |
> >>          digit = Character space ifFalse: [
> >>          nextIsOdd
> >>              ifTrue:  [oddSum := ...]
> >>              ifFalse: [evenSum := ...].
> >>          nextIsOdd := nextIsOdd not]].
> >
> > hmm,
> >
> > Still no luck with this code :
> >
> > cardNumber := '4539 1488 0343 6467'.
> > oddSum := 0.
> > evenSum := 0.
> > nextIsOdd := true.
> >      cardNumber reverseDo: [:digit |
> >          digit = Character space ifFalse: [
> >          nextIsOdd
> >              ifTrue:  [oddSum := oddSum + digit asInteger ]
> >              ifFalse: [evenSum := ((digit asInteger * 2) > 9)
> >     ifTrue: [evenSum + ((digit asInteger * 2) - 9) ]
> >     ifFalse: [ evenSum + (digit asInteger * 2) ]].
> >             nextIsOdd := nextIsOdd not]].
> > ^ oddSum + evenSum
>

With the one change to use #digitValue instead of #asInteger (which answers
the code point), the above example  works.

| evenSum oddSum |
cardNumber := '4539 1488 0343 6467'.
oddSum := evenSum := 0.
nextIsOdd := true.
cardNumber reverseDo: [:digit |
digit = Character space ifFalse: [
nextIsOdd
ifTrue:  [oddSum := oddSum + digit digitValue ]
ifFalse: [evenSum := ((digit digitValue * 2) > 9)
ifTrue: [evenSum + ((digit digitValue * 2) - 9) ]
ifFalse: [ evenSum + (digit digitValue * 2) ]].
nextIsOdd := nextIsOdd not]].
^ oddSum + evenSum
gives me 80 for the answer.

A few (mostly) minor points:
- I don't see why "reverse" is necessary. Of course if you use #do:,
nextIsOdd needs to start with true.
- repeating the "digit digitValue" or other variations adds clutter and
reduces clarity
-  ((digit digitValue * 2) - 9) is not unreasonable, but could be
simplified. What is the largest integer X such that 2xX<=9?


>
> > the answer schould be 57 where I get 1157
> >
> > So some debugging to do
> >
>
>
>

Reply via email to