Last active
December 10, 2015 01:18
-
-
Save emanon001/4358164 to your computer and use it in GitHub Desktop.
Project Euler Problem 13 #mitori_clj
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; Project Euler Problem 13 | |
;;; 「50桁の数字100個の和の上位10桁を求めよ」 | |
;;; http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2013 | |
(ns projecteuler-answers.problem-013 | |
(:require [clojure.math.numeric-tower :as math] | |
[clojure.test :refer [are]])) | |
(def nums | |
[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]) | |
(defn high-order-digits | |
"整数 n の上位 m 桁を返します" | |
[n m] | |
(->> n | |
math/abs | |
str | |
(take m) | |
(apply str) | |
bigint)) | |
(are [n m expected] | |
(= (high-order-digits n m) expected) | |
123 1 1 | |
123 2 12 | |
123 3 123 | |
-123 3 123) | |
(defn solve | |
"整数列の和の上位 n 桁を返します" | |
([] (solve nums 10)) | |
([nums n] | |
(high-order-digits (apply +' nums) n))) | |
(are [nums n expected] | |
(= (solve nums n) expected) | |
[100 20 3] 1 1 | |
[100 20 3] 2 12 | |
[100 20 3] 3 123 | |
[-100 -20 -3] 3 123) | |
(time (solve)) | |
; "Elapsed time: 0.133 msecs" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@kohyama
指摘ありがとうございます。math.numeric-tower を使用するようにしました。(ついでに、
clojure.test
も最小限のものをrequire
するようにしました)関数の入出力や切り分け、どこまで汎用的に作るのかなど毎回悩みます。
今回の場合は、正の整数だけを受け取るならば、
abs
相当の処理は必要ありませんし、文字列をそのまま返しても答えを得ることは可能ですし。また、
high-order-digits
という名前ならば、数値そのものよりも、各桁のシーケンスを返すべきではないのか、などなど……。Clojure を使うようになってからは、その辺りのことを意識する機会が増えたなあと感じています。
@tnoda
おお、
clojure.core
にあったのですね。clojure.string
を見て、それらしい関数が無かったので.substring
を呼ぶしかないと思っていました。存在意義という点については、
とかでしょうか。(
subs
の使用頻度はそこまで高くないだろう、他に関数化すべきものがあるだろう、というのは置いておいて)clojure.string
ではなくclojure.core
にあるのは謎のままですが……。