Strange numbers: Difference between revisions
Content deleted Content added
m added a ";Definition:, ";Task:" (section headers) to the draft task, added whitespace, added clarification that the number should be expressed in base ten. |
|||
Line 1,045: | Line 1,045: | ||
474 475 479 492 494 496 497 </pre> |
474 475 479 492 494 496 497 </pre> |
||
=={{header|jq}}== |
|||
{{works with|jq}} |
|||
'''Works with gojq, the Go implementation of jq''' |
|||
===Filter method=== |
|||
<lang jq> |
|||
def is_strange: |
|||
def digits: tostring | explode | map([.] | implode | tonumber); |
|||
digits |
|||
| . as $d |
|||
| [2, 3, 5, 7] as $primes |
|||
| all( range(1; length); |
|||
($d[.] - $d[. - 1]) | length | IN( $primes[])); |
|||
# Pretty-printing |
|||
def nwise($n): |
|||
def n: if length <= $n then . else .[0:$n] , (.[$n:] | n) end; |
|||
n; |
|||
def lpad($len): tostring | ($len - length) as $l | (" " * $l)[:$l] + .; |
|||
def task($start; $stop; filter): |
|||
"Finding numbers matching $f for open interval \($start), \($stop):\n", |
|||
( [range($start; $stop) | select(filter) ] |
|||
| nwise(10) | map(lpad(3)) | join(" ") ); |
|||
task(100; 500; is_strange) |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
Finding numbers matching $f for open interval 100, 500: |
|||
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 |
|||
</pre> |
|||
===Generator method=== |
|||
`lpad` and and `nwise` are as above and so their definitions are not repeated. |
|||
<lang jq> |
|||
# input: width |
|||
# $start: maximum first digit allowed e.g. 9 for unrestricted |
|||
# output: the specified stream of strange numbers |
|||
def generator($start): |
|||
# Emit the next permissible digit after `.` |
|||
# (`length` as used here is the builtin equivalent of `abs`) |
|||
def nxt: . as $i | range(0;10) | select($i - . | length | IN(2, 3, 5, 7)); |
|||
# input: number of digits |
|||
# output: an array of digits |
|||
def gen: |
|||
if . == 0 then empty |
|||
elif . == 1 then range(1;10) | [.] |
|||
else (. - 1) | gen | . + ((.[-1]|nxt) | [.]) |
|||
end; |
|||
range(1; $start+1) as $i | [$i] + (.-1|gen); |
|||
[3 | generator(4) | map(tostring) | join("") | tonumber] |
|||
| nwise(10) | map(lpad(3)) | join(" ") |
|||
</lang> |
|||
{{out}} |
|||
As above, except for the header. |
|||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
===Filter method=== |
===Filter method=== |