Strange numbers: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: oops, copied the wrong version in...)
Line 1,103: Line 1,103:
496
496
497</pre>
497</pre>

=={{header|Nim}}==
Our program finds the strange numbers with a given number of digits. Filtering is done afterwards. It consumes a lot of memory but is able to find the result in less than a second on our small laptop.

<lang Nim>import algorithm, sequtils

const PrimeDigits = [2, 3, 5, 7]

type
Digit = 0..9
DigitSeq = seq[Digit]

func toInt(s: DigitSeq): int =
## Convert a sequence of digits to an int.
for d in s:
result = 10 * result + d


proc findStrangeNumbers(ndigits: Positive): seq[int] =
## Return the list of strange numbers with "ndigits" digits.
var list: seq[DigitSeq] = toSeq(1..9).mapIt(@[Digit it]) # Starting digits.
for _ in 2..ndigits:
var newList: seq[DigitSeq] # List with one more digit.
for dseq in list:
let last = dseq[^1]
for p in PrimeDigits:
if last - p >= 0:
newList.add dseq & (last - p)
if last + p <= 9:
newList.add dseq & (last + p)
list = move(newList) # "newList" becomes the current list.
result = list.map(toInt)


var result = sorted(findStrangeNumbers(3).filterIt(it < 500))
echo "Found ", result.len, " strange numbers between 101 and 499."
for i, n in result:
stdout.write n, if (i + 1) mod 15 == 0: '\n' else: ' '
echo()

result = findStrangeNumbers(10).filterIt(it div 1_000_000_000 == 1)
echo "\nFound ", result.len, " strange numbers with 10 digits and starting with 1."</lang>

{{out}}
<pre>Found 87 strange numbers between 101 and 499.
130 131 135 136 138 141 142 146 147 149 161 163 164 168 169
181 183 185 186 202 203 205 207 241 242 246 247 249 250 252
253 257 258 270 272 274 275 279 292 294 296 297 302 303 305
307 313 314 316 318 350 352 353 357 358 361 363 364 368 369
381 383 385 386 413 414 416 418 420 424 425 427 429 461 463
464 468 469 470 472 474 475 479 492 494 496 497

Found 853423 strange numbers with 10 digits and starting with 1.</pre>


=={{header|Pascal}}==
=={{header|Pascal}}==