See below.
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: [
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]].
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?