18/04/17 10:33:51.01 ePc5Lh3L.net
>>869 Squeak/Pharo Smalltalk
| check |
check := [:digitsStr |
| digits checkDigit calcDigit |
digits := digitsStr asArray collect: #digitValue.
checkDigit := digits last.
calcDigit := ((digits * #(6 5 4 3 2 7 6 5 4 3 2 0)) sum \\ 11
in: [:x | x < 2 ifTrue: [0] ifFalse: [11 - x]]).
checkDigit = calcDigit
].
#('99999999999?' '??9999999999') collect: [:incmpNum |
| indices candNums |
indices := incmpNum asArray collectWithIndex: [:chr :idx | chr == $? ifTrue: [idx] ifFalse: [0]].
indices := indices reject: #isZero.
candNums := OrderedCollection new.
($0 to: $9) asDigitsToPower: indices size do: [:digs |
| candNum |
candNum := incmpNum copy.
indices with: digs do: [:idx :dig | candNum at: idx put: dig].
(check value: candNum) ifTrue: [candNums add: candNum]
].
incmpNum -> candNums asStringWithCr
]