Permalink
Browse files

usual commit

  • Loading branch information...
1 parent c893d47 commit ff36d2e4f362cd019611ab4de8fd674e88dee6d9 @Liutos committed Apr 3, 2012
Showing with 396 additions and 3 deletions.
  1. +19 −0 haskell/pro24.hs
  2. 0 lisp/#pro50.lisp#
  3. +42 −0 lisp/pro11.lisp
  4. +20 −0 lisp/pro11.txt
  5. +10 −0 lisp/pro13.lisp
  6. +100 −0 lisp/pro13.txt
  7. +10 −0 lisp/pro15.lisp
  8. +29 −0 lisp/pro24.lisp
  9. +8 −3 lisp/pro3.lisp
  10. +33 −0 lisp/pro37.lisp
  11. +70 −0 lisp/pro38.lisp
  12. +21 −0 python/pro3.py
  13. +14 −0 python/pro4.py
  14. +20 −0 python/pro5.py
View
@@ -0,0 +1,19 @@
+factorial :: Int -> Int
+factorial n =
+ let rec acc m =
+ if 0 == m then acc else rec (acc * m) (m - 1)
+ in rec 1 n
+
+nthLexicographicPermutation :: Int -> [Int] -> Integer
+nthLexicographicPermutation n digitList =
+ let rec acc rest l nth
+ | 0 == nth = foldl (\sum x -> 10 * sum + x) acc rest
+ | otherwise =
+ let fac = factorial l
+ in if fac > nth
+ then rec acc rest (l - 1) nth
+ else let q = nth `div` fac
+ r = nth - q * fac
+ inc = rest !! q
+ in rec (10 * acc + inc) [e | e <- rest, e /= inc] (l - 1) r
+ in rec 0 digitList (length digitList) n
View
No changes.
View
@@ -0,0 +1,42 @@
+(defpackage :pro11
+ (:use :cl :iterate :cl-ppcre))
+
+(in-package :pro11)
+
+(declaim (optimize (debug 3)))
+
+(defun read-array (filespec)
+ (let ((lst '()))
+ (iterate (for line in-file filespec using #'read-line)
+ (push (mapcar #'parse-integer
+ (split " " line)) lst))
+ (make-array '(20 20) :initial-contents (nreverse lst))))
+
+(defun down-value (table i j)
+ (if (> i 16) 0
+ (* (aref table i j) (aref table (+ i 1) j)
+ (aref table (+ i 2) j) (aref table (+ i 3) j))))
+(defun right-value (table i j)
+ (if (> j 16) 0
+ (* (aref table i j) (aref table i (+ j 1))
+ (aref table i (+ j 2)) (aref table i (+ j 3)))))
+(defun rb-value (table i j)
+ (if (or (> j 16) (> i 16)) 0
+ (* (aref table i j) (aref table (+ i 1) (+ j 1))
+ (aref table (+ i 2) (+ j 2)) (aref table (+ i 3) (+ j 3)))))
+(defun lb-value (table i j)
+ (if (or (< j 4) (> i 16)) 0
+ (* (aref table i j) (aref table (+ i 1) (- j 1))
+ (aref table (+ i 2) (- j 2)) (aref table (+ i 3) (- j 3)))))
+
+(defun pro11 (table)
+ (let ((d (array-dimension table 0))
+ (max 0))
+ (dotimes (i d)
+ (dotimes (j d)
+ (let ((new-max (max (down-value table i j)
+ (right-value table i j)
+ (rb-value table i j)
+ (lb-value table i j))))
+ (if (> new-max max) (setf max new-max)))))
+ max))
View
@@ -0,0 +1,20 @@
+08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
+49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
+81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
+52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
+22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
+24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
+32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
+67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
+24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
+21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
+78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
+16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
+86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
+19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
+04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
+88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
+04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
+20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
+20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
+01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
View
@@ -0,0 +1,10 @@
+(defpackage :pro13
+ (:use :cl :iterate))
+
+(in-package :pro13)
+
+(defun pro13 ()
+ (let ((sum 0))
+ (iterate (for line in-file "pro13.txt" using #'read-line)
+ (incf sum (parse-integer line)))
+ (subseq (format nil "~D" sum) 0 10)))
View
@@ -0,0 +1,100 @@
+37107287533902102798797998220837590246510135740250
+46376937677490009712648124896970078050417018260538
+74324986199524741059474233309513058123726617309629
+91942213363574161572522430563301811072406154908250
+23067588207539346171171980310421047513778063246676
+89261670696623633820136378418383684178734361726757
+28112879812849979408065481931592621691275889832738
+44274228917432520321923589422876796487670272189318
+47451445736001306439091167216856844588711603153276
+70386486105843025439939619828917593665686757934951
+62176457141856560629502157223196586755079324193331
+64906352462741904929101432445813822663347944758178
+92575867718337217661963751590579239728245598838407
+58203565325359399008402633568948830189458628227828
+80181199384826282014278194139940567587151170094390
+35398664372827112653829987240784473053190104293586
+86515506006295864861532075273371959191420517255829
+71693888707715466499115593487603532921714970056938
+54370070576826684624621495650076471787294438377604
+53282654108756828443191190634694037855217779295145
+36123272525000296071075082563815656710885258350721
+45876576172410976447339110607218265236877223636045
+17423706905851860660448207621209813287860733969412
+81142660418086830619328460811191061556940512689692
+51934325451728388641918047049293215058642563049483
+62467221648435076201727918039944693004732956340691
+15732444386908125794514089057706229429197107928209
+55037687525678773091862540744969844508330393682126
+18336384825330154686196124348767681297534375946515
+80386287592878490201521685554828717201219257766954
+78182833757993103614740356856449095527097864797581
+16726320100436897842553539920931837441497806860984
+48403098129077791799088218795327364475675590848030
+87086987551392711854517078544161852424320693150332
+59959406895756536782107074926966537676326235447210
+69793950679652694742597709739166693763042633987085
+41052684708299085211399427365734116182760315001271
+65378607361501080857009149939512557028198746004375
+35829035317434717326932123578154982629742552737307
+94953759765105305946966067683156574377167401875275
+88902802571733229619176668713819931811048770190271
+25267680276078003013678680992525463401061632866526
+36270218540497705585629946580636237993140746255962
+24074486908231174977792365466257246923322810917141
+91430288197103288597806669760892938638285025333403
+34413065578016127815921815005561868836468420090470
+23053081172816430487623791969842487255036638784583
+11487696932154902810424020138335124462181441773470
+63783299490636259666498587618221225225512486764533
+67720186971698544312419572409913959008952310058822
+95548255300263520781532296796249481641953868218774
+76085327132285723110424803456124867697064507995236
+37774242535411291684276865538926205024910326572967
+23701913275725675285653248258265463092207058596522
+29798860272258331913126375147341994889534765745501
+18495701454879288984856827726077713721403798879715
+38298203783031473527721580348144513491373226651381
+34829543829199918180278916522431027392251122869539
+40957953066405232632538044100059654939159879593635
+29746152185502371307642255121183693803580388584903
+41698116222072977186158236678424689157993532961922
+62467957194401269043877107275048102390895523597457
+23189706772547915061505504953922979530901129967519
+86188088225875314529584099251203829009407770775672
+11306739708304724483816533873502340845647058077308
+82959174767140363198008187129011875491310547126581
+97623331044818386269515456334926366572897563400500
+42846280183517070527831839425882145521227251250327
+55121603546981200581762165212827652751691296897789
+32238195734329339946437501907836945765883352399886
+75506164965184775180738168837861091527357929701337
+62177842752192623401942399639168044983993173312731
+32924185707147349566916674687634660915035914677504
+99518671430235219628894890102423325116913619626622
+73267460800591547471830798392868535206946944540724
+76841822524674417161514036427982273348055556214818
+97142617910342598647204516893989422179826088076852
+87783646182799346313767754307809363333018982642090
+10848802521674670883215120185883543223812876952786
+71329612474782464538636993009049310363619763878039
+62184073572399794223406235393808339651327408011116
+66627891981488087797941876876144230030984490851411
+60661826293682836764744779239180335110989069790714
+85786944089552990653640447425576083659976645795096
+66024396409905389607120198219976047599490197230297
+64913982680032973156037120041377903785566085089252
+16730939319872750275468906903707539413042652315011
+94809377245048795150954100921645863754710598436791
+78639167021187492431995700641917969777599028300699
+15368713711936614952811305876380278410754449733078
+40789923115535562561142322423255033685442488917353
+44889911501440648020369068063960672322193204149535
+41503128880339536053299340368006977710650566631954
+81234880673210146739058568557934581403627822703280
+82616570773948327592232845941706525094512325230608
+22918802058777319719839450180888072429661980811197
+77158542502016545090413245809786882778948721859617
+72107838435069186155435662884062257473692284509516
+20849603980134001723930671666823555245252804609722
+53503534226472524250874054075591789781264330331690
View
@@ -0,0 +1,10 @@
+(defun square-routes (size)
+ (let ((aux (make-array `(,(1+ size) ,(1+ size)) :initial-element nil)))
+ (labels ((rec (i j)
+ (cond ((aref aux i j) (aref aux i j))
+ ((or (= size i) (= size j)) 1)
+ (t (let ((right-ptr (rec (1+ i) j))
+ (down-ptr (rec i (1+ j))))
+ (setf (aref aux i j) (+ right-ptr down-ptr))
+ (+ right-ptr down-ptr))))))
+ (rec 0 0))))
View
@@ -0,0 +1,29 @@
+(proclaim '(optimize speed))
+
+(defun factorial (n)
+ (labels ((rec (acc m)
+ (if (= 0 m)
+ acc
+ (rec (* acc m) (- m 1)))))
+ (rec 1 n)))
+
+(defun nth-lexicographic-permutation (n digit-list)
+ (labels ((rec (acc rest l nth)
+ (if (= 0 nth)
+ (reduce #'(lambda (sum x)
+ (+ (* 10 sum) x)) rest :initial-value acc)
+ (let ((fac (factorial l)))
+ (if (> fac nth)
+ (rec acc rest (- l 1) nth)
+ (let ((r (rem nth fac)))
+ (let ((q (/ (- nth r) fac)))
+ (let ((inc (nth q rest)))
+ (rec (+ (* 10 acc) inc)
+ (remove inc rest)
+ (- l 1)
+ r)))))))))
+ (rec 0 digit-list (length digit-list) n)))
+
+(defun pro24 ()
+ (nth-lexicographic-permutation (1- (expt 10 6))
+ '(0 1 2 3 4 5 6 7 8 9)))
View
@@ -1,9 +1,14 @@
+(defun smallest-factor (n)
+ (labels ((rec (test)
+ (if (or (>= test n) (zerop (rem n test)))
+ test
+ (rec (1+ test)))))
+ (rec 2)))
+
(defun largest-prime-factor (n)
(labels ((rec (num acc)
(cond ((= 1 num) acc)
((<= num 2) num)
- (t (let ((fac (do ((i 2 (1+ i)))
- ((or (>= i num)
- (zerop (mod num i))) i))))
+ (t (let ((fac (smallest-factor num)))
(rec (/ num fac) fac))))))
(rec n 1)))
View
@@ -0,0 +1,33 @@
+(proclaim '(optimize speed))
+
+(defun primep (number)
+ (let ((bnd (truncate (sqrt number))))
+ (labels ((rec (test)
+ (cond ((> test bnd) t)
+ ((= 0 (rem number test)) nil)
+ (t (rec (+ test 2))))))
+ (cond ((= 1 number) nil)
+ ((= 2 number) t)
+ ((= 0 (rem number 2)) nil)
+ (t (rec 3))))))
+
+(defun left-right-prime-p (number)
+ (labels ((rec (test)
+ (if (> test number)
+ t
+ (let* ((right-ptr (rem number test))
+ (left-ptr (/ (- number right-ptr) test)))
+ (if (and (primep right-ptr) (primep left-ptr))
+ (rec (* 10 test))
+ nil)))))
+ (and (primep number)
+ (rec 10))))
+
+(defun pro37 ()
+ (labels ((rec (acc cnt test)
+ (if (= 11 cnt)
+ acc
+ (if (left-right-prime-p test)
+ (rec (+ acc test) (1+ cnt) (+ test 2))
+ (rec acc cnt (+ test 2))))))
+ (rec 0 0 11)))
View
@@ -0,0 +1,70 @@
+(proclaim '(optimize speed))
+
+(declaim (optimize (debug 3)))
+
+(defun mul-pandigital-p (number digits)
+ (let ((aux (make-array '(9) :initial-element 0)))
+ (labels ((fill-aux (number)
+ (if (/= 0 number)
+ (let ((lsb (rem number 10)))
+ (if (= 0 lsb) (return-from mul-pandigital-p nil))
+ (incf (aref aux (- lsb 1)))
+ (fill-aux (/ (- number lsb) 10)))))
+ (rec (lst)
+ (cond ((null lst)
+ (every #'(lambda (x) (= 1 x)) aux))
+ (t
+ (fill-aux (* number (car lst)))
+ (rec (cdr lst))))))
+ (rec digits))))
+
+(defun number-len (number)
+ (labels ((rec (acc num)
+ (if (= 0 num)
+ acc
+ (rec (1+ acc) (truncate (/ num 10))))))
+ (rec 0 number)))
+
+(defun bnd-for-n (n)
+ (labels ((rec (test)
+ (if (= 1 test) nil
+ (let ((mul-len (number-len (* n test))))
+ (if (> mul-len 9)
+ (rec (1- test))
+ (ceiling (/ 9 mul-len)))))))
+ (rec 9)))
+
+(defun gen1->n (n)
+ (let ((seq (list)))
+ (loop :for i :from 1 :upto n
+ :do (push i seq))
+ (nreverse seq)))
+
+(defun mul-sum (n digits)
+ (reduce #'(lambda (sum x)
+ (let ((len (number-len (* n x))))
+ (+ (* (expt 10 len) sum) (* n x)))) digits :initial-value 0))
+
+(defun mul-pandigital-p (number)
+ (let ((aux (make-array '(9) :initial-element 0)))
+ (labels ((rec (cur)
+ (if (= 0 cur)
+ (every #'(lambda (x) (= 1 x)) aux)
+ (let ((lsb (rem cur 10)))
+ (when (/= 0 lsb)
+ (incf (aref aux (1- lsb)))
+ (rec (/ (- cur lsb) 10)))))))
+ (rec number))))
+
+(defun pro38 ()
+ (let ((max 0))
+ (loop :for i :from 1 :upto 9999
+ :do (let ((bnd (bnd-for-n i)))
+ (if bnd
+ (loop :for j :from 2 :upto bnd
+ :do (let* ((digits (gen1->n j))
+ (val (mul-sum i digits)))
+ (if (and (mul-pandigital-p val)
+ (> val max))
+ (setf max val)))))))
+ max))
View
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+
+def smallest_factor(n):
+ test = 2
+ while test < n:
+ if 0 == n % test:
+ return test
+ test = test + 1
+ return n
+
+def largest_prime_factor(n):
+ num = n
+ acc = 1
+ while num != 1:
+ if num <= 2:
+ return num
+ else:
+ fac = smallest_factor(num)
+ num = num / fac
+ acc = fac
+ return acc
Oops, something went wrong.

0 comments on commit ff36d2e

Please sign in to comment.