(import std.Math :sqrt :prime?) (import std.List :iota) (import std.String :join) (import std.Range) (let ascending (fun (n f) { (mut nums (iota 1 9)) (mut i 0) (mut matched []) (while (and (< (len matched) n) (< i (len nums))) { (let val (@ nums i)) (if (f val) (append! matched val)) (mut r (range:range (+ 1 (mod val 10)) 10)) (set r (range:map r (fun (k) (+ k (* 10 val))))) (concat! nums r) (set i (+ 1 i)) }) matched })) (print (join (ascending 100 prime?) ", "))