Merge branch 'master' of git://github.com/killy971/factor

Slava Pestov 2009-09-12 01:32:09 -05:00
commit 9c7c214bb5
6 changed files with 1129 additions and 4 deletions

View File

@ -0,0 +1,4 @@
USING: project-euler.102 tools.test ;
IN: project-euler.102.tests
[ 228 ] [ euler102 ] unit-test

View File

@ -0,0 +1,64 @@
! Copyright (c) 2009 Guillaume Nargeot.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays grouping io.encodings.ascii io.files kernel math
math.parser sequences splitting project-euler.common ;
IN: project-euler.102
! http://projecteuler.net/index.php?section=problems&id=102
! DESCRIPTION
! -----------
! Three distinct points are plotted at random on a Cartesian plane, for which
! -1000 ≤ x, y ≤ 1000, such that a triangle is formed.
! Consider the following two triangles:
! A(-340,495), B(-153,-910), C(835,-947)
! X(-175,41), Y(-421,-714), Z(574,-645)
! It can be verified that triangle ABC contains the origin, whereas triangle
! XYZ does not.
! Using triangles.txt (right click and 'Save Link/Target As...'), a 27K text
! file containing the co-ordinates of one thousand "random" triangles, find the
! number of triangles for which the interior contains the origin.
! NOTE: The first two examples in the file represent the triangles in the
! example given above.
! SOLUTION
! --------
! A triangle of coordinates (x1, y1) (x2, y2) (x3, y3) contains
! the origin when (ab * bc > 0) and (bc * ca > 0) where:
! ab = x1 * (y2 - y1) - y1 * (x2 - x1)
! bc = x2 * (y3 - y2) - y2 * (x3 - x2)
! ca = x3 * (y1 - y3) - y3 * (x1 - x3)
<PRIVATE
: source-102 ( -- seq )
"resource:extra/project-euler/102/triangles.txt"
ascii file-lines [
"," split [ string>number ] map 2 group
] map ;
: det ( coord coord -- n )
dupd [ [ last ] bi@ - ] [ [ first ] bi@ - ] 2bi 2array
[ [ first ] bi@ * ] [ [ last ] bi@ * ] 2bi - ;
: include-origin? ( coord-seq -- ? )
dup first suffix 2 clump [ [ first ] [ last ] bi det ] map
2 clump [ product 0 > ] all? ;
PRIVATE>
: euler102 ( -- answer )
source-102 [ include-origin? ] count ;
! [ euler102 ] 100 ave-time
! 12 ms ave run time - 0.92 SD (100 trials)
SOLUTION: euler102

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
USING: project-euler.112 tools.test ;
IN: project-euler.112.tests
[ 1587000 ] [ euler112 ] unit-test

View File

@ -0,0 +1,52 @@
! Copyright (c) 2009 Guillaume Nargeot.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel math project-euler.common sequences sorting ;
IN: project-euler.112
! http://projecteuler.net/index.php?section=problems&id=112
! DESCRIPTION
! -----------
! Working from left-to-right if no digit is exceeded by the digit to its left
! it is called an increasing number; for example, 134468.
! Similarly if no digit is exceeded by the digit to its right it is called a
! decreasing number; for example, 66420.
! We shall call a positive integer that is neither increasing nor decreasing a
! "bouncy" number; for example, 155349.
! Clearly there cannot be any bouncy numbers below one-hundred, but just over
! half of the numbers below one-thousand (525) are bouncy. In fact, the least
! number for which the proportion of bouncy numbers first reaches 50% is 538.
! Surprisingly, bouncy numbers become more and more common and by the time we
! reach 21780 the proportion of bouncy numbers is equal to 90%.
! Find the least number for which the proportion of bouncy numbers is exactly
! 99%.
! SOLUTION
! --------
<PRIVATE
: bouncy? ( n -- ? )
number>digits dup natural-sort
[ = not ] [ reverse = not ] 2bi and ;
PRIVATE>
: euler112 ( -- answer )
0 0 0 [
2dup swap 99 * = not
] [
[ 1 + ] 2dip pick bouncy? [ 1 + ] [ [ 1 + ] dip ] if
] do while 2drop ;
! [ euler112 ] 100 ave-time
! 2749 ms ave run time - 33.76 SD (100 trials)
SOLUTION: euler112

View File

@ -19,10 +19,11 @@ USING: definitions io io.files io.pathnames kernel math math.parser
project-euler.059 project-euler.063 project-euler.067 project-euler.069
project-euler.071 project-euler.073 project-euler.075 project-euler.076
project-euler.079 project-euler.085 project-euler.092 project-euler.097
project-euler.099 project-euler.100 project-euler.116 project-euler.117
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.190 project-euler.203 project-euler.215 ;
project-euler.099 project-euler.100 project-euler.102 project-euler.112
project-euler.116 project-euler.117 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.190
project-euler.203 project-euler.215 ;
IN: project-euler
<PRIVATE