From b8ab94b5339a316fedd098b6c802079b81b8ca65 Mon Sep 17 00:00:00 2001 From: Evan Hemsley Date: Thu, 20 Nov 2014 14:20:39 -0800 Subject: [PATCH] tidying up more solutions --- euler.rb | 19 +++-- euler012.rb | 37 ++++------ euler013.rb | 202 ++++++++++++++++++++++++++-------------------------- euler014.rb | 27 +++---- euler015.rb | 19 ++--- 5 files changed, 145 insertions(+), 159 deletions(-) diff --git a/euler.rb b/euler.rb index 25f79dc..f61fde2 100644 --- a/euler.rb +++ b/euler.rb @@ -1,8 +1,19 @@ require 'prime' class Integer - def to_digit_list - self.to_s.split('').map(&:to_i) + def choose(k) + factorial / (k.factorial * (self - k).factorial) + end + + def divisors + divisors = [] + (1..Math.sqrt(self).to_i).each do |num| + if self % num == 0 + divisors << num + divisors << self / num + end + end + divisors end def factorial @@ -15,8 +26,8 @@ class Integer i end - def choose(k) - factorial / (k.factorial * (self - k).factorial) + def to_digit_list + self.to_s.split('').map(&:to_i) end end diff --git a/euler012.rb b/euler012.rb index 3976afc..3f83f7d 100644 --- a/euler012.rb +++ b/euler012.rb @@ -1,30 +1,17 @@ -class Integer - def divisors - divisors = [] - (1..Math.sqrt(self).to_i).each do |num| - if self % num == 0 - divisors << num - divisors << self / num - end +require_relative 'euler' + +def triangle_enumerator + Enumerator.new do |y| + sum = 1 + next_num = 2 + loop do + y << sum + sum += next_num + next_num += 1 end - divisors end end -triangle = Enumerator.new do |y| - sum = 1 - next_num = 2 - loop do - y << sum - sum += next_num - next_num += 1 - end +def solution + triangle_enumerator.take_while { |x| x.divisors.count <= 500 }.last end - -val = triangle.next - -while val.divisors.count < 500 - val = triangle.next -end - -puts val diff --git a/euler013.rb b/euler013.rb index 8fd56b3..504212d 100644 --- a/euler013.rb +++ b/euler013.rb @@ -1,100 +1,102 @@ -puts (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).to_s[0..9] +def solution + (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).to_s[0..9] +end diff --git a/euler014.rb b/euler014.rb index bce3aa8..c9b193d 100644 --- a/euler014.rb +++ b/euler014.rb @@ -1,23 +1,16 @@ def collatz(num) - list = [] - current_num = num - while current_num > 1 - list << current_num - if current_num % 2 == 0 - current_num /= 2 - else - current_num = 3*current_num + 1 + [].tap do |list| + until num == 1 + if num.even? + list << (num = num / 2) + else + list << (num = (3 * num) + 1) + end end + list << 1 end - list << 1 end -def longest_chain(num) - chain_length = {} - (1..num).each do |starting_num| - chain_length[starting_num] = collatz(starting_num).count - end - chain_length.sort_by { |key, value| value }.last +def solution + (1..999999).map { |i| collatz(i).count }.each_with_index.max[1] + 1 end - -puts longest_chain(999999) diff --git a/euler015.rb b/euler015.rb index afa59b2..047d896 100644 --- a/euler015.rb +++ b/euler015.rb @@ -1,16 +1,9 @@ -def factorial(n) - i = 1 - while (n > 0) - i *= n - n -= 1 - end - i -end - -def combination(n, k) - factorial(n) / (factorial(k) * factorial(n-k)) -end +require_relative 'euler' def lattice_paths(size) - combination(2*size, size) + (2*size).choose(size) +end + +def solution + lattice_paths(20) end