From 0a350bbe6e081e3d83f9cd31c2bdf656a1fd4132 Mon Sep 17 00:00:00 2001 From: Guillaume Nargeot Date: Mon, 26 Oct 2009 21:17:06 +0900 Subject: [PATCH] Solution to Project Euler problem 62 --- extra/project-euler/062/062-tests.factor | 4 ++ extra/project-euler/062/062.factor | 54 ++++++++++++++++++++++++ extra/project-euler/062/authors.txt | 1 + extra/project-euler/project-euler.factor | 20 ++++----- 4 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 extra/project-euler/062/062-tests.factor create mode 100644 extra/project-euler/062/062.factor create mode 100644 extra/project-euler/062/authors.txt diff --git a/extra/project-euler/062/062-tests.factor b/extra/project-euler/062/062-tests.factor new file mode 100644 index 0000000000..d8e0b9682e --- /dev/null +++ b/extra/project-euler/062/062-tests.factor @@ -0,0 +1,4 @@ +USING: project-euler.062 tools.test ; +IN: project-euler.062.tests + +[ 127035954683 ] [ euler062 ] unit-test diff --git a/extra/project-euler/062/062.factor b/extra/project-euler/062/062.factor new file mode 100644 index 0000000000..037cdc1af5 --- /dev/null +++ b/extra/project-euler/062/062.factor @@ -0,0 +1,54 @@ +! Copyright (c) 2009 Guillaume Nargeot. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays assocs hashtables kernel math math.functions +project-euler.common sequences sorting ; +IN: project-euler.062 + +! http://projecteuler.net/index.php?section=problems&id=062 + +! DESCRIPTION +! ----------- + +! The cube, 41063625 (345^3), can be permuted to produce two +! other cubes: 56623104 (384^3) and 66430125 (405^3). In +! fact, 41063625 is the smallest cube which has exactly three +! permutations of its digits which are also cube. + +! Find the smallest cube for which exactly five permutations of +! its digits are cube. + + +! SOLUTION +! -------- + +key ( n -- k ) cube number>digits natural-sort ; inline +: has-entry? ( n assoc -- ? ) [ >key ] dip key? ; inline + +: (euler062) ( n assoc -- n ) + 2dup has-entry? [ + 2dup [ >key ] dip + [ dup 0 swap [ 1 + ] change-nth ] change-at + 2dup [ >key ] dip at first 5 = + [ + [ >key ] dip at second + ] [ + [ 1 + ] dip (euler062) + ] if + ] [ + 2dup 1 pick cube 2array -rot + [ >key ] dip set-at [ 1 + ] dip + (euler062) + ] if ; + +PRIVATE> + +: euler062 ( -- answer ) + 1 1 (euler062) ; + +! [ euler062 ] 100 ave-time +! 78 ms ave run time - 0.9 SD (100 trials) + +SOLUTION: euler062 diff --git a/extra/project-euler/062/authors.txt b/extra/project-euler/062/authors.txt new file mode 100644 index 0000000000..6eb6698c00 --- /dev/null +++ b/extra/project-euler/062/authors.txt @@ -0,0 +1 @@ +Guillaume Nargeot diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index e64bd61852..66f4296827 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -16,16 +16,16 @@ USING: definitions io io.files io.pathnames kernel math math.parser project-euler.045 project-euler.046 project-euler.047 project-euler.048 project-euler.049 project-euler.051 project-euler.052 project-euler.053 project-euler.054 project-euler.055 project-euler.056 project-euler.057 - project-euler.058 project-euler.059 project-euler.063 project-euler.065 - project-euler.067 project-euler.069 project-euler.071 project-euler.072 - project-euler.073 project-euler.074 project-euler.075 project-euler.076 - project-euler.079 project-euler.081 project-euler.085 project-euler.092 - project-euler.097 project-euler.099 project-euler.100 project-euler.102 - project-euler.112 project-euler.116 project-euler.117 project-euler.124 - project-euler.134 project-euler.148 project-euler.150 project-euler.151 - project-euler.164 project-euler.169 project-euler.173 project-euler.175 - project-euler.186 project-euler.188 project-euler.190 project-euler.203 - project-euler.215 ; + project-euler.058 project-euler.059 project-euler.062 project-euler.063 + project-euler.065 project-euler.067 project-euler.069 project-euler.071 + project-euler.072 project-euler.073 project-euler.074 project-euler.075 + project-euler.076 project-euler.079 project-euler.081 project-euler.085 + project-euler.092 project-euler.097 project-euler.099 project-euler.100 + project-euler.102 project-euler.112 project-euler.116 project-euler.117 + project-euler.124 project-euler.134 project-euler.148 project-euler.150 + project-euler.151 project-euler.164 project-euler.169 project-euler.173 + project-euler.175 project-euler.186 project-euler.188 project-euler.190 + project-euler.203 project-euler.215 ; IN: project-euler