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