<commit_before>! Copyright (c) 2008 <NAME>.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.functions math.ranges math.order
project-euler.common sequences layouts ;
IN: project-euler.044

! http://projecteuler.net/index.php?section=problems&id=44

! DESCRIPTION
! -----------

! Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2. The first ten
! pentagonal numbers are:

!     1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

! It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference,
! 70 − 22 = 48, is not pentagonal.

! Find the pair of pentagonal numbers, Pj and Pk, for which their sum and
! difference is pentagonal and D = |Pk − Pj| is minimised; what is the value of D?


! SOLUTION
! --------

! Brute force using a cartesian product and an arbitrarily chosen limit.

<PRIVATE

: nth-pentagonal ( n -- seq )
    dup 3 * 1 - * 2 /i ; inline

: sum-and-diff? ( m n -- ? )
    [ + ] [ - ] 2bi [ pentagonal? ] bi@ and ; inline

: euler044-step ( min m n -- min' )
    [ nth-pentagonal ] bi@
    2dup sum-and-diff? [ - abs min ] [ 2drop ] if ; inline

PRIVATE>

: euler044 ( -- answer )
    most-positive-fixnum >fixnum
    2500 [1,b] [
        2500 [1,b] [
            euler044-step
        ] with each
    ] each ;

! [ euler044 ] 10 ave-time
! 4996 ms ave run time - 87.46 SD (10 trials)

SOLUTION: euler044<commit_msg>project-euler.044: even faster algorithm<commit_after>! Copyright (c) 2008 <NAME>.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.functions math.ranges math.order
project-euler.common sequences layouts ;
IN: project-euler.044

! http://projecteuler.net/index.php?section=problems&id=44

! DESCRIPTION
! -----------

! Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2. The first ten
! pentagonal numbers are:

!     1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

! It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference,
! 70 − 22 = 48, is not pentagonal.

! Find the pair of pentagonal numbers, Pj and Pk, for which their sum and
! difference is pentagonal and D = |Pk − Pj| is minimised; what is the value of D?


! SOLUTION
! --------

! Brute force using a cartesian product and an arbitrarily chosen limit.

<PRIVATE

: nth-pentagonal ( n -- seq )
    dup 3 * 1 - * 2 /i ; inline

: sum-and-diff? ( m n -- ? )
    [ + ] [ - ] 2bi [ pentagonal? ] bi@ and ; inline

: euler044-step ( min m n -- min' )
    [ nth-pentagonal ] bi@
    2dup sum-and-diff? [ - abs min ] [ 2drop ] if ; inline

PRIVATE>

: euler044 ( -- answer )
    most-positive-fixnum >fixnum
    2500 [1,b] [
        dup [1,b] [
            euler044-step
        ] with each
    ] each ;

! [ euler044 ] 10 ave-time
! 4996 ms ave run time - 87.46 SD (10 trials)

SOLUTION: euler044
{'fraction_non_alphanumeric': 0.13964285714285715, 'fraction_numerical': 0.06392857142857143, 'mean_word_length': 2.572704081632653, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4991934', 'n_tokens_mistral': 1143, 'n_tokens_neox': 983, 'n_words': 340}