diff --git a/extra/math/combinatorics/combinatorics.factor b/extra/math/combinatorics/combinatorics.factor index b1c49b8ab5..00a104b381 100644 --- a/extra/math/combinatorics/combinatorics.factor +++ b/extra/math/combinatorics/combinatorics.factor @@ -44,5 +44,12 @@ PRIVATE> : all-permutations ( seq -- seq ) [ length factorial ] keep '[ _ permutation ] map ; +: each-permutation ( seq quot -- ) + [ [ length factorial ] keep ] dip + '[ _ permutation @ ] each ; inline + +: reduce-permutations ( seq initial quot -- result ) + swapd each-permutation ; inline + : inverse-permutation ( seq -- permutation ) <enum> >alist sort-values keys ; diff --git a/extra/project-euler/043/043.factor b/extra/project-euler/043/043.factor index 268a6becfb..37118b88a3 100644 --- a/extra/project-euler/043/043.factor +++ b/extra/project-euler/043/043.factor @@ -52,8 +52,11 @@ IN: project-euler.043 PRIVATE> : euler043 ( -- answer ) - 1234567890 number>digits all-permutations - [ interesting? ] filter [ 10 digits>integer ] map sum ; + 1234567890 number>digits 0 [ + dup interesting? [ + 10 digits>integer + + ] [ drop ] if + ] reduce-permutations ; ! [ euler043 ] time ! 104526 ms run / 42735 ms GC time