]> gitweb.factorcode.org Git - factor.git/blob - extra/project-euler/040/040.factor
factor: trim using lists
[factor.git] / extra / project-euler / 040 / 040.factor
1 ! Copyright (c) 2008 Aaron Schaefer.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math math.parser sequences project-euler.common ;
4 IN: project-euler.040
5
6 ! http://projecteuler.net/index.php?section=problems&id=40
7
8 ! DESCRIPTION
9 ! -----------
10
11 ! An irrational decimal fraction is created by concatenating the positive
12 ! integers:
13
14 !     0.123456789101112131415161718192021...
15
16 ! It can be seen that the 12th digit of the fractional part is 1.
17
18 ! If dn represents the nth digit of the fractional part, find the value of the
19 ! following expression.
20
21 !     d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000
22
23
24 ! SOLUTION
25 ! --------
26
27 <PRIVATE
28
29 : (concat-upto) ( n limit str -- str )
30     2dup length > [
31         pick number>string append! [ 1 + ] 2dip (concat-upto)
32     ] [
33         2nip
34     ] if ;
35
36 : concat-upto ( n -- str )
37     SBUF" " clone 1 -rot (concat-upto) ;
38
39 : nth-integer ( n str -- m )
40     [ 1 - ] dip nth digit> ;
41
42 PRIVATE>
43
44 : euler040 ( -- answer )
45     1000000 concat-upto { 1 10 100 1000 10000 100000 1000000 }
46     [ swap nth-integer ] with map product ;
47
48 ! [ euler040 ] 100 ave-time
49 ! 444 ms ave run time - 23.64 SD (100 trials)
50
51 SOLUTION: euler040