From 95341b61b030c9e1290f3b326cb7ec584f543aea Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Sun, 31 Aug 2014 20:21:45 +0200 Subject: moved files to higher directory after split to new repository --- 001.py | 7 + 002.c | 20 + 003.py | 9 + 004.py | 23 + 005.py | 19 + 006.py | 13 + 007.py | 20 + 008.py | 22 + 009.py | 7 + 010.py | 33 + 011.py | 50 + 011.txt | 20 + 012.c | 37 + 013.py | 14 + 013.txt | 100 + 014.py | 21 + 015.py | 29 + 016.py | 9 + 017.py | 31 + 018.py | 20 + 018.txt | 15 + 019.py | 17 + 020.py | 16 + 021.c | 35 + 022.py | 18 + 022.txt | 5163 ++++++++++++++++++++++++++++++++++++++++++++ 023.py | 37 + 024.py | 24 + 025.py | 19 + 026.py | 33 + 027.py | 25 + 028.py | 13 + 029.py | 9 + 030.c | 41 + 031.py | 18 + 032.c | 64 + 032.py | 43 + 033.c | 59 + 033.py | 34 + 034.py | 27 + 035.py | 33 + 036.py | 40 + 037.py | 61 + 038.py | 43 + 039.c | 37 + 039.py | 21 + 040.py | 34 + 041.py | 26 + 042.py | 18 + 042.txt | 1786 +++++++++++++++ 043.py | 35 + 044.py | 9 + 045.py | 12 + 046.py | 35 + 047.py | 25 + 048.py | 6 + 049.py | 34 + 050.py | 28 + 051.c | 121 ++ 052.py | 22 + 053.py | 14 + 054.py | 287 +++ 054.txt | 1000 +++++++++ 055.py | 17 + 056.py | 18 + 057.py | 16 + 058.py | 39 + 059.py | 28 + 059.txt | 1 + 060.py | 49 + 061.py | 53 + 062.c | 57 + 063.py | 23 + 064.c | 84 + 065.c | 40 + 066.c | 112 + 067.py | 20 + 067.txt | 100 + 068.py | 5 + 069.py | 28 + 069_2.py | 22 + 071.py | 15 + 072.c | 16 + 072.txt | 16 + 073.py | 14 + 074.py | 48 + 075.py | 29 + 080.py | 55 + 081.py | 71 + 081.txt | 80 + 082.py | 85 + 082.txt | 80 + 083.py | 76 + 083.txt | 80 + 087.c | 42 + 089.py | 97 + 089.txt | 1000 +++++++++ 092.c | 45 + 096.pl | 173 ++ 096.txt | 500 +++++ 097.py | 1 + 098.py | 77 + 098.txt | 1 + 099.py | 21 + 099.txt | 1000 +++++++++ 102.py | 43 + 102.txt | 1000 +++++++++ 112.c | 45 + 124.py | 31 + 125.py | 22 + 134.c | 59 + 187.c | 28 + 206.py | 24 + common.c | 154 ++ common.h | 9 + common.py | 145 ++ src/projecteuler/001.py | 7 - src/projecteuler/002.c | 20 - src/projecteuler/003.py | 9 - src/projecteuler/004.py | 23 - src/projecteuler/005.py | 19 - src/projecteuler/006.py | 13 - src/projecteuler/007.py | 20 - src/projecteuler/008.py | 22 - src/projecteuler/009.py | 7 - src/projecteuler/010.py | 33 - src/projecteuler/011.py | 50 - src/projecteuler/011.txt | 20 - src/projecteuler/012.c | 37 - src/projecteuler/013.py | 14 - src/projecteuler/013.txt | 100 - src/projecteuler/014.py | 21 - src/projecteuler/015.py | 29 - src/projecteuler/016.py | 9 - src/projecteuler/017.py | 31 - src/projecteuler/018.py | 20 - src/projecteuler/018.txt | 15 - src/projecteuler/019.py | 17 - src/projecteuler/020.py | 16 - src/projecteuler/021.c | 35 - src/projecteuler/022.py | 18 - src/projecteuler/022.txt | 5163 -------------------------------------------- src/projecteuler/023.py | 37 - src/projecteuler/024.py | 24 - src/projecteuler/025.py | 19 - src/projecteuler/026.py | 33 - src/projecteuler/027.py | 25 - src/projecteuler/028.py | 13 - src/projecteuler/029.py | 9 - src/projecteuler/030.c | 41 - src/projecteuler/031.py | 18 - src/projecteuler/032.c | 64 - src/projecteuler/032.py | 43 - src/projecteuler/033.c | 59 - src/projecteuler/033.py | 34 - src/projecteuler/034.py | 27 - src/projecteuler/035.py | 33 - src/projecteuler/036.py | 40 - src/projecteuler/037.py | 61 - src/projecteuler/038.py | 43 - src/projecteuler/039.c | 37 - src/projecteuler/039.py | 21 - src/projecteuler/040.py | 34 - src/projecteuler/041.py | 26 - src/projecteuler/042.py | 18 - src/projecteuler/042.txt | 1786 --------------- src/projecteuler/043.py | 35 - src/projecteuler/044.py | 9 - src/projecteuler/045.py | 12 - src/projecteuler/046.py | 35 - src/projecteuler/047.py | 25 - src/projecteuler/048.py | 6 - src/projecteuler/049.py | 34 - src/projecteuler/050.py | 28 - src/projecteuler/051.c | 121 -- src/projecteuler/052.py | 22 - src/projecteuler/053.py | 14 - src/projecteuler/054.py | 287 --- src/projecteuler/054.txt | 1000 --------- src/projecteuler/055.py | 17 - src/projecteuler/056.py | 18 - src/projecteuler/057.py | 16 - src/projecteuler/058.py | 39 - src/projecteuler/059.py | 28 - src/projecteuler/059.txt | 1 - src/projecteuler/060.py | 49 - src/projecteuler/061.py | 53 - src/projecteuler/062.c | 57 - src/projecteuler/063.py | 23 - src/projecteuler/064.c | 84 - src/projecteuler/065.c | 40 - src/projecteuler/066.c | 112 - src/projecteuler/067.py | 20 - src/projecteuler/067.txt | 100 - src/projecteuler/068.py | 5 - src/projecteuler/069.py | 28 - src/projecteuler/069_2.py | 22 - src/projecteuler/071.py | 15 - src/projecteuler/072.c | 16 - src/projecteuler/072.txt | 16 - src/projecteuler/073.py | 14 - src/projecteuler/074.py | 48 - src/projecteuler/075.py | 29 - src/projecteuler/080.py | 55 - src/projecteuler/081.py | 71 - src/projecteuler/081.txt | 80 - src/projecteuler/082.py | 85 - src/projecteuler/082.txt | 80 - src/projecteuler/083.py | 76 - src/projecteuler/083.txt | 80 - src/projecteuler/087.c | 42 - src/projecteuler/089.py | 97 - src/projecteuler/089.txt | 1000 --------- src/projecteuler/092.c | 45 - src/projecteuler/096.pl | 173 -- src/projecteuler/096.txt | 500 ----- src/projecteuler/097.py | 1 - src/projecteuler/098.py | 77 - src/projecteuler/098.txt | 1 - src/projecteuler/099.py | 21 - src/projecteuler/099.txt | 1000 --------- src/projecteuler/102.py | 43 - src/projecteuler/102.txt | 1000 --------- src/projecteuler/112.c | 45 - src/projecteuler/124.py | 31 - src/projecteuler/125.py | 22 - src/projecteuler/134.c | 59 - src/projecteuler/187.c | 28 - src/projecteuler/206.py | 24 - src/projecteuler/common.c | 154 -- src/projecteuler/common.h | 9 - src/projecteuler/common.py | 145 -- 232 files changed, 15835 insertions(+), 15835 deletions(-) create mode 100644 001.py create mode 100644 002.c create mode 100644 003.py create mode 100644 004.py create mode 100644 005.py create mode 100644 006.py create mode 100644 007.py create mode 100644 008.py create mode 100644 009.py create mode 100644 010.py create mode 100644 011.py create mode 100644 011.txt create mode 100644 012.c create mode 100644 013.py create mode 100644 013.txt create mode 100644 014.py create mode 100644 015.py create mode 100644 016.py create mode 100644 017.py create mode 100644 018.py create mode 100644 018.txt create mode 100644 019.py create mode 100644 020.py create mode 100644 021.c create mode 100644 022.py create mode 100644 022.txt create mode 100644 023.py create mode 100644 024.py create mode 100644 025.py create mode 100644 026.py create mode 100644 027.py create mode 100644 028.py create mode 100644 029.py create mode 100644 030.c create mode 100644 031.py create mode 100644 032.c create mode 100644 032.py create mode 100644 033.c create mode 100644 033.py create mode 100644 034.py create mode 100644 035.py create mode 100644 036.py create mode 100644 037.py create mode 100644 038.py create mode 100644 039.c create mode 100644 039.py create mode 100644 040.py create mode 100644 041.py create mode 100644 042.py create mode 100644 042.txt create mode 100644 043.py create mode 100644 044.py create mode 100644 045.py create mode 100644 046.py create mode 100644 047.py create mode 100644 048.py create mode 100644 049.py create mode 100644 050.py create mode 100644 051.c create mode 100644 052.py create mode 100644 053.py create mode 100644 054.py create mode 100644 054.txt create mode 100644 055.py create mode 100644 056.py create mode 100644 057.py create mode 100644 058.py create mode 100644 059.py create mode 100644 059.txt create mode 100644 060.py create mode 100644 061.py create mode 100644 062.c create mode 100644 063.py create mode 100644 064.c create mode 100644 065.c create mode 100644 066.c create mode 100644 067.py create mode 100644 067.txt create mode 100644 068.py create mode 100644 069.py create mode 100644 069_2.py create mode 100644 071.py create mode 100644 072.c create mode 100644 072.txt create mode 100644 073.py create mode 100644 074.py create mode 100644 075.py create mode 100644 080.py create mode 100644 081.py create mode 100644 081.txt create mode 100644 082.py create mode 100644 082.txt create mode 100644 083.py create mode 100644 083.txt create mode 100644 087.c create mode 100644 089.py create mode 100644 089.txt create mode 100644 092.c create mode 100644 096.pl create mode 100644 096.txt create mode 100644 097.py create mode 100644 098.py create mode 100644 098.txt create mode 100644 099.py create mode 100644 099.txt create mode 100644 102.py create mode 100644 102.txt create mode 100644 112.c create mode 100644 124.py create mode 100644 125.py create mode 100644 134.c create mode 100644 187.c create mode 100644 206.py create mode 100644 common.c create mode 100644 common.h create mode 100644 common.py delete mode 100644 src/projecteuler/001.py delete mode 100644 src/projecteuler/002.c delete mode 100644 src/projecteuler/003.py delete mode 100644 src/projecteuler/004.py delete mode 100644 src/projecteuler/005.py delete mode 100644 src/projecteuler/006.py delete mode 100644 src/projecteuler/007.py delete mode 100644 src/projecteuler/008.py delete mode 100644 src/projecteuler/009.py delete mode 100644 src/projecteuler/010.py delete mode 100644 src/projecteuler/011.py delete mode 100644 src/projecteuler/011.txt delete mode 100644 src/projecteuler/012.c delete mode 100644 src/projecteuler/013.py delete mode 100644 src/projecteuler/013.txt delete mode 100644 src/projecteuler/014.py delete mode 100644 src/projecteuler/015.py delete mode 100644 src/projecteuler/016.py delete mode 100644 src/projecteuler/017.py delete mode 100644 src/projecteuler/018.py delete mode 100644 src/projecteuler/018.txt delete mode 100644 src/projecteuler/019.py delete mode 100644 src/projecteuler/020.py delete mode 100644 src/projecteuler/021.c delete mode 100644 src/projecteuler/022.py delete mode 100644 src/projecteuler/022.txt delete mode 100644 src/projecteuler/023.py delete mode 100644 src/projecteuler/024.py delete mode 100644 src/projecteuler/025.py delete mode 100644 src/projecteuler/026.py delete mode 100644 src/projecteuler/027.py delete mode 100644 src/projecteuler/028.py delete mode 100644 src/projecteuler/029.py delete mode 100644 src/projecteuler/030.c delete mode 100644 src/projecteuler/031.py delete mode 100644 src/projecteuler/032.c delete mode 100644 src/projecteuler/032.py delete mode 100644 src/projecteuler/033.c delete mode 100644 src/projecteuler/033.py delete mode 100644 src/projecteuler/034.py delete mode 100644 src/projecteuler/035.py delete mode 100644 src/projecteuler/036.py delete mode 100644 src/projecteuler/037.py delete mode 100644 src/projecteuler/038.py delete mode 100644 src/projecteuler/039.c delete mode 100644 src/projecteuler/039.py delete mode 100644 src/projecteuler/040.py delete mode 100644 src/projecteuler/041.py delete mode 100644 src/projecteuler/042.py delete mode 100644 src/projecteuler/042.txt delete mode 100644 src/projecteuler/043.py delete mode 100644 src/projecteuler/044.py delete mode 100644 src/projecteuler/045.py delete mode 100644 src/projecteuler/046.py delete mode 100644 src/projecteuler/047.py delete mode 100644 src/projecteuler/048.py delete mode 100644 src/projecteuler/049.py delete mode 100644 src/projecteuler/050.py delete mode 100644 src/projecteuler/051.c delete mode 100644 src/projecteuler/052.py delete mode 100644 src/projecteuler/053.py delete mode 100644 src/projecteuler/054.py delete mode 100644 src/projecteuler/054.txt delete mode 100644 src/projecteuler/055.py delete mode 100644 src/projecteuler/056.py delete mode 100644 src/projecteuler/057.py delete mode 100644 src/projecteuler/058.py delete mode 100644 src/projecteuler/059.py delete mode 100644 src/projecteuler/059.txt delete mode 100644 src/projecteuler/060.py delete mode 100644 src/projecteuler/061.py delete mode 100644 src/projecteuler/062.c delete mode 100644 src/projecteuler/063.py delete mode 100644 src/projecteuler/064.c delete mode 100644 src/projecteuler/065.c delete mode 100644 src/projecteuler/066.c delete mode 100644 src/projecteuler/067.py delete mode 100644 src/projecteuler/067.txt delete mode 100644 src/projecteuler/068.py delete mode 100644 src/projecteuler/069.py delete mode 100644 src/projecteuler/069_2.py delete mode 100644 src/projecteuler/071.py delete mode 100644 src/projecteuler/072.c delete mode 100644 src/projecteuler/072.txt delete mode 100644 src/projecteuler/073.py delete mode 100644 src/projecteuler/074.py delete mode 100644 src/projecteuler/075.py delete mode 100644 src/projecteuler/080.py delete mode 100644 src/projecteuler/081.py delete mode 100644 src/projecteuler/081.txt delete mode 100644 src/projecteuler/082.py delete mode 100644 src/projecteuler/082.txt delete mode 100644 src/projecteuler/083.py delete mode 100644 src/projecteuler/083.txt delete mode 100644 src/projecteuler/087.c delete mode 100644 src/projecteuler/089.py delete mode 100644 src/projecteuler/089.txt delete mode 100644 src/projecteuler/092.c delete mode 100644 src/projecteuler/096.pl delete mode 100644 src/projecteuler/096.txt delete mode 100644 src/projecteuler/097.py delete mode 100644 src/projecteuler/098.py delete mode 100644 src/projecteuler/098.txt delete mode 100644 src/projecteuler/099.py delete mode 100644 src/projecteuler/099.txt delete mode 100644 src/projecteuler/102.py delete mode 100644 src/projecteuler/102.txt delete mode 100644 src/projecteuler/112.c delete mode 100644 src/projecteuler/124.py delete mode 100644 src/projecteuler/125.py delete mode 100644 src/projecteuler/134.c delete mode 100644 src/projecteuler/187.c delete mode 100644 src/projecteuler/206.py delete mode 100644 src/projecteuler/common.c delete mode 100644 src/projecteuler/common.h delete mode 100644 src/projecteuler/common.py diff --git a/001.py b/001.py new file mode 100644 index 0000000..dd1cbc6 --- /dev/null +++ b/001.py @@ -0,0 +1,7 @@ +result = 0 + +for i in range(1,1000): + if i % 3 == 0 or i % 5 == 0: + result += i + +print result diff --git a/002.c b/002.c new file mode 100644 index 0000000..7a16a80 --- /dev/null +++ b/002.c @@ -0,0 +1,20 @@ +int main() +{ + int previous = 1, next = 2; + int sum = 0, tmp = 0; + + while(next <= 4000000) + { + if(!(next & 1)) + sum += next; + + tmp = next; + next += previous; + previous = tmp; + } + + printf("%ld\n", sum); + + return 0; +} + diff --git a/003.py b/003.py new file mode 100644 index 0000000..c5b3036 --- /dev/null +++ b/003.py @@ -0,0 +1,9 @@ +number = 600851475143 + +i = 3 +while(i < number): + while(number % i == 0 and number != i): + number = number / i + i += 2 + +print number diff --git a/004.py b/004.py new file mode 100644 index 0000000..c22b764 --- /dev/null +++ b/004.py @@ -0,0 +1,23 @@ +max = 0 + +def palindrom(number): + tmp = number + new = 0 + while(tmp > 0): + new *= 10 + new += tmp % 10 + tmp = tmp / 10 + + if new == number: + return True + else: + return False + + +for i in xrange(100,1000): + for j in xrange(100,1000): + if palindrom(i*j) and i*j > max: + max = i*j + +print max + diff --git a/005.py b/005.py new file mode 100644 index 0000000..8929956 --- /dev/null +++ b/005.py @@ -0,0 +1,19 @@ +divisors = [11, 12, 13, 14, 15, 16, 17, 18, 19] # only need to check those divisors + +def divisible(number): + result = True + for i in divisors: + if number % i != 0: + result = False + break + return result + +number = 20 + +while(True): + if divisible(number): + break + number += 20 + +print number + diff --git a/006.py b/006.py new file mode 100644 index 0000000..2010877 --- /dev/null +++ b/006.py @@ -0,0 +1,13 @@ +def sum_of_squares(limit): + result = 0 + for i in range(1, limit+1): + result += i*i + return result + +def square_of_sums(limit): + result = 0 + for i in range(1, limit+1): + result += i + return result*result + +print abs(sum_of_squares(100) - square_of_sums(100)) diff --git a/007.py b/007.py new file mode 100644 index 0000000..63d565a --- /dev/null +++ b/007.py @@ -0,0 +1,20 @@ +prime_list = [2] + +def is_prime(number): + global prime_list + prime = True + for x in prime_list: + if number % x == 0: + prime = False + break + return prime + +count = 3 + +while(len(prime_list) < 10001): + if is_prime(count): + prime_list.append(count) + count += 2 + +print prime_list[-1] + diff --git a/008.py b/008.py new file mode 100644 index 0000000..002b958 --- /dev/null +++ b/008.py @@ -0,0 +1,22 @@ +number = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 + +max = 0 + +while(number > 0): + tmp = number + digit1 = tmp % 10 + tmp = tmp / 10 + digit2 = tmp % 10 + tmp = tmp / 10 + digit3 = tmp % 10 + tmp = tmp / 10 + digit4 = tmp % 10 + tmp = tmp / 10 + digit5 = tmp % 10 + tmp = tmp / 10 + number = number / 10 + product = digit1 * digit2 * digit3 * digit4 * digit5 + if product > max: + max = product + +print max diff --git a/009.py b/009.py new file mode 100644 index 0000000..f122a7a --- /dev/null +++ b/009.py @@ -0,0 +1,7 @@ +for a in range(1,1000): + for b in range(a, 1000): + c = 1000 - a - b + if a*a + b*b == c*c: + print a*b*c + break + diff --git a/010.py b/010.py new file mode 100644 index 0000000..691c7a5 --- /dev/null +++ b/010.py @@ -0,0 +1,33 @@ +limit = 2000000 + +number_list = [False] + [True]*(limit-1) +list_len = len(number_list) + +def next_prime(i): + global number_list + global list_len + x = i+1 + while(x <= list_len): + if number_list[x-1] == True: + break + x += 1 + return x + +i = 2 + +while(i*i <= list_len): + x = i*i + while(x <= list_len): + number_list[x-1] = False + x += i + i = next_prime(i) + + +sum = 0 + +for i in xrange(1, limit+1): + if number_list[i-1]: + sum += i + +print sum + diff --git a/011.py b/011.py new file mode 100644 index 0000000..4fff9d4 --- /dev/null +++ b/011.py @@ -0,0 +1,50 @@ + +numbers = [] + +f = open('011.txt', 'r') +for line in f: + line.rstrip('\n') + line_str = line.split(' ') + line_int = [ int(x) for x in line_str ] + numbers.append(line_int) +f.close() + + +def find_down(): + max = 0 + for i in range(0, 17): + for j in range(0, 20): + product = numbers[i][j] * numbers[i+1][j] * numbers[i+2][j] * numbers[i+3][j] + if product > max: + max = product + return max + +def find_right(): + max = 0 + for i in range(0, 20): + for j in range(0, 17): + product = numbers[i][j] * numbers[i][j+1] * numbers[i][j+2] * numbers[i][j+3] + if product > max: + max = product + return max + +def find_diagonal1(): + max = 0 + for i in range(0, 17): + for j in range(0, 17): + product = numbers[i][j] * numbers[i+1][j+1] * numbers[i+2][j+2] * numbers[i+3][j+3] + if product > max: + max = product + return max + +def find_diagonal2(): + max = 0 + for i in range(0, 17): + for j in range(0, 17): + product = numbers[i][19-j] * numbers[i+1][18-j] * numbers[i+2][17-j] * numbers[i+3][16-j] + if product > max: + max = product + return max + +print max(find_down(), find_right(), find_diagonal1(), find_diagonal2()) + diff --git a/011.txt b/011.txt new file mode 100644 index 0000000..4ac2451 --- /dev/null +++ b/011.txt @@ -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 diff --git a/012.c b/012.c new file mode 100644 index 0000000..c5cc49e --- /dev/null +++ b/012.c @@ -0,0 +1,37 @@ +#include + +int count_divisors(unsigned int triangle) +{ + unsigned int i; + int count = 2; + int limit = (int) ceil(sqrt(triangle)); + for(i=2; i max_len: + max_start = i + max_len = len + +print max_start + diff --git a/015.py b/015.py new file mode 100644 index 0000000..749be04 --- /dev/null +++ b/015.py @@ -0,0 +1,29 @@ + +size = 20 + +field = [ [ 1 for i in range(0, size+1) ] for i in range(0, size+1) ] + +for i in xrange(1, size+1): + for j in xrange(1, size+1): + field[i][j] = field[i][j-1] + field[i-1][j] + +print field[size][size] + + +# +# recursive solution. too slow +# +#def count_path(width, height): +# if width == 0 and height == 0: +# return 1 +# +# count = 0 +# if width > 0: # go right +# count += count_path(width-1, height) +# if height > 0: # go down +# count += count_path(width, height-1) +# +# return count +# +#print count_path(20, 20) + diff --git a/016.py b/016.py new file mode 100644 index 0000000..d83451e --- /dev/null +++ b/016.py @@ -0,0 +1,9 @@ +number = 1 << 1000 + +sum = 0 + +while(number > 0): + sum += number % 10 + number = number / 10 + +print sum diff --git a/017.py b/017.py new file mode 100644 index 0000000..8bb95cf --- /dev/null +++ b/017.py @@ -0,0 +1,31 @@ +n1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] +n2 = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] +n3 = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] +n4 = ["hundred"] +n5 = ["thousand"] + +numbers = "" +for i in range(1, 1001): + current = "" + + if (i % 10000) / 1000 > 0: + current += n1[(i%10000)/1000] + n5[0] + if i % 1000 > 0: + current += "and" + + if (i % 1000) / 100 > 0: + current += n1[(i%1000)/100] + n4[0] + if i % 100 > 0: + current += "and" + + if i % 100 <= 9: + current += n1[i%10] + elif i % 100 <= 19: + current += n2[(i%10)-10] + else: + current += n3[(i%100)/10-2] + n1[i%10] + + numbers += current + +print len(numbers) + diff --git a/018.py b/018.py new file mode 100644 index 0000000..d54d14c --- /dev/null +++ b/018.py @@ -0,0 +1,20 @@ + +triangle = [] + +f = open('018.txt', 'r') +for line in f: + line.rstrip('\n') + row_str = line.split(' ') + row_int = [ int(x) for x in row_str ] + triangle.append(row_int) +f.close() + +for i in range(1, len(triangle)): + rowlen = len(triangle[i]) + triangle[i][0] += triangle[i-1][0] + triangle[i][rowlen-1] += triangle[i-1][rowlen-2] + for j in range(1, rowlen-1): + triangle[i][j] += max(triangle[i-1][j-1], triangle[i-1][j]) + +print max(triangle[-1]) + diff --git a/018.txt b/018.txt new file mode 100644 index 0000000..e236c2f --- /dev/null +++ b/018.txt @@ -0,0 +1,15 @@ +75 +95 64 +17 47 82 +18 35 87 10 +20 04 82 47 65 +19 01 23 75 03 34 +88 02 77 73 07 63 67 +99 65 04 28 06 16 70 92 +41 41 26 56 83 40 80 70 33 +41 48 72 33 47 32 37 16 94 29 +53 71 44 65 25 43 91 52 97 51 14 +70 11 33 28 77 73 17 78 39 68 17 57 +91 71 52 38 17 14 91 43 58 50 27 29 48 +63 66 04 68 89 53 67 30 73 16 69 87 40 31 +04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 diff --git a/019.py b/019.py new file mode 100644 index 0000000..187b45e --- /dev/null +++ b/019.py @@ -0,0 +1,17 @@ +days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + +day = 7 # first sunday in 1900 +count = 0 + +for year in range(1900, 2001): + for month in range(1, 13): + if day == 1 and year >= 1901: + count += 1 + if month == 2 and year % 4 == 0: + day -= 1 + while(day <= days[month-1]): + day += 7 + day -= days[month-1] + +print count + diff --git a/020.py b/020.py new file mode 100644 index 0000000..451d614 --- /dev/null +++ b/020.py @@ -0,0 +1,16 @@ +def fac(limit): + result = 1 + for i in range(1, limit+1): + result *= i + return result + +number = fac(100) + +sum = 0 + +while(number > 0): + sum += number % 10 + number = number / 10 + +print sum + diff --git a/021.c b/021.c new file mode 100644 index 0000000..e236cf3 --- /dev/null +++ b/021.c @@ -0,0 +1,35 @@ +#include + +int sum_divisors(int number) +{ + int i; + int sum = 1; + int limit = (int) ceil(sqrt(number)); + for(i=2; i n: + return True + else: + return False + +def sum_abundant(n): + for i in numbers: + if n-i in numbers: + return True + return False + + +for n in xrange(2, limit+1): + if abundant(n): + numbers.add(n) + +sum = 0 + +for n in xrange(limit+1): + if not sum_abundant(n): + sum += n + +print sum + diff --git a/024.py b/024.py new file mode 100644 index 0000000..47546a5 --- /dev/null +++ b/024.py @@ -0,0 +1,24 @@ + +import sys + +digits = [ x for x in range(0, 10) ] + +limit = 1000000 + +count = 0 + +def permutate(start, end): + global permutations, count + if len(end) == 1: + count += 1 + if count == limit: + print start+end + sys.exit(0) + return + for i in range(0, len(end)): + s = start + [end[i]] + e = end[:i] + end[i+1:] + permutate(s, e) + +permutate([], digits) + diff --git a/025.py b/025.py new file mode 100644 index 0000000..b69bddc --- /dev/null +++ b/025.py @@ -0,0 +1,19 @@ +import math + +def digits(number): + return math.ceil(math.log10(number+1)) + +prev = 1 +next = 1 +count = 2 + +while(True): + if(digits(next) >= 1000): + break + tmp = next + next += prev + prev = tmp + count += 1 + +print count + diff --git a/026.py b/026.py new file mode 100644 index 0000000..0ddd85a --- /dev/null +++ b/026.py @@ -0,0 +1,33 @@ + +def get_cycle(d): + remainders = [] + x = 1 + while x > 0: + if x < d: + x *= 10 + continue + + z = x / d + x = (x % d) * 10 + if x in remainders: # cycle detected + pos = 0 + for i in range(len(remainders)): + if remainders[i] == x: + return len(remainders) - i + break + remainders += [x] + + return 0 # no cycle + + +max_remainder = 0 +result = 0 + +for i in range(1, 1000): + r = get_cycle(i) + if r > max_remainder: + max_remainder = r + result = i + +print result + diff --git a/027.py b/027.py new file mode 100644 index 0000000..563d6af --- /dev/null +++ b/027.py @@ -0,0 +1,25 @@ +from common import sieve + +primes = sieve(10000).primes() + +def count_primes(a, b): + n = 0 + while True: + p = n**2 + a*n + b + if p not in primes: + break + n += 1 + return n + +max_count = 0 +max_pair = (0, 0) + +for a in xrange(-999, 1000): + for b in xrange(-999, 1000): + c = count_primes(a, b) + if c > max_count: + max_count = c + max_pair = (a, b) + +print max_pair[0] * max_pair[1] + diff --git a/028.py b/028.py new file mode 100644 index 0000000..3ec1ff5 --- /dev/null +++ b/028.py @@ -0,0 +1,13 @@ + +width = 1001 +max_level = (width-1)/2 + +last = sum = 1 + +for level in range(1, max_level+1): + add = 2*level + sum += (last+add) + (last+2*add) + (last+3*add) + (last+4*add) + last = last+4*add + +print sum + diff --git a/029.py b/029.py new file mode 100644 index 0000000..0740911 --- /dev/null +++ b/029.py @@ -0,0 +1,9 @@ + +x = [] + +for i in range(2, 101): + for j in range(2, 101): + x.append(i**j) + +print len(set(x)) + diff --git a/030.c b/030.c new file mode 100644 index 0000000..5d044e9 --- /dev/null +++ b/030.c @@ -0,0 +1,41 @@ + +int digit_sum(int number) +{ + int sum = 0; + int digit; + int n = number; + + while(n > 0) + { + digit = n % 10; + sum += digit*digit*digit*digit*digit; + n = n / 10; + } + + if(number == sum) + return 1; + else + return 0; +} + +int main() +{ + int start = 10; + int end = 354294; // 9^5 * 6 + int sum = 0; + int i; + + for(i=start; i + +/* + * much faster than python version, though less optimized... + * + * to filter out duplicates and add numbers: + * $ ./032 | sort -u | tr "\n" "+" | sed 's/+$/\n/' | bc + * + */ + +int is_pandigital(long int a, long int b, long int c) +{ + char digits[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + char digit; + int i; + + while(a > 0) + { + digit = a % 10; + if(digit == 0 || digits[digit]++) + return 0; + a /= 10; + } + while(b > 0) + { + digit = b % 10; + if(digit == 0 || digits[digit]++) + return 0; + b /= 10; + } + while(c > 0) + { + digit = c % 10; + if(digit == 0 || digits[digit]++) + return 0; + c /= 10; + } + + for(i=1; i<10; i++) + if(digits[i] != 1) + return 0; + return 1; +} + +int main(void) +{ + long int limit = 10000; + long int a, b, c; + for(a=2; a limit) + break; + if(is_pandigital(a, b, c)) + printf("%ld\n", c); + } + } + + return 0; +} + diff --git a/032.py b/032.py new file mode 100644 index 0000000..0958625 --- /dev/null +++ b/032.py @@ -0,0 +1,43 @@ + +from common import pandigital + +pandigital = pandigital(9).numbers(5) +pandigital.remove(1) + +def is_pandigital(a, b, c): + d = [0]*10 + while a > 0: + digit = a % 10 + if d[digit] > 0: + return False + d[digit] += 1 + a /= 10 + while b > 0: + digit = b % 10 + if d[digit] > 0: + return False + d[digit] += 1 + b /= 10 + while c > 0: + digit = c % 10 + if d[digit] > 0: + return False + d[digit] += 1 + c /= 10 + return d[1:] == [1]*9 + +products = set() + +for a in pandigital: + for b in pandigital: + c = a * b + if c in pandigital and is_pandigital(a, b, c): + #print str(a), "*", str(b), "=", str(c) + products.add(c) + +sum = 0 +for p in products: + sum += p + +print sum + diff --git a/033.c b/033.c new file mode 100644 index 0000000..61a7ffd --- /dev/null +++ b/033.c @@ -0,0 +1,59 @@ + +int curious_fraction(int a, int b) +{ + int a1 = a/10; + int a2 = a%10; + int b1 = b/10; + int b2 = b%10; + + float result = 1.0*a/b; + + if(a2 == 0) + return 0; + + if(a1 == b1) + { + float result2 = 1.0*a2/b2; + if(result == result2) + return 1; + } + + if(a1 == b2) + { + float result2 = 1.0*a2/b1; + if(result == result2) + return 1; + } + + if(a2 == b1) + { + float result2 = 1.0*a1/b2; + if(result == result2) + return 1; + } + + if(a2 == b2) + { + float result2 = 1.0*a1/b1; + if(result == result2) + return 1; + } + + return 0; +} + +int main() +{ + int a, b; + float product = 1.0; + + for(a=10; a<100; a++) + for(b=a+1; b<100; b++) + if(curious_fraction(a, b)) + product *= 1.0*a/b; + + printf("%d\n", (int)(1/product)); + + return 0; +} + diff --git a/033.py b/033.py new file mode 100644 index 0000000..9575983 --- /dev/null +++ b/033.py @@ -0,0 +1,34 @@ +def curious_fraction(a, b): + a1 = a/10 + a2 = a%10 + b1 = b/10 + b2 = b%10 + + result = 1.0*a/b; + + if a2 == 0 or b2 == 0: + return False + + if a1 == b1 and 1.0*a2/b2 == result: + return True + + if a1 == b2 and 1.0*a2/b1 == result: + return True + + if a2 == b1 and 1.0*a1/b2 == result: + return True + + if a2 == b2 and 1.0*a1/b1 == result: + return True + + return False + +product = 1.0 + +for a in range(10, 100): + for b in range(a+1, 100): + if curious_fraction(a, b): + product *= 1.0*a/b + +print int(1/product) + diff --git a/034.py b/034.py new file mode 100644 index 0000000..505a987 --- /dev/null +++ b/034.py @@ -0,0 +1,27 @@ +def fac(limit): + result = 1 + for i in range(1, limit+1): + result *= i + return result + + +facs = [ fac(i) for i in range(0, 10) ] + +def facsum(number): + global facs + sum = 0 + while number > 0: + digit = number % 10 + sum += facs[digit] + number = number / 10 + return sum + + +sum = 0 + +for i in xrange(10, 2540160): + if facsum(i) == i: + sum += i + +print sum + diff --git a/035.py b/035.py new file mode 100644 index 0000000..8f00da8 --- /dev/null +++ b/035.py @@ -0,0 +1,33 @@ +def circular_prime(number): + global number_list + result = True + number_str = str(number) + for i in range(1, len(number_str)): + rotated_str = number_str[i:] + number_str[:i] + rotated_nr = int(rotated_str) + if not number_list[rotated_nr-1]: + result = False + break + return result + + +limit = 1000000 + +number_list = [False] +for i in range(2, limit+1): + number_list.append(True) + +for i in range(2, limit+1): + x = i*2 + while(x <= len(number_list)): + number_list[x-1] = False + x += i + +count = 0 + +for i in range(1, limit+1): + if number_list[i-1] and circular_prime(i): + count += 1 + +print count + diff --git a/036.py b/036.py new file mode 100644 index 0000000..bf800da --- /dev/null +++ b/036.py @@ -0,0 +1,40 @@ + +binary = [ 2**x for x in range(20) ][::-1] + +def palindromic_decimal(n): + if n == int(str(n)[::-1]): + return True + return False + + +def dec2bin(n): + res = "" + for i in binary: + if n - i > 0 or n == i: + res += "1" + n -= i + else: + if len(res) > 0: # do not add leading 0s + res += "0" + return res + +def bin2dec(n): + res = 0 + for i in range(1, len(n)+1): + if n[-i] == "1": + res += binary[-i] + return res + +def palindromic_binary(n): + if n == bin2dec(dec2bin(n)[::-1]): + return True + return False + +sum = 0 + +for n in xrange(1000000): + if palindromic_decimal(n) and palindromic_binary(n): + sum += n + +print sum + diff --git a/037.py b/037.py new file mode 100644 index 0000000..5e506c2 --- /dev/null +++ b/037.py @@ -0,0 +1,61 @@ + +limit = 800000 + +number_list = [False] + [True]*(limit-1) +list_len = len(number_list) + +def next_prime(i): + global number_list + global list_len + x = i+1 + while(x <= list_len): + if number_list[x-1] == True: + break + x += 1 + return x + +i = 2 + +while(i*i <= list_len): + x = i*i + while(x <= list_len): + number_list[x-1] = False + x += i + i = next_prime(i) + + +primes = set() + +for i in xrange(1, limit+1): + if number_list[i-1]: + primes.add(i) + + +def truncatable(n): + # right truncatable + tmp = n/10 + while tmp > 0: + if not tmp in primes: + return False + tmp = tmp / 10 + + # left truncatable + tmp = n + modulo = 10**14 + while tmp > 0: + if not tmp in primes: + return False + modulo = modulo / 10 + tmp = tmp % modulo + + return True + + +result = [] + +for p in primes: + if truncatable(p) and p not in (2, 3, 5, 7): + result += [p] + +print sum(result) + diff --git a/038.py b/038.py new file mode 100644 index 0000000..bc43644 --- /dev/null +++ b/038.py @@ -0,0 +1,43 @@ + +def is_pandigital(x): + digits = 10*[0] + + while x > 0: + digit = x % 10 + if digit == 0: + return False + digits[digit] += 1 + x /= 10 + + for i in range(1, 10): + if digits[i] != 1: + return False + + return True + + +def pandigital(x): + result = str(x * 1) + count = 1 + + while len(result) < 9: + count += 1 + result += str(x * count) + + if len(result) > 9: + return 0 + + if is_pandigital(int(result)): + return int(result) + + return 0 + +max_pd = 0 +for i in xrange(9876): + p = pandigital(i) + if p > max_pd: + max_pd = p + i += 1 + +print max_pd + diff --git a/039.c b/039.c new file mode 100644 index 0000000..202df6c --- /dev/null +++ b/039.c @@ -0,0 +1,37 @@ + +int solutions(int p) +{ + int solution = 0; + int a, b, c; + + for(a=0; a

max_solutions) + { + max_solutions = n; + max_p = p; + } + } + + printf("%d\n", max_p); + + return 0; +} + diff --git a/039.py b/039.py new file mode 100644 index 0000000..6a6bd0b --- /dev/null +++ b/039.py @@ -0,0 +1,21 @@ + +def solutions(p): + solution = 0 + for a in xrange(1, p/2): + for b in xrange(a, p-a): + c = p - a - b + if a*a + b*b == c*c: + solution += 1 + return solution + +max_solutions = 0 +max_p = 0 + +for p in xrange(3, 1000): + n = solutions(p) + if n > max_solutions: + max_solutions = n + max_p = p + +print max_p + diff --git a/040.py b/040.py new file mode 100644 index 0000000..6f20325 --- /dev/null +++ b/040.py @@ -0,0 +1,34 @@ + +# liefert zurueck an welcher Stelle die x-stelligen Zahlen beginnen +def begin(x): + stelle = 1 + for i in range(1, x): + stelle += 9 * (10**(i-1)) * i + return stelle + + +def stelle(pos): + n = 0 + i = 0 + # suche nach Anfang der x-stelligen Region in der pos liegt + while n <= pos: + i += 1 + n = begin(i) + + stellen = i-1 + startpos = begin(stellen) + startvalue = 10**(stellen-1) + diff = pos - startpos + zahl = startvalue + diff/stellen + result = (zahl / (10**(stellen-(diff%stellen)-1))) % 10 + + return result + + +product = 1 + +for i in range(0, 7): + product *= stelle(10**i) + +print product + diff --git a/041.py b/041.py new file mode 100644 index 0000000..04a6272 --- /dev/null +++ b/041.py @@ -0,0 +1,26 @@ +from common import pandigital, sieve + +primes = list(sieve(10**6).primes()) +numbers = [x for x in pandigital(1, 9).numbers(10) if x > 10**8] +numbers += [x for x in pandigital(1, 8).numbers(10) if x > 10**7] +numbers += [x for x in pandigital(1, 7).numbers(10) if x > 10**6] +numbers += [x for x in pandigital(1, 6).numbers(10) if x > 10**5] +numbers += [x for x in pandigital(1, 5).numbers(10) if x > 10**4] +numbers += [x for x in pandigital(1, 4).numbers(10) if x > 10**3] +numbers += [x for x in pandigital(1, 3).numbers(10) if x > 10**2] +numbers += [x for x in pandigital(1, 2).numbers(10) if x > 10**1] + +numbers.sort(reverse=True) + +# check for divisibility up to sqrt(n), as sieve requires too much memory +def is_prime(n): + for p in primes: + if n % p == 0: + return False + return True + +for n in numbers: + if is_prime(n): + print n + break + diff --git a/042.py b/042.py new file mode 100644 index 0000000..46f08fa --- /dev/null +++ b/042.py @@ -0,0 +1,18 @@ +def score(name): + sum = 0 + for char in name: + sum += ord(char) - 64 + return sum + +triangle_numbers = [ int(0.5*n*(n-1)) for n in range(2, 200) ] +count = 0 + +f = open('042.txt', 'r') +for word in f: + word = word.rstrip("\n") + if score(word) in triangle_numbers: + count += 1 +f.close() + +print count + diff --git a/042.txt b/042.txt new file mode 100644 index 0000000..124e8b6 --- /dev/null +++ b/042.txt @@ -0,0 +1,1786 @@ +A +ABILITY +ABLE +ABOUT +ABOVE +ABSENCE +ABSOLUTELY +ACADEMIC +ACCEPT +ACCESS +ACCIDENT +ACCOMPANY +ACCORDING +ACCOUNT +ACHIEVE +ACHIEVEMENT +ACID +ACQUIRE +ACROSS +ACT +ACTION +ACTIVE +ACTIVITY +ACTUAL +ACTUALLY +ADD +ADDITION +ADDITIONAL +ADDRESS +ADMINISTRATION +ADMIT +ADOPT +ADULT +ADVANCE +ADVANTAGE +ADVICE +ADVISE +AFFAIR +AFFECT +AFFORD +AFRAID +AFTER +AFTERNOON +AFTERWARDS +AGAIN +AGAINST +AGE +AGENCY +AGENT +AGO +AGREE +AGREEMENT +AHEAD +AID +AIM +AIR +AIRCRAFT +ALL +ALLOW +ALMOST +ALONE +ALONG +ALREADY +ALRIGHT +ALSO +ALTERNATIVE +ALTHOUGH +ALWAYS +AMONG +AMONGST +AMOUNT +AN +ANALYSIS +ANCIENT +AND +ANIMAL +ANNOUNCE +ANNUAL +ANOTHER +ANSWER +ANY +ANYBODY +ANYONE +ANYTHING +ANYWAY +APART +APPARENT +APPARENTLY +APPEAL +APPEAR +APPEARANCE +APPLICATION +APPLY +APPOINT +APPOINTMENT +APPROACH +APPROPRIATE +APPROVE +AREA +ARGUE +ARGUMENT +ARISE +ARM +ARMY +AROUND +ARRANGE +ARRANGEMENT +ARRIVE +ART +ARTICLE +ARTIST +AS +ASK +ASPECT +ASSEMBLY +ASSESS +ASSESSMENT +ASSET +ASSOCIATE +ASSOCIATION +ASSUME +ASSUMPTION +AT +ATMOSPHERE +ATTACH +ATTACK +ATTEMPT +ATTEND +ATTENTION +ATTITUDE +ATTRACT +ATTRACTIVE +AUDIENCE +AUTHOR +AUTHORITY +AVAILABLE +AVERAGE +AVOID +AWARD +AWARE +AWAY +AYE +BABY +BACK +BACKGROUND +BAD +BAG +BALANCE +BALL +BAND +BANK +BAR +BASE +BASIC +BASIS +BATTLE +BE +BEAR +BEAT +BEAUTIFUL +BECAUSE +BECOME +BED +BEDROOM +BEFORE +BEGIN +BEGINNING +BEHAVIOUR +BEHIND +BELIEF +BELIEVE +BELONG +BELOW +BENEATH +BENEFIT +BESIDE +BEST +BETTER +BETWEEN +BEYOND +BIG +BILL +BIND +BIRD +BIRTH +BIT +BLACK +BLOCK +BLOOD +BLOODY +BLOW +BLUE +BOARD +BOAT +BODY +BONE +BOOK +BORDER +BOTH +BOTTLE +BOTTOM +BOX +BOY +BRAIN +BRANCH +BREAK +BREATH +BRIDGE +BRIEF +BRIGHT +BRING +BROAD +BROTHER +BUDGET +BUILD +BUILDING +BURN +BUS +BUSINESS +BUSY +BUT +BUY +BY +CABINET +CALL +CAMPAIGN +CAN +CANDIDATE +CAPABLE +CAPACITY +CAPITAL +CAR +CARD +CARE +CAREER +CAREFUL +CAREFULLY +CARRY +CASE +CASH +CAT +CATCH +CATEGORY +CAUSE +CELL +CENTRAL +CENTRE +CENTURY +CERTAIN +CERTAINLY +CHAIN +CHAIR +CHAIRMAN +CHALLENGE +CHANCE +CHANGE +CHANNEL +CHAPTER +CHARACTER +CHARACTERISTIC +CHARGE +CHEAP +CHECK +CHEMICAL +CHIEF +CHILD +CHOICE +CHOOSE +CHURCH +CIRCLE +CIRCUMSTANCE +CITIZEN +CITY +CIVIL +CLAIM +CLASS +CLEAN +CLEAR +CLEARLY +CLIENT +CLIMB +CLOSE +CLOSELY +CLOTHES +CLUB +COAL +CODE +COFFEE +COLD +COLLEAGUE +COLLECT +COLLECTION +COLLEGE +COLOUR +COMBINATION +COMBINE +COME +COMMENT +COMMERCIAL +COMMISSION +COMMIT +COMMITMENT +COMMITTEE +COMMON +COMMUNICATION +COMMUNITY +COMPANY +COMPARE +COMPARISON +COMPETITION +COMPLETE +COMPLETELY +COMPLEX +COMPONENT +COMPUTER +CONCENTRATE +CONCENTRATION +CONCEPT +CONCERN +CONCERNED +CONCLUDE +CONCLUSION +CONDITION +CONDUCT +CONFERENCE +CONFIDENCE +CONFIRM +CONFLICT +CONGRESS +CONNECT +CONNECTION +CONSEQUENCE +CONSERVATIVE +CONSIDER +CONSIDERABLE +CONSIDERATION +CONSIST +CONSTANT +CONSTRUCTION +CONSUMER +CONTACT +CONTAIN +CONTENT +CONTEXT +CONTINUE +CONTRACT +CONTRAST +CONTRIBUTE +CONTRIBUTION +CONTROL +CONVENTION +CONVERSATION +COPY +CORNER +CORPORATE +CORRECT +COS +COST +COULD +COUNCIL +COUNT +COUNTRY +COUNTY +COUPLE +COURSE +COURT +COVER +CREATE +CREATION +CREDIT +CRIME +CRIMINAL +CRISIS +CRITERION +CRITICAL +CRITICISM +CROSS +CROWD +CRY +CULTURAL +CULTURE +CUP +CURRENT +CURRENTLY +CURRICULUM +CUSTOMER +CUT +DAMAGE +DANGER +DANGEROUS +DARK +DATA +DATE +DAUGHTER +DAY +DEAD +DEAL +DEATH +DEBATE +DEBT +DECADE +DECIDE +DECISION +DECLARE +DEEP +DEFENCE +DEFENDANT +DEFINE +DEFINITION +DEGREE +DELIVER +DEMAND +DEMOCRATIC +DEMONSTRATE +DENY +DEPARTMENT +DEPEND +DEPUTY +DERIVE +DESCRIBE +DESCRIPTION +DESIGN +DESIRE +DESK +DESPITE +DESTROY +DETAIL +DETAILED +DETERMINE +DEVELOP +DEVELOPMENT +DEVICE +DIE +DIFFERENCE +DIFFERENT +DIFFICULT +DIFFICULTY +DINNER +DIRECT +DIRECTION +DIRECTLY +DIRECTOR +DISAPPEAR +DISCIPLINE +DISCOVER +DISCUSS +DISCUSSION +DISEASE +DISPLAY +DISTANCE +DISTINCTION +DISTRIBUTION +DISTRICT +DIVIDE +DIVISION +DO +DOCTOR +DOCUMENT +DOG +DOMESTIC +DOOR +DOUBLE +DOUBT +DOWN +DRAW +DRAWING +DREAM +DRESS +DRINK +DRIVE +DRIVER +DROP +DRUG +DRY +DUE +DURING +DUTY +EACH +EAR +EARLY +EARN +EARTH +EASILY +EAST +EASY +EAT +ECONOMIC +ECONOMY +EDGE +EDITOR +EDUCATION +EDUCATIONAL +EFFECT +EFFECTIVE +EFFECTIVELY +EFFORT +EGG +EITHER +ELDERLY +ELECTION +ELEMENT +ELSE +ELSEWHERE +EMERGE +EMPHASIS +EMPLOY +EMPLOYEE +EMPLOYER +EMPLOYMENT +EMPTY +ENABLE +ENCOURAGE +END +ENEMY +ENERGY +ENGINE +ENGINEERING +ENJOY +ENOUGH +ENSURE +ENTER +ENTERPRISE +ENTIRE +ENTIRELY +ENTITLE +ENTRY +ENVIRONMENT +ENVIRONMENTAL +EQUAL +EQUALLY +EQUIPMENT +ERROR +ESCAPE +ESPECIALLY +ESSENTIAL +ESTABLISH +ESTABLISHMENT +ESTATE +ESTIMATE +EVEN +EVENING +EVENT +EVENTUALLY +EVER +EVERY +EVERYBODY +EVERYONE +EVERYTHING +EVIDENCE +EXACTLY +EXAMINATION +EXAMINE +EXAMPLE +EXCELLENT +EXCEPT +EXCHANGE +EXECUTIVE +EXERCISE +EXHIBITION +EXIST +EXISTENCE +EXISTING +EXPECT +EXPECTATION +EXPENDITURE +EXPENSE +EXPENSIVE +EXPERIENCE +EXPERIMENT +EXPERT +EXPLAIN +EXPLANATION +EXPLORE +EXPRESS +EXPRESSION +EXTEND +EXTENT +EXTERNAL +EXTRA +EXTREMELY +EYE +FACE +FACILITY +FACT +FACTOR +FACTORY +FAIL +FAILURE +FAIR +FAIRLY +FAITH +FALL +FAMILIAR +FAMILY +FAMOUS +FAR +FARM +FARMER +FASHION +FAST +FATHER +FAVOUR +FEAR +FEATURE +FEE +FEEL +FEELING +FEMALE +FEW +FIELD +FIGHT +FIGURE +FILE +FILL +FILM +FINAL +FINALLY +FINANCE +FINANCIAL +FIND +FINDING +FINE +FINGER +FINISH +FIRE +FIRM +FIRST +FISH +FIT +FIX +FLAT +FLIGHT +FLOOR +FLOW +FLOWER +FLY +FOCUS +FOLLOW +FOLLOWING +FOOD +FOOT +FOOTBALL +FOR +FORCE +FOREIGN +FOREST +FORGET +FORM +FORMAL +FORMER +FORWARD +FOUNDATION +FREE +FREEDOM +FREQUENTLY +FRESH +FRIEND +FROM +FRONT +FRUIT +FUEL +FULL +FULLY +FUNCTION +FUND +FUNNY +FURTHER +FUTURE +GAIN +GAME +GARDEN +GAS +GATE +GATHER +GENERAL +GENERALLY +GENERATE +GENERATION +GENTLEMAN +GET +GIRL +GIVE +GLASS +GO +GOAL +GOD +GOLD +GOOD +GOVERNMENT +GRANT +GREAT +GREEN +GREY +GROUND +GROUP +GROW +GROWING +GROWTH +GUEST +GUIDE +GUN +HAIR +HALF +HALL +HAND +HANDLE +HANG +HAPPEN +HAPPY +HARD +HARDLY +HATE +HAVE +HE +HEAD +HEALTH +HEAR +HEART +HEAT +HEAVY +HELL +HELP +HENCE +HER +HERE +HERSELF +HIDE +HIGH +HIGHLY +HILL +HIM +HIMSELF +HIS +HISTORICAL +HISTORY +HIT +HOLD +HOLE +HOLIDAY +HOME +HOPE +HORSE +HOSPITAL +HOT +HOTEL +HOUR +HOUSE +HOUSEHOLD +HOUSING +HOW +HOWEVER +HUGE +HUMAN +HURT +HUSBAND +I +IDEA +IDENTIFY +IF +IGNORE +ILLUSTRATE +IMAGE +IMAGINE +IMMEDIATE +IMMEDIATELY +IMPACT +IMPLICATION +IMPLY +IMPORTANCE +IMPORTANT +IMPOSE +IMPOSSIBLE +IMPRESSION +IMPROVE +IMPROVEMENT +IN +INCIDENT +INCLUDE +INCLUDING +INCOME +INCREASE +INCREASED +INCREASINGLY +INDEED +INDEPENDENT +INDEX +INDICATE +INDIVIDUAL +INDUSTRIAL +INDUSTRY +INFLUENCE +INFORM +INFORMATION +INITIAL +INITIATIVE +INJURY +INSIDE +INSIST +INSTANCE +INSTEAD +INSTITUTE +INSTITUTION +INSTRUCTION +INSTRUMENT +INSURANCE +INTEND +INTENTION +INTEREST +INTERESTED +INTERESTING +INTERNAL +INTERNATIONAL +INTERPRETATION +INTERVIEW +INTO +INTRODUCE +INTRODUCTION +INVESTIGATE +INVESTIGATION +INVESTMENT +INVITE +INVOLVE +IRON +IS +ISLAND +ISSUE +IT +ITEM +ITS +ITSELF +JOB +JOIN +JOINT +JOURNEY +JUDGE +JUMP +JUST +JUSTICE +KEEP +KEY +KID +KILL +KIND +KING +KITCHEN +KNEE +KNOW +KNOWLEDGE +LABOUR +LACK +LADY +LAND +LANGUAGE +LARGE +LARGELY +LAST +LATE +LATER +LATTER +LAUGH +LAUNCH +LAW +LAWYER +LAY +LEAD +LEADER +LEADERSHIP +LEADING +LEAF +LEAGUE +LEAN +LEARN +LEAST +LEAVE +LEFT +LEG +LEGAL +LEGISLATION +LENGTH +LESS +LET +LETTER +LEVEL +LIABILITY +LIBERAL +LIBRARY +LIE +LIFE +LIFT +LIGHT +LIKE +LIKELY +LIMIT +LIMITED +LINE +LINK +LIP +LIST +LISTEN +LITERATURE +LITTLE +LIVE +LIVING +LOAN +LOCAL +LOCATION +LONG +LOOK +LORD +LOSE +LOSS +LOT +LOVE +LOVELY +LOW +LUNCH +MACHINE +MAGAZINE +MAIN +MAINLY +MAINTAIN +MAJOR +MAJORITY +MAKE +MALE +MAN +MANAGE +MANAGEMENT +MANAGER +MANNER +MANY +MAP +MARK +MARKET +MARRIAGE +MARRIED +MARRY +MASS +MASTER +MATCH +MATERIAL +MATTER +MAY +MAYBE +ME +MEAL +MEAN +MEANING +MEANS +MEANWHILE +MEASURE +MECHANISM +MEDIA +MEDICAL +MEET +MEETING +MEMBER +MEMBERSHIP +MEMORY +MENTAL +MENTION +MERELY +MESSAGE +METAL +METHOD +MIDDLE +MIGHT +MILE +MILITARY +MILK +MIND +MINE +MINISTER +MINISTRY +MINUTE +MISS +MISTAKE +MODEL +MODERN +MODULE +MOMENT +MONEY +MONTH +MORE +MORNING +MOST +MOTHER +MOTION +MOTOR +MOUNTAIN +MOUTH +MOVE +MOVEMENT +MUCH +MURDER +MUSEUM +MUSIC +MUST +MY +MYSELF +NAME +NARROW +NATION +NATIONAL +NATURAL +NATURE +NEAR +NEARLY +NECESSARILY +NECESSARY +NECK +NEED +NEGOTIATION +NEIGHBOUR +NEITHER +NETWORK +NEVER +NEVERTHELESS +NEW +NEWS +NEWSPAPER +NEXT +NICE +NIGHT +NO +NOBODY +NOD +NOISE +NONE +NOR +NORMAL +NORMALLY +NORTH +NORTHERN +NOSE +NOT +NOTE +NOTHING +NOTICE +NOTION +NOW +NUCLEAR +NUMBER +NURSE +OBJECT +OBJECTIVE +OBSERVATION +OBSERVE +OBTAIN +OBVIOUS +OBVIOUSLY +OCCASION +OCCUR +ODD +OF +OFF +OFFENCE +OFFER +OFFICE +OFFICER +OFFICIAL +OFTEN +OIL +OKAY +OLD +ON +ONCE +ONE +ONLY +ONTO +OPEN +OPERATE +OPERATION +OPINION +OPPORTUNITY +OPPOSITION +OPTION +OR +ORDER +ORDINARY +ORGANISATION +ORGANISE +ORGANIZATION +ORIGIN +ORIGINAL +OTHER +OTHERWISE +OUGHT +OUR +OURSELVES +OUT +OUTCOME +OUTPUT +OUTSIDE +OVER +OVERALL +OWN +OWNER +PACKAGE +PAGE +PAIN +PAINT +PAINTING +PAIR +PANEL +PAPER +PARENT +PARK +PARLIAMENT +PART +PARTICULAR +PARTICULARLY +PARTLY +PARTNER +PARTY +PASS +PASSAGE +PAST +PATH +PATIENT +PATTERN +PAY +PAYMENT +PEACE +PENSION +PEOPLE +PER +PERCENT +PERFECT +PERFORM +PERFORMANCE +PERHAPS +PERIOD +PERMANENT +PERSON +PERSONAL +PERSUADE +PHASE +PHONE +PHOTOGRAPH +PHYSICAL +PICK +PICTURE +PIECE +PLACE +PLAN +PLANNING +PLANT +PLASTIC +PLATE +PLAY +PLAYER +PLEASE +PLEASURE +PLENTY +PLUS +POCKET +POINT +POLICE +POLICY +POLITICAL +POLITICS +POOL +POOR +POPULAR +POPULATION +POSITION +POSITIVE +POSSIBILITY +POSSIBLE +POSSIBLY +POST +POTENTIAL +POUND +POWER +POWERFUL +PRACTICAL +PRACTICE +PREFER +PREPARE +PRESENCE +PRESENT +PRESIDENT +PRESS +PRESSURE +PRETTY +PREVENT +PREVIOUS +PREVIOUSLY +PRICE +PRIMARY +PRIME +PRINCIPLE +PRIORITY +PRISON +PRISONER +PRIVATE +PROBABLY +PROBLEM +PROCEDURE +PROCESS +PRODUCE +PRODUCT +PRODUCTION +PROFESSIONAL +PROFIT +PROGRAM +PROGRAMME +PROGRESS +PROJECT +PROMISE +PROMOTE +PROPER +PROPERLY +PROPERTY +PROPORTION +PROPOSE +PROPOSAL +PROSPECT +PROTECT +PROTECTION +PROVE +PROVIDE +PROVIDED +PROVISION +PUB +PUBLIC +PUBLICATION +PUBLISH +PULL +PUPIL +PURPOSE +PUSH +PUT +QUALITY +QUARTER +QUESTION +QUICK +QUICKLY +QUIET +QUITE +RACE +RADIO +RAILWAY +RAIN +RAISE +RANGE +RAPIDLY +RARE +RATE +RATHER +REACH +REACTION +READ +READER +READING +READY +REAL +REALISE +REALITY +REALIZE +REALLY +REASON +REASONABLE +RECALL +RECEIVE +RECENT +RECENTLY +RECOGNISE +RECOGNITION +RECOGNIZE +RECOMMEND +RECORD +RECOVER +RED +REDUCE +REDUCTION +REFER +REFERENCE +REFLECT +REFORM +REFUSE +REGARD +REGION +REGIONAL +REGULAR +REGULATION +REJECT +RELATE +RELATION +RELATIONSHIP +RELATIVE +RELATIVELY +RELEASE +RELEVANT +RELIEF +RELIGION +RELIGIOUS +RELY +REMAIN +REMEMBER +REMIND +REMOVE +REPEAT +REPLACE +REPLY +REPORT +REPRESENT +REPRESENTATION +REPRESENTATIVE +REQUEST +REQUIRE +REQUIREMENT +RESEARCH +RESOURCE +RESPECT +RESPOND +RESPONSE +RESPONSIBILITY +RESPONSIBLE +REST +RESTAURANT +RESULT +RETAIN +RETURN +REVEAL +REVENUE +REVIEW +REVOLUTION +RICH +RIDE +RIGHT +RING +RISE +RISK +RIVER +ROAD +ROCK +ROLE +ROLL +ROOF +ROOM +ROUND +ROUTE +ROW +ROYAL +RULE +RUN +RURAL +SAFE +SAFETY +SALE +SAME +SAMPLE +SATISFY +SAVE +SAY +SCALE +SCENE +SCHEME +SCHOOL +SCIENCE +SCIENTIFIC +SCIENTIST +SCORE +SCREEN +SEA +SEARCH +SEASON +SEAT +SECOND +SECONDARY +SECRETARY +SECTION +SECTOR +SECURE +SECURITY +SEE +SEEK +SEEM +SELECT +SELECTION +SELL +SEND +SENIOR +SENSE +SENTENCE +SEPARATE +SEQUENCE +SERIES +SERIOUS +SERIOUSLY +SERVANT +SERVE +SERVICE +SESSION +SET +SETTLE +SETTLEMENT +SEVERAL +SEVERE +SEX +SEXUAL +SHAKE +SHALL +SHAPE +SHARE +SHE +SHEET +SHIP +SHOE +SHOOT +SHOP +SHORT +SHOT +SHOULD +SHOULDER +SHOUT +SHOW +SHUT +SIDE +SIGHT +SIGN +SIGNAL +SIGNIFICANCE +SIGNIFICANT +SILENCE +SIMILAR +SIMPLE +SIMPLY +SINCE +SING +SINGLE +SIR +SISTER +SIT +SITE +SITUATION +SIZE +SKILL +SKIN +SKY +SLEEP +SLIGHTLY +SLIP +SLOW +SLOWLY +SMALL +SMILE +SO +SOCIAL +SOCIETY +SOFT +SOFTWARE +SOIL +SOLDIER +SOLICITOR +SOLUTION +SOME +SOMEBODY +SOMEONE +SOMETHING +SOMETIMES +SOMEWHAT +SOMEWHERE +SON +SONG +SOON +SORRY +SORT +SOUND +SOURCE +SOUTH +SOUTHERN +SPACE +SPEAK +SPEAKER +SPECIAL +SPECIES +SPECIFIC +SPEECH +SPEED +SPEND +SPIRIT +SPORT +SPOT +SPREAD +SPRING +STAFF +STAGE +STAND +STANDARD +STAR +START +STATE +STATEMENT +STATION +STATUS +STAY +STEAL +STEP +STICK +STILL +STOCK +STONE +STOP +STORE +STORY +STRAIGHT +STRANGE +STRATEGY +STREET +STRENGTH +STRIKE +STRONG +STRONGLY +STRUCTURE +STUDENT +STUDIO +STUDY +STUFF +STYLE +SUBJECT +SUBSTANTIAL +SUCCEED +SUCCESS +SUCCESSFUL +SUCH +SUDDENLY +SUFFER +SUFFICIENT +SUGGEST +SUGGESTION +SUITABLE +SUM +SUMMER +SUN +SUPPLY +SUPPORT +SUPPOSE +SURE +SURELY +SURFACE +SURPRISE +SURROUND +SURVEY +SURVIVE +SWITCH +SYSTEM +TABLE +TAKE +TALK +TALL +TAPE +TARGET +TASK +TAX +TEA +TEACH +TEACHER +TEACHING +TEAM +TEAR +TECHNICAL +TECHNIQUE +TECHNOLOGY +TELEPHONE +TELEVISION +TELL +TEMPERATURE +TEND +TERM +TERMS +TERRIBLE +TEST +TEXT +THAN +THANK +THANKS +THAT +THE +THEATRE +THEIR +THEM +THEME +THEMSELVES +THEN +THEORY +THERE +THEREFORE +THESE +THEY +THIN +THING +THINK +THIS +THOSE +THOUGH +THOUGHT +THREAT +THREATEN +THROUGH +THROUGHOUT +THROW +THUS +TICKET +TIME +TINY +TITLE +TO +TODAY +TOGETHER +TOMORROW +TONE +TONIGHT +TOO +TOOL +TOOTH +TOP +TOTAL +TOTALLY +TOUCH +TOUR +TOWARDS +TOWN +TRACK +TRADE +TRADITION +TRADITIONAL +TRAFFIC +TRAIN +TRAINING +TRANSFER +TRANSPORT +TRAVEL +TREAT +TREATMENT +TREATY +TREE +TREND +TRIAL +TRIP +TROOP +TROUBLE +TRUE +TRUST +TRUTH +TRY +TURN +TWICE +TYPE +TYPICAL +UNABLE +UNDER +UNDERSTAND +UNDERSTANDING +UNDERTAKE +UNEMPLOYMENT +UNFORTUNATELY +UNION +UNIT +UNITED +UNIVERSITY +UNLESS +UNLIKELY +UNTIL +UP +UPON +UPPER +URBAN +US +USE +USED +USEFUL +USER +USUAL +USUALLY +VALUE +VARIATION +VARIETY +VARIOUS +VARY +VAST +VEHICLE +VERSION +VERY +VIA +VICTIM +VICTORY +VIDEO +VIEW +VILLAGE +VIOLENCE +VISION +VISIT +VISITOR +VITAL +VOICE +VOLUME +VOTE +WAGE +WAIT +WALK +WALL +WANT +WAR +WARM +WARN +WASH +WATCH +WATER +WAVE +WAY +WE +WEAK +WEAPON +WEAR +WEATHER +WEEK +WEEKEND +WEIGHT +WELCOME +WELFARE +WELL +WEST +WESTERN +WHAT +WHATEVER +WHEN +WHERE +WHEREAS +WHETHER +WHICH +WHILE +WHILST +WHITE +WHO +WHOLE +WHOM +WHOSE +WHY +WIDE +WIDELY +WIFE +WILD +WILL +WIN +WIND +WINDOW +WINE +WING +WINNER +WINTER +WISH +WITH +WITHDRAW +WITHIN +WITHOUT +WOMAN +WONDER +WONDERFUL +WOOD +WORD +WORK +WORKER +WORKING +WORKS +WORLD +WORRY +WORTH +WOULD +WRITE +WRITER +WRITING +WRONG +YARD +YEAH +YEAR +YES +YESTERDAY +YET +YOU +YOUNG +YOUR +YOURSELF +YOUTH diff --git a/043.py b/043.py new file mode 100644 index 0000000..2dd1db9 --- /dev/null +++ b/043.py @@ -0,0 +1,35 @@ +from common import pandigital + + +def check_number(i): + x = str(i) + if int(x[1:4]) & 1 != 0: + return False + if int(x[2:5]) % 3 != 0: + return False + if int(x[3:6]) % 5 != 0: + return False + if int(x[4:7]) % 7 != 0: + return False + if int(x[5:8]) % 11 != 0: + return False + if int(x[6:9]) % 13 != 0: + return False + if int(x[7:10]) % 17 != 0: + return False + return True + + +numbers = pandigital(0, 9).numbers(11) + +result = 0 + +for i in numbers: + if i < 1000000000: + continue + + if check_number(i): + result += i + +print result + diff --git a/044.py b/044.py new file mode 100644 index 0000000..5baae84 --- /dev/null +++ b/044.py @@ -0,0 +1,9 @@ + +pentagonal = [n*(3*n-1)/2 for n in xrange(1, 10000)] +pentagonal_set = set(pentagonal) + +for j in pentagonal: + for k in pentagonal: + if j+k in pentagonal_set and j-k in pentagonal_set: + print abs(j-k) + diff --git a/045.py b/045.py new file mode 100644 index 0000000..5a8bb7c --- /dev/null +++ b/045.py @@ -0,0 +1,12 @@ + +limit = 500000 + +triangle = set([ int(n*(n+1)/2) for n in range(1, limit) ]) +pentagonal = set([ int(n*(2*n-1)) for n in range(1, limit) ]) +hexagonal = set([ int(n*(3*n-1)/2) for n in range(1, limit) ]) + +result = triangle & pentagonal & hexagonal + +for i in result: + print i + diff --git a/046.py b/046.py new file mode 100644 index 0000000..24a2983 --- /dev/null +++ b/046.py @@ -0,0 +1,35 @@ + +from common import sieve + +squares = set([ x*x for x in xrange(1, 1000000) ]) + +def check_number(number, prime): + square = (number - prime) >> 1 + return square in squares + +prime_set = sieve(1000000).primes() +primes = list(prime_set) +primes.sort() + +number = 3 + +while True: + number += 2 + + if number in prime_set: + continue + + conjecture = False + + for p in primes: + if p >= number: + break + if check_number(number, p): + conjecture = True + break + + if not conjecture: + break + +print number + diff --git a/047.py b/047.py new file mode 100644 index 0000000..19f5185 --- /dev/null +++ b/047.py @@ -0,0 +1,25 @@ +from common import sieve + +primes = list(sieve(1000000).primes()) +primes.sort() + +factors = 4 + +def check_prime_factors(x): + distinct = set() + for p in primes: + while x % p == 0: + x /= p + distinct.add(p) + if x == 1: + break + return len(distinct) == factors + +n = 644 + +while True: + if check_prime_factors(n) and check_prime_factors(n+1) and check_prime_factors(n+2) and check_prime_factors(n+3): + print n + break + n += 1 + diff --git a/048.py b/048.py new file mode 100644 index 0000000..7c4102e --- /dev/null +++ b/048.py @@ -0,0 +1,6 @@ +sum = 0 +for i in range(1, 1001): + sum += i**i + +print sum % 10**10 + diff --git a/049.py b/049.py new file mode 100644 index 0000000..1cb2fbf --- /dev/null +++ b/049.py @@ -0,0 +1,34 @@ +from common import sieve, permutation + +primes = sieve(10000).primes() +primes2 = [ x for x in primes if x > 1000 ] +primes2.sort() + +end = False +ignore = 1487 +result = [] + +for p in primes2: + for q in primes2: + if p == q: + continue + if permutation(p, q): + new = 0 + if q > p: + diff = q - p + new = q + diff + else: + diff = p - q + new = p + diff + + if new in primes and permutation(q, new) and not permutation(ignore, p): + result += [p, q, new] + end = True + if end: + break + if end: + break + +result.sort() +print str(result[0]) + str(result[1]) + str(result[2]) + diff --git a/050.py b/050.py new file mode 100644 index 0000000..615f0d5 --- /dev/null +++ b/050.py @@ -0,0 +1,28 @@ +from common import sieve + +limit = 1000000 + +prime_set = sieve(limit).primes() +prime_list = list(prime_set) +prime_list.sort() + +n = len(prime_list) + +max_sum = 0 +max_count = 0 + +for i in xrange(n): + sum = prime_list[i] + count = 1 + for j in xrange(i+1, n): + sum += prime_list[j] + count += 1 + if sum > prime_list[-1]: + break + + if sum in prime_set and count > max_count: + max_sum = sum + max_count = count + +print max_sum + diff --git a/051.c b/051.c new file mode 100644 index 0000000..ee79ece --- /dev/null +++ b/051.c @@ -0,0 +1,121 @@ +#include "common.h" +#include +#include +#include + +unsigned long* p; + +const int pattern_size = 1024; +unsigned long* patterns; + +void init_patterns() +{ + int i, cur; + unsigned long n, pos; + + patterns = (unsigned long*) malloc(pattern_size*sizeof(unsigned long)); + + for(i=0; i 0) + { + n += (cur&1)*pos; + pos *= 10; + cur >>= 1; + } + patterns[i] = n; + } +} + +int valid_replacement(unsigned long prime, unsigned long number, unsigned long pattern) +{ + int digit = -1; // replaced digit in prime + + while(pattern > 0) + { + char d1 = pattern % 10; + char d2 = prime % 10; + char d3 = number % 10; + + if(d1 == 1) + { + if(digit < 0) + digit = d2; + else if(digit != d2) // not same digits replaced + return 0; + } + + if(d1 == 0 && d2 != d3) + return 0; + else if(prime == 0 && number != 0) + return 0; + + pattern /= 10; + prime /= 10; + number /= 10; + } + + if(pattern == 0 && prime != number) + return 0; + + return 1; +} + +int check_prime(unsigned long prime) +{ + int i, j; + + for(i=2; i= 10*tmp) + break; + + for(j=0; j<10; j++) + { + tmp += pat; + + if(isprime(tmp, p) && valid_replacement(prime, tmp, pat)) + count++; + } + + if(count>=8) + { + printf("Pattern: %ld\n", pat); + return 1; + } + } + + return 0; +} + +int main(void) +{ + unsigned long pcount; + unsigned long pos; + + p = primes(1000000); + pcount = p[0]; + + init_patterns(); + + for(pos=1; pos<=pcount; pos++) + { + if(check_prime(p[pos])) + { + printf("Prime: %li\n", p[pos]); + break; + } + } + + free(p); + free(patterns); + return 0; +} + diff --git a/052.py b/052.py new file mode 100644 index 0000000..2419a72 --- /dev/null +++ b/052.py @@ -0,0 +1,22 @@ + +def digits(n): + result = [0]*10 + while n > 0: + digit = n % 10 + n /= 10 + result[digit] += 1 + return result + +def check(n): + foo = [ digits(n*x) for x in range(1, 7) ] + return foo == foo[1:]+foo[:1] # all array entries are equal + +n = 1 + +while True: + if check(n): + break + n += 1 + +print n + diff --git a/053.py b/053.py new file mode 100644 index 0000000..6e9461c --- /dev/null +++ b/053.py @@ -0,0 +1,14 @@ + +facs = [1]*101 +for i in range(1, 101): + facs[i] = facs[i-1] * i + +count = 0 +for n in range(23, 101): + for r in range(n+1): + x = facs[n] / (facs[r]*facs[n-r]) + if x > 1000000: + count += 1 + +print count + diff --git a/054.py b/054.py new file mode 100644 index 0000000..bd7d14f --- /dev/null +++ b/054.py @@ -0,0 +1,287 @@ + +values = { +'2': 2, +'3': 3, +'4': 4, +'5': 5, +'6': 6, +'7': 7, +'8': 8, +'9': 9, +'T': 10, +'J': 11, +'Q': 12, +'K': 13, +'A': 14 +} + +colors = { +'H': 1, +'C': 2, +'S': 3, +'D': 4 +} + + +def handvalue(hand): + return values[hand[0]]*10 + colors[hand[1]] + +def count_cards(hand): + hand = [ x/10 for x in hand ] + counter = { } + for c in hand: + if c in counter: + counter[c] += 1 + else: + counter[c] = 1 + return counter + +def high_card(hand): + hand = [ x/10 for x in hand ] + hand.sort() + return hand[-1] + +def is_flush(hand): + return (hand[0]%10 == hand[1]%10 == hand[2]%10 == hand[3]%10 == hand[4]%10) + +def is_straight(hand): + hand = [ x/10 for x in hand ] + hand.sort() + return (hand[4] == hand[3]+1 == hand[2]+2 == hand[1]+3 == hand[0]+4) + +def is_straight_flush(hand): + return is_flush(hand) and is_straight(hand) + +def is_royal_flush(hand): + return is_straight_flush(hand) and high_card(hand) == values['A'] + +def is_n_of_a_kind(hand, n): + counter = count_cards(hand) + for c in counter: + if counter[c] == n: + return True + return False + +def is_four_of_a_kind(hand): + return is_n_of_a_kind(hand, 4) + +def is_three_of_a_kind(hand): + return is_n_of_a_kind(hand, 3) + +def is_one_pair(hand): + return is_n_of_a_kind(hand, 2) + +def is_two_pairs(hand): + counter = count_cards(hand) + pairs = 0 + for c in counter: + if counter[c] == 2 or counter[c] == 3: + pairs += 1 + return pairs == 2 + +def is_full_house(hand): + return is_two_pairs(hand) and is_three_of_a_kind(hand) + + +def better_hand(hand1, hand2): + # both are straight flush + if is_straight_flush(hand1): + if high_card(hand1) > high_card(hand2): + return 1 + else: + return 2 + + # both are four of a kind + if is_four_of_a_kind(hand1): + count1 = count_cards(hand1) + count2 = count_cards(hand2) + value4_1 = 0 + value4_2 = 0 + for c in count1: + if count1[c] == 4: + value4_1 = c + break + for c in count2: + if count2[c] == 4: + value4_2 = c + break + if value4_1 > value4_2: + return 1 + else: + return 2 + + # both are full house + if is_full_house(hand1): + count1 = count_cards(hand1) + count2 = count_cards(hand2) + value3_1 = 0 + value3_2 = 0 + for c in count1: + if count1[c] == 3: + value3_1 = c + break + for c in count2: + if count2[c] == 3: + value3_2 = c + break + if value3_1 > value3_2: + return 1 + else: + return 2 + + # both are flush + if is_flush(hand1): + hand1 = [ x/10 for x in hand1 ] + hand2 = [ x/10 for x in hand2 ] + hand1.sort() + hand2.sort() + for i in range(0, 5): + if hand1[4-i] > hand2[4-i]: + return 1 + elif hand2[4-i] > hand1[4-i]: + return 2 + print "ERROR: no winner with hands: ", hand1, hand2 # should never be reached + + # both are straight + if is_straight(hand1): + if high_card(hand1) > high_card(hand2): + return 1 + else: + return 2 + + # both are three of a kind + if is_three_of_a_kind(hand1): + count1 = count_cards(hand1) + count2 = count_cards(hand2) + value3_1 = 0 + value3_2 = 0 + for c in count1: + if count1[c] == 3: + value3_1 = c + break + for c in count2: + if count2[c] == 3: + value3_2 = c + break + if value3_1 > value3_2: + return 1 + else: + return 2 + + # both are two pairs + if is_two_pairs(hand1): + count1 = count_cards(hand1) + count2 = count_cards(hand2) + value2_1 = [] + value1_1 = 0 + value2_2 = [] + value1_2 = 0 + for c in count1: + if count1[c] == 2: + value2_1.append(c) + elif count1[c] == 1: + value1_1 = c + for c in count2: + if count2[c] == 2: + value2_2.append(c) + elif count1[c] == 1: + value1_2 = c + value2_1.sort() + value2_2.sort() + if value2_1[1] > value2_2[1]: + return 1 + elif value2_2[1] > value2_1[1]: + return 2 + elif value2_1[0] > value2_2[0]: + return 1 + elif value2_2[0] > value2_1[0]: + return 2 + elif value1_1 > value1_2: + return 1 + else: + return 2 + + # both are one pair + if is_one_pair(hand1): + count1 = count_cards(hand1) + count2 = count_cards(hand2) + value2_1 = 0 + value1_1 = [] + value2_2 = 0 + value1_2 = [] + for c in count1: + if count1[c] == 2: + value2_1 = c + elif count1[c] == 1: + value1_1.append(c) + for c in count2: + if count2[c] == 2: + value2_2 = c + elif count2[c] == 1: + value1_2.append(c) + value1_1.sort() + value1_2.sort() + if value2_1 > value2_2: + return 1 + elif value2_2 > value2_1: + return 2 + elif high_card(value1_1) > high_card(value1_2): + return 1 + else: + return 2 + + + # both are high card + if high_card(hand1) > high_card(hand2): + return 1 + else: + return 2 + + +def rank(hand): + if is_royal_flush(hand): + return 10 + if is_straight_flush(hand): + return 9 + if is_four_of_a_kind(hand): + return 8 + if is_full_house(hand): + return 7 + if is_flush(hand): + return 6 + if is_straight(hand): + return 5 + if is_three_of_a_kind(hand): + return 4 + if is_two_pairs(hand): + return 3 + if is_one_pair(hand): + return 2 + return 1 # high card + +def winner(hand1, hand2): + if rank(hand1) > rank(hand2): + return 1 + if rank(hand2) > rank(hand1): + return 2 + return better_hand(hand1, hand2) + +hands = [] + +f = open('054.txt', 'r') +for line in f: + line.rstrip('\n') + hands.append([ handvalue(x) for x in line.split(' ') ]) +f.close() + +count_win1 = 0 + +for h in hands: + hand1 = h[:5] + hand2 = h[5:] + if winner(hand1, hand2) == 1: + count_win1 += 1 + +print count_win1 + + diff --git a/054.txt b/054.txt new file mode 100644 index 0000000..231e249 --- /dev/null +++ b/054.txt @@ -0,0 +1,1000 @@ +8C TS KC 9H 4S 7D 2S 5D 3S AC +5C AD 5D AC 9C 7C 5H 8D TD KS +3H 7H 6S KC JS QH TD JC 2D 8S +TH 8H 5C QS TC 9H 4D JC KS JS +7C 5H KC QH JD AS KH 4C AD 4S +5H KS 9C 7D 9H 8D 3S 5D 5C AH +6H 4H 5C 3H 2H 3S QH 5S 6S AS +TD 8C 4H 7C TC KC 4C 3H 7S KS +7C 9C 6D KD 3H 4C QS QC AC KH +JC 6S 5H 2H 2D KD 9D 7C AS JS +AD QH TH 9D 8H TS 6D 3S AS AC +2H 4S 5C 5S TC KC JD 6C TS 3C +QD AS 6H JS 2C 3D 9H KC 4H 8S +KD 8S 9S 7C 2S 3S 6D 6S 4H KC +3C 8C 2D 7D 4D 9S 4S QH 4H JD +8C KC 7S TC 2D TS 8H QD AC 5C +3D KH QD 6C 6S AD AS 8H 2H QS +6S 8D 4C 8S 6C QH TC 6D 7D 9D +2S 8D 8C 4C TS 9S 9D 9C AC 3D +3C QS 2S 4H JH 3D 2D TD 8S 9H +5H QS 8S 6D 3C 8C JD AS 7H 7D +6H TD 9D AS JH 6C QC 9S KD JC +AH 8S QS 4D TH AC TS 3C 3D 5C +5S 4D JS 3D 8H 6C TS 3S AD 8C +6D 7C 5D 5H 3S 5C JC 2H 5S 3D +5H 6H 2S KS 3D 5D JD 7H JS 8H +KH 4H AS JS QS QC TC 6D 7C KS +3D QS TS 2H JS 4D AS 9S JC KD +QD 5H 4D 5D KH 7H 3D JS KD 4H +2C 9H 6H 5C 9D 6C JC 2D TH 9S +7D 6D AS QD JH 4D JS 7C QS 5C +3H KH QD AD 8C 8H 3S TH 9D 5S +AH 9S 4D 9D 8S 4H JS 3C TC 8D +2C KS 5H QD 3S TS 9H AH AD 8S +5C 7H 5D KD 9H 4D 3D 2D KS AD +KS KC 9S 6D 2C QH 9D 9H TS TC +9C 6H 5D QH 4D AD 6D QC JS KH +9S 3H 9D JD 5C 4D 9H AS TC QH +2C 6D JC 9C 3C AD 9S KH 9D 7D +KC 9C 7C JC JS KD 3H AS 3C 7D +QD KH QS 2C 3S 8S 8H 9H 9C JC +QH 8D 3C KC 4C 4H 6D AD 9H 9D +3S KS QS 7H KH 7D 5H 5D JD AD +2H 2C 6H TH TC 7D 8D 4H 8C AS +4S 2H AC QC 3S 6D TH 4D 4C KH +4D TC KS AS 7C 3C 6D 2D 9H 6C +8C TD 5D QS 2C 7H 4C 9C 3H 9H +5H JH TS 7S TD 6H AD QD 8H 8S +5S AD 9C 8C 7C 8D 5H 9D 8S 2S +4H KH KS 9S 2S KC 5S AD 4S 7D +QS 9C QD 6H JS 5D AC 8D 2S AS +KH AC JC 3S 9D 9S 3C 9C 5S JS +AD 3C 3D KS 3S 5C 9C 8C TS 4S +JH 8D 5D 6H KD QS QD 3D 6C KC +8S JD 6C 3S 8C TC QC 3C QH JS +KC JC 8H 2S 9H 9C JH 8S 8C 9S +8S 2H QH 4D QC 9D KC AS TH 3C +8S 6H TH 7C 2H 6S 3C 3H AS 7S +QH 5S JS 4H 5H TS 8H AH AC JC +9D 8H 2S 4S TC JC 3C 7H 3H 5C +3D AD 3C 3S 4C QC AS 5D TH 8C +6S 9D 4C JS KH AH TS JD 8H AD +4C 6S 9D 7S AC 4D 3D 3S TC JD +AD 7H 6H 4H JH KC TD TS 7D 6S +8H JH TC 3S 8D 8C 9S 2C 5C 4D +2C 9D KC QH TH QS JC 9C 4H TS +QS 3C QD 8H KH 4H 8D TD 8S AC +7C 3C TH 5S 8H 8C 9C JD TC KD +QC TC JD TS 8C 3H 6H KD 7C TD +JH QS KS 9C 6D 6S AS 9H KH 6H +2H 4D AH 2D JH 6H TD 5D 4H JD +KD 8C 9S JH QD JS 2C QS 5C 7C +4S TC 7H 8D 2S 6H 7S 9C 7C KC +8C 5D 7H 4S TD QC 8S JS 4H KS +AD 8S JH 6D TD KD 7C 6C 2D 7D +JC 6H 6S JS 4H QH 9H AH 4C 3C +6H 5H AS 7C 7S 3D KH KC 5D 5C +JC 3D TD AS 4D 6D 6S QH JD KS +8C 7S 8S QH 2S JD 5C 7H AH QD +8S 3C 6H 6C 2C 8D TD 7D 4C 4D +5D QH KH 7C 2S 7H JS 6D QC QD +AD 6C 6S 7D TH 6H 2H 8H KH 4H +KS JS KD 5D 2D KH 7D 9C 8C 3D +9C 6D QD 3C KS 3S 7S AH JD 2D +AH QH AS JC 8S 8H 4C KC TH 7D +JC 5H TD 7C 5D KD 4C AD 8H JS +KC 2H AC AH 7D JH KH 5D 7S 6D +9S 5S 9C 6H 8S TD JD 9H 6C AC +7D 8S 6D TS KD 7H AC 5S 7C 5D +AH QC JC 4C TC 8C 2H TS 2C 7D +KD KC 6S 3D 7D 2S 8S 3H 5S 5C +8S 5D 8H 4C 6H KC 3H 7C 5S KD +JH 8C 3D 3C 6C KC TD 7H 7C 4C +JC KC 6H TS QS TD KS 8H 8C 9S +6C 5S 9C QH 7D AH KS KC 9S 2C +4D 4S 8H TD 9C 3S 7D 9D AS TH +6S 7D 3C 6H 5D KD 2C 5C 9D 9C +2H KC 3D AD 3H QD QS 8D JC 4S +8C 3H 9C 7C AD 5D JC 9D JS AS +5D 9H 5C 7H 6S 6C QC JC QD 9S +JC QS JH 2C 6S 9C QC 3D 4S TC +4H 5S 8D 3D 4D 2S KC 2H JS 2C +TD 3S TH KD 4D 7H JH JS KS AC +7S 8C 9S 2D 8S 7D 5C AD 9D AS +8C 7H 2S 6C TH 3H 4C 3S 8H AC +KD 5H JC 8H JD 2D 4H TD JH 5C +3D AS QH KS 7H JD 8S 5S 6D 5H +9S 6S TC QS JC 5C 5D 9C TH 8C +5H 3S JH 9H 2S 2C 6S 7S AS KS +8C QD JC QS TC QC 4H AC KH 6C +TC 5H 7D JH 4H 2H 8D JC KS 4D +5S 9C KH KD 9H 5C TS 3D 7D 2D +5H AS TC 4D 8C 2C TS 9D 3H 8D +6H 8D 2D 9H JD 6C 4S 5H 5S 6D +AD 9C JC 7D 6H 9S 6D JS 9H 3C +AD JH TC QS 4C 5D 9S 7C 9C AH +KD 6H 2H TH 8S QD KS 9D 9H AS +4H 8H 8D 5H 6C AH 5S AS AD 8S +QS 5D 4S 2H TD KS 5H AC 3H JC +9C 7D QD KD AC 6D 5H QH 6H 5S +KC AH QH 2H 7D QS 3H KS 7S JD +6C 8S 3H 6D KS QD 5D 5C 8H TC +9H 4D 4S 6S 9D KH QC 4H 6C JD +TD 2D QH 4S 6H JH KD 3C QD 8C +4S 6H 7C QD 9D AS AH 6S AD 3C +2C KC TH 6H 8D AH 5C 6D 8S 5D +TD TS 7C AD JC QD 9H 3C KC 7H +5D 4D 5S 8H 4H 7D 3H JD KD 2D +JH TD 6H QS 4S KD 5C 8S 7D 8H +AC 3D AS 8C TD 7H KH 5D 6C JD +9D KS 7C 6D QH TC JD KD AS KC +JH 8S 5S 7S 7D AS 2D 3D AD 2H +2H 5D AS 3C QD KC 6H 9H 9S 2C +9D 5D TH 4C JH 3H 8D TC 8H 9H +6H KD 2C TD 2H 6C 9D 2D JS 8C +KD 7S 3C 7C AS QH TS AD 8C 2S +QS 8H 6C JS 4C 9S QC AD TD TS +2H 7C TS TC 8C 3C 9H 2D 6D JC +TC 2H 8D JH KS 6D 3H TD TH 8H +9D TD 9H QC 5D 6C 8H 8C KC TS +2H 8C 3D AH 4D TH TC 7D 8H KC +TS 5C 2D 8C 6S KH AH 5H 6H KC +5S 5D AH TC 4C JD 8D 6H 8C 6C +KC QD 3D 8H 2D JC 9H 4H AD 2S +TD 6S 7D JS KD 4H QS 2S 3S 8C +4C 9H JH TS 3S 4H QC 5S 9S 9C +2C KD 9H JS 9S 3H JC TS 5D AC +AS 2H 5D AD 5H JC 7S TD JS 4C +2D 4S 8H 3D 7D 2C AD KD 9C TS +7H QD JH 5H JS AC 3D TH 4C 8H +6D KH KC QD 5C AD 7C 2D 4H AC +3D 9D TC 8S QD 2C JC 4H JD AH +6C TD 5S TC 8S AH 2C 5D AS AC +TH 7S 3D AS 6C 4C 7H 7D 4H AH +5C 2H KS 6H 7S 4H 5H 3D 3C 7H +3C 9S AC 7S QH 2H 3D 6S 3S 3H +2D 3H AS 2C 6H TC JS 6S 9C 6C +QH KD QD 6D AC 6H KH 2C TS 8C +8H 7D 3S 9H 5D 3H 4S QC 9S 5H +2D 9D 7H 6H 3C 8S 5H 4D 3S 4S +KD 9S 4S TC 7S QC 3S 8S 2H 7H +TC 3D 8C 3H 6C 2H 6H KS KD 4D +KC 3D 9S 3H JS 4S 8H 2D 6C 8S +6H QS 6C TC QD 9H 7D 7C 5H 4D +TD 9D 8D 6S 6C TC 5D TS JS 8H +4H KC JD 9H TC 2C 6S 5H 8H AS +JS 9C 5C 6S 9D JD 8H KC 4C 6D +4D 8D 8S 6C 7C 6H 7H 8H 5C KC +TC 3D JC 6D KS 9S 6H 7S 9C 2C +6C 3S KD 5H TS 7D 9H 9S 6H KH +3D QD 4C 6H TS AC 3S 5C 2H KD +4C AS JS 9S 7C TS 7H 9H JC KS +4H 8C JD 3H 6H AD 9S 4S 5S KS +4C 2C 7D 3D AS 9C 2S QS KC 6C +8S 5H 3D 2S AC 9D 6S 3S 4D TD +QD TH 7S TS 3D AC 7H 6C 5D QC +TC QD AD 9C QS 5C 8D KD 3D 3C +9D 8H AS 3S 7C 8S JD 2D 8D KC +4C TH AC QH JS 8D 7D 7S 9C KH +9D 8D 4C JH 2C 2S QD KD TS 4H +4D 6D 5D 2D JH 3S 8S 3H TC KH +AD 4D 2C QS 8C KD JH JD AH 5C +5C 6C 5H 2H JH 4H KS 7C TC 3H +3C 4C QC 5D JH 9C QD KH 8D TC +3H 9C JS 7H QH AS 7C 9H 5H JC +2D 5S QD 4S 3C KC 6S 6C 5C 4C +5D KH 2D TS 8S 9C AS 9S 7C 4C +7C AH 8C 8D 5S KD QH QS JH 2C +8C 9D AH 2H AC QC 5S 8H 7H 2C +QD 9H 5S QS QC 9C 5H JC TH 4H +6C 6S 3H 5H 3S 6H KS 8D AC 7S +AC QH 7H 8C 4S KC 6C 3D 3S TC +9D 3D JS TH AC 5H 3H 8S 3S TC +QD KH JS KS 9S QC 8D AH 3C AC +5H 6C KH 3S 9S JH 2D QD AS 8C +6C 4D 7S 7H 5S JC 6S 9H 4H JH +AH 5S 6H 9S AD 3S TH 2H 9D 8C +4C 8D 9H 7C QC AD 4S 9C KC 5S +9D 6H 4D TC 4C JH 2S 5D 3S AS +2H 6C 7C KH 5C AD QS TH JD 8S +3S 4S 7S AH AS KC JS 2S AD TH +JS KC 2S 7D 8C 5C 9C TS 5H 9D +7S 9S 4D TD JH JS KH 6H 5D 2C +JD JS JC TH 2D 3D QD 8C AC 5H +7S KH 5S 9D 5D TD 4S 6H 3C 2D +4S 5D AC 8D 4D 7C AD AS AH 9C +6S TH TS KS 2C QC AH AS 3C 4S +2H 8C 3S JC 5C 7C 3H 3C KH JH +7S 3H JC 5S 6H 4C 2S 4D KC 7H +4D 7C 4H 9S 8S 6S AD TC 6C JC +KH QS 3S TC 4C 8H 8S AC 3C TS +QD QS TH 3C TS 7H 7D AH TD JC +TD JD QC 4D 9S 7S TS AD 7D AC +AH 7H 4S 6D 7C 2H 9D KS JC TD +7C AH JD 4H 6D QS TS 2H 2C 5C +TC KC 8C 9S 4C JS 3C JC 6S AH +AS 7D QC 3D 5S JC JD 9D TD KH +TH 3C 2S 6H AH AC 5H 5C 7S 8H +QC 2D AC QD 2S 3S JD QS 6S 8H +KC 4H 3C 9D JS 6H 3S 8S AS 8C +7H KC 7D JD 2H JC QH 5S 3H QS +9H TD 3S 8H 7S AC 5C 6C AH 7C +8D 9H AH JD TD QS 7D 3S 9C 8S +AH QH 3C JD KC 4S 5S 5D TD KS +9H 7H 6S JH TH 4C 7C AD 5C 2D +7C KD 5S TC 9D 6S 6C 5D 2S TH +KC 9H 8D 5H 7H 4H QC 3D 7C AS +6S 8S QC TD 4S 5C TH QS QD 2S +8S 5H TH QC 9H 6S KC 7D 7C 5C +7H KD AH 4D KH 5C 4S 2D KC QH +6S 2C TD JC AS 4D 6C 8C 4H 5S +JC TC JD 5S 6S 8D AS 9D AD 3S +6D 6H 5D 5S TC 3D 7D QS 9D QD +4S 6C 8S 3S 7S AD KS 2D 7D 7C +KC QH JC AC QD 5D 8D QS 7H 7D +JS AH 8S 5H 3D TD 3H 4S 6C JH +4S QS 7D AS 9H JS KS 6D TC 5C +2D 5C 6H TC 4D QH 3D 9H 8S 6C +6D 7H TC TH 5S JD 5C 9C KS KD +8D TD QH 6S 4S 6C 8S KC 5C TC +5S 3D KS AC 4S 7D QD 4C TH 2S +TS 8H 9S 6S 7S QH 3C AH 7H 8C +4C 8C TS JS QC 3D 7D 5D 7S JH +8S 7S 9D QC AC 7C 6D 2H JH KC +JS KD 3C 6S 4S 7C AH QC KS 5H +KS 6S 4H JD QS TC 8H KC 6H AS +KH 7C TC 6S TD JC 5C 7D AH 3S +3H 4C 4H TC TH 6S 7H 6D 9C QH +7D 5H 4S 8C JS 4D 3D 8S QH KC +3H 6S AD 7H 3S QC 8S 4S 7S JS +3S JD KH TH 6H QS 9C 6C 2D QD +4S QH 4D 5H KC 7D 6D 8D TH 5S +TD AD 6S 7H KD KH 9H 5S KC JC +3H QC AS TS 4S QD KS 9C 7S KC +TS 6S QC 6C TH TC 9D 5C 5D KD +JS 3S 4H KD 4C QD 6D 9S JC 9D +8S JS 6D 4H JH 6H 6S 6C KS KH +AC 7D 5D TC 9S KH 6S QD 6H AS +AS 7H 6D QH 8D TH 2S KH 5C 5H +4C 7C 3D QC TC 4S KH 8C 2D JS +6H 5D 7S 5H 9C 9H JH 8S TH 7H +AS JS 2S QD KH 8H 4S AC 8D 8S +3H 4C TD KD 8C JC 5C QS 2D JD +TS 7D 5D 6C 2C QS 2H 3C AH KS +4S 7C 9C 7D JH 6C 5C 8H 9D QD +2S TD 7S 6D 9C 9S QS KH QH 5C +JC 6S 9C QH JH 8D 7S JS KH 2H +8D 5H TH KC 4D 4S 3S 6S 3D QS +2D JD 4C TD 7C 6D TH 7S JC AH +QS 7S 4C TH 9D TS AD 4D 3H 6H +2D 3H 7D JD 3D AS 2S 9C QC 8S +4H 9H 9C 2C 7S JH KD 5C 5D 6H +TC 9H 8H JC 3C 9S 8D KS AD KC +TS 5H JD QS QH QC 8D 5D KH AH +5D AS 8S 6S 4C AH QC QD TH 7H +3H 4H 7D 6S 4S 9H AS 8H JS 9D +JD 8C 2C 9D 7D 5H 5S 9S JC KD +KD 9C 4S QD AH 7C AD 9D AC TD +6S 4H 4S 9C 8D KS TC 9D JH 7C +5S JC 5H 4S QH AC 2C JS 2S 9S +8C 5H AS QD AD 5C 7D 8S QC TD +JC 4C 8D 5C KH QS 4D 6H 2H 2C +TH 4S 2D KC 3H QD AC 7H AD 9D +KH QD AS 8H TH KC 8D 7S QH 8C +JC 6C 7D 8C KH AD QS 2H 6S 2D +JC KH 2D 7D JS QC 5H 4C 5D AD +TS 3S AD 4S TD 2D TH 6S 9H JH +9H 2D QS 2C 4S 3D KH AS AC 9D +KH 6S 8H 4S KD 7D 9D TS QD QC +JH 5H AH KS AS AD JC QC 5S KH +5D 7D 6D KS KD 3D 7C 4D JD 3S +AC JS 8D 5H 9C 3H 4H 4D TS 2C +6H KS KH 9D 7C 2S 6S 8S 2H 3D +6H AC JS 7S 3S TD 8H 3H 4H TH +9H TC QC KC 5C KS 6H 4H AC 8S +TC 7D QH 4S JC TS 6D 6C AC KH +QH 7D 7C JH QS QD TH 3H 5D KS +3D 5S 8D JS 4C 2C KS 7H 9C 4H +5H 8S 4H TD 2C 3S QD QC 3H KC +QC JS KD 9C AD 5S 9D 7D 7H TS +8C JC KH 7C 7S 6C TS 2C QD TH +5S 9D TH 3C 7S QH 8S 9C 2H 5H +5D 9H 6H 2S JS KH 3H 7C 2H 5S +JD 5D 5S 2C TC 2S 6S 6C 3C 8S +4D KH 8H 4H 2D KS 3H 5C 2S 9H +3S 2D TD 7H 8S 6H JD KC 9C 8D +6S QD JH 7C 9H 5H 8S 8H TH TD +QS 7S TD 7D TS JC KD 7C 3C 2C +3C JD 8S 4H 2D 2S TD AS 4D AC +AH KS 6C 4C 4S 7D 8C 9H 6H AS +5S 3C 9S 2C QS KD 4D 4S AC 5D +2D TS 2C JS KH QH 5D 8C AS KC +KD 3H 6C TH 8S 7S KH 6H 9S AC +6H 7S 6C QS AH 2S 2H 4H 5D 5H +5H JC QD 2C 2S JD AS QC 6S 7D +6C TC AS KD 8H 9D 2C 7D JH 9S +2H 4C 6C AH 8S TD 3H TH 7C TS +KD 4S TS 6C QH 8D 9D 9C AH 7D +6D JS 5C QD QC 9C 5D 8C 2H KD +3C QH JH AD 6S AH KC 8S 6D 6H +3D 7C 4C 7S 5S 3S 6S 5H JC 3C +QH 7C 5H 3C 3S 8C TS 4C KD 9C +QD 3S 7S 5H 7H QH JC 7C 8C KD +3C KD KH 2S 4C TS AC 6S 2C 7C +2C KH 3C 4C 6H 4D 5H 5S 7S QD +4D 7C 8S QD TS 9D KS 6H KD 3C +QS 4D TS 7S 4C 3H QD 8D 9S TC +TS QH AC 6S 3C 9H 9D QS 8S 6H +3S 7S 5D 4S JS 2D 6C QH 6S TH +4C 4H AS JS 5D 3D TS 9C AC 8S +6S 9C 7C 3S 5C QS AD AS 6H 3C +9S 8C 7H 3H 6S 7C AS 9H JD KH +3D 3H 7S 4D 6C 7C AC 2H 9C TH +4H 5S 3H AC TC TH 9C 9H 9S 8D +8D 9H 5H 4D 6C 2H QD 6S 5D 3S +4C 5C JD QS 4D 3H TH AC QH 8C +QC 5S 3C 7H AD 4C KS 4H JD 6D +QS AH 3H KS 9H 2S JS JH 5H 2H +2H 5S TH 6S TS 3S KS 3C 5H JS +2D 9S 7H 3D KC JH 6D 7D JS TD +AC JS 8H 2C 8C JH JC 2D TH 7S +5D 9S 8H 2H 3D TC AH JC KD 9C +9D QD JC 2H 6D KH TS 9S QH TH +2C 8D 4S JD 5H 3H TH TC 9C KC +AS 3D 9H 7D 4D TH KH 2H 7S 3H +4H 7S KS 2S JS TS 8S 2H QD 8D +5S 6H JH KS 8H 2S QC AC 6S 3S +JC AS AD QS 8H 6C KH 4C 4D QD +2S 3D TS TD 9S KS 6S QS 5C 8D +3C 6D 4S QC KC JH QD TH KH AD +9H AH 4D KS 2S 8D JH JC 7C QS +2D 6C TH 3C 8H QD QH 2S 3S KS +6H 5D 9S 4C TS TD JS QD 9D JD +5H 8H KH 8S KS 7C TD AD 4S KD +2C 7C JC 5S AS 6C 7D 8S 5H 9C +6S QD 9S TS KH QS 5S QH 3C KC +7D 3H 3C KD 5C AS JH 7H 6H JD +9D 5C 9H KC 8H KS 4S AD 4D 2S +3S JD QD 8D 2S 7C 5S 6S 5H TS +6D 9S KC TD 3S 6H QD JD 5C 8D +5H 9D TS KD 8D 6H TD QC 4C 7D +6D 4S JD 9D AH 9S AS TD 9H QD +2D 5S 2H 9C 6H 9S TD QC 7D TC +3S 2H KS TS 2C 9C 8S JS 9D 7D +3C KC 6D 5D 6C 6H 8S AS 7S QS +JH 9S 2H 8D 4C 8H 9H AD TH KH +QC AS 2S JS 5C 6H KD 3H 7H 2C +QD 8H 2S 8D 3S 6D AH 2C TC 5C +JD JS TS 8S 3H 5D TD KC JC 6H +6S QS TC 3H 5D AH JC 7C 7D 4H +7C 5D 8H 9C 2H 9H JH KH 5S 2C +9C 7H 6S TH 3S QC QD 4C AC JD +2H 5D 9S 7D KC 3S QS 2D AS KH +2S 4S 2H 7D 5C TD TH QH 9S 4D +6D 3S TS 6H 4H KS 9D 8H 5S 2D +9H KS 4H 3S 5C 5D KH 6H 6S JS +KC AS 8C 4C JC KH QC TH QD AH +6S KH 9S 2C 5H TC 3C 7H JC 4D +JD 4S 6S 5S 8D 7H 7S 4D 4C 2H +7H 9H 5D KH 9C 7C TS TC 7S 5H +4C 8D QC TS 4S 9H 3D AD JS 7C +8C QS 5C 5D 3H JS AH KC 4S 9D +TS JD 8S QS TH JH KH 2D QD JS +JD QC 5D 6S 9H 3S 2C 8H 9S TS +2S 4C AD 7H JC 5C 2D 6D 4H 3D +7S JS 2C 4H 8C AD QD 9C 3S TD +JD TS 4C 6H 9H 7D QD 6D 3C AS +AS 7C 4C 6S 5D 5S 5C JS QC 4S +KD 6S 9S 7C 3C 5S 7D JH QD JS +4S 7S JH 2C 8S 5D 7H 3D QH AD +TD 6H 2H 8D 4H 2D 7C AD KH 5D +TS 3S 5H 2C QD AH 2S 5C KH TD +KC 4D 8C 5D AS 6C 2H 2S 9H 7C +KD JS QC TS QS KH JH 2C 5D AD +3S 5H KC 6C 9H 3H 2H AD 7D 7S +7S JS JH KD 8S 7D 2S 9H 7C 2H +9H 2D 8D QC 6S AD AS 8H 5H 6C +2S 7H 6C 6D 7D 8C 5D 9D JC 3C +7C 9C 7H JD 2H KD 3S KH AD 4S +QH AS 9H 4D JD KS KD TS KH 5H +4C 8H 5S 3S 3D 7D TD AD 7S KC +JS 8S 5S JC 8H TH 9C 4D 5D KC +7C 5S 9C QD 2C QH JS 5H 8D KH +TD 2S KS 3D AD KC 7S TC 3C 5D +4C 2S AD QS 6C 9S QD TH QH 5C +8C AD QS 2D 2S KC JD KS 6C JC +8D 4D JS 2H 5D QD 7S 7D QH TS +6S 7H 3S 8C 8S 9D QS 8H 6C 9S +4S TC 2S 5C QD 4D QS 6D TH 6S +3S 5C 9D 6H 8D 4C 7D TC 7C TD +AH 6S AS 7H 5S KD 3H 5H AC 4C +8D 8S AH KS QS 2C AD 6H 7D 5D +6H 9H 9S 2H QS 8S 9C 5D 2D KD +TS QC 5S JH 7D 7S TH 9S 9H AC +7H 3H 6S KC 4D 6D 5C 4S QD TS +TD 2S 7C QD 3H JH 9D 4H 7S 7H +KS 3D 4H 5H TC 2S AS 2D 6D 7D +8H 3C 7H TD 3H AD KC TH 9C KH +TC 4C 2C 9S 9D 9C 5C 2H JD 3C +3H AC TS 5D AD 8D 6H QC 6S 8C +2S TS 3S JD 7H 8S QH 4C 5S 8D +AC 4S 6C 3C KH 3D 7C 2D 8S 2H +4H 6C 8S TH 2H 4S 8H 9S 3H 7S +7C 4C 9C 2C 5C AS 5D KD 4D QH +9H 4H TS AS 7D 8D 5D 9S 8C 2H +QC KD AC AD 2H 7S AS 3S 2D 9S +2H QC 8H TC 6D QD QS 5D KH 3C +TH JD QS 4C 2S 5S AD 7H 3S AS +7H JS 3D 6C 3S 6D AS 9S AC QS +9C TS AS 8C TC 8S 6H 9D 8D 6C +4D JD 9C KC 7C 6D KS 3S 8C AS +3H 6S TC 8D TS 3S KC 9S 7C AS +8C QC 4H 4S 8S 6C 3S TC AH AC +4D 7D 5C AS 2H 6S TS QC AD TC +QD QC 8S 4S TH 3D AH TS JH 4H +5C 2D 9S 2C 3H 3C 9D QD QH 7D +KC 9H 6C KD 7S 3C 4D AS TC 2D +3D JS 4D 9D KS 7D TH QC 3H 3C +8D 5S 2H 9D 3H 8C 4C 4H 3C TH +JC TH 4S 6S JD 2D 4D 6C 3D 4C +TS 3S 2D 4H AC 2C 6S 2H JH 6H +TD 8S AD TC AH AC JH 9S 6S 7S +6C KC 4S JD 8D 9H 5S 7H QH AH +KD 8D TS JH 5C 5H 3H AD AS JS +2D 4H 3D 6C 8C 7S AD 5D 5C 8S +TD 5D 7S 9C 4S 5H 6C 8C 4C 8S +JS QH 9C AS 5C QS JC 3D QC 7C +JC 9C KH JH QS QC 2C TS 3D AD +5D JH AC 5C 9S TS 4C JD 8C KS +KC AS 2D KH 9H 2C 5S 4D 3D 6H +TH AH 2D 8S JC 3D 8C QH 7S 3S +8H QD 4H JC AS KH KS 3C 9S 6D +9S QH 7D 9C 4S AC 7H KH 4D KD +AH AD TH 6D 9C 9S KD KS QH 4H +QD 6H 9C 7C QS 6D 6S 9D 5S JH +AH 8D 5H QD 2H JC KS 4H KH 5S +5C 2S JS 8D 9C 8C 3D AS KC AH +JD 9S 2H QS 8H 5S 8C TH 5C 4C +QC QS 8C 2S 2C 3S 9C 4C KS KH +2D 5D 8S AH AD TD 2C JS KS 8C +TC 5S 5H 8H QC 9H 6H JD 4H 9S +3C JH 4H 9H AH 4S 2H 4C 8D AC +8S TH 4D 7D 6D QD QS 7S TC 7C +KH 6D 2D JD 5H JS QD JH 4H 4S +9C 7S JH 4S 3S TS QC 8C TC 4H +QH 9D 4D JH QS 3S 2C 7C 6C 2D +4H 9S JD 5C 5H AH 9D TS 2D 4C +KS JH TS 5D 2D AH JS 7H AS 8D +JS AH 8C AD KS 5S 8H 2C 6C TH +2H 5D AD AC KS 3D 8H TS 6H QC +6D 4H TS 9C 5H JS JH 6S JD 4C +JH QH 4H 2C 6D 3C 5D 4C QS KC +6H 4H 6C 7H 6S 2S 8S KH QC 8C +3H 3D 5D KS 4H TD AD 3S 4D TS +5S 7C 8S 7D 2C KS 7S 6C 8C JS +5D 2H 3S 7C 5C QD 5H 6D 9C 9H +JS 2S KD 9S 8D TD TS AC 8C 9D +5H QD 2S AC 8C 9H KS 7C 4S 3C +KH AS 3H 8S 9C JS QS 4S AD 4D +AS 2S TD AD 4D 9H JC 4C 5H QS +5D 7C 4H TC 2D 6C JS 4S KC 3S +4C 2C 5D AC 9H 3D JD 8S QS QH +2C 8S 6H 3C QH 6D TC KD AC AH +QC 6C 3S QS 4S AC 8D 5C AD KH +5S 4C AC KH AS QC 2C 5C 8D 9C +8H JD 3C KH 8D 5C 9C QD QH 9D +7H TS 2C 8C 4S TD JC 9C 5H QH +JS 4S 2C 7C TH 6C AS KS 7S JD +JH 7C 9H 7H TC 5H 3D 6D 5D 4D +2C QD JH 2H 9D 5S 3D TD AD KS +JD QH 3S 4D TH 7D 6S QS KS 4H +TC KS 5S 8D 8H AD 2S 2D 4C JH +5S JH TC 3S 2D QS 9D 4C KD 9S +AC KH 3H AS 9D KC 9H QD 6C 6S +9H 7S 3D 5C 7D KC TD 8H 4H 6S +3C 7H 8H TC QD 4D 7S 6S QH 6C +6D AD 4C QD 6C 5D 7D 9D KS TS +JH 2H JD 9S 7S TS KH 8D 5D 8H +2D 9S 4C 7D 9D 5H QD 6D AC 6S +7S 6D JC QD JH 4C 6S QS 2H 7D +8C TD JH KD 2H 5C QS 2C JS 7S +TC 5H 4H JH QD 3S 5S 5D 8S KH +KS KH 7C 2C 5D JH 6S 9C 6D JC +5H AH JD 9C JS KC 2H 6H 4D 5S +AS 3C TH QC 6H 9C 8S 8C TD 7C +KC 2C QD 9C KH 4D 7S 3C TS 9H +9C QC 2S TS 8C TD 9S QD 3S 3C +4D 9D TH JH AH 6S 2S JD QH JS +QD 9H 6C KD 7D 7H 5D 6S 8H AH +8H 3C 4S 2H 5H QS QH 7S 4H AC +QS 3C 7S 9S 4H 3S AH KS 9D 7C +AD 5S 6S 2H 2D 5H TC 4S 3C 8C +QH TS 6S 4D JS KS JH AS 8S 6D +2C 8S 2S TD 5H AS TC TS 6C KC +KC TS 8H 2H 3H 7C 4C 5S TH TD +KD AD KH 7H 7S 5D 5H 5S 2D 9C +AD 9S 3D 7S 8C QC 7C 9C KD KS +3C QC 9S 8C 4D 5C AS QD 6C 2C +2H KC 8S JD 7S AC 8D 5C 2S 4D +9D QH 3D 2S TC 3S KS 3C 9H TD +KD 6S AC 2C 7H 5H 3S 6C 6H 8C +QH TC 8S 6S KH TH 4H 5D TS 4D +8C JS 4H 6H 2C 2H 7D AC QD 3D +QS KC 6S 2D 5S 4H TD 3H JH 4C +7S 5H 7H 8H KH 6H QS TH KD 7D +5H AD KD 7C KH 5S TD 6D 3C 6C +8C 9C 5H JD 7C KC KH 7H 2H 3S +7S 4H AD 4D 8S QS TH 3D 7H 5S +8D TC KS KD 9S 6D AD JD 5C 2S +7H 8H 6C QD 2H 6H 9D TC 9S 7C +8D 6D 4C 7C 6C 3C TH KH JS JH +5S 3S 8S JS 9H AS AD 8H 7S KD +JH 7C 2C KC 5H AS AD 9C 9S JS +AD AC 2C 6S QD 7C 3H TH KS KD +9D JD 4H 8H 4C KH 7S TS 8C KC +3S 5S 2H 7S 6H 7D KS 5C 6D AD +5S 8C 9H QS 7H 7S 2H 6C 7D TD +QS 5S TD AC 9D KC 3D TC 2D 4D +TD 2H 7D JD QD 4C 7H 5D KC 3D +4C 3H 8S KD QH 5S QC 9H TC 5H +9C QD TH 5H TS 5C 9H AH QH 2C +4D 6S 3C AC 6C 3D 2C 2H TD TH +AC 9C 5D QC 4D AD 8D 6D 8C KC +AD 3C 4H AC 8D 8H 7S 9S TD JC +4H 9H QH JS 2D TH TD TC KD KS +5S 6S 9S 8D TH AS KH 5H 5C 8S +JD 2S 9S 6S 5S 8S 5D 7S 7H 9D +5D 8C 4C 9D AD TS 2C 7D KD TC +8S QS 4D KC 5C 8D 4S KH JD KD +AS 5C AD QH 7D 2H 9S 7H 7C TC +2S 8S JD KH 7S 6C 6D AD 5D QC +9H 6H 3S 8C 8H AH TC 4H JS TD +2C TS 4D 7H 2D QC 9C 5D TH 7C +6C 8H QC 5D TS JH 5C 5H 9H 4S +2D QC 7H AS JS 8S 2H 4C 4H 8D +JS 6S AC KD 3D 3C 4S 7H TH KC +QH KH 6S QS 5S 4H 3C QD 3S 3H +7H AS KH 8C 4H 9C 5S 3D 6S TS +9C 7C 3H 5S QD 2C 3D AD AC 5H +JH TD 2D 4C TS 3H KH AD 3S 7S +AS 4C 5H 4D 6S KD JC 3C 6H 2D +3H 6S 8C 2D TH 4S AH QH AD 5H +7C 2S 9H 7H KC 5C 6D 5S 3H JC +3C TC 9C 4H QD TD JH 6D 9H 5S +7C 6S 5C 5D 6C 4S 7H 9H 6H AH +AD 2H 7D KC 2C 4C 2S 9S 7H 3S +TH 4C 8S 6S 3S AD KS AS JH TD +5C TD 4S 4D AD 6S 5D TC 9C 7D +8H 3S 4D 4S 5S 6H 5C AC 3H 3D +9H 3C AC 4S QS 8S 9D QH 5H 4D +JC 6C 5H TS AC 9C JD 8C 7C QD +8S 8H 9C JD 2D QC QH 6H 3C 8D +KS JS 2H 6H 5H QH QS 3H 7C 6D +TC 3H 4S 7H QC 2H 3S 8C JS KH +AH 8H 5S 4C 9H JD 3H 7S JC AC +3C 2D 4C 5S 6C 4S QS 3S JD 3D +5H 2D TC AH KS 6D 7H AD 8C 6H +6C 7S 3C JD 7C 8H KS KH AH 6D +AH 7D 3H 8H 8S 7H QS 5H 9D 2D +JD AC 4H 7S 8S 9S KS AS 9D QH +7S 2C 8S 5S JH QS JC AH KD 4C +AH 2S 9H 4H 8D TS TD 6H QH JD +4H JC 3H QS 6D 7S 9C 8S 9D 8D +5H TD 4S 9S 4C 8C 8D 7H 3H 3D +QS KH 3S 2C 2S 3C 7S TD 4S QD +7C TD 4D 5S KH AC AS 7H 4C 6C +2S 5H 6D JD 9H QS 8S 2C 2H TD +2S TS 6H 9H 7S 4H JC 4C 5D 5S +2C 5H 7D 4H 3S QH JC JS 6D 8H +4C QH 7C QD 3S AD TH 8S 5S TS +9H TC 2S TD JC 7D 3S 3D TH QH +7D 4C 8S 5C JH 8H 6S 3S KC 3H +JC 3H KH TC QH TH 6H 2C AC 5H +QS 2H 9D 2C AS 6S 6C 2S 8C 8S +9H 7D QC TH 4H KD QS AC 7S 3C +4D JH 6S 5S 8H KS 9S QC 3S AS +JD 2D 6S 7S TC 9H KC 3H 7D KD +2H KH 7C 4D 4S 3H JS QD 7D KC +4C JC AS 9D 3C JS 6C 8H QD 4D +AH JS 3S 6C 4C 3D JH 6D 9C 9H +9H 2D 8C 7H 5S KS 6H 9C 2S TC +6C 8C AD 7H 6H 3D KH AS 5D TH +KS 8C 3S TS 8S 4D 5S 9S 6C 4H +9H 4S 4H 5C 7D KC 2D 2H 9D JH +5C JS TC 9D 9H 5H 7S KH JC 6S +7C 9H 8H 4D JC KH JD 2H TD TC +8H 6C 2H 2C KH 6H 9D QS QH 5H +AC 7D 2S 3D QD JC 2D 8D JD JH +2H JC 2D 7H 2C 3C 8D KD TD 4H +3S 4H 6D 8D TS 3H TD 3D 6H TH +JH JC 3S AC QH 9H 7H 8S QC 2C +7H TD QS 4S 8S 9C 2S 5D 4D 2H +3D TS 3H 2S QC 8H 6H KC JC KS +5D JD 7D TC 8C 6C 9S 3D 8D AC +8H 6H JH 6C 5D 8D 8S 4H AD 2C +9D 4H 2D 2C 3S TS AS TC 3C 5D +4D TH 5H KS QS 6C 4S 2H 3D AD +5C KC 6H 2C 5S 3C 4D 2D 9H 9S +JD 4C 3H TH QH 9H 5S AH 8S AC +7D 9S 6S 2H TD 9C 4H 8H QS 4C +3C 6H 5D 4H 8C 9C KC 6S QD QS +3S 9H KD TC 2D JS 8C 6S 4H 4S +2S 4C 8S QS 6H KH 3H TH 8C 5D +2C KH 5S 3S 7S 7H 6C 9D QD 8D +8H KS AC 2D KH TS 6C JS KC 7H +9C KS 5C TD QC AH 6C 5H 9S 7C +5D 4D 3H 4H 6S 7C 7S AH QD TD +2H 7D QC 6S TC TS AH 7S 9D 3H +TH 5H QD 9S KS 7S 7C 6H 8C TD +TH 2D 4D QC 5C 7D JD AH 9C 4H +4H 3H AH 8D 6H QC QH 9H 2H 2C +2D AD 4C TS 6H 7S TH 4H QS TD +3C KD 2H 3H QS JD TC QC 5D 8H +KS JC QD TH 9S KD 8D 8C 2D 9C +3C QD KD 6D 4D 8D AH AD QC 8S +8H 3S 9D 2S 3H KS 6H 4C 7C KC +TH 9S 5C 3D 7D 6H AC 7S 4D 2C +5C 3D JD 4D 2D 6D 5H 9H 4C KH +AS 7H TD 6C 2H 3D QD KS 4C 4S +JC 3C AC 7C JD JS 8H 9S QC 5D +JD 6S 5S 2H AS 8C 7D 5H JH 3D +8D TC 5S 9S 8S 3H JC 5H 7S AS +5C TD 3D 7D 4H 8D 7H 4D 5D JS +QS 9C KS TD 2S 8S 5C 2H 4H AS +TH 7S 4H 7D 3H JD KD 5D 2S KC +JD 7H 4S 8H 4C JS 6H QH 5S 4H +2C QS 8C 5S 3H QC 2S 6C QD AD +8C 3D JD TC 4H 2H AD 5S AC 2S +5D 2C JS 2D AD 9D 3D 4C 4S JH +8D 5H 5D 6H 7S 4D KS 9D TD JD +3D 6D 9C 2S AS 7D 5S 5C 8H JD +7C 8S 3S 6S 5H JD TC AD 7H 7S +2S 9D TS 4D AC 8D 6C QD JD 3H +9S KH 2C 3C AC 3D 5H 6H 8D 5D +KS 3D 2D 6S AS 4C 2S 7C 7H KH +AC 2H 3S JC 5C QH 4D 2D 5H 7S +TS AS JD 8C 6H JC 8S 5S 2C 5D +7S QH 7H 6C QC 8H 2D 7C JD 2S +2C QD 2S 2H JC 9C 5D 2D JD JH +7C 5C 9C 8S 7D 6D 8D 6C 9S JH +2C AD 6S 5H 3S KS 7S 9D KH 4C +7H 6C 2C 5C TH 9D 8D 3S QC AH +5S KC 6H TC 5H 8S TH 6D 3C AH +9C KD 4H AD TD 9S 4S 7D 6H 5D +7H 5C 5H 6D AS 4C KD KH 4H 9D +3C 2S 5C 6C JD QS 2H 9D 7D 3H +AC 2S 6S 7S JS QD 5C QS 6H AD +5H TH QC 7H TC 3S 7C 6D KC 3D +4H 3D QC 9S 8H 2C 3S JC KS 5C +4S 6S 2C 6H 8S 3S 3D 9H 3H JS +4S 8C 4D 2D 8H 9H 7D 9D AH TS +9S 2C 9H 4C 8D AS 7D 3D 6D 5S +6S 4C 7H 8C 3H 5H JC AH 9D 9C +2S 7C 5S JD 8C 3S 3D 4D 7D 6S +3C KC 4S 5D 7D 3D JD 7H 3H 4H +9C 9H 4H 4D TH 6D QD 8S 9S 7S +2H AC 8S 4S AD 8C 2C AH 7D TC +TS 9H 3C AD KS TC 3D 8C 8H JD +QC 8D 2C 3C 7D 7C JD 9H 9C 6C +AH 6S JS JH 5D AS QC 2C JD TD +9H KD 2H 5D 2D 3S 7D TC AH TS +TD 8H AS 5D AH QC AC 6S TC 5H +KS 4S 7H 4D 8D 9C TC 2H 6H 3H +3H KD 4S QD QH 3D 8H 8C TD 7S +8S JD TC AH JS QS 2D KH KS 4D +3C AD JC KD JS KH 4S TH 9H 2C +QC 5S JS 9S KS AS 7C QD 2S JD +KC 5S QS 3S 2D AC 5D 9H 8H KS +6H 9C TC AD 2C 6D 5S JD 6C 7C +QS KH TD QD 2C 3H 8S 2S QC AH +9D 9H JH TC QH 3C 2S JS 5C 7H +6C 3S 3D 2S 4S QD 2D TH 5D 2C +2D 6H 6D 2S JC QH AS 7H 4H KH +5H 6S KS AD TC TS 7C AC 4S 4H +AD 3C 4H QS 8C 9D KS 2H 2D 4D +4S 9D 6C 6D 9C AC 8D 3H 7H KD +JC AH 6C TS JD 6D AD 3S 5D QD +JC JH JD 3S 7S 8S JS QC 3H 4S +JD TH 5C 2C AD JS 7H 9S 2H 7S +8D 3S JH 4D QC AS JD 2C KC 6H +2C AC 5H KD 5S 7H QD JH AH 2D +JC QH 8D 8S TC 5H 5C AH 8C 6C +3H JS 8S QD JH 3C 4H 6D 5C 3S +6D 4S 4C AH 5H 5S 3H JD 7C 8D +8H AH 2H 3H JS 3C 7D QC 4H KD +6S 2H KD 5H 8H 2D 3C 8S 7S QD +2S 7S KC QC AH TC QS 6D 4C 8D +5S 9H 2C 3S QD 7S 6C 2H 7C 9D +3C 6C 5C 5S JD JC KS 3S 5D TS +7C KS 6S 5S 2S 2D TC 2H 5H QS +AS 7H 6S TS 5H 9S 9D 3C KD 2H +4S JS QS 3S 4H 7C 2S AC 6S 9D +8C JH 2H 5H 7C 5D QH QS KH QC +3S TD 3H 7C KC 8D 5H 8S KH 8C +4H KH JD TS 3C 7H AS QC JS 5S +AH 9D 2C 8D 4D 2D 6H 6C KC 6S +2S 6H 9D 3S 7H 4D KH 8H KD 3D +9C TC AC JH KH 4D JD 5H TD 3S +7S 4H 9D AS 4C 7D QS 9S 2S KH +3S 8D 8S KS 8C JC 5C KH 2H 5D +8S QH 2C 4D KC JS QC 9D AC 6H +8S 8C 7C JS JD 6S 4C 9C AC 4S +QH 5D 2C 7D JC 8S 2D JS JH 4C +JS 4C 7S TS JH KC KH 5H QD 4S +QD 8C 8D 2D 6S TD 9D AC QH 5S +QH QC JS 3D 3C 5C 4H KH 8S 7H +7C 2C 5S JC 8S 3H QC 5D 2H KC +5S 8D KD 6H 4H QD QH 6D AH 3D +7S KS 6C 2S 4D AC QS 5H TS JD +7C 2D TC 5D QS AC JS QC 6C KC +2C KS 4D 3H TS 8S AD 4H 7S 9S +QD 9H QH 5H 4H 4D KH 3S JC AD +4D AC KC 8D 6D 4C 2D KH 2C JD +2C 9H 2D AH 3H 6D 9C 7D TC KS +8C 3H KD 7C 5C 2S 4S 5H AS AH +TH JD 4H KD 3H TC 5C 3S AC KH +6D 7H AH 7S QC 6H 2D TD JD AS +JH 5D 7H TC 9S 7D JC AS 5S KH +2H 8C AD TH 6H QD KD 9H 6S 6C +QH KC 9D 4D 3S JS JH 4H 2C 9H +TC 7H KH 4H JC 7D 9S 3H QS 7S +AD 7D JH 6C 7H 4H 3S 3H 4D QH +JD 2H 5C AS 6C QC 4D 3C TC JH +AC JD 3H 6H 4C JC AD 7D 7H 9H +4H TC TS 2C 8C 6S KS 2H JD 9S +4C 3H QS QC 9S 9H 6D KC 9D 9C +5C AD 8C 2C QH TH QD JC 8D 8H +QC 2C 2S QD 9C 4D 3S 8D JH QS +9D 3S 2C 7S 7C JC TD 3C TC 9H +3C TS 8H 5C 4C 2C 6S 8D 7C 4H +KS 7H 2H TC 4H 2C 3S AS AH QS +8C 2D 2H 2C 4S 4C 6S 7D 5S 3S +TH QC 5D TD 3C QS KD KC KS AS +4D AH KD 9H KS 5C 4C 6H JC 7S +KC 4H 5C QS TC 2H JC 9S AH QH +4S 9H 3H 5H 3C QD 2H QC JH 8H +5D AS 7H 2C 3D JH 6H 4C 6S 7D +9C JD 9H AH JS 8S QH 3H KS 8H +3S AC QC TS 4D AD 3D AH 8S 9H +7H 3H QS 9C 9S 5H JH JS AH AC +8D 3C JD 2H AC 9C 7H 5S 4D 8H +7C JH 9H 6C JS 9S 7H 8C 9D 4H +2D AS 9S 6H 4D JS JH 9H AD QD +6H 7S JH KH AH 7H TD 5S 6S 2C +8H JH 6S 5H 5S 9D TC 4C QC 9S +7D 2C KD 3H 5H AS QD 7H JS 4D +TS QH 6C 8H TH 5H 3C 3H 9C 9D +AD KH JS 5D 3H AS AC 9S 5C KC +2C KH 8C JC QS 6D AH 2D KC TC +9D 3H 2S 7C 4D 6D KH KS 8D 7D +9H 2S TC JH AC QC 3H 5S 3S 8H +3S AS KD 8H 4C 3H 7C JH QH TS +7S 6D 7H 9D JH 4C 3D 3S 6C AS +4S 2H 2C 4C 8S 5H KC 8C QC QD +3H 3S 6C QS QC 2D 6S 5D 2C 9D +2H 8D JH 2S 3H 2D 6C 5C 7S AD +9H JS 5D QH 8S TS 2H 7S 6S AD +6D QC 9S 7H 5H 5C 7D KC JD 4H +QC 5S 9H 9C 4D 6S KS 2S 4C 7C +9H 7C 4H 8D 3S 6H 5C 8H JS 7S +2D 6H JS TD 4H 4D JC TH 5H KC +AC 7C 8D TH 3H 9S 2D 4C KC 4D +KD QS 9C 7S 3D KS AD TS 4C 4H +QH 9C 8H 2S 7D KS 7H 5D KD 4C +9C 2S 2H JC 6S 6C TC QC JH 5C +7S AC 8H KC 8S 6H QS JC 3D 6S +JS 2D JH 8C 4S 6H 8H 6D 5D AD +6H 7D 2S 4H 9H 7C AS AC 8H 5S +3C JS 4S 6D 5H 2S QH 6S 9C 2C +3D 5S 6S 9S 4C QS 8D QD 8S TC +9C 3D AH 9H 5S 2C 7D AD JC 3S +7H TC AS 3C 6S 6D 7S KH KC 9H +3S TC 8H 6S 5H JH 8C 7D AC 2S +QD 9D 9C 3S JC 8C KS 8H 5D 4D +JS AH JD 6D 9D 8C 9H 9S 8H 3H +2D 6S 4C 4D 8S AD 4S TC AH 9H +TS AC QC TH KC 6D 4H 7S 8C 2H +3C QD JS 9D 5S JC AH 2H TS 9H +3H 4D QH 5D 9C 5H 7D 4S JC 3S +8S TH 3H 7C 2H JD JS TS AC 8D +9C 2H TD KC JD 2S 8C 5S AD 2C +3D KD 7C 5H 4D QH QD TC 6H 7D +7H 2C KC 5S KD 6H AH QC 7S QH +6H 5C AC 5H 2C 9C 2D 7C TD 2S +4D 9D AH 3D 7C JD 4H 8C 4C KS +TH 3C JS QH 8H 4C AS 3D QS QC +4D 7S 5H JH 6D 7D 6H JS KH 3C +QD 8S 7D 2H 2C 7C JC 2S 5H 8C +QH 8S 9D TC 2H AD 7C 8D QD 6S +3S 7C AD 9H 2H 9S JD TS 4C 2D +3S AS 4H QC 2C 8H 8S 7S TD TC +JH TH TD 3S 4D 4H 5S 5D QS 2C +8C QD QH TC 6D 4S 9S 9D 4H QC +8C JS 9D 6H JD 3H AD 6S TD QC +KC 8S 3D 7C TD 7D 8D 9H 4S 3S +6C 4S 3D 9D KD TC KC KS AC 5S +7C 6S QH 3D JS KD 6H 6D 2D 8C +JD 2S 5S 4H 8S AC 2D 6S TS 5C +5H 8C 5S 3C 4S 3D 7C 8D AS 3H +AS TS 7C 3H AD 7D JC QS 6C 6H +3S 9S 4C AC QH 5H 5D 9H TS 4H +6C 5C 7H 7S TD AD JD 5S 2H 2S +7D 6C KC 3S JD 8D 8S TS QS KH +8S QS 8D 6C TH AC AH 2C 8H 9S +7H TD KH QH 8S 3D 4D AH JD AS +TS 3D 2H JC 2S JH KH 6C QC JS +KC TH 2D 6H 7S 2S TC 8C 9D QS +3C 9D 6S KH 8H 6D 5D TH 2C 2H +6H TC 7D AD 4D 8S TS 9H TD 7S +JS 6D JD JC 2H AC 6C 3D KH 8D +KH JD 9S 5D 4H 4C 3H 7S QS 5C +4H JD 5D 3S 3C 4D KH QH QS 7S +JD TS 8S QD AH 4C 6H 3S 5S 2C +QS 3D JD AS 8D TH 7C 6S QC KS +7S 2H 8C QC 7H AC 6D 2D TH KH +5S 6C 7H KH 7D AH 8C 5C 7S 3D +3C KD AD 7D 6C 4D KS 2D 8C 4S +7C 8D 5S 2D 2S AH AD 2C 9D TD +3C AD 4S KS JH 7C 5C 8C 9C TH +AS TD 4D 7C JD 8C QH 3C 5H 9S +3H 9C 8S 9S 6S QD KS AH 5H JH +QC 9C 5S 4H 2H TD 7D AS 8C 9D +8C 2C 9D KD TC 7S 3D KH QC 3C +4D AS 4C QS 5S 9D 6S JD QH KS +6D AH 6C 4C 5H TS 9H 7D 3D 5S +QS JD 7C 8D 9C AC 3S 6S 6C KH +8H JH 5D 9S 6D AS 6S 3S QC 7H +QD AD 5C JH 2H AH 4H AS KC 2C +JH 9C 2C 6H 2D JS 5D 9H KC 6D +7D 9D KD TH 3H AS 6S QC 6H AD +JD 4H 7D KC 3H JS 3C TH 3D QS +4C 3H 8C QD 5H 6H AS 8H AD JD +TH 8S KD 5D QC 7D JS 5S 5H TS +7D KC 9D QS 3H 3C 6D TS 7S AH +7C 4H 7H AH QC AC 4D 5D 6D TH +3C 4H 2S KD 8H 5H JH TC 6C JD +4S 8C 3D 4H JS TD 7S JH QS KD +7C QC KD 4D 7H 6S AD TD TC KH +5H 9H KC 3H 4D 3D AD 6S QD 6H +TH 7C 6H TS QH 5S 2C KC TD 6S +7C 4D 5S JD JH 7D AC KD KH 4H +7D 6C 8D 8H 5C JH 8S QD TH JD +8D 7D 6C 7C 9D KD AS 5C QH JH +9S 2C 8C 3C 4C KS JH 2D 8D 4H +7S 6C JH KH 8H 3H 9D 2D AH 6D +4D TC 9C 8D 7H TD KS TH KD 3C +JD 9H 8D QD AS KD 9D 2C 2S 9C +8D 3H 5C 7H KS 5H QH 2D 8C 9H +2D TH 6D QD 6C KC 3H 3S AD 4C +4H 3H JS 9D 3C TC 5H QH QC JC +3D 5C 6H 3S 3C JC 5S 7S 2S QH +AC 5C 8C 4D 5D 4H 2S QD 3C 3H +2C TD AH 9C KD JS 6S QD 4C QC +QS 8C 3S 4H TC JS 3H 7C JC AD +5H 4D 9C KS JC TD 9S TS 8S 9H +QD TS 7D AS AC 2C TD 6H 8H AH +6S AD 8C 4S 9H 8D 9D KH 8S 3C +QS 4D 2D 7S KH JS JC AD 4C 3C +QS 9S 7H KC TD TH 5H JS AC JH +6D AC 2S QS 7C AS KS 6S KH 5S +6D 8H KH 3C QS 2H 5C 9C 9D 6C +JS 2C 4C 6H 7D JC AC QD TD 3H +4H QC 8H JD 4C KD KS 5C KC 7S +6D 2D 3H 2S QD 5S 7H AS TH 6S +AS 6D 8D 2C 8S TD 8H QD JC AH +9C 9H 2D TD QH 2H 5C TC 3D 8H +KC 8S 3D KH 2S TS TC 6S 4D JH +9H 9D QS AC KC 6H 5D 4D 8D AH +9S 5C QS 4H 7C 7D 2H 8S AD JS +3D AC 9S AS 2C 2D 2H 3H JC KH +7H QH KH JD TC KS 5S 8H 4C 8D +2H 7H 3S 2S 5H QS 3C AS 9H KD +AD 3D JD 6H 5S 9C 6D AC 9S 3S +3D 5D 9C 2D AC 4S 2S AD 6C 6S +QC 4C 2D 3H 6S KC QH QD 2H JH +QC 3C 8S 4D 9S 2H 5C 8H QS QD +6D KD 6S 7H 3S KH 2H 5C JC 6C +3S 9S TC 6S 8H 2D AD 7S 8S TS +3C 6H 9C 3H 5C JC 8H QH TD QD +3C JS QD 5D TD 2C KH 9H TH AS +9S TC JD 3D 5C 5H AD QH 9H KC +TC 7H 4H 8H 3H TD 6S AC 7C 2S +QS 9D 5D 3C JC KS 4D 6C JH 2S +9S 6S 3C 7H TS 4C KD 6D 3D 9C +2D 9H AH AC 7H 2S JH 3S 7C QC +QD 9H 3C 2H AC AS 8S KD 8C KH +2D 7S TD TH 6D JD 8D 4D 2H 5S +8S QH KD JD QS JH 4D KC 5H 3S +3C KH QC 6D 8H 3S AH 7D TD 2D +5S 9H QH 4S 6S 6C 6D TS TH 7S +6C 4C 6D QS JS 9C TS 3H 8D 8S +JS 5C 7S AS 2C AH 2H AD 5S TC +KD 6C 9C 9D TS 2S JC 4H 2C QD +QS 9H TC 3H KC KS 4H 3C AD TH +KH 9C 2H KD 9D TC 7S KC JH 2D +7C 3S KC AS 8C 5D 9C 9S QH 3H +2D 8C TD 4C 2H QC 5D TC 2C 7D +KS 4D 6C QH TD KH 5D 7C AD 8D +2S 9S 8S 4C 8C 3D 6H QD 7C 7H +6C 8S QH 5H TS 5C 3C 4S 2S 2H +8S 6S 2H JC 3S 3H 9D 8C 2S 7H +QC 2C 8H 9C AC JD 4C 4H 6S 3S +3H 3S 7D 4C 9S 5H 8H JC 3D TC +QH 2S 2D 9S KD QD 9H AD 6D 9C +8D 2D KS 9S JC 4C JD KC 4S TH +KH TS 6D 4D 5C KD 5H AS 9H AD +QD JS 7C 6D 5D 5C TH 5H QH QS +9D QH KH 5H JH 4C 4D TC TH 6C +KH AS TS 9D KD 9C 7S 4D 8H 5S +KH AS 2S 7D 9D 4C TS TH AH 7C +KS 4D AC 8S 9S 8D TH QH 9D 5C +5D 5C 8C QS TC 4C 3D 3S 2C 8D +9D KS 2D 3C KC 4S 8C KH 6C JC +8H AH 6H 7D 7S QD 3C 4C 6C KC +3H 2C QH 8H AS 7D 4C 8C 4H KC +QD 5S 4H 2C TD AH JH QH 4C 8S +3H QS 5S JS 8H 2S 9H 9C 3S 2C +6H TS 7S JC QD AC TD KC 5S 3H +QH AS QS 7D JC KC 2C 4C 5C 5S +QH 3D AS JS 4H 8D 7H JC 2S 9C +5D 4D 2S 4S 9D 9C 2D QS 8H 7H +6D 7H 3H JS TS AC 2D JH 7C 8S +JH 5H KC 3C TC 5S 9H 4C 8H 9D +8S KC 5H 9H AD KS 9D KH 8D AH +JC 2H 9H KS 6S 3H QC 5H AH 9C +5C KH 5S AD 6C JC 9H QC 9C TD +5S 5D JC QH 2D KS 8H QS 2H TS +JH 5H 5S AH 7H 3C 8S AS TD KH +6H 3D JD 2C 4C KC 7S AH 6C JH +4C KS 9D AD 7S KC 7D 8H 3S 9C +7H 5C 5H 3C 8H QC 3D KH 6D JC +2D 4H 5D 7D QC AD AH 9H QH 8H +KD 8C JS 9D 3S 3C 2H 5D 6D 2S +8S 6S TS 3C 6H 8D 5S 3H TD 6C +KS 3D JH 9C 7C 9S QS 5S 4H 6H +7S 6S TH 4S KC KD 3S JC JH KS +7C 3C 2S 6D QH 2C 7S 5H 8H AH +KC 8D QD 6D KH 5C 7H 9D 3D 9C +6H 2D 8S JS 9S 2S 6D KC 7C TC +KD 9C JH 7H KC 8S 2S 7S 3D 6H +4H 9H 2D 4C 8H 7H 5S 8S 2H 8D +AD 7C 3C 7S 5S 4D 9H 3D JC KH +5D AS 7D 6D 9C JC 4C QH QS KH +KD JD 7D 3D QS QC 8S 6D JS QD +6S 8C 5S QH TH 9H AS AC 2C JD +QC KS QH 7S 3C 4C 5C KC 5D AH +6C 4H 9D AH 2C 3H KD 3D TS 5C +TD 8S QS AS JS 3H KD AC 4H KS +7D 5D TS 9H 4H 4C 9C 2H 8C QC +2C 7D 9H 4D KS 4C QH AD KD JS +QD AD AH KH 9D JS 9H JC KD JD +8S 3C 4S TS 7S 4D 5C 2S 6H 7C +JS 7S 5C KD 6D QH 8S TD 2H 6S +QH 6C TC 6H TD 4C 9D 2H QC 8H +3D TS 4D 2H 6H 6S 2C 7H 8S 6C +9H 9D JD JH 3S AH 2C 6S 3H 8S +2C QS 8C 5S 3H 2S 7D 3C AD 4S +5C QC QH AS TS 4S 6S 4C 5H JS +JH 5C TD 4C 6H JS KD KH QS 4H +TC KH JC 4D 9H 9D 8D KC 3C 8H +2H TC 8S AD 9S 4H TS 7H 2C 5C +4H 2S 6C 5S KS AH 9C 7C 8H KD +TS QH TD QS 3C JH AH 2C 8D 7D +5D KC 3H 5S AC 4S 7H QS 4C 2H +3D 7D QC KH JH 6D 6C TD TH KD +5S 8D TH 6C 9D 7D KH 8C 9S 6D +JD QS 7S QC 2S QH JC 4S KS 8D +7S 5S 9S JD KD 9C JC AD 2D 7C +4S 5H AH JH 9C 5D TD 7C 2D 6S +KC 6C 7H 6S 9C QD 5S 4H KS TD +6S 8D KS 2D TH TD 9H JD TS 3S +KH JS 4H 5D 9D TC TD QC JD TS +QS QD AC AD 4C 6S 2D AS 3H KC +4C 7C 3C TD QS 9C KC AS 8D AD +KC 7H QC 6D 8H 6S 5S AH 7S 8C +3S AD 9H JC 6D JD AS KH 6S JH +AD 3D TS KS 7H JH 2D JS QD AC +9C JD 7C 6D TC 6H 6C JC 3D 3S +QC KC 3S JC KD 2C 8D AH QS TS +AS KD 3D JD 8H 7C 8C 5C QD 6C diff --git a/055.py b/055.py new file mode 100644 index 0000000..d623d9b --- /dev/null +++ b/055.py @@ -0,0 +1,17 @@ + +def lychrel(x): + for i in xrange(50): + t = x + int(str(x)[::-1]) + if t == int(str(t)[::-1]): + return False + x = t + return True + +count = 0 + +for i in xrange(1, 10000): + if lychrel(i): + count += 1 + +print count + diff --git a/056.py b/056.py new file mode 100644 index 0000000..567f41d --- /dev/null +++ b/056.py @@ -0,0 +1,18 @@ + +def digit_sum(n): + s = 0 + while n > 0: + s += n % 10 + n /= 10 + return s + +max_sum = 0 + +for i in range(2, 100): + for j in range(2, 100): + s = digit_sum(i**j) + if s > max_sum: + max_sum = s + +print max_sum + diff --git a/057.py b/057.py new file mode 100644 index 0000000..8098995 --- /dev/null +++ b/057.py @@ -0,0 +1,16 @@ + +def get_fraction(c): + (n, d) = (1, 2) + for i in xrange(1, c): + (n, d) = (2*d+n, d) # add 2 + (n, d) = (d, n) # 1/x, swap entries + return (d+n, d) # add 1 + +count = 0 +for i in xrange(1, 1000): + (n, d) = get_fraction(i) + if len(str(n)) > len(str(d)): + count += 1 + +print count + diff --git a/058.py b/058.py new file mode 100644 index 0000000..a483fac --- /dev/null +++ b/058.py @@ -0,0 +1,39 @@ +from common import sieve + +primes = sieve(30000).primes() +prime_list = list(primes) +prime_list.sort() + +def is_prime(n): + if n in primes: + return True + for p in prime_list: + if p*p > n: + return True + if n % p == 0: + return False + return True + +def count_primes(numbers): + prime = 0 + for n in numbers: + if is_prime(n): + prime += 1 + return prime + +#numbers = [1, 3, 5, 7, 9] +prime_count = 3 +number_count = 5 +level = 2 +last = 9 + +while 10*prime_count >= number_count: + step = 2 * level + numbers = [last+step, last+2*step, last+3*step, last+4*step] + prime_count += count_primes(numbers) + number_count += 4 + level += 1 + last += 4*step + +print 2*(level-1) + 1 + diff --git a/059.py b/059.py new file mode 100644 index 0000000..449afb7 --- /dev/null +++ b/059.py @@ -0,0 +1,28 @@ +import string + +keys = [] + +for a in string.lowercase: + for b in string.lowercase: + for c in string.lowercase: + keys.append(a+b+c) + +f = open('059.txt', 'r') +content = f.read().split(',') +f.close() + +cipher = [ int(i) for i in content ] +cipher_len = len(cipher) + +for key in keys: + decoded = "" + for p in range(0, cipher_len): + decoded += chr(cipher[p] ^ ord(key[p%3])) + if decoded.find(" the ") != -1 and decoded.find(" and ") != -1: + break + +#print decoded +#print key + +print sum([ ord(x) for x in decoded ]) + diff --git a/059.txt b/059.txt new file mode 100644 index 0000000..08cee2d --- /dev/null +++ b/059.txt @@ -0,0 +1 @@ +79,59,12,2,79,35,8,28,20,2,3,68,8,9,68,45,0,12,9,67,68,4,7,5,23,27,1,21,79,85,78,79,85,71,38,10,71,27,12,2,79,6,2,8,13,9,1,13,9,8,68,19,7,1,71,56,11,21,11,68,6,3,22,2,14,0,30,79,1,31,6,23,19,10,0,73,79,44,2,79,19,6,28,68,16,6,16,15,79,35,8,11,72,71,14,10,3,79,12,2,79,19,6,28,68,32,0,0,73,79,86,71,39,1,71,24,5,20,79,13,9,79,16,15,10,68,5,10,3,14,1,10,14,1,3,71,24,13,19,7,68,32,0,0,73,79,87,71,39,1,71,12,22,2,14,16,2,11,68,2,25,1,21,22,16,15,6,10,0,79,16,15,10,22,2,79,13,20,65,68,41,0,16,15,6,10,0,79,1,31,6,23,19,28,68,19,7,5,19,79,12,2,79,0,14,11,10,64,27,68,10,14,15,2,65,68,83,79,40,14,9,1,71,6,16,20,10,8,1,79,19,6,28,68,14,1,68,15,6,9,75,79,5,9,11,68,19,7,13,20,79,8,14,9,1,71,8,13,17,10,23,71,3,13,0,7,16,71,27,11,71,10,18,2,29,29,8,1,1,73,79,81,71,59,12,2,79,8,14,8,12,19,79,23,15,6,10,2,28,68,19,7,22,8,26,3,15,79,16,15,10,68,3,14,22,12,1,1,20,28,72,71,14,10,3,79,16,15,10,68,3,14,22,12,1,1,20,28,68,4,14,10,71,1,1,17,10,22,71,10,28,19,6,10,0,26,13,20,7,68,14,27,74,71,89,68,32,0,0,71,28,1,9,27,68,45,0,12,9,79,16,15,10,68,37,14,20,19,6,23,19,79,83,71,27,11,71,27,1,11,3,68,2,25,1,21,22,11,9,10,68,6,13,11,18,27,68,19,7,1,71,3,13,0,7,16,71,28,11,71,27,12,6,27,68,2,25,1,21,22,11,9,10,68,10,6,3,15,27,68,5,10,8,14,10,18,2,79,6,2,12,5,18,28,1,71,0,2,71,7,13,20,79,16,2,28,16,14,2,11,9,22,74,71,87,68,45,0,12,9,79,12,14,2,23,2,3,2,71,24,5,20,79,10,8,27,68,19,7,1,71,3,13,0,7,16,92,79,12,2,79,19,6,28,68,8,1,8,30,79,5,71,24,13,19,1,1,20,28,68,19,0,68,19,7,1,71,3,13,0,7,16,73,79,93,71,59,12,2,79,11,9,10,68,16,7,11,71,6,23,71,27,12,2,79,16,21,26,1,71,3,13,0,7,16,75,79,19,15,0,68,0,6,18,2,28,68,11,6,3,15,27,68,19,0,68,2,25,1,21,22,11,9,10,72,71,24,5,20,79,3,8,6,10,0,79,16,8,79,7,8,2,1,71,6,10,19,0,68,19,7,1,71,24,11,21,3,0,73,79,85,87,79,38,18,27,68,6,3,16,15,0,17,0,7,68,19,7,1,71,24,11,21,3,0,71,24,5,20,79,9,6,11,1,71,27,12,21,0,17,0,7,68,15,6,9,75,79,16,15,10,68,16,0,22,11,11,68,3,6,0,9,72,16,71,29,1,4,0,3,9,6,30,2,79,12,14,2,68,16,7,1,9,79,12,2,79,7,6,2,1,73,79,85,86,79,33,17,10,10,71,6,10,71,7,13,20,79,11,16,1,68,11,14,10,3,79,5,9,11,68,6,2,11,9,8,68,15,6,23,71,0,19,9,79,20,2,0,20,11,10,72,71,7,1,71,24,5,20,79,10,8,27,68,6,12,7,2,31,16,2,11,74,71,94,86,71,45,17,19,79,16,8,79,5,11,3,68,16,7,11,71,13,1,11,6,1,17,10,0,71,7,13,10,79,5,9,11,68,6,12,7,2,31,16,2,11,68,15,6,9,75,79,12,2,79,3,6,25,1,71,27,12,2,79,22,14,8,12,19,79,16,8,79,6,2,12,11,10,10,68,4,7,13,11,11,22,2,1,68,8,9,68,32,0,0,73,79,85,84,79,48,15,10,29,71,14,22,2,79,22,2,13,11,21,1,69,71,59,12,14,28,68,14,28,68,9,0,16,71,14,68,23,7,29,20,6,7,6,3,68,5,6,22,19,7,68,21,10,23,18,3,16,14,1,3,71,9,22,8,2,68,15,26,9,6,1,68,23,14,23,20,6,11,9,79,11,21,79,20,11,14,10,75,79,16,15,6,23,71,29,1,5,6,22,19,7,68,4,0,9,2,28,68,1,29,11,10,79,35,8,11,74,86,91,68,52,0,68,19,7,1,71,56,11,21,11,68,5,10,7,6,2,1,71,7,17,10,14,10,71,14,10,3,79,8,14,25,1,3,79,12,2,29,1,71,0,10,71,10,5,21,27,12,71,14,9,8,1,3,71,26,23,73,79,44,2,79,19,6,28,68,1,26,8,11,79,11,1,79,17,9,9,5,14,3,13,9,8,68,11,0,18,2,79,5,9,11,68,1,14,13,19,7,2,18,3,10,2,28,23,73,79,37,9,11,68,16,10,68,15,14,18,2,79,23,2,10,10,71,7,13,20,79,3,11,0,22,30,67,68,19,7,1,71,8,8,8,29,29,71,0,2,71,27,12,2,79,11,9,3,29,71,60,11,9,79,11,1,79,16,15,10,68,33,14,16,15,10,22,73 diff --git a/060.py b/060.py new file mode 100644 index 0000000..22d1311 --- /dev/null +++ b/060.py @@ -0,0 +1,49 @@ +from common import sieve + +# +# WARNING: uses a lot of RAM! +# +# notes: +# - limit:1000000, sieve:50000000 -> no result when starting with ["3"] or ["7"] +# - limit:800000, sieve:50000000 -> no result! +# - limit:100000, sieve:100000000 -> [['13', '5197', '5701', '6733', '8389']] +# +# + +limit = 9000 + +primes = sieve(int(str(limit)+str(limit))).primes() +prime_list = [ p for p in primes if p < limit] +prime_list.sort() +prime_list_str = [ str(p) for p in prime_list ] + +def check_list(l): + result = [] + for sublist in l: + for p in prime_list_str: + isprime = True + for n in sublist: + if int(n+p) not in primes or int(p+n) not in primes: + isprime = False + break + if isprime: + result += [ sublist+[p] ] + + return result + + +def cleanup(l): + result = [] + for sublist in l: + sublist.sort() + if sublist not in result: + result += [sublist] + return result + + +l = [ [p] for p in prime_list_str ] +for i in range(4): + l = cleanup(check_list(l)) + +print l + diff --git a/061.py b/061.py new file mode 100644 index 0000000..d9688e1 --- /dev/null +++ b/061.py @@ -0,0 +1,53 @@ + +import sys + +triangle = set([ n*(n+1)/2 for n in range(45,141) ]) +square = set([ n*n for n in range(32,99) ]) +pentagonal = set([ n*(3*n-1)/2 for n in range(26,82) ]) +hexagonal = set([ n*(2*n-1) for n in range(23,71) ]) +heptagonal = set([ n*(5*n-3)/2 for n in range(21,64) ]) +octagonal = set([ n*(3*n-2) for n in range(19,59) ]) + +whole = set(triangle | square | pentagonal | hexagonal | heptagonal | octagonal) + + +def check_cond(testset): + check = 0 + for e in testset: + if e in octagonal: + check |= 1 + elif e in heptagonal: + check |= 2 + elif e in hexagonal: + check |= 4 + elif e in pentagonal: + check |= 8 + elif e in square: + check |= 16 + elif e in triangle: + check |= 32 + return check == 63 + +for i0 in whole: + t0 = i0 % 100 + tail0 = [ n for n in whole if t0*100 < n < (t0+1)*100 ] + for i1 in tail0: + t1 = i1 % 100 + tail1 = [ n for n in whole if t1*100 < n < (t1+1)*100 ] + for i2 in tail1: + t2 = i2 % 100 + tail2 = [ n for n in whole if t2*100 < n < (t2+1)*100 ] + for i3 in tail2: + t3 = i3 % 100 + tail3 = [ n for n in whole if t3*100 < n < (t3+1)*100 ] + for i4 in tail3: + t4 = i4 % 100 + tail4 = [ n for n in whole if t4*100 < n < (t4+1)*100 ] + for i5 in tail4: + if i5 % 100 != i0 / 100: + continue + s = set([i0, i1, i2, i3, i4, i5]) + if len(s) == 6 and check_cond(s): + print sum(s) + sys.exit(0) + diff --git a/062.c b/062.c new file mode 100644 index 0000000..4ba3350 --- /dev/null +++ b/062.c @@ -0,0 +1,57 @@ +#include +#include +#include + +struct number +{ + char digits[10]; +}; + +const int cubecount = 30000; +struct number* cubedigits; + +int main(void) +{ + int i, j; + + cubedigits = (struct number*) malloc(cubecount*sizeof(struct number)); + memset(cubedigits, 0, cubecount*sizeof(struct number)); + + for(i=1; i 0) + { + char digit = c % 10; + cubedigits[i].digits[digit]++; + c /= 10; + } + + // search for permutations (i.e. same digits) + count = 0; + for(j=1; j +#include +#include +#include + + +const int size = 100; +double *fraction; +int pos = 0; + +void continued_fraction(int n) +{ + double sqrtn, x, y, an, a0; + + memset(fraction, 0, size*sizeof(double)); + pos = 0; + + sqrtn = sqrt((double)n); + a0 = floor(sqrtn); + + if((int)sqrtn*sqrtn == n) // works only for rational square roots + { + fraction[pos] = sqrtn; + return; + } + + // + // floor + ( sqrt(23) - x ) / y + // nenner = (23 - x*x) + // tmp = y * (sqrt(23) + x) / nenner) + // an = floor(tmp) + // x = an*nenner/y - x + // + x = a0; + y = 1.0; + + while(1) + { + double denominator = (n - x*x); + double tmp = y * (sqrtn + x) / denominator; + an = floor(tmp); + x = (an * denominator / y) - x; + y = denominator / y; + + fraction[pos++] = an; + + if(an == 2*a0) + break; + } + + /* + // not working because of double imprecision + while(1) + { + an = floorl(a); + r = 1/(a - an); + a = r; + + fraction[++pos] = an; + + if(an == 2*a0) + break; + } + */ +} + +int main(void) +{ + int i, count=0; + + fraction = (double*) malloc(size*sizeof(double)); + + for(i=2; i<=10000; i++) + { + continued_fraction(i); + if(pos > 0 && pos&1 == 1) + count++; + } + + printf("%i\n", count); + + return 0; +} + diff --git a/065.c b/065.c new file mode 100644 index 0000000..94c17fd --- /dev/null +++ b/065.c @@ -0,0 +1,40 @@ +#include +#include + +#define limit 100 + +unsigned int start = 2; +unsigned int factors[limit-1]; + +int main(void) +{ + int pos, k=1, sum; + mpz_t numerator, denominator; + + for(pos=0; pos=0; pos--) + { + mpz_addmul_ui(numerator, denominator, factors[pos]); // numerator += denominator * factors[pos] + mpz_swap(numerator, denominator); + } + + mpz_addmul_ui(numerator, denominator, start); // numerator += denominator * start + + sum = 0; + while(mpz_cmp_ui(numerator, 0) > 0) + sum += mpz_fdiv_q_ui(numerator, numerator, 10); + + printf("%li\n", sum); + + return 0; +} + diff --git a/066.c b/066.c new file mode 100644 index 0000000..3c1014e --- /dev/null +++ b/066.c @@ -0,0 +1,112 @@ +#include +#include +#include +#include +#include + +// numerator/denominator pairs of continued fractions are solutions to pell's equations + +/* + * taken from problem 65 + * + * numerator, denominator: resulting num / denom are stored there + * limit: depth of continued fraction + * start: decimal part (pre-period) + * factors, factor_len: period of continued fraction with factor_len elements + * + */ +void compute(mpz_t numerator, mpz_t denominator, unsigned int limit, + unsigned long start, const unsigned int* factors, unsigned int factor_len) +{ + int i; + mpz_set_ui(numerator, 1); + mpz_set_ui(denominator, factors[limit % factor_len]); + for(i=limit-1; i>=0; i--) + { + mpz_addmul_ui(numerator, denominator, factors[i % factor_len]); + mpz_swap(numerator, denominator); + } + mpz_addmul_ui(numerator, denominator, start); +} + +// taken from problem 64 +int continued_fraction(unsigned int* fraction, unsigned int n) +{ + double sqrtn, x, y; + unsigned int an, a0, pos=0; + + sqrtn = sqrt((double)n); + a0 = (int)floor(sqrtn); + + fraction[pos++] = sqrtn; + + if((int)sqrtn*sqrtn == n) // works only for rational square roots + return 1; + + x = (double)a0; + y = 1.0; + + while(1) + { + double denominator = (n - x*x); + double tmp = y * (sqrtn + x) / denominator; + an = (int)floor(tmp); + x = (an * denominator / y) - x; + y = denominator / y; + + fraction[pos++] = an; + + if(an == 2*a0) + break; + } + + return pos; +} + +const int max_period_size = 100; + +int main(void) +{ + int d, i, maxd=0; + mpz_t maxx, numerator, denominator, tmp1, tmp2; + unsigned int* fraction = (unsigned int*) malloc(max_period_size*sizeof(unsigned int)); + + mpz_init_set_ui(maxx, 0); + mpz_init(numerator); + mpz_init(denominator); + mpz_init(tmp1); + mpz_init(tmp2); + + for(d=2; d<=1000; d++) + { + + memset(fraction, 0, max_period_size*sizeof(unsigned int)); + int frac_len = continued_fraction(fraction, d); + + if(frac_len == 1) // no solution for squares + continue; + + for(i=0;;i++) + { + compute(numerator, denominator, i, fraction[0], &(fraction[1]), frac_len-1); + + // numerator^2 - denominator^2 * d + mpz_mul(tmp1, numerator, numerator); + mpz_mul(tmp2, denominator, denominator); + mpz_submul_ui(tmp1, tmp2, d); + if(mpz_cmp_ui(tmp1, 1) == 0) + break; + } + + if(mpz_cmp(numerator, maxx) > 0) + { + mpz_set(maxx, numerator); + maxd = d; + } + } + + printf("%d\n", maxd); + + return 0; +} + diff --git a/067.py b/067.py new file mode 100644 index 0000000..2678fd9 --- /dev/null +++ b/067.py @@ -0,0 +1,20 @@ + +triangle = [] + +f = open('067.txt', 'r') +for line in f: + line.rstrip('\n') + row_str = line.split(' ') + row_int = [ int(x) for x in row_str ] + triangle.append(row_int) +f.close() + +for i in range(1, len(triangle)): + rowlen = len(triangle[i]) + triangle[i][0] += triangle[i-1][0] + triangle[i][rowlen-1] += triangle[i-1][rowlen-2] + for j in range(1, rowlen-1): + triangle[i][j] += max(triangle[i-1][j-1], triangle[i-1][j]) + +print max(triangle[-1]) + diff --git a/067.txt b/067.txt new file mode 100644 index 0000000..00f98e3 --- /dev/null +++ b/067.txt @@ -0,0 +1,100 @@ +59 +73 41 +52 40 09 +26 53 06 34 +10 51 87 86 81 +61 95 66 57 25 68 +90 81 80 38 92 67 73 +30 28 51 76 81 18 75 44 +84 14 95 87 62 81 17 78 58 +21 46 71 58 02 79 62 39 31 09 +56 34 35 53 78 31 81 18 90 93 15 +78 53 04 21 84 93 32 13 97 11 37 51 +45 03 81 79 05 18 78 86 13 30 63 99 95 +39 87 96 28 03 38 42 17 82 87 58 07 22 57 +06 17 51 17 07 93 09 07 75 97 95 78 87 08 53 +67 66 59 60 88 99 94 65 55 77 55 34 27 53 78 28 +76 40 41 04 87 16 09 42 75 69 23 97 30 60 10 79 87 +12 10 44 26 21 36 32 84 98 60 13 12 36 16 63 31 91 35 +70 39 06 05 55 27 38 48 28 22 34 35 62 62 15 14 94 89 86 +66 56 68 84 96 21 34 34 34 81 62 40 65 54 62 05 98 03 02 60 +38 89 46 37 99 54 34 53 36 14 70 26 02 90 45 13 31 61 83 73 47 +36 10 63 96 60 49 41 05 37 42 14 58 84 93 96 17 09 43 05 43 06 59 +66 57 87 57 61 28 37 51 84 73 79 15 39 95 88 87 43 39 11 86 77 74 18 +54 42 05 79 30 49 99 73 46 37 50 02 45 09 54 52 27 95 27 65 19 45 26 45 +71 39 17 78 76 29 52 90 18 99 78 19 35 62 71 19 23 65 93 85 49 33 75 09 02 +33 24 47 61 60 55 32 88 57 55 91 54 46 57 07 77 98 52 80 99 24 25 46 78 79 05 +92 09 13 55 10 67 26 78 76 82 63 49 51 31 24 68 05 57 07 54 69 21 67 43 17 63 12 +24 59 06 08 98 74 66 26 61 60 13 03 09 09 24 30 71 08 88 70 72 70 29 90 11 82 41 34 +66 82 67 04 36 60 92 77 91 85 62 49 59 61 30 90 29 94 26 41 89 04 53 22 83 41 09 74 90 +48 28 26 37 28 52 77 26 51 32 18 98 79 36 62 13 17 08 19 54 89 29 73 68 42 14 08 16 70 37 +37 60 69 70 72 71 09 59 13 60 38 13 57 36 09 30 43 89 30 39 15 02 44 73 05 73 26 63 56 86 12 +55 55 85 50 62 99 84 77 28 85 03 21 27 22 19 26 82 69 54 04 13 07 85 14 01 15 70 59 89 95 10 19 +04 09 31 92 91 38 92 86 98 75 21 05 64 42 62 84 36 20 73 42 21 23 22 51 51 79 25 45 85 53 03 43 22 +75 63 02 49 14 12 89 14 60 78 92 16 44 82 38 30 72 11 46 52 90 27 08 65 78 03 85 41 57 79 39 52 33 48 +78 27 56 56 39 13 19 43 86 72 58 95 39 07 04 34 21 98 39 15 39 84 89 69 84 46 37 57 59 35 59 50 26 15 93 +42 89 36 27 78 91 24 11 17 41 05 94 07 69 51 96 03 96 47 90 90 45 91 20 50 56 10 32 36 49 04 53 85 92 25 65 +52 09 61 30 61 97 66 21 96 92 98 90 06 34 96 60 32 69 68 33 75 84 18 31 71 50 84 63 03 03 19 11 28 42 75 45 45 +61 31 61 68 96 34 49 39 05 71 76 59 62 67 06 47 96 99 34 21 32 47 52 07 71 60 42 72 94 56 82 83 84 40 94 87 82 46 +01 20 60 14 17 38 26 78 66 81 45 95 18 51 98 81 48 16 53 88 37 52 69 95 72 93 22 34 98 20 54 27 73 61 56 63 60 34 63 +93 42 94 83 47 61 27 51 79 79 45 01 44 73 31 70 83 42 88 25 53 51 30 15 65 94 80 44 61 84 12 77 02 62 02 65 94 42 14 94 +32 73 09 67 68 29 74 98 10 19 85 48 38 31 85 67 53 93 93 77 47 67 39 72 94 53 18 43 77 40 78 32 29 59 24 06 02 83 50 60 66 +32 01 44 30 16 51 15 81 98 15 10 62 86 79 50 62 45 60 70 38 31 85 65 61 64 06 69 84 14 22 56 43 09 48 66 69 83 91 60 40 36 61 +92 48 22 99 15 95 64 43 01 16 94 02 99 19 17 69 11 58 97 56 89 31 77 45 67 96 12 73 08 20 36 47 81 44 50 64 68 85 40 81 85 52 09 +91 35 92 45 32 84 62 15 19 64 21 66 06 01 52 80 62 59 12 25 88 28 91 50 40 16 22 99 92 79 87 51 21 77 74 77 07 42 38 42 74 83 02 05 +46 19 77 66 24 18 05 32 02 84 31 99 92 58 96 72 91 36 62 99 55 29 53 42 12 37 26 58 89 50 66 19 82 75 12 48 24 87 91 85 02 07 03 76 86 +99 98 84 93 07 17 33 61 92 20 66 60 24 66 40 30 67 05 37 29 24 96 03 27 70 62 13 04 45 47 59 88 43 20 66 15 46 92 30 04 71 66 78 70 53 99 +67 60 38 06 88 04 17 72 10 99 71 07 42 25 54 05 26 64 91 50 45 71 06 30 67 48 69 82 08 56 80 67 18 46 66 63 01 20 08 80 47 07 91 16 03 79 87 +18 54 78 49 80 48 77 40 68 23 60 88 58 80 33 57 11 69 55 53 64 02 94 49 60 92 16 35 81 21 82 96 25 24 96 18 02 05 49 03 50 77 06 32 84 27 18 38 +68 01 50 04 03 21 42 94 53 24 89 05 92 26 52 36 68 11 85 01 04 42 02 45 15 06 50 04 53 73 25 74 81 88 98 21 67 84 79 97 99 20 95 04 40 46 02 58 87 +94 10 02 78 88 52 21 03 88 60 06 53 49 71 20 91 12 65 07 49 21 22 11 41 58 99 36 16 09 48 17 24 52 36 23 15 72 16 84 56 02 99 43 76 81 71 29 39 49 17 +64 39 59 84 86 16 17 66 03 09 43 06 64 18 63 29 68 06 23 07 87 14 26 35 17 12 98 41 53 64 78 18 98 27 28 84 80 67 75 62 10 11 76 90 54 10 05 54 41 39 66 +43 83 18 37 32 31 52 29 95 47 08 76 35 11 04 53 35 43 34 10 52 57 12 36 20 39 40 55 78 44 07 31 38 26 08 15 56 88 86 01 52 62 10 24 32 05 60 65 53 28 57 99 +03 50 03 52 07 73 49 92 66 80 01 46 08 67 25 36 73 93 07 42 25 53 13 96 76 83 87 90 54 89 78 22 78 91 73 51 69 09 79 94 83 53 09 40 69 62 10 79 49 47 03 81 30 +71 54 73 33 51 76 59 54 79 37 56 45 84 17 62 21 98 69 41 95 65 24 39 37 62 03 24 48 54 64 46 82 71 78 33 67 09 16 96 68 52 74 79 68 32 21 13 78 96 60 09 69 20 36 +73 26 21 44 46 38 17 83 65 98 07 23 52 46 61 97 33 13 60 31 70 15 36 77 31 58 56 93 75 68 21 36 69 53 90 75 25 82 39 50 65 94 29 30 11 33 11 13 96 02 56 47 07 49 02 +76 46 73 30 10 20 60 70 14 56 34 26 37 39 48 24 55 76 84 91 39 86 95 61 50 14 53 93 64 67 37 31 10 84 42 70 48 20 10 72 60 61 84 79 69 65 99 73 89 25 85 48 92 56 97 16 +03 14 80 27 22 30 44 27 67 75 79 32 51 54 81 29 65 14 19 04 13 82 04 91 43 40 12 52 29 99 07 76 60 25 01 07 61 71 37 92 40 47 99 66 57 01 43 44 22 40 53 53 09 69 26 81 07 +49 80 56 90 93 87 47 13 75 28 87 23 72 79 32 18 27 20 28 10 37 59 21 18 70 04 79 96 03 31 45 71 81 06 14 18 17 05 31 50 92 79 23 47 09 39 47 91 43 54 69 47 42 95 62 46 32 85 +37 18 62 85 87 28 64 05 77 51 47 26 30 65 05 70 65 75 59 80 42 52 25 20 44 10 92 17 71 95 52 14 77 13 24 55 11 65 26 91 01 30 63 15 49 48 41 17 67 47 03 68 20 90 98 32 04 40 68 +90 51 58 60 06 55 23 68 05 19 76 94 82 36 96 43 38 90 87 28 33 83 05 17 70 83 96 93 06 04 78 47 80 06 23 84 75 23 87 72 99 14 50 98 92 38 90 64 61 58 76 94 36 66 87 80 51 35 61 38 +57 95 64 06 53 36 82 51 40 33 47 14 07 98 78 65 39 58 53 06 50 53 04 69 40 68 36 69 75 78 75 60 03 32 39 24 74 47 26 90 13 40 44 71 90 76 51 24 36 50 25 45 70 80 61 80 61 43 90 64 11 +18 29 86 56 68 42 79 10 42 44 30 12 96 18 23 18 52 59 02 99 67 46 60 86 43 38 55 17 44 93 42 21 55 14 47 34 55 16 49 24 23 29 96 51 55 10 46 53 27 92 27 46 63 57 30 65 43 27 21 20 24 83 +81 72 93 19 69 52 48 01 13 83 92 69 20 48 69 59 20 62 05 42 28 89 90 99 32 72 84 17 08 87 36 03 60 31 36 36 81 26 97 36 48 54 56 56 27 16 91 08 23 11 87 99 33 47 02 14 44 73 70 99 43 35 33 +90 56 61 86 56 12 70 59 63 32 01 15 81 47 71 76 95 32 65 80 54 70 34 51 40 45 33 04 64 55 78 68 88 47 31 47 68 87 03 84 23 44 89 72 35 08 31 76 63 26 90 85 96 67 65 91 19 14 17 86 04 71 32 95 +37 13 04 22 64 37 37 28 56 62 86 33 07 37 10 44 52 82 52 06 19 52 57 75 90 26 91 24 06 21 14 67 76 30 46 14 35 89 89 41 03 64 56 97 87 63 22 34 03 79 17 45 11 53 25 56 96 61 23 18 63 31 37 37 47 +77 23 26 70 72 76 77 04 28 64 71 69 14 85 96 54 95 48 06 62 99 83 86 77 97 75 71 66 30 19 57 90 33 01 60 61 14 12 90 99 32 77 56 41 18 14 87 49 10 14 90 64 18 50 21 74 14 16 88 05 45 73 82 47 74 44 +22 97 41 13 34 31 54 61 56 94 03 24 59 27 98 77 04 09 37 40 12 26 87 09 71 70 07 18 64 57 80 21 12 71 83 94 60 39 73 79 73 19 97 32 64 29 41 07 48 84 85 67 12 74 95 20 24 52 41 67 56 61 29 93 35 72 69 +72 23 63 66 01 11 07 30 52 56 95 16 65 26 83 90 50 74 60 18 16 48 43 77 37 11 99 98 30 94 91 26 62 73 45 12 87 73 47 27 01 88 66 99 21 41 95 80 02 53 23 32 61 48 32 43 43 83 14 66 95 91 19 81 80 67 25 88 +08 62 32 18 92 14 83 71 37 96 11 83 39 99 05 16 23 27 10 67 02 25 44 11 55 31 46 64 41 56 44 74 26 81 51 31 45 85 87 09 81 95 22 28 76 69 46 48 64 87 67 76 27 89 31 11 74 16 62 03 60 94 42 47 09 34 94 93 72 +56 18 90 18 42 17 42 32 14 86 06 53 33 95 99 35 29 15 44 20 49 59 25 54 34 59 84 21 23 54 35 90 78 16 93 13 37 88 54 19 86 67 68 55 66 84 65 42 98 37 87 56 33 28 58 38 28 38 66 27 52 21 81 15 08 22 97 32 85 27 +91 53 40 28 13 34 91 25 01 63 50 37 22 49 71 58 32 28 30 18 68 94 23 83 63 62 94 76 80 41 90 22 82 52 29 12 18 56 10 08 35 14 37 57 23 65 67 40 72 39 93 39 70 89 40 34 07 46 94 22 20 05 53 64 56 30 05 56 61 88 27 +23 95 11 12 37 69 68 24 66 10 87 70 43 50 75 07 62 41 83 58 95 93 89 79 45 39 02 22 05 22 95 43 62 11 68 29 17 40 26 44 25 71 87 16 70 85 19 25 59 94 90 41 41 80 61 70 55 60 84 33 95 76 42 63 15 09 03 40 38 12 03 32 +09 84 56 80 61 55 85 97 16 94 82 94 98 57 84 30 84 48 93 90 71 05 95 90 73 17 30 98 40 64 65 89 07 79 09 19 56 36 42 30 23 69 73 72 07 05 27 61 24 31 43 48 71 84 21 28 26 65 65 59 65 74 77 20 10 81 61 84 95 08 52 23 70 +47 81 28 09 98 51 67 64 35 51 59 36 92 82 77 65 80 24 72 53 22 07 27 10 21 28 30 22 48 82 80 48 56 20 14 43 18 25 50 95 90 31 77 08 09 48 44 80 90 22 93 45 82 17 13 96 25 26 08 73 34 99 06 49 24 06 83 51 40 14 15 10 25 01 +54 25 10 81 30 64 24 74 75 80 36 75 82 60 22 69 72 91 45 67 03 62 79 54 89 74 44 83 64 96 66 73 44 30 74 50 37 05 09 97 70 01 60 46 37 91 39 75 75 18 58 52 72 78 51 81 86 52 08 97 01 46 43 66 98 62 81 18 70 93 73 08 32 46 34 +96 80 82 07 59 71 92 53 19 20 88 66 03 26 26 10 24 27 50 82 94 73 63 08 51 33 22 45 19 13 58 33 90 15 22 50 36 13 55 06 35 47 82 52 33 61 36 27 28 46 98 14 73 20 73 32 16 26 80 53 47 66 76 38 94 45 02 01 22 52 47 96 64 58 52 39 +88 46 23 39 74 63 81 64 20 90 33 33 76 55 58 26 10 46 42 26 74 74 12 83 32 43 09 02 73 55 86 54 85 34 28 23 29 79 91 62 47 41 82 87 99 22 48 90 20 05 96 75 95 04 43 28 81 39 81 01 28 42 78 25 39 77 90 57 58 98 17 36 73 22 63 74 51 +29 39 74 94 95 78 64 24 38 86 63 87 93 06 70 92 22 16 80 64 29 52 20 27 23 50 14 13 87 15 72 96 81 22 08 49 72 30 70 24 79 31 16 64 59 21 89 34 96 91 48 76 43 53 88 01 57 80 23 81 90 79 58 01 80 87 17 99 86 90 72 63 32 69 14 28 88 69 +37 17 71 95 56 93 71 35 43 45 04 98 92 94 84 96 11 30 31 27 31 60 92 03 48 05 98 91 86 94 35 90 90 08 48 19 33 28 68 37 59 26 65 96 50 68 22 07 09 49 34 31 77 49 43 06 75 17 81 87 61 79 52 26 27 72 29 50 07 98 86 01 17 10 46 64 24 18 56 +51 30 25 94 88 85 79 91 40 33 63 84 49 67 98 92 15 26 75 19 82 05 18 78 65 93 61 48 91 43 59 41 70 51 22 15 92 81 67 91 46 98 11 11 65 31 66 10 98 65 83 21 05 56 05 98 73 67 46 74 69 34 08 30 05 52 07 98 32 95 30 94 65 50 24 63 28 81 99 57 +19 23 61 36 09 89 71 98 65 17 30 29 89 26 79 74 94 11 44 48 97 54 81 55 39 66 69 45 28 47 13 86 15 76 74 70 84 32 36 33 79 20 78 14 41 47 89 28 81 05 99 66 81 86 38 26 06 25 13 60 54 55 23 53 27 05 89 25 23 11 13 54 59 54 56 34 16 24 53 44 06 +13 40 57 72 21 15 60 08 04 19 11 98 34 45 09 97 86 71 03 15 56 19 15 44 97 31 90 04 87 87 76 08 12 30 24 62 84 28 12 85 82 53 99 52 13 94 06 65 97 86 09 50 94 68 69 74 30 67 87 94 63 07 78 27 80 36 69 41 06 92 32 78 37 82 30 05 18 87 99 72 19 99 +44 20 55 77 69 91 27 31 28 81 80 27 02 07 97 23 95 98 12 25 75 29 47 71 07 47 78 39 41 59 27 76 13 15 66 61 68 35 69 86 16 53 67 63 99 85 41 56 08 28 33 40 94 76 90 85 31 70 24 65 84 65 99 82 19 25 54 37 21 46 33 02 52 99 51 33 26 04 87 02 08 18 96 +54 42 61 45 91 06 64 79 80 82 32 16 83 63 42 49 19 78 65 97 40 42 14 61 49 34 04 18 25 98 59 30 82 72 26 88 54 36 21 75 03 88 99 53 46 51 55 78 22 94 34 40 68 87 84 25 30 76 25 08 92 84 42 61 40 38 09 99 40 23 29 39 46 55 10 90 35 84 56 70 63 23 91 39 +52 92 03 71 89 07 09 37 68 66 58 20 44 92 51 56 13 71 79 99 26 37 02 06 16 67 36 52 58 16 79 73 56 60 59 27 44 77 94 82 20 50 98 33 09 87 94 37 40 83 64 83 58 85 17 76 53 02 83 52 22 27 39 20 48 92 45 21 09 42 24 23 12 37 52 28 50 78 79 20 86 62 73 20 59 +54 96 80 15 91 90 99 70 10 09 58 90 93 50 81 99 54 38 36 10 30 11 35 84 16 45 82 18 11 97 36 43 96 79 97 65 40 48 23 19 17 31 64 52 65 65 37 32 65 76 99 79 34 65 79 27 55 33 03 01 33 27 61 28 66 08 04 70 49 46 48 83 01 45 19 96 13 81 14 21 31 79 93 85 50 05 +92 92 48 84 59 98 31 53 23 27 15 22 79 95 24 76 05 79 16 93 97 89 38 89 42 83 02 88 94 95 82 21 01 97 48 39 31 78 09 65 50 56 97 61 01 07 65 27 21 23 14 15 80 97 44 78 49 35 33 45 81 74 34 05 31 57 09 38 94 07 69 54 69 32 65 68 46 68 78 90 24 28 49 51 45 86 35 +41 63 89 76 87 31 86 09 46 14 87 82 22 29 47 16 13 10 70 72 82 95 48 64 58 43 13 75 42 69 21 12 67 13 64 85 58 23 98 09 37 76 05 22 31 12 66 50 29 99 86 72 45 25 10 28 19 06 90 43 29 31 67 79 46 25 74 14 97 35 76 37 65 46 23 82 06 22 30 76 93 66 94 17 96 13 20 72 +63 40 78 08 52 09 90 41 70 28 36 14 46 44 85 96 24 52 58 15 87 37 05 98 99 39 13 61 76 38 44 99 83 74 90 22 53 80 56 98 30 51 63 39 44 30 91 91 04 22 27 73 17 35 53 18 35 45 54 56 27 78 48 13 69 36 44 38 71 25 30 56 15 22 73 43 32 69 59 25 93 83 45 11 34 94 44 39 92 +12 36 56 88 13 96 16 12 55 54 11 47 19 78 17 17 68 81 77 51 42 55 99 85 66 27 81 79 93 42 65 61 69 74 14 01 18 56 12 01 58 37 91 22 42 66 83 25 19 04 96 41 25 45 18 69 96 88 36 93 10 12 98 32 44 83 83 04 72 91 04 27 73 07 34 37 71 60 59 31 01 54 54 44 96 93 83 36 04 45 +30 18 22 20 42 96 65 79 17 41 55 69 94 81 29 80 91 31 85 25 47 26 43 49 02 99 34 67 99 76 16 14 15 93 08 32 99 44 61 77 67 50 43 55 87 55 53 72 17 46 62 25 50 99 73 05 93 48 17 31 70 80 59 09 44 59 45 13 74 66 58 94 87 73 16 14 85 38 74 99 64 23 79 28 71 42 20 37 82 31 23 +51 96 39 65 46 71 56 13 29 68 53 86 45 33 51 49 12 91 21 21 76 85 02 17 98 15 46 12 60 21 88 30 92 83 44 59 42 50 27 88 46 86 94 73 45 54 23 24 14 10 94 21 20 34 23 51 04 83 99 75 90 63 60 16 22 33 83 70 11 32 10 50 29 30 83 46 11 05 31 17 86 42 49 01 44 63 28 60 07 78 95 40 +44 61 89 59 04 49 51 27 69 71 46 76 44 04 09 34 56 39 15 06 94 91 75 90 65 27 56 23 74 06 23 33 36 69 14 39 05 34 35 57 33 22 76 46 56 10 61 65 98 09 16 69 04 62 65 18 99 76 49 18 72 66 73 83 82 40 76 31 89 91 27 88 17 35 41 35 32 51 32 67 52 68 74 85 80 57 07 11 62 66 47 22 67 +65 37 19 97 26 17 16 24 24 17 50 37 64 82 24 36 32 11 68 34 69 31 32 89 79 93 96 68 49 90 14 23 04 04 67 99 81 74 70 74 36 96 68 09 64 39 88 35 54 89 96 58 66 27 88 97 32 14 06 35 78 20 71 06 85 66 57 02 58 91 72 05 29 56 73 48 86 52 09 93 22 57 79 42 12 01 31 68 17 59 63 76 07 77 +73 81 14 13 17 20 11 09 01 83 08 85 91 70 84 63 62 77 37 07 47 01 59 95 39 69 39 21 99 09 87 02 97 16 92 36 74 71 90 66 33 73 73 75 52 91 11 12 26 53 05 26 26 48 61 50 90 65 01 87 42 47 74 35 22 73 24 26 56 70 52 05 48 41 31 18 83 27 21 39 80 85 26 08 44 02 71 07 63 22 05 52 19 08 20 +17 25 21 11 72 93 33 49 64 23 53 82 03 13 91 65 85 02 40 05 42 31 77 42 05 36 06 54 04 58 07 76 87 83 25 57 66 12 74 33 85 37 74 32 20 69 03 97 91 68 82 44 19 14 89 28 85 85 80 53 34 87 58 98 88 78 48 65 98 40 11 57 10 67 70 81 60 79 74 72 97 59 79 47 30 20 54 80 89 91 14 05 33 36 79 39 +60 85 59 39 60 07 57 76 77 92 06 35 15 72 23 41 45 52 95 18 64 79 86 53 56 31 69 11 91 31 84 50 44 82 22 81 41 40 30 42 30 91 48 94 74 76 64 58 74 25 96 57 14 19 03 99 28 83 15 75 99 01 89 85 79 50 03 95 32 67 44 08 07 41 62 64 29 20 14 76 26 55 48 71 69 66 19 72 44 25 14 01 48 74 12 98 07 +64 66 84 24 18 16 27 48 20 14 47 69 30 86 48 40 23 16 61 21 51 50 26 47 35 33 91 28 78 64 43 68 04 79 51 08 19 60 52 95 06 68 46 86 35 97 27 58 04 65 30 58 99 12 12 75 91 39 50 31 42 64 70 04 46 07 98 73 98 93 37 89 77 91 64 71 64 65 66 21 78 62 81 74 42 20 83 70 73 95 78 45 92 27 34 53 71 15 +30 11 85 31 34 71 13 48 05 14 44 03 19 67 23 73 19 57 06 90 94 72 57 69 81 62 59 68 88 57 55 69 49 13 07 87 97 80 89 05 71 05 05 26 38 40 16 62 45 99 18 38 98 24 21 26 62 74 69 04 85 57 77 35 58 67 91 79 79 57 86 28 66 34 72 51 76 78 36 95 63 90 08 78 47 63 45 31 22 70 52 48 79 94 15 77 61 67 68 +23 33 44 81 80 92 93 75 94 88 23 61 39 76 22 03 28 94 32 06 49 65 41 34 18 23 08 47 62 60 03 63 33 13 80 52 31 54 73 43 70 26 16 69 57 87 83 31 03 93 70 81 47 95 77 44 29 68 39 51 56 59 63 07 25 70 07 77 43 53 64 03 94 42 95 39 18 01 66 21 16 97 20 50 90 16 70 10 95 69 29 06 25 61 41 26 15 59 63 35 diff --git a/068.py b/068.py new file mode 100644 index 0000000..2357156 --- /dev/null +++ b/068.py @@ -0,0 +1,5 @@ +# 16-digit string -> 10 on the outside (used once) + +# solved on paper by "trial-and-error": +print "6531031914842725" + diff --git a/069.py b/069.py new file mode 100644 index 0000000..99236c5 --- /dev/null +++ b/069.py @@ -0,0 +1,28 @@ +from common import sieve + +primes = sieve(1000000).primes() +prime_list = [ p for p in primes if p < 1000 ] +prime_list.sort() + +def phi(x): + if x in primes: + return x-1 + product = x + for p in prime_list: + if p*p > x: + break + if x % p != 0: + continue + product *= (1 - 1/float(p)) + return product + +maxn = 0 +maxres = 0 + +for n in xrange(2, 1000001): + if n/phi(n) >= maxres: + maxres = n/phi(n) + maxn = n + +print maxn + diff --git a/069_2.py b/069_2.py new file mode 100644 index 0000000..c00483b --- /dev/null +++ b/069_2.py @@ -0,0 +1,22 @@ +# +# n/phi(n) is a maximum, if phi(n) is minimal +# +# phi(n) = n*(1-1/p1)*(1-1/p2)*...*(1-1/pi) +# n/phi(n) = 1/((1-1/p1)*(1-1/p2)*...*(1-1/pi)) +# -> smallest primes +# + +from common import sieve + +primes = sieve(100).primes() +prime_list = [ x for x in primes ] +prime_list.sort() + +x = 1 +for p in prime_list: + if x*p > 1000000: + break + x *= p + +print x + diff --git a/071.py b/071.py new file mode 100644 index 0000000..44c38b0 --- /dev/null +++ b/071.py @@ -0,0 +1,15 @@ + +from common import ggt +import math + +limit = 1000000 + +(n1, d1) = (1, limit) + +for d2 in xrange(limit+1): + n2 = int(math.floor(float(d2) * 3.0/7.0)) + if n2*d1 > n1*d2 and ggt(n2, d2) == 1 and d2 != 7: + (n1, d1) = (n2, d2) + +print n1 + diff --git a/072.c b/072.c new file mode 100644 index 0000000..c886291 --- /dev/null +++ b/072.c @@ -0,0 +1,16 @@ +#include "common.h" + +const int limit = 1000000; + +int main() +{ + unsigned long* prime_list = primes(limit); + unsigned long sum = 0; + int n; + + for(n=2; n 0: + x += fac[n % 10] + n /= 10 + return x + +def count(n): + if numbers[n] != 0: + return + chain = [n] + x = next(n) + while x not in chain: + chain.append(x) + if numbers[x] != 0: + break + x = next(x) + last = numbers[chain[-1]] + l = len(chain) + for j in xrange(0, l-1): + c = chain[j] + numbers[c] = l - j - 1 + last + +c = 0 +for i in xrange(10, 1000000): + count(i) + if numbers[i] == 60: + c += 1 + +print c + diff --git a/075.py b/075.py new file mode 100644 index 0000000..58e9136 --- /dev/null +++ b/075.py @@ -0,0 +1,29 @@ +# generating Pythagorean triplets + +limit = 1500000 +limit_search = 900 +squares = [ x*x for x in xrange(limit) ] +triangles = [ set() for x in xrange(limit+1) ] + + +for m in xrange(1, limit_search): + for n in xrange(1, m): + (a,b,c) = (squares[m] - squares[n], 2*m*n, squares[m] + squares[n]) + if a > b: + (a,b,c) = (b,a,c) + + k = 1 + while True: + if k*(a+b+c) > limit: + break + triangles[k*a + k*b + k*c].add((k*a,k*b,k*c)) + k += 1 + + +count = 0 +for t in triangles: + if len(t) == 1: + count += 1 + +print count + diff --git a/080.py b/080.py new file mode 100644 index 0000000..9becd19 --- /dev/null +++ b/080.py @@ -0,0 +1,55 @@ + +# schriftliches wurzelziehen: http://www.diaware.de/html/wurzel.html + +def sqrt(x, accuracy): + a = [] # vor komma + b = [] # nach komma + + groups = [] + while x > 0: + groups.append(x % 100) + x /= 100 + groups = groups[::-1] + + result = 0 + remainder = 0 + while accuracy > 0: + group = 100 * remainder + if len(groups) > 0: + group += groups[0] + + subcount = 0 + sub = 20*result + 1 + while sub < group: + group -= sub + if group < 0: + break + subcount += 1 + sub += 2 + remainder = group + if subcount == 0: + remainder *= 100 + result *= 10 + result += subcount + + if len(groups) > 0: + a.append(subcount) + del groups[0] + else: + b.append(subcount) + accuracy -= 1 + + return (a, b) + +squares = set([ x*x for x in range(11) ]) + +digitsum = 0 + +for n in xrange(100): + if n in squares: + continue + s = sqrt(n, 100) + digitsum += sum(s[0]) + sum(s[1]) + +print digitsum + diff --git a/081.py b/081.py new file mode 100644 index 0000000..c951abf --- /dev/null +++ b/081.py @@ -0,0 +1,71 @@ + +# uses Dijkstra's algorithm to find minimal path + +infinity = 999999 + +matrix = [] + +width = 80 +height = 80 + +f = open('081.txt', 'r') +for line in f: + line.rstrip('\n') + line_str = line.split(',') + line_int = [ int(x) for x in line_str ] + matrix.append(line_int) +f.close() + + +# initialize +distance = [infinity] * (width*height) +pre = [None] * (width*height) +distance[0] = 0 +Q = range(width*height) + +def mindistance(Q): + mind = infinity + mini = -1 + for i in Q: + if distance[i] < mind: + mind = distance[i] + mini = i + return mini + +def neighbors(u): + n = [] + row = u / width + col = u % width + if col < width-1: + n.append(row*width + col + 1) # right neighbor + if row < height-1: + n.append((row+1)*width + col) # lower neighbor + return n + +def update(u, v): + alt = distance[u] + matrix[v/width][v%width] + if alt < distance[v]: + distance[v] = alt + pre[v] = u + +# main algorithm +while len(Q) > 0: + u = mindistance(Q) + Q.remove(u) + for v in neighbors(u): + if v in Q: + update(u, v) + +# search min distance +u = width*height-1 # target node +path = [ u ] +while pre[u] != None: + u = pre[u] + path = [u] + path + +minsum = 0 +for n in path: + minsum += matrix[n/width][n%width] + +print minsum + diff --git a/081.txt b/081.txt new file mode 100644 index 0000000..1e9e6cd --- /dev/null +++ b/081.txt @@ -0,0 +1,80 @@ +4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 +1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 +9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 +7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 +3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 +1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 +4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 +510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 +9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 +3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 +6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 +7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 +4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 +356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 +9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 +192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 +1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 +4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 +5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 +1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 +1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 +8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 +7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 +3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 +9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 +5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 +6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 +9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 +5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 +6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 +5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 +1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 +4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 +4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 +8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 +2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 +6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 +2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 +6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 +3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 +5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 +3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 +1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 +8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 +3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 +8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 +8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 +9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 +3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 +1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 +7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 +9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 +7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 +3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 +1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 +126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 +8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 +7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 +4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 +4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 +7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 +7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 +6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 +4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 +9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 +3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 +2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 +3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 +4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 +171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 +3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 +2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 +7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 +8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 +2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 +6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 +8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 +2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 +2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 +5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/082.py b/082.py new file mode 100644 index 0000000..b0fd92a --- /dev/null +++ b/082.py @@ -0,0 +1,85 @@ + +# uses Dijkstra's algorithm to find minimal path +# (based on solution for problem 81) +# +# slow, but working + +infinity = 99999999 + +matrix = [] + +width = 80 +height = 80 + +f = open('082.txt', 'r') +for line in f: + line.rstrip('\n') + line_str = line.split(',') + line_int = [ int(x) for x in line_str ] + matrix.append(line_int) +f.close() + +globalmin = 500000 + +for currentrow in range(height): + + # initialize + distance = [infinity] * (width*height) + pre = [None] * (width*height) + distance[currentrow*width] = 0 # start node + Q = range(width*height) + + def mindistance(Q): + mini = Q[0] + mind = distance[mini] + for i in Q: + if distance[i] < mind: + mind = distance[i] + mini = i + return mini + + def neighbors(u): + n = [] + row = u / width + col = u % width + if col == 0: + return[u+1] + if col < width-1: + n.append(row*width + col + 1) # right neighbor + if row < height-1: + n.append((row+1)*width + col) # lower neighbor + if row > 0: + n.append((row-1)*width + col) # upper neighbor + return n + + def update(u, v): + alt = distance[u] + matrix[v/width][v%width] + if alt < distance[v]: + distance[v] = alt + pre[v] = u + + # main algorithm + while len(Q) > 0: + u = mindistance(Q) + Q.remove(u) + for v in neighbors(u): + if v in Q: + update(u, v) + + # search min distance + for targetrow in range(height): + u = targetrow*width-1 # target node + path = [ u ] + while pre[u] != None: + u = pre[u] + path = [u] + path + + minsum = 0 + for n in path: + minsum += matrix[n/width][n%width] + + if minsum < globalmin: + globalmin = minsum + +print globalmin + diff --git a/082.txt b/082.txt new file mode 100644 index 0000000..1e9e6cd --- /dev/null +++ b/082.txt @@ -0,0 +1,80 @@ +4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 +1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 +9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 +7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 +3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 +1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 +4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 +510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 +9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 +3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 +6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 +7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 +4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 +356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 +9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 +192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 +1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 +4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 +5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 +1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 +1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 +8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 +7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 +3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 +9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 +5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 +6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 +9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 +5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 +6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 +5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 +1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 +4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 +4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 +8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 +2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 +6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 +2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 +6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 +3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 +5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 +3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 +1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 +8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 +3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 +8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 +8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 +9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 +3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 +1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 +7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 +9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 +7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 +3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 +1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 +126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 +8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 +7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 +4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 +4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 +7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 +7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 +6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 +4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 +9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 +3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 +2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 +3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 +4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 +171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 +3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 +2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 +7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 +8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 +2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 +6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 +8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 +2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 +2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 +5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/083.py b/083.py new file mode 100644 index 0000000..f1620e5 --- /dev/null +++ b/083.py @@ -0,0 +1,76 @@ + +# uses Dijkstra's algorithm to find minimal path +# (based on solution for problem 81) + +infinity = 999999 + +matrix = [] + +width = 80 +height = 80 + +f = open('083.txt', 'r') +for line in f: + line.rstrip('\n') + line_str = line.split(',') + line_int = [ int(x) for x in line_str ] + matrix.append(line_int) +f.close() + + +# initialize +distance = [infinity] * (width*height) +pre = [None] * (width*height) +distance[0] = 0 +Q = range(width*height) + +def mindistance(Q): + mind = infinity + mini = -1 + for i in Q: + if distance[i] < mind: + mind = distance[i] + mini = i + return mini + +def neighbors(u): + n = [] + row = u / width + col = u % width + if col < width-1: + n.append(row*width + col + 1) # right neighbor + if row < height-1: + n.append((row+1)*width + col) # lower neighbor + if row > 0: + n.append((row-1)*width + col) # upper neighbor + if col > 0: + n.append(row*width + col - 1) # left neighbor + return n + +def update(u, v): + alt = distance[u] + matrix[v/width][v%width] + if alt < distance[v]: + distance[v] = alt + pre[v] = u + +# main algorithm +while len(Q) > 0: + u = mindistance(Q) + Q.remove(u) + for v in neighbors(u): + if v in Q: + update(u, v) + +# search min distance +u = width*height-1 # target node +path = [ u ] +while pre[u] != None: + u = pre[u] + path = [u] + path + +minsum = 0 +for n in path: + minsum += matrix[n/width][n%width] + +print minsum + diff --git a/083.txt b/083.txt new file mode 100644 index 0000000..1e9e6cd --- /dev/null +++ b/083.txt @@ -0,0 +1,80 @@ +4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 +1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 +9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 +7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 +3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 +1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 +4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 +510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 +9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 +3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 +6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 +7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 +4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 +356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 +9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 +192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 +1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 +4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 +5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 +1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 +1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 +8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 +7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 +3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 +9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 +5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 +6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 +9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 +5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 +6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 +5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 +1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 +4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 +4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 +8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 +2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 +6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 +2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 +6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 +3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 +5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 +3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 +1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 +8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 +3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 +8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 +8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 +9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 +3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 +1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 +7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 +9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 +7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 +3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 +1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 +126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 +8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 +7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 +4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 +4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 +7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 +7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 +6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 +4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 +9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 +3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 +2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 +3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 +4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 +171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 +3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 +2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 +7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 +8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 +2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 +6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 +8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 +2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 +2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 +5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/087.c b/087.c new file mode 100644 index 0000000..e1b1ad8 --- /dev/null +++ b/087.c @@ -0,0 +1,42 @@ +#include "common.h" +#include +#include + +const unsigned long limit = 50000000; + +int main(void) +{ + unsigned long* p = primes(8000); + unsigned long count = p[0]; + unsigned long i2, i3, i4, counter; + char* numbers = malloc(limit*sizeof(char)); + memset(numbers, 0, limit); + + for(i2=1; i2<=count; i2++) + for(i3=1; i3<=count; i3++) + for(i4=1; i4<=count; i4++) + { + unsigned long p4 = p[i4]; + unsigned long p3 = p[i3]; + unsigned long p2 = p[i2]; + unsigned long long result = (unsigned long long)p4*p4*p4*p4; + if(result >= limit) break; + result += (unsigned long long)p3*p3*p3; + if(result >= limit) break; + result += (unsigned long long)p2*p2; + if(result >= limit) break; + + numbers[result] = 1; + } + + counter = 0; + for(i2=0; i2 0: + if n - 1000 >= 0: + n -= 1000 + result += "M" + elif n - 900 >= 0: + n -= 900 + result += "CM" + elif n - 500 >= 0: + n -= 500 + result += "D" + elif n - 400 >= 0: + n -= 400 + result += "CD" + elif n - 100 >= 0: + n -= 100 + result += "C" + elif n - 90 >= 0: + n -= 90 + result += "XC" + elif n - 50 >= 0: + n -= 50 + result += "L" + elif n - 40 >= 0: + n -= 40 + result += "XL" + elif n - 10 >= 0: + n -= 10 + result += "X" + elif n - 9 >= 0: + n -= 9 + result += "IX" + elif n - 5 >= 0: + n -= 5 + result += "V" + elif n - 4 >= 0: + n -= 4 + result += "IV" + elif n - 1 >= 0: + n -= 1 + result += "I" + return result + + +numbers = [] + +f = open('089.txt', 'r') +for line in f: + line = line.rstrip('\r\n') + numbers.append(line) +f.close() + +saved = 0 + +for number in numbers: + n = decode_roman(number) + m = minimal_roman(n) + saved += len(number) - len(m) + +print saved + diff --git a/089.txt b/089.txt new file mode 100644 index 0000000..721ab99 --- /dev/null +++ b/089.txt @@ -0,0 +1,1000 @@ +MMMMDCLXXII +MMDCCCLXXXIII +MMMDLXVIIII +MMMMDXCV +DCCCLXXII +MMCCCVI +MMMCDLXXXVII +MMMMCCXXI +MMMCCXX +MMMMDCCCLXXIII +MMMCCXXXVII +MMCCCLXXXXIX +MDCCCXXIIII +MMCXCVI +CCXCVIII +MMMCCCXXXII +MDCCXXX +MMMDCCCL +MMMMCCLXXXVI +MMDCCCXCVI +MMMDCII +MMMCCXII +MMMMDCCCCI +MMDCCCXCII +MDCXX +CMLXXXVII +MMMXXI +MMMMCCCXIV +MLXXII +MCCLXXVIIII +MMMMCCXXXXI +MMDCCCLXXII +MMMMXXXI +MMMDCCLXXX +MMDCCCLXXIX +MMMMLXXXV +MCXXI +MDCCCXXXVII +MMCCCLXVII +MCDXXXV +CCXXXIII +CMXX +MMMCLXIV +MCCCLXXXVI +DCCCXCVIII +MMMDCCCCXXXIV +CDXVIIII +MMCCXXXV +MDCCCXXXII +MMMMD +MMDCCLXIX +MMMMCCCLXXXXVI +MMDCCXLII +MMMDCCCVIIII +DCCLXXXIIII +MDCCCCXXXII +MMCXXVII +DCCCXXX +CCLXIX +MMMXI +MMMMCMLXXXXVIII +MMMMDLXXXVII +MMMMDCCCLX +MMCCLIV +CMIX +MMDCCCLXXXIIII +CLXXXII +MMCCCCXXXXV +MMMMDLXXXVIIII +MMMDCCCXXI +MMDCCCCLXXVI +MCCCCLXX +MMCDLVIIII +MMMDCCCLIX +MMMMCCCCXIX +MMMDCCCLXXV +XXXI +CDLXXXIII +MMMCXV +MMDCCLXIII +MMDXXX +MMMMCCCLVII +MMMDCI +MMMMCDLXXXIIII +MMMMCCCXVI +CCCLXXXVIII +MMMMCML +MMMMXXIV +MMMCCCCXXX +DCCX +MMMCCLX +MMDXXXIII +CCCLXIII +MMDCCXIII +MMMCCCXLIV +CLXXXXI +CXVI +MMMMCXXXIII +CLXX +DCCCXVIII +MLXVII +DLXXXX +MMDXXI +MMMMDLXXXXVIII +MXXII +LXI +DCCCCXLIII +MMMMDV +MMMMXXXIV +MDCCCLVIII +MMMCCLXXII +MMMMDCCXXXVI +MMMMLXXXIX +MDCCCLXXXI +MMMMDCCCXV +MMMMCCCCXI +MMMMCCCLIII +MDCCCLXXI +MMCCCCXI +MLXV +MMCDLXII +MMMMDXXXXII +MMMMDCCCXL +MMMMCMLVI +CCLXXXIV +MMMDCCLXXXVI +MMCLII +MMMCCCCXV +MMLXXXIII +MMMV +MMMV +DCCLXII +MMDCCCCXVI +MMDCXLVIII +CCLIIII +CCCXXV +MMDCCLXXXVIIII +MMMMDCLXXVIII +MMMMDCCCXCI +MMMMCCCXX +MMCCXLV +MMMDCCCLXIX +MMCCLXIIII +MMMDCCCXLIX +MMMMCCCLXIX +CMLXXXXI +MCMLXXXIX +MMCDLXI +MMDCLXXVIII +MMMMDCCLXI +MCDXXV +DL +CCCLXXII +MXVIIII +MCCCCLXVIII +CIII +MMMDCCLXXIIII +MMMDVIII +MMMMCCCLXXXXVII +MMDXXVII +MMDCCLXXXXV +MMMMCXLVI +MMMDCCLXXXII +MMMDXXXVI +MCXXII +CLI +DCLXXXIX +MMMCLI +MDCLXIII +MMMMDCCXCVII +MMCCCLXXXV +MMMDCXXVIII +MMMCDLX +MMMCMLII +MMMIV +MMMMDCCCLVIII +MMMDLXXXVIII +MCXXIV +MMMMLXXVI +CLXXIX +MMMCCCCXXVIIII +DCCLXXXV +MMMDCCCVI +LI +CLXXXVI +MMMMCCCLXXVI +MCCCLXVI +CCXXXIX +MMDXXXXI +MMDCCCXLI +DCCCLXXXVIII +MMMMDCCCIV +MDCCCCXV +MMCMVI +MMMMCMLXXXXV +MMDCCLVI +MMMMCCXLVIII +DCCCCIIII +MMCCCCIII +MMMDCCLXXXVIIII +MDCCCLXXXXV +DVII +MMMV +DCXXV +MMDCCCXCV +DCVIII +MMCDLXVI +MCXXVIII +MDCCXCVIII +MMDCLX +MMMDCCLXIV +MMCDLXXVII +MMDLXXXIIII +MMMMCCCXXII +MMMDCCCXLIIII +DCCCCLXVII +MMMCLXXXXIII +MCCXV +MMMMDCXI +MMMMDCLXXXXV +MMMCCCLII +MMCMIX +MMDCCXXV +MMDLXXXVI +MMMMDCXXVIIII +DCCCCXXXVIIII +MMCCXXXIIII +MMDCCLXXVIII +MDCCLXVIIII +MMCCLXXXV +MMMMDCCCLXXXVIII +MMCMXCI +MDXLII +MMMMDCCXIV +MMMMLI +DXXXXIII +MMDCCXI +MMMMCCLXXXIII +MMMDCCCLXXIII +MDCLVII +MMCD +MCCCXXVII +MMMMDCCIIII +MMMDCCXLVI +MMMCLXXXVII +MMMCCVIIII +MCCCCLXXIX +DL +DCCCLXXVI +MMDXCI +MMMMDCCCCXXXVI +MMCII +MMMDCCCXXXXV +MMMCDXLV +MMDCXXXXIV +MMD +MDCCCLXXXX +MMDCXLIII +MMCCXXXII +MMDCXXXXVIIII +DCCCLXXI +MDXCVIIII +MMMMCCLXXVIII +MDCLVIIII +MMMCCCLXXXIX +MDCLXXXV +MDLVIII +MMMMCCVII +MMMMDCXIV +MMMCCCLXIIII +MMIIII +MMMMCCCLXXIII +CCIII +MMMCCLV +MMMDXIII +MMMCCCXC +MMMDCCCXXI +MMMMCCCCXXXII +CCCLVI +MMMCCCLXXXVI +MXVIIII +MMMCCCCXIIII +CLXVII +MMMCCLXX +CCCCLXIV +MMXXXXII +MMMMCCLXXXX +MXL +CCXVI +CCCCLVIIII +MMCCCII +MCCCLVIII +MMMMCCCX +MCDLXXXXIV +MDCCCXIII +MMDCCCXL +MMMMCCCXXIII +DXXXIV +CVI +MMMMDCLXXX +DCCCVII +MMCMLXIIII +MMMDCCCXXXIII +DCCC +MDIII +MMCCCLXVI +MMMCCCCLXXI +MMDCCCCXVIII +CCXXXVII +CCCXXV +MDCCCXII +MMMCMV +MMMMCMXV +MMMMDCXCI +DXXI +MMCCXLVIIII +MMMMCMLII +MDLXXX +MMDCLXVI +CXXI +MMMDCCCLIIII +MMMCXXI +MCCIII +MMDCXXXXI +CCXCII +MMMMDXXXV +MMMCCCLXV +MMMMDLXV +MMMCCCCXXXII +MMMCCCVIII +DCCCCLXXXXII +MMCLXIV +MMMMCXI +MLXXXXVII +MMMCDXXXVIII +MDXXII +MLV +MMMMDLXVI +MMMCXII +XXXIII +MMMMDCCCXXVI +MMMLXVIIII +MMMLX +MMMCDLXVII +MDCCCLVII +MMCXXXVII +MDCCCCXXX +MMDCCCLXIII +MMMMDCXLIX +MMMMCMXLVIII +DCCCLXXVIIII +MDCCCLIII +MMMCMLXI +MMMMCCLXI +MMDCCCLIII +MMMDCCCVI +MMDXXXXIX +MMCLXXXXV +MMDXXX +MMMXIII +DCLXXIX +DCCLXII +MMMMDCCLXVIII +MDCCXXXXIII +CCXXXII +MMMMDCXXV +MMMCCCXXVIII +MDCVIII +MMMCLXXXXIIII +CLXXXI +MDCCCCXXXIII +MMMMDCXXX +MMMDCXXIV +MMMCCXXXVII +MCCCXXXXIIII +CXVIII +MMDCCCCIV +MMMMCDLXXV +MMMDLXIV +MDXCIII +MCCLXXXI +MMMDCCCXXIV +MCXLIII +MMMDCCCI +MCCLXXX +CCXV +MMDCCLXXI +MMDLXXXIII +MMMMDCXVII +MMMCMLXV +MCLXVIII +MMMMCCLXXVI +MMMDCCLXVIIII +MMMMDCCCIX +DLXXXXIX +DCCCXXII +MMMMIII +MMMMCCCLXXVI +DCCCXCIII +DXXXI +MXXXIIII +CCXII +MMMDCCLXXXIIII +MMMCXX +MMMCMXXVII +DCCCXXXX +MMCDXXXVIIII +MMMMDCCXVIII +LV +MMMDCCCCVI +MCCCII +MMCMLXVIIII +MDCCXI +MMMMDLXVII +MMCCCCLXI +MMDCCV +MMMCCCXXXIIII +MMMMDI +MMMDCCCXCV +MMDCCLXXXXI +MMMDXXVI +MMMDCCCLVI +MMDCXXX +MCCCVII +MMMMCCCLXII +MMMMXXV +MMCMXXV +MMLVI +MMDXXX +MMMMCVII +MDC +MCCIII +MMMMDCC +MMCCLXXV +MMDCCCXXXXVI +MMMMCCCLXV +CDXIIII +MLXIIII +CCV +MMMCMXXXI +CCCCLXVI +MDXXXII +MMMMCCCLVIII +MMV +MMMCLII +MCMLI +MMDCCXX +MMMMCCCCXXXVI +MCCLXXXI +MMMCMVI +DCCXXX +MMMMCCCLXV +DCCCXI +MMMMDCCCXIV +CCCXXI +MMDLXXV +CCCCLXXXX +MCCCLXXXXII +MMDCIX +DCCXLIIII +DXIV +MMMMCLII +CDLXI +MMMCXXVII +MMMMDCCCCLXIII +MMMDCLIIII +MCCCCXXXXII +MMCCCLX +CCCCLIII +MDCCLXXVI +MCMXXIII +MMMMDLXXVIII +MMDCCCCLX +MMMCCCLXXXX +MMMCDXXVI +MMMDLVIII +CCCLXI +MMMMDCXXII +MMDCCCXXI +MMDCCXIII +MMMMCLXXXVI +MDCCCCXXVI +MDV +MMDCCCCLXXVI +MMMMCCXXXVII +MMMDCCLXXVIIII +MMMCCCCLXVII +DCCXLI +MMCLXXXVIII +MCCXXXVI +MMDCXLVIII +MMMMCXXXII +MMMMDCCLXVI +MMMMCMLI +MMMMCLXV +MMMMDCCCXCIV +MCCLXXVII +LXXVIIII +DCCLII +MMMCCCXCVI +MMMCLV +MMDCCCXXXXVIII +DCCCXV +MXC +MMDCCLXXXXVII +MMMMCML +MMDCCCLXXVIII +DXXI +MCCCXLI +DCLXXXXI +MMCCCLXXXXVIII +MDCCCCLXXVIII +MMMMDXXV +MMMDCXXXVI +MMMCMXCVII +MMXVIIII +MMMDCCLXXIV +MMMCXXV +DXXXVIII +MMMMCLXVI +MDXII +MMCCCLXX +CCLXXI +DXIV +MMMCLIII +DLII +MMMCCCXLIX +MMCCCCXXVI +MMDCXLIII +MXXXXII +CCCLXXXV +MDCLXXVI +MDCXII +MMMCCCLXXXIII +MMDCCCCLXXXII +MMMMCCCLXXXV +MMDCXXI +DCCCXXX +MMMDCCCCLII +MMMDCCXXII +MMMMCDXCVIII +MMMCCLXVIIII +MMXXV +MMMMCDXIX +MMMMCCCX +MMMCCCCLXVI +MMMMDCLXXVIIII +MMMMDCXXXXIV +MMMCMXII +MMMMXXXIII +MMMMDLXXXII +DCCCLIV +MDXVIIII +MMMCLXXXXV +CCCCXX +MMDIX +MMCMLXXXVIII +DCCXLIII +DCCLX +D +MCCCVII +MMMMCCCLXXXIII +MDCCCLXXIIII +MMMDCCCCLXXXVII +MMMMCCCVII +MMMDCCLXXXXVI +CDXXXIV +MCCLXVIII +MMMMDLX +MMMMDXII +MMMMCCCCLIIII +MCMLXXXXIII +MMMMDCCCIII +MMDCLXXXIII +MDCCCXXXXIV +XXXXVII +MMMDCCCXXXII +MMMDCCCXLII +MCXXXV +MDCXXVIIII +MMMCXXXXIIII +MMMMCDXVII +MMMDXXIII +MMMMCCCCLXI +DCLXXXXVIIII +LXXXXI +CXXXIII +MCDX +MCCLVII +MDCXXXXII +MMMCXXIV +MMMMLXXXX +MMDCCCCXLV +MLXXX +MMDCCCCLX +MCDLIII +MMMCCCLXVII +MMMMCCCLXXIV +MMMDCVIII +DCCCCXXIII +MMXCI +MMDCCIV +MMMMDCCCXXXIV +CCCLXXI +MCCLXXXII +MCMIII +CCXXXI +DCCXXXVIII +MMMMDCCXLVIIII +MMMMCMXXXV +DCCCLXXV +DCCXCI +MMMMDVII +MMMMDCCCLXVIIII +CCCXCV +MMMMDCCXX +MCCCCII +MMMCCCXC +MMMCCCII +MMDCCLXXVII +MMDCLIIII +CCXLIII +MMMDCXVIII +MMMCCCIX +MCXV +MMCCXXV +MLXXIIII +MDCCXXVI +MMMCCCXX +MMDLXX +MMCCCCVI +MMDCCXX +MMMMDCCCCXCV +MDCCCXXXII +MMMMDCCCCXXXX +XCIV +MMCCCCLX +MMXVII +MLXXI +MMMDXXVIII +MDCCCCII +MMMCMLVII +MMCLXXXXVIII +MDCCCCLV +MCCCCLXXIIII +MCCCLII +MCDXLVI +MMMMDXVIII +DCCLXXXIX +MMMDCCLXIV +MDCCCCXLIII +CLXXXXV +MMMMCCXXXVI +MMMDCCCXXI +MMMMCDLXXVII +MCDLIII +MMCCXLVI +DCCCLV +MCDLXX +DCLXXVIII +MMDCXXXIX +MMMMDCLX +MMDCCLI +MMCXXXV +MMMCCXII +MMMMCMLXII +MMMMCCV +MCCCCLXIX +MMMMCCIII +CLXVII +MCCCLXXXXIIII +MMMMDCVIII +MMDCCCLXI +MMLXXIX +CMLXIX +MMDCCCXLVIIII +DCLXII +MMMCCCXLVII +MDCCCXXXV +MMMMDCCXCVI +DCXXX +XXVI +MMLXIX +MMCXI +DCXXXVII +MMMMCCCXXXXVIII +MMMMDCLXI +MMMMDCLXXIIII +MMMMVIII +MMMMDCCCLXII +MDCXCI +MMCCCXXIIII +CCCCXXXXV +MMDCCCXXI +MCVI +MMDCCLXVIII +MMMMCXL +MLXVIII +CMXXVII +CCCLV +MDCCLXXXIX +MMMCCCCLXV +MMDCCLXII +MDLXVI +MMMCCCXVIII +MMMMCCLXXXI +MMCXXVII +MMDCCCLXVIII +MMMCXCII +MMMMDCLVIII +MMMMDCCCXXXXII +MMDCCCCLXXXXVI +MDCCXL +MDCCLVII +MMMMDCCCLXXXVI +DCCXXXIII +MMMMDCCCCLXXXV +MMCCXXXXVIII +MMMCCLXXVIII +MMMDCLXXVIII +DCCCI +MMMMLXXXXVIIII +MMMCCCCLXXII +MMCLXXXVII +CCLXVI +MCDXLIII +MMCXXVIII +MDXIV +CCCXCVIII +CLXXVIII +MMCXXXXVIIII +MMMDCLXXXIV +CMLVIII +MCDLIX +MMMMDCCCXXXII +MMMMDCXXXIIII +MDCXXI +MMMDCXLV +MCLXXVIII +MCDXXII +IV +MCDLXXXXIII +MMMMDCCLXV +CCLI +MMMMDCCCXXXVIII +DCLXII +MCCCLXVII +MMMMDCCCXXXVI +MMDCCXLI +MLXI +MMMCDLXVIII +MCCCCXCIII +XXXIII +MMMDCLXIII +MMMMDCL +DCCCXXXXIIII +MMDLVII +DXXXVII +MCCCCXXIIII +MCVII +MMMMDCCXL +MMMMCXXXXIIII +MCCCCXXIV +MMCLXVIII +MMXCIII +MDCCLXXX +MCCCLIIII +MMDCLXXI +MXI +MCMLIV +MMMCCIIII +DCCLXXXVIIII +MDCLIV +MMMDCXIX +CMLXXXI +DCCLXXXVII +XXV +MMMXXXVI +MDVIIII +CLXIII +MMMCDLVIIII +MMCCCCVII +MMMLXX +MXXXXII +MMMMCCCLXVIII +MMDCCCXXVIII +MMMMDCXXXXI +MMMMDCCCXXXXV +MMMXV +MMMMCCXVIIII +MMDCCXIIII +MMMXXVII +MDCCLVIIII +MMCXXIIII +MCCCLXXIV +DCLVIII +MMMLVII +MMMCXLV +MMXCVII +MMMCCCLXXXVII +MMMMCCXXII +DXII +MMMDLV +MCCCLXXVIII +MMMCLIIII +MMMMCLXXXX +MMMCLXXXIIII +MDCXXIII +MMMMCCXVI +MMMMDLXXXIII +MMMDXXXXIII +MMMMCCCCLV +MMMDLXXXI +MMMCCLXXVI +MMMMXX +MMMMDLVI +MCCCCLXXX +MMMXXII +MMXXII +MMDCCCCXXXI +MMMDXXV +MMMDCLXXXVIIII +MMMDLXXXXVII +MDLXIIII +CMXC +MMMXXXVIII +MDLXXXVIII +MCCCLXXVI +MMCDLIX +MMDCCCXVIII +MDCCCXXXXVI +MMMMCMIV +MMMMDCIIII +MMCCXXXV +XXXXVI +MMMMCCXVII +MMCCXXIV +MCMLVIIII +MLXXXIX +MMMMLXXXIX +CLXXXXIX +MMMDCCCCLVIII +MMMMCCLXXIII +MCCCC +DCCCLIX +MMMCCCLXXXII +MMMCCLXVIIII +MCLXXXV +CDLXXXVII +DCVI +MMX +MMCCXIII +MMMMDCXX +MMMMXXVIII +DCCCLXII +MMMMCCCXLIII +MMMMCLXV +DXCI +MMMMCLXXX +MMMDCCXXXXI +MMMMXXXXVI +DCLX +MMMCCCXI +MCCLXXX +MMCDLXXII +DCCLXXI +MMMCCCXXXVI +MCCCCLXXXVIIII +CDLVIII +DCCLVI +MMMMDCXXXVIII +MMCCCLXXXIII +MMMMDCCLXXV +MMMXXXVI +CCCLXXXXIX +CV +CCCCXIII +CCCCXVI +MDCCCLXXXIIII +MMDCCLXXXII +MMMMCCCCLXXXI +MXXV +MMCCCLXXVIIII +MMMCCXII +MMMMCCXXXIII +MMCCCLXXXVI +MMMDCCCLVIIII +MCCXXXVII +MDCLXXV +XXXV +MMDLI +MMMCCXXX +MMMMCXXXXV +CCCCLIX +MMMMDCCCLXXIII +MMCCCXVII +DCCCXVI +MMMCCCXXXXV +MDCCCCXCV +CLXXXI +MMMMDCCLXX +MMMDCCCIII +MMCLXXVII +MMMDCCXXIX +MMDCCCXCIIII +MMMCDXXIIII +MMMMXXVIII +MMMMDCCCCLXVIII +MDCCCXX +MMMMCDXXI +MMMMDLXXXIX +CCXVI +MDVIII +MMCCLXXI +MMMDCCCLXXI +MMMCCCLXXVI +MMCCLXI +MMMMDCCCXXXIV +DLXXXVI +MMMMDXXXII +MMMXXIIII +MMMMCDIV +MMMMCCCXLVIII +MMMMCXXXVIII +MMMCCCLXVI +MDCCXVIII +MMCXX +CCCLIX +MMMMDCCLXXII +MDCCCLXXV +MMMMDCCCXXIV +DCCCXXXXVIII +MMMDCCCCXXXVIIII +MMMMCCXXXV +MDCLXXXIII +MMCCLXXXIV +MCLXXXXIIII +DXXXXIII +MCCCXXXXVIII +MMCLXXIX +MMMMCCLXIV +MXXII +MMMCXIX +MDCXXXVII +MMDCCVI +MCLXXXXVIII +MMMCXVI +MCCCLX +MMMCDX +CCLXVIIII +MMMCCLX +MCXXVIII +LXXXII +MCCCCLXXXI +MMMI +MMMCCCLXIV +MMMCCCXXVIIII +CXXXVIII +MMCCCXX +MMMCCXXVIIII +MCCLXVI +MMMCCCCXXXXVI +MMDCCXCIX +MCMLXXI +MMCCLXVIII +CDLXXXXIII +MMMMDCCXXII +MMMMDCCLXXXVII +MMMDCCLIV +MMCCLXIII +MDXXXVII +DCCXXXIIII +MCII +MMMDCCCLXXI +MMMLXXIII +MDCCCLIII +MMXXXVIII +MDCCXVIIII +MDCCCCXXXVII +MMCCCXVI +MCMXXII +MMMCCCLVIII +MMMMDCCCXX +MCXXIII +MMMDLXI +MMMMDXXII +MDCCCX +MMDXCVIIII +MMMDCCCCVIII +MMMMDCCCCXXXXVI +MMDCCCXXXV +MMCXCIV +MCMLXXXXIII +MMMCCCLXXVI +MMMMDCLXXXV +CMLXIX +DCXCII +MMXXVIII +MMMMCCCXXX +XXXXVIIII \ No newline at end of file diff --git a/092.c b/092.c new file mode 100644 index 0000000..8616cf8 --- /dev/null +++ b/092.c @@ -0,0 +1,45 @@ + + +const int limit = 10000000; + +const int squares[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 }; + +int next_chain(int number) +{ + int sum = 0; + int digit; + while(number > 0) + { + digit = number % 10; + number = number / 10; + sum += squares[digit]; + } + return sum; +} + +int main() +{ + int* numbers = calloc(limit, sizeof(int)); + int i, count; + + for(i=0; i{$n}; + } +} + +sub numbers_in_row { + my $field = shift; + my $row = shift; + my $numbers = {}; + + for(my $i=0; $i<9; $i++) { + my $number = $field->[9*$row + $i]; + $numbers->{$number} = 1 if $number; + } + + return $numbers; +} + +sub numbers_in_col { + my $field = shift; + my $col = shift; + my $numbers = {}; + + for(my $i=0; $i<9; $i++) { + my $number = $field->[9*$i + $col]; + $numbers->{$number} = 1 if $number; + } + + return $numbers; +} + +sub numbers_in_block { + my $field = shift; + my $block = shift; + my $numbers = {}; + + my $blk_row = int($block / 3); + my $blk_col = $block % 3; + + for(my $row=0; $row<3; $row++) { + for (my $col=0; $col<3; $col++) { + my $number = $field->[9*(3*$blk_row + $row) + (3*$blk_col + $col)]; + $numbers->{$number} = 1 if $number; + } + } + + return $numbers; +} + +sub collect_numbers { + my $field = shift; + + my $row_n = []; + my $col_n = []; + my $blk_n = []; + + for(my $i=0; $i<9; $i++) { + $row_n->[$i] = numbers_in_row($field, $i); + } + for(my $i=0; $i<9; $i++) { + $col_n->[$i] = numbers_in_col($field, $i); + } + for(my $i=0; $i<9; $i++) { + $blk_n->[$i] = numbers_in_block($field, $i); + } + + return ($row_n, $col_n, $blk_n); +} + +sub print_field { + my $field = shift || return; + + for(my $i=0; $i<9; $i++) { + for(my $j=0; $j<9; $j++) { + print $field->[9*$i + $j] . " "; + } + print "\n"; + } + print "\n"; +} + +sub find_candidates { + my $field = shift; + my ($row_n, $col_n, $blk_n) = collect_numbers($field); + +restart: + my $candidates = {}; + for(my $row=0; $row<9; $row++) { + for(my $col=0; $col<9; $col++) { + next if $field->[9*$row + $col]; + + my $blk = 3*int($row / 3) + int($col / 3); + my %numbers = map { $_ => 1 } 1..9; + remove_numbers(\%numbers, $row_n->[$row]); + remove_numbers(\%numbers, $col_n->[$col]); + remove_numbers(\%numbers, $blk_n->[$blk]); + + if (scalar keys %numbers == 1) { + # there is only one possibility -> restart search with updated field + my $n = (keys %numbers)[0]; + $field->[9*$row + $col] = $n; + $row_n->[$row]->{$n} = 1; + $col_n->[$col]->{$n} = 1; + $blk_n->[$blk]->{$n} = 1; + goto restart; + } elsif (scalar keys %numbers > 1) { + $candidates->{9*$row + $col} = [ sort keys %numbers ]; + } else { + # no candidate possible on this position + return; + } + } + } + return $candidates; +} + +sub solve { + my @field = @_; + + my $candidates = find_candidates(\@field) || return; + + if (scalar keys %$candidates == 0) { + return \@field; + } + + my @field_copy = @field; + + # iterate remaining positions with multiple possibilities + foreach my $pos (sort { scalar @{$candidates->{$a}} <=> scalar @{$candidates->{$b}} } keys %$candidates) { + @field = @field_copy; + foreach my $cand (@{$candidates->{$pos}}) { + @field[$pos] = $cand; + my $solved_field = solve(@field); + return $solved_field if $solved_field; + } + return; + } +} + +sub main { + my $content; + open FILE, "<096.txt" or die "Can't open file: $!\n"; + while() { + $content .= $_; + } + close FILE; + + my @sudokus = split('\n?Grid [0-9]+\n', $content); + shift @sudokus; # remove empty first element + + my $sum = 0; + + foreach my $sudoku (@sudokus) { + my @field = split("\n?", $sudoku); + my $solution = solve(@field); + $sum += 100*$solution->[0] + 10*$solution->[1] + 1*$solution->[2] . "\n"; + } + + print $sum . "\n"; +} + +main(); + diff --git a/096.txt b/096.txt new file mode 100644 index 0000000..be23f6a --- /dev/null +++ b/096.txt @@ -0,0 +1,500 @@ +Grid 01 +003020600 +900305001 +001806400 +008102900 +700000008 +006708200 +002609500 +800203009 +005010300 +Grid 02 +200080300 +060070084 +030500209 +000105408 +000000000 +402706000 +301007040 +720040060 +004010003 +Grid 03 +000000907 +000420180 +000705026 +100904000 +050000040 +000507009 +920108000 +034059000 +507000000 +Grid 04 +030050040 +008010500 +460000012 +070502080 +000603000 +040109030 +250000098 +001020600 +080060020 +Grid 05 +020810740 +700003100 +090002805 +009040087 +400208003 +160030200 +302700060 +005600008 +076051090 +Grid 06 +100920000 +524010000 +000000070 +050008102 +000000000 +402700090 +060000000 +000030945 +000071006 +Grid 07 +043080250 +600000000 +000001094 +900004070 +000608000 +010200003 +820500000 +000000005 +034090710 +Grid 08 +480006902 +002008001 +900370060 +840010200 +003704100 +001060049 +020085007 +700900600 +609200018 +Grid 09 +000900002 +050123400 +030000160 +908000000 +070000090 +000000205 +091000050 +007439020 +400007000 +Grid 10 +001900003 +900700160 +030005007 +050000009 +004302600 +200000070 +600100030 +042007006 +500006800 +Grid 11 +000125400 +008400000 +420800000 +030000095 +060902010 +510000060 +000003049 +000007200 +001298000 +Grid 12 +062340750 +100005600 +570000040 +000094800 +400000006 +005830000 +030000091 +006400007 +059083260 +Grid 13 +300000000 +005009000 +200504000 +020000700 +160000058 +704310600 +000890100 +000067080 +000005437 +Grid 14 +630000000 +000500008 +005674000 +000020000 +003401020 +000000345 +000007004 +080300902 +947100080 +Grid 15 +000020040 +008035000 +000070602 +031046970 +200000000 +000501203 +049000730 +000000010 +800004000 +Grid 16 +361025900 +080960010 +400000057 +008000471 +000603000 +259000800 +740000005 +020018060 +005470329 +Grid 17 +050807020 +600010090 +702540006 +070020301 +504000908 +103080070 +900076205 +060090003 +080103040 +Grid 18 +080005000 +000003457 +000070809 +060400903 +007010500 +408007020 +901020000 +842300000 +000100080 +Grid 19 +003502900 +000040000 +106000305 +900251008 +070408030 +800763001 +308000104 +000020000 +005104800 +Grid 20 +000000000 +009805100 +051907420 +290401065 +000000000 +140508093 +026709580 +005103600 +000000000 +Grid 21 +020030090 +000907000 +900208005 +004806500 +607000208 +003102900 +800605007 +000309000 +030020050 +Grid 22 +005000006 +070009020 +000500107 +804150000 +000803000 +000092805 +907006000 +030400010 +200000600 +Grid 23 +040000050 +001943600 +009000300 +600050002 +103000506 +800020007 +005000200 +002436700 +030000040 +Grid 24 +004000000 +000030002 +390700080 +400009001 +209801307 +600200008 +010008053 +900040000 +000000800 +Grid 25 +360020089 +000361000 +000000000 +803000602 +400603007 +607000108 +000000000 +000418000 +970030014 +Grid 26 +500400060 +009000800 +640020000 +000001008 +208000501 +700500000 +000090084 +003000600 +060003002 +Grid 27 +007256400 +400000005 +010030060 +000508000 +008060200 +000107000 +030070090 +200000004 +006312700 +Grid 28 +000000000 +079050180 +800000007 +007306800 +450708096 +003502700 +700000005 +016030420 +000000000 +Grid 29 +030000080 +009000500 +007509200 +700105008 +020090030 +900402001 +004207100 +002000800 +070000090 +Grid 30 +200170603 +050000100 +000006079 +000040700 +000801000 +009050000 +310400000 +005000060 +906037002 +Grid 31 +000000080 +800701040 +040020030 +374000900 +000030000 +005000321 +010060050 +050802006 +080000000 +Grid 32 +000000085 +000210009 +960080100 +500800016 +000000000 +890006007 +009070052 +300054000 +480000000 +Grid 33 +608070502 +050608070 +002000300 +500090006 +040302050 +800050003 +005000200 +010704090 +409060701 +Grid 34 +050010040 +107000602 +000905000 +208030501 +040070020 +901080406 +000401000 +304000709 +020060010 +Grid 35 +053000790 +009753400 +100000002 +090080010 +000907000 +080030070 +500000003 +007641200 +061000940 +Grid 36 +006080300 +049070250 +000405000 +600317004 +007000800 +100826009 +000702000 +075040190 +003090600 +Grid 37 +005080700 +700204005 +320000084 +060105040 +008000500 +070803010 +450000091 +600508007 +003010600 +Grid 38 +000900800 +128006400 +070800060 +800430007 +500000009 +600079008 +090004010 +003600284 +001007000 +Grid 39 +000080000 +270000054 +095000810 +009806400 +020403060 +006905100 +017000620 +460000038 +000090000 +Grid 40 +000602000 +400050001 +085010620 +038206710 +000000000 +019407350 +026040530 +900020007 +000809000 +Grid 41 +000900002 +050123400 +030000160 +908000000 +070000090 +000000205 +091000050 +007439020 +400007000 +Grid 42 +380000000 +000400785 +009020300 +060090000 +800302009 +000040070 +001070500 +495006000 +000000092 +Grid 43 +000158000 +002060800 +030000040 +027030510 +000000000 +046080790 +050000080 +004070100 +000325000 +Grid 44 +010500200 +900001000 +002008030 +500030007 +008000500 +600080004 +040100700 +000700006 +003004050 +Grid 45 +080000040 +000469000 +400000007 +005904600 +070608030 +008502100 +900000005 +000781000 +060000010 +Grid 46 +904200007 +010000000 +000706500 +000800090 +020904060 +040002000 +001607000 +000000030 +300005702 +Grid 47 +000700800 +006000031 +040002000 +024070000 +010030080 +000060290 +000800070 +860000500 +002006000 +Grid 48 +001007090 +590080001 +030000080 +000005800 +050060020 +004100000 +080000030 +100020079 +020700400 +Grid 49 +000003017 +015009008 +060000000 +100007000 +009000200 +000500004 +000000020 +500600340 +340200000 +Grid 50 +300200000 +000107000 +706030500 +070009080 +900020004 +010800050 +009040301 +000702000 +000008006 \ No newline at end of file diff --git a/097.py b/097.py new file mode 100644 index 0000000..ec263b0 --- /dev/null +++ b/097.py @@ -0,0 +1 @@ +print (28433*(1<<7830457)+1) % 10**10 diff --git a/098.py b/098.py new file mode 100644 index 0000000..452e15e --- /dev/null +++ b/098.py @@ -0,0 +1,77 @@ +from math import sqrt, ceil + +# is x anagram of y? +def anagram(x, y): + x2 = [c for c in x] + y2 = [c for c in y] + x2.sort() + y2.sort() + return x2 == y2 + + +# returns replacement list +def replacement(word, number): + digits = [False] * 10 + for char in word[::-1]: + digit = number % 10 + number /= 10 + + if char in digits and digits[digit] != char: + return None + + if digits[digit] == False: + digits[digit] = char + elif digits[digit] != char: + return None + return digits + + +# find numbers matching the specified word in descending order +def match(word, numbers): + result = [] + for n in numbers: + digits = replacement(word, n) + if digits != None: + result.append(n) + + result.sort(reverse=True) + return result + + +f = open('098.txt', 'r') +words = f.read() +f.close() + +maxlen = 14 + +words = set([ w.strip('"') for w in words.split(',') ]) +squares = [ [ x*x for x in xrange(int(ceil(sqrt(10**n)))-1, int(ceil(sqrt(10**(n-1))))-1, -1) ] for n in xrange(1, maxlen+1) ] + +maxsquare = 0 + +for l in xrange(1, maxlen+1): + cur = [ w for w in words if len(w) == l ] + + for word1 in cur: + for word2 in cur: + if word1 == word2 or word1 == word2[::-1] or not anagram(word1, word2): + continue + + m1 = match(word1, squares[l-1]) + m2 = match(word2, squares[l-1]) + + # compare result lists + for n1 in m1: + found = False + for n2 in m2: + if replacement(word1, n1) == replacement(word2, n2): + #print word1, word2, n1, n2 + if n1 > maxsquare: + maxsquare = n1 + found = True + break + if found: + break + +print maxsquare + diff --git a/098.txt b/098.txt new file mode 100644 index 0000000..7177624 --- /dev/null +++ b/098.txt @@ -0,0 +1 @@ +"A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH" \ No newline at end of file diff --git a/099.py b/099.py new file mode 100644 index 0000000..bc72d07 --- /dev/null +++ b/099.py @@ -0,0 +1,21 @@ +import math + +numbers = [] + +f = open('099.txt', 'r') +for line in f: + line.rstrip('\n') + l = [int(x) for x in line.split(',')] + numbers.append(l[1] * math.log(l[0])) # log(x^r) = r*log(x) +f.close() + +maxline = 0 +maxn = 0 + +for n in xrange(0, len(numbers)-1): + if numbers[n] > maxn: + maxn = numbers[n] + maxline = n + +print maxline+1 + diff --git a/099.txt b/099.txt new file mode 100644 index 0000000..92201db --- /dev/null +++ b/099.txt @@ -0,0 +1,1000 @@ +519432,525806 +632382,518061 +78864,613712 +466580,530130 +780495,510032 +525895,525320 +15991,714883 +960290,502358 +760018,511029 +166800,575487 +210884,564478 +555151,523163 +681146,515199 +563395,522587 +738250,512126 +923525,503780 +595148,520429 +177108,572629 +750923,511482 +440902,532446 +881418,505504 +422489,534197 +979858,501616 +685893,514935 +747477,511661 +167214,575367 +234140,559696 +940238,503122 +728969,512609 +232083,560102 +900971,504694 +688801,514772 +189664,569402 +891022,505104 +445689,531996 +119570,591871 +821453,508118 +371084,539600 +911745,504251 +623655,518600 +144361,582486 +352442,541775 +420726,534367 +295298,549387 +6530,787777 +468397,529976 +672336,515696 +431861,533289 +84228,610150 +805376,508857 +444409,532117 +33833,663511 +381850,538396 +402931,536157 +92901,604930 +304825,548004 +731917,512452 +753734,511344 +51894,637373 +151578,580103 +295075,549421 +303590,548183 +333594,544123 +683952,515042 +60090,628880 +951420,502692 +28335,674991 +714940,513349 +343858,542826 +549279,523586 +804571,508887 +260653,554881 +291399,549966 +402342,536213 +408889,535550 +40328,652524 +375856,539061 +768907,510590 +165993,575715 +976327,501755 +898500,504795 +360404,540830 +478714,529095 +694144,514472 +488726,528258 +841380,507226 +328012,544839 +22389,690868 +604053,519852 +329514,544641 +772965,510390 +492798,527927 +30125,670983 +895603,504906 +450785,531539 +840237,507276 +380711,538522 +63577,625673 +76801,615157 +502694,527123 +597706,520257 +310484,547206 +944468,502959 +121283,591152 +451131,531507 +566499,522367 +425373,533918 +40240,652665 +39130,654392 +714926,513355 +469219,529903 +806929,508783 +287970,550487 +92189,605332 +103841,599094 +671839,515725 +452048,531421 +987837,501323 +935192,503321 +88585,607450 +613883,519216 +144551,582413 +647359,517155 +213902,563816 +184120,570789 +258126,555322 +502546,527130 +407655,535678 +401528,536306 +477490,529193 +841085,507237 +732831,512408 +833000,507595 +904694,504542 +581435,521348 +455545,531110 +873558,505829 +94916,603796 +720176,513068 +545034,523891 +246348,557409 +556452,523079 +832015,507634 +173663,573564 +502634,527125 +250732,556611 +569786,522139 +216919,563178 +521815,525623 +92304,605270 +164446,576167 +753413,511364 +11410,740712 +448845,531712 +925072,503725 +564888,522477 +7062,780812 +641155,517535 +738878,512100 +636204,517828 +372540,539436 +443162,532237 +571192,522042 +655350,516680 +299741,548735 +581914,521307 +965471,502156 +513441,526277 +808682,508700 +237589,559034 +543300,524025 +804712,508889 +247511,557192 +543486,524008 +504383,526992 +326529,545039 +792493,509458 +86033,609017 +126554,589005 +579379,521481 +948026,502823 +404777,535969 +265767,554022 +266876,553840 +46631,643714 +492397,527958 +856106,506581 +795757,509305 +748946,511584 +294694,549480 +409781,535463 +775887,510253 +543747,523991 +210592,564536 +517119,525990 +520253,525751 +247926,557124 +592141,520626 +346580,542492 +544969,523902 +506501,526817 +244520,557738 +144745,582349 +69274,620858 +292620,549784 +926027,503687 +736320,512225 +515528,526113 +407549,535688 +848089,506927 +24141,685711 +9224,757964 +980684,501586 +175259,573121 +489160,528216 +878970,505604 +969546,502002 +525207,525365 +690461,514675 +156510,578551 +659778,516426 +468739,529945 +765252,510770 +76703,615230 +165151,575959 +29779,671736 +928865,503569 +577538,521605 +927555,503618 +185377,570477 +974756,501809 +800130,509093 +217016,563153 +365709,540216 +774508,510320 +588716,520851 +631673,518104 +954076,502590 +777828,510161 +990659,501222 +597799,520254 +786905,509727 +512547,526348 +756449,511212 +869787,505988 +653747,516779 +84623,609900 +839698,507295 +30159,670909 +797275,509234 +678136,515373 +897144,504851 +989554,501263 +413292,535106 +55297,633667 +788650,509637 +486748,528417 +150724,580377 +56434,632490 +77207,614869 +588631,520859 +611619,519367 +100006,601055 +528924,525093 +190225,569257 +851155,506789 +682593,515114 +613043,519275 +514673,526183 +877634,505655 +878905,505602 +1926,914951 +613245,519259 +152481,579816 +841774,507203 +71060,619442 +865335,506175 +90244,606469 +302156,548388 +399059,536557 +478465,529113 +558601,522925 +69132,620966 +267663,553700 +988276,501310 +378354,538787 +529909,525014 +161733,576968 +758541,511109 +823425,508024 +149821,580667 +269258,553438 +481152,528891 +120871,591322 +972322,501901 +981350,501567 +676129,515483 +950860,502717 +119000,592114 +392252,537272 +191618,568919 +946699,502874 +289555,550247 +799322,509139 +703886,513942 +194812,568143 +261823,554685 +203052,566221 +217330,563093 +734748,512313 +391759,537328 +807052,508777 +564467,522510 +59186,629748 +113447,594545 +518063,525916 +905944,504492 +613922,519213 +439093,532607 +445946,531981 +230530,560399 +297887,549007 +459029,530797 +403692,536075 +855118,506616 +963127,502245 +841711,507208 +407411,535699 +924729,503735 +914823,504132 +333725,544101 +176345,572832 +912507,504225 +411273,535308 +259774,555036 +632853,518038 +119723,591801 +163902,576321 +22691,689944 +402427,536212 +175769,572988 +837260,507402 +603432,519893 +313679,546767 +538165,524394 +549026,523608 +61083,627945 +898345,504798 +992556,501153 +369999,539727 +32847,665404 +891292,505088 +152715,579732 +824104,507997 +234057,559711 +730507,512532 +960529,502340 +388395,537687 +958170,502437 +57105,631806 +186025,570311 +993043,501133 +576770,521664 +215319,563513 +927342,503628 +521353,525666 +39563,653705 +752516,511408 +110755,595770 +309749,547305 +374379,539224 +919184,503952 +990652,501226 +647780,517135 +187177,570017 +168938,574877 +649558,517023 +278126,552016 +162039,576868 +658512,516499 +498115,527486 +896583,504868 +561170,522740 +747772,511647 +775093,510294 +652081,516882 +724905,512824 +499707,527365 +47388,642755 +646668,517204 +571700,522007 +180430,571747 +710015,513617 +435522,532941 +98137,602041 +759176,511070 +486124,528467 +526942,525236 +878921,505604 +408313,535602 +926980,503640 +882353,505459 +566887,522345 +3326,853312 +911981,504248 +416309,534800 +392991,537199 +622829,518651 +148647,581055 +496483,527624 +666314,516044 +48562,641293 +672618,515684 +443676,532187 +274065,552661 +265386,554079 +347668,542358 +31816,667448 +181575,571446 +961289,502320 +365689,540214 +987950,501317 +932299,503440 +27388,677243 +746701,511701 +492258,527969 +147823,581323 +57918,630985 +838849,507333 +678038,515375 +27852,676130 +850241,506828 +818403,508253 +131717,587014 +850216,506834 +904848,504529 +189758,569380 +392845,537217 +470876,529761 +925353,503711 +285431,550877 +454098,531234 +823910,508003 +318493,546112 +766067,510730 +261277,554775 +421530,534289 +694130,514478 +120439,591498 +213308,563949 +854063,506662 +365255,540263 +165437,575872 +662240,516281 +289970,550181 +847977,506933 +546083,523816 +413252,535113 +975829,501767 +361540,540701 +235522,559435 +224643,561577 +736350,512229 +328303,544808 +35022,661330 +307838,547578 +474366,529458 +873755,505819 +73978,617220 +827387,507845 +670830,515791 +326511,545034 +309909,547285 +400970,536363 +884827,505352 +718307,513175 +28462,674699 +599384,520150 +253565,556111 +284009,551093 +343403,542876 +446557,531921 +992372,501160 +961601,502308 +696629,514342 +919537,503945 +894709,504944 +892201,505051 +358160,541097 +448503,531745 +832156,507636 +920045,503924 +926137,503675 +416754,534757 +254422,555966 +92498,605151 +826833,507873 +660716,516371 +689335,514746 +160045,577467 +814642,508425 +969939,501993 +242856,558047 +76302,615517 +472083,529653 +587101,520964 +99066,601543 +498005,527503 +709800,513624 +708000,513716 +20171,698134 +285020,550936 +266564,553891 +981563,501557 +846502,506991 +334,1190800 +209268,564829 +9844,752610 +996519,501007 +410059,535426 +432931,533188 +848012,506929 +966803,502110 +983434,501486 +160700,577267 +504374,526989 +832061,507640 +392825,537214 +443842,532165 +440352,532492 +745125,511776 +13718,726392 +661753,516312 +70500,619875 +436952,532814 +424724,533973 +21954,692224 +262490,554567 +716622,513264 +907584,504425 +60086,628882 +837123,507412 +971345,501940 +947162,502855 +139920,584021 +68330,621624 +666452,516038 +731446,512481 +953350,502619 +183157,571042 +845400,507045 +651548,516910 +20399,697344 +861779,506331 +629771,518229 +801706,509026 +189207,569512 +737501,512168 +719272,513115 +479285,529045 +136046,585401 +896746,504860 +891735,505067 +684771,514999 +865309,506184 +379066,538702 +503117,527090 +621780,518717 +209518,564775 +677135,515423 +987500,501340 +197049,567613 +329315,544673 +236756,559196 +357092,541226 +520440,525733 +213471,563911 +956852,502490 +702223,514032 +404943,535955 +178880,572152 +689477,514734 +691351,514630 +866669,506128 +370561,539656 +739805,512051 +71060,619441 +624861,518534 +261660,554714 +366137,540160 +166054,575698 +601878,519990 +153445,579501 +279899,551729 +379166,538691 +423209,534125 +675310,515526 +145641,582050 +691353,514627 +917468,504026 +284778,550976 +81040,612235 +161699,576978 +616394,519057 +767490,510661 +156896,578431 +427408,533714 +254849,555884 +737217,512182 +897133,504851 +203815,566051 +270822,553189 +135854,585475 +778805,510111 +784373,509847 +305426,547921 +733418,512375 +732087,512448 +540668,524215 +702898,513996 +628057,518328 +640280,517587 +422405,534204 +10604,746569 +746038,511733 +839808,507293 +457417,530938 +479030,529064 +341758,543090 +620223,518824 +251661,556451 +561790,522696 +497733,527521 +724201,512863 +489217,528217 +415623,534867 +624610,518548 +847541,506953 +432295,533249 +400391,536421 +961158,502319 +139173,584284 +421225,534315 +579083,521501 +74274,617000 +701142,514087 +374465,539219 +217814,562985 +358972,540995 +88629,607424 +288597,550389 +285819,550812 +538400,524385 +809930,508645 +738326,512126 +955461,502535 +163829,576343 +826475,507891 +376488,538987 +102234,599905 +114650,594002 +52815,636341 +434037,533082 +804744,508880 +98385,601905 +856620,506559 +220057,562517 +844734,507078 +150677,580387 +558697,522917 +621751,518719 +207067,565321 +135297,585677 +932968,503404 +604456,519822 +579728,521462 +244138,557813 +706487,513800 +711627,513523 +853833,506674 +497220,527562 +59428,629511 +564845,522486 +623621,518603 +242689,558077 +125091,589591 +363819,540432 +686453,514901 +656813,516594 +489901,528155 +386380,537905 +542819,524052 +243987,557841 +693412,514514 +488484,528271 +896331,504881 +336730,543721 +728298,512647 +604215,519840 +153729,579413 +595687,520398 +540360,524240 +245779,557511 +924873,503730 +509628,526577 +528523,525122 +3509,847707 +522756,525555 +895447,504922 +44840,646067 +45860,644715 +463487,530404 +398164,536654 +894483,504959 +619415,518874 +966306,502129 +990922,501212 +835756,507474 +548881,523618 +453578,531282 +474993,529410 +80085,612879 +737091,512193 +50789,638638 +979768,501620 +792018,509483 +665001,516122 +86552,608694 +462772,530469 +589233,520821 +891694,505072 +592605,520594 +209645,564741 +42531,649269 +554376,523226 +803814,508929 +334157,544042 +175836,572970 +868379,506051 +658166,516520 +278203,551995 +966198,502126 +627162,518387 +296774,549165 +311803,547027 +843797,507118 +702304,514032 +563875,522553 +33103,664910 +191932,568841 +543514,524006 +506835,526794 +868368,506052 +847025,506971 +678623,515342 +876139,505726 +571997,521984 +598632,520198 +213590,563892 +625404,518497 +726508,512738 +689426,514738 +332495,544264 +411366,535302 +242546,558110 +315209,546555 +797544,509219 +93889,604371 +858879,506454 +124906,589666 +449072,531693 +235960,559345 +642403,517454 +720567,513047 +705534,513858 +603692,519870 +488137,528302 +157370,578285 +63515,625730 +666326,516041 +619226,518883 +443613,532186 +597717,520257 +96225,603069 +86940,608450 +40725,651929 +460976,530625 +268875,553508 +270671,553214 +363254,540500 +384248,538137 +762889,510892 +377941,538833 +278878,551890 +176615,572755 +860008,506412 +944392,502967 +608395,519571 +225283,561450 +45095,645728 +333798,544090 +625733,518476 +995584,501037 +506135,526853 +238050,558952 +557943,522972 +530978,524938 +634244,517949 +177168,572616 +85200,609541 +953043,502630 +523661,525484 +999295,500902 +840803,507246 +961490,502312 +471747,529685 +380705,538523 +911180,504275 +334149,544046 +478992,529065 +325789,545133 +335884,543826 +426976,533760 +749007,511582 +667067,516000 +607586,519623 +674054,515599 +188534,569675 +565185,522464 +172090,573988 +87592,608052 +907432,504424 +8912,760841 +928318,503590 +757917,511138 +718693,513153 +315141,546566 +728326,512645 +353492,541647 +638429,517695 +628892,518280 +877286,505672 +620895,518778 +385878,537959 +423311,534113 +633501,517997 +884833,505360 +883402,505416 +999665,500894 +708395,513697 +548142,523667 +756491,511205 +987352,501340 +766520,510705 +591775,520647 +833758,507563 +843890,507108 +925551,503698 +74816,616598 +646942,517187 +354923,541481 +256291,555638 +634470,517942 +930904,503494 +134221,586071 +282663,551304 +986070,501394 +123636,590176 +123678,590164 +481717,528841 +423076,534137 +866246,506145 +93313,604697 +783632,509880 +317066,546304 +502977,527103 +141272,583545 +71708,618938 +617748,518975 +581190,521362 +193824,568382 +682368,515131 +352956,541712 +351375,541905 +505362,526909 +905165,504518 +128645,588188 +267143,553787 +158409,577965 +482776,528754 +628896,518282 +485233,528547 +563606,522574 +111001,595655 +115920,593445 +365510,540237 +959724,502374 +938763,503184 +930044,503520 +970959,501956 +913658,504176 +68117,621790 +989729,501253 +567697,522288 +820427,508163 +54236,634794 +291557,549938 +124961,589646 +403177,536130 +405421,535899 +410233,535417 +815111,508403 +213176,563974 +83099,610879 +998588,500934 +513640,526263 +129817,587733 +1820,921851 +287584,550539 +299160,548820 +860621,506386 +529258,525059 +586297,521017 +953406,502616 +441234,532410 +986217,501386 +781938,509957 +461247,530595 +735424,512277 +146623,581722 +839838,507288 +510667,526494 +935085,503327 +737523,512167 +303455,548204 +992779,501145 +60240,628739 +939095,503174 +794368,509370 +501825,527189 +459028,530798 +884641,505363 +512287,526364 +835165,507499 +307723,547590 +160587,577304 +735043,512300 +493289,527887 +110717,595785 +306480,547772 +318593,546089 +179810,571911 +200531,566799 +314999,546580 +197020,567622 +301465,548487 +237808,559000 +131944,586923 +882527,505449 +468117,530003 +711319,513541 +156240,578628 +965452,502162 +992756,501148 +437959,532715 +739938,512046 +614249,519196 +391496,537356 +62746,626418 +688215,514806 +75501,616091 +883573,505412 +558824,522910 +759371,511061 +173913,573489 +891351,505089 +727464,512693 +164833,576051 +812317,508529 +540320,524243 +698061,514257 +69149,620952 +471673,529694 +159092,577753 +428134,533653 +89997,606608 +711061,513557 +779403,510081 +203327,566155 +798176,509187 +667688,515963 +636120,517833 +137410,584913 +217615,563034 +556887,523038 +667229,515991 +672276,515708 +325361,545187 +172115,573985 +13846,725685 \ No newline at end of file diff --git a/102.py b/102.py new file mode 100644 index 0000000..a2108f6 --- /dev/null +++ b/102.py @@ -0,0 +1,43 @@ + +# check if r*(AC) + s*(AB) == P + +def point_in_triangle((x_a, y_a), (x_b, y_b), (x_c, y_c), (x_p, y_p)): + t = x_c - x_a + u = x_b - x_a + v = y_c - y_a + w = y_b - y_a + + # Cramer's rule + detA = t*w - u*v + detR = x_p*w - u*y_p + detS = t*y_p - x_p*v + + if detA == 0: + print "Not solvable" + + r = detR / float(detA) + s = detS / float(detA) + + return 0 <= r <= 1 and 0 <= s <= 1 and r + s < 1 + + +count = 0 + +f = open('102.txt', 'r') +for line in f: + line = line.rstrip('\r\n') + coords = [ int(x) for x in line.split(',') ] + + # move one point to origin, adjust other points + (a1, a2) = (coords[0], coords[1]) + A = (0, 0) + B = (coords[2]-a1, coords[3]-a2) + C = (coords[4]-a1, coords[5]-a2) + P = (-a1, -a2) + + if point_in_triangle(A, B, C, P): + count += 1 +f.close() + +print count + diff --git a/102.txt b/102.txt new file mode 100644 index 0000000..d43312a --- /dev/null +++ b/102.txt @@ -0,0 +1,1000 @@ +-340,495,-153,-910,835,-947 +-175,41,-421,-714,574,-645 +-547,712,-352,579,951,-786 +419,-864,-83,650,-399,171 +-429,-89,-357,-930,296,-29 +-734,-702,823,-745,-684,-62 +-971,762,925,-776,-663,-157 +162,570,628,485,-807,-896 +641,91,-65,700,887,759 +215,-496,46,-931,422,-30 +-119,359,668,-609,-358,-494 +440,929,968,214,760,-857 +-700,785,838,29,-216,411 +-770,-458,-325,-53,-505,633 +-752,-805,349,776,-799,687 +323,5,561,-36,919,-560 +-907,358,264,320,204,274 +-728,-466,350,969,292,-345 +940,836,272,-533,748,185 +411,998,813,520,316,-949 +-152,326,658,-762,148,-651 +330,507,-9,-628,101,174 +551,-496,772,-541,-702,-45 +-164,-489,-90,322,631,-59 +673,366,-4,-143,-606,-704 +428,-609,801,-449,740,-269 +453,-924,-785,-346,-853,111 +-738,555,-181,467,-426,-20 +958,-692,784,-343,505,-569 +620,27,263,54,-439,-726 +804,87,998,859,871,-78 +-119,-453,-709,-292,-115,-56 +-626,138,-940,-476,-177,-274 +-11,160,142,588,446,158 +538,727,550,787,330,810 +420,-689,854,-546,337,516 +872,-998,-607,748,473,-192 +653,440,-516,-985,808,-857 +374,-158,331,-940,-338,-641 +137,-925,-179,771,734,-715 +-314,198,-115,29,-641,-39 +759,-574,-385,355,590,-603 +-189,-63,-168,204,289,305 +-182,-524,-715,-621,911,-255 +331,-816,-833,471,168,126 +-514,581,-855,-220,-731,-507 +129,169,576,651,-87,-458 +783,-444,-881,658,-266,298 +603,-430,-598,585,368,899 +43,-724,962,-376,851,409 +-610,-646,-883,-261,-482,-881 +-117,-237,978,641,101,-747 +579,125,-715,-712,208,534 +672,-214,-762,372,874,533 +-564,965,38,715,367,242 +500,951,-700,-981,-61,-178 +-382,-224,-959,903,-282,-60 +-355,295,426,-331,-591,655 +892,128,958,-271,-993,274 +-454,-619,302,138,-790,-874 +-642,601,-574,159,-290,-318 +266,-109,257,-686,54,975 +162,628,-478,840,264,-266 +466,-280,982,1,904,-810 +721,839,730,-807,777,981 +-129,-430,748,263,943,96 +434,-94,410,-990,249,-704 +237,42,122,-732,44,-51 +909,-116,-229,545,292,717 +824,-768,-807,-370,-262,30 +675,58,332,-890,-651,791 +363,825,-717,254,684,240 +405,-715,900,166,-589,422 +-476,686,-830,-319,634,-807 +633,837,-971,917,-764,207 +-116,-44,-193,-70,908,809 +-26,-252,998,408,70,-713 +-601,645,-462,842,-644,-591 +-160,653,274,113,-138,687 +369,-273,-181,925,-167,-693 +-338,135,480,-967,-13,-840 +-90,-270,-564,695,161,907 +607,-430,869,-713,461,-469 +919,-165,-776,522,606,-708 +-203,465,288,207,-339,-458 +-453,-534,-715,975,838,-677 +-973,310,-350,934,546,-805 +-835,385,708,-337,-594,-772 +-14,914,900,-495,-627,594 +833,-713,-213,578,-296,699 +-27,-748,484,455,915,291 +270,889,739,-57,442,-516 +119,811,-679,905,184,130 +-678,-469,925,553,612,482 +101,-571,-732,-842,644,588 +-71,-737,566,616,957,-663 +-634,-356,90,-207,936,622 +598,443,964,-895,-58,529 +847,-467,929,-742,91,10 +-633,829,-780,-408,222,-30 +-818,57,275,-38,-746,198 +-722,-825,-549,597,-391,99 +-570,908,430,873,-103,-360 +342,-681,512,434,542,-528 +297,850,479,609,543,-357 +9,784,212,548,56,859 +-152,560,-240,-969,-18,713 +140,-133,34,-635,250,-163 +-272,-22,-169,-662,989,-604 +471,-765,355,633,-742,-118 +-118,146,942,663,547,-376 +583,16,162,264,715,-33 +-230,-446,997,-838,561,555 +372,397,-729,-318,-276,649 +92,982,-970,-390,-922,922 +-981,713,-951,-337,-669,670 +-999,846,-831,-504,7,-128 +455,-954,-370,682,-510,45 +822,-960,-892,-385,-662,314 +-668,-686,-367,-246,530,-341 +-723,-720,-926,-836,-142,757 +-509,-134,384,-221,-873,-639 +-803,-52,-706,-669,373,-339 +933,578,631,-616,770,555 +741,-564,-33,-605,-576,275 +-715,445,-233,-730,734,-704 +120,-10,-266,-685,-490,-17 +-232,-326,-457,-946,-457,-116 +811,52,639,826,-200,147 +-329,279,293,612,943,955 +-721,-894,-393,-969,-642,453 +-688,-826,-352,-75,371,79 +-809,-979,407,497,858,-248 +-485,-232,-242,-582,-81,849 +141,-106,123,-152,806,-596 +-428,57,-992,811,-192,478 +864,393,122,858,255,-876 +-284,-780,240,457,354,-107 +956,605,-477,44,26,-678 +86,710,-533,-815,439,327 +-906,-626,-834,763,426,-48 +201,-150,-904,652,475,412 +-247,149,81,-199,-531,-148 +923,-76,-353,175,-121,-223 +427,-674,453,472,-410,585 +931,776,-33,85,-962,-865 +-655,-908,-902,208,869,792 +-316,-102,-45,-436,-222,885 +-309,768,-574,653,745,-975 +896,27,-226,993,332,198 +323,655,-89,260,240,-902 +501,-763,-424,793,813,616 +993,375,-938,-621,672,-70 +-880,-466,-283,770,-824,143 +63,-283,886,-142,879,-116 +-964,-50,-521,-42,-306,-161 +724,-22,866,-871,933,-383 +-344,135,282,966,-80,917 +-281,-189,420,810,362,-582 +-515,455,-588,814,162,332 +555,-436,-123,-210,869,-943 +589,577,232,286,-554,876 +-773,127,-58,-171,-452,125 +-428,575,906,-232,-10,-224 +437,276,-335,-348,605,878 +-964,511,-386,-407,168,-220 +307,513,912,-463,-423,-416 +-445,539,273,886,-18,760 +-396,-585,-670,414,47,364 +143,-506,754,906,-971,-203 +-544,472,-180,-541,869,-465 +-779,-15,-396,890,972,-220 +-430,-564,503,182,-119,456 +89,-10,-739,399,506,499 +954,162,-810,-973,127,870 +890,952,-225,158,828,237 +-868,952,349,465,574,750 +-915,369,-975,-596,-395,-134 +-135,-601,575,582,-667,640 +413,890,-560,-276,-555,-562 +-633,-269,561,-820,-624,499 +371,-92,-784,-593,864,-717 +-971,655,-439,367,754,-951 +172,-347,36,279,-247,-402 +633,-301,364,-349,-683,-387 +-780,-211,-713,-948,-648,543 +72,58,762,-465,-66,462 +78,502,781,-832,713,836 +-431,-64,-484,-392,208,-343 +-64,101,-29,-860,-329,844 +398,391,828,-858,700,395 +578,-896,-326,-604,314,180 +97,-321,-695,185,-357,852 +854,839,283,-375,951,-209 +194,96,-564,-847,162,524 +-354,532,494,621,580,560 +419,-678,-450,926,-5,-924 +-661,905,519,621,-143,394 +-573,268,296,-562,-291,-319 +-211,266,-196,158,564,-183 +18,-585,-398,777,-581,864 +790,-894,-745,-604,-418,70 +848,-339,150,773,11,851 +-954,-809,-53,-20,-648,-304 +658,-336,-658,-905,853,407 +-365,-844,350,-625,852,-358 +986,-315,-230,-159,21,180 +-15,599,45,-286,-941,847 +-613,-68,184,639,-987,550 +334,675,-56,-861,923,340 +-848,-596,960,231,-28,-34 +707,-811,-994,-356,-167,-171 +-470,-764,72,576,-600,-204 +379,189,-542,-576,585,800 +440,540,-445,-563,379,-334 +-155,64,514,-288,853,106 +-304,751,481,-520,-708,-694 +-709,132,594,126,-844,63 +723,471,421,-138,-962,892 +-440,-263,39,513,-672,-954 +775,809,-581,330,752,-107 +-376,-158,335,-708,-514,578 +-343,-769,456,-187,25,413 +548,-877,-172,300,-500,928 +938,-102,423,-488,-378,-969 +-36,564,-55,131,958,-800 +-322,511,-413,503,700,-847 +-966,547,-88,-17,-359,-67 +637,-341,-437,-181,527,-153 +-74,449,-28,3,485,189 +-997,658,-224,-948,702,-807 +-224,736,-896,127,-945,-850 +-395,-106,439,-553,-128,124 +-841,-445,-758,-572,-489,212 +633,-327,13,-512,952,771 +-940,-171,-6,-46,-923,-425 +-142,-442,-817,-998,843,-695 +340,847,-137,-920,-988,-658 +-653,217,-679,-257,651,-719 +-294,365,-41,342,74,-892 +690,-236,-541,494,408,-516 +180,-807,225,790,494,59 +707,605,-246,656,284,271 +65,294,152,824,442,-442 +-321,781,-540,341,316,415 +420,371,-2,545,995,248 +56,-191,-604,971,615,449 +-981,-31,510,592,-390,-362 +-317,-968,913,365,97,508 +832,63,-864,-510,86,202 +-483,456,-636,340,-310,676 +981,-847,751,-508,-962,-31 +-157,99,73,797,63,-172 +220,858,872,924,866,-381 +996,-169,805,321,-164,971 +896,11,-625,-973,-782,76 +578,-280,730,-729,307,-905 +-580,-749,719,-698,967,603 +-821,874,-103,-623,662,-491 +-763,117,661,-644,672,-607 +592,787,-798,-169,-298,690 +296,644,-526,-762,-447,665 +534,-818,852,-120,57,-379 +-986,-549,-329,294,954,258 +-133,352,-660,-77,904,-356 +748,343,215,500,317,-277 +311,7,910,-896,-809,795 +763,-602,-753,313,-352,917 +668,619,-474,-597,-650,650 +-297,563,-701,-987,486,-902 +-461,-740,-657,233,-482,-328 +-446,-250,-986,-458,-629,520 +542,-49,-327,-469,257,-947 +121,-575,-634,-143,-184,521 +30,504,455,-645,-229,-945 +-12,-295,377,764,771,125 +-686,-133,225,-25,-376,-143 +-6,-46,338,270,-405,-872 +-623,-37,582,467,963,898 +-804,869,-477,420,-475,-303 +94,41,-842,-193,-768,720 +-656,-918,415,645,-357,460 +-47,-486,-911,468,-608,-686 +-158,251,419,-394,-655,-895 +272,-695,979,508,-358,959 +-776,650,-918,-467,-690,-534 +-85,-309,-626,167,-366,-429 +-880,-732,-186,-924,970,-875 +517,645,-274,962,-804,544 +721,402,104,640,478,-499 +198,684,-134,-723,-452,-905 +-245,745,239,238,-826,441 +-217,206,-32,462,-981,-895 +-51,989,526,-173,560,-676 +-480,-659,-976,-580,-727,466 +-996,-90,-995,158,-239,642 +302,288,-194,-294,17,924 +-943,969,-326,114,-500,103 +-619,163,339,-880,230,421 +-344,-601,-795,557,565,-779 +590,345,-129,-202,-125,-58 +-777,-195,159,674,775,411 +-939,312,-665,810,121,855 +-971,254,712,815,452,581 +442,-9,327,-750,61,757 +-342,869,869,-160,390,-772 +620,601,565,-169,-69,-183 +-25,924,-817,964,321,-970 +-64,-6,-133,978,825,-379 +601,436,-24,98,-115,940 +-97,502,614,-574,922,513 +-125,262,-946,695,99,-220 +429,-721,719,-694,197,-558 +326,689,-70,-908,-673,338 +-468,-856,-902,-254,-358,305 +-358,530,542,355,-253,-47 +-438,-74,-362,963,988,788 +137,717,467,622,319,-380 +-86,310,-336,851,918,-288 +721,395,646,-53,255,-425 +255,175,912,84,-209,878 +-632,-485,-400,-357,991,-608 +235,-559,992,-297,857,-591 +87,-71,148,130,647,578 +-290,-584,-639,-788,-21,592 +386,984,625,-731,-993,-336 +-538,634,-209,-828,-150,-774 +-754,-387,607,-781,976,-199 +412,-798,-664,295,709,-537 +-412,932,-880,-232,561,852 +-656,-358,-198,-964,-433,-848 +-762,-668,-632,186,-673,-11 +-876,237,-282,-312,-83,682 +403,73,-57,-436,-622,781 +-587,873,798,976,-39,329 +-369,-622,553,-341,817,794 +-108,-616,920,-849,-679,96 +290,-974,234,239,-284,-321 +-22,394,-417,-419,264,58 +-473,-551,69,923,591,-228 +-956,662,-113,851,-581,-794 +-258,-681,413,-471,-637,-817 +-866,926,992,-653,-7,794 +556,-350,602,917,831,-610 +188,245,-906,361,492,174 +-720,384,-818,329,638,-666 +-246,846,890,-325,-59,-850 +-118,-509,620,-762,-256,15 +-787,-536,-452,-338,-399,813 +458,560,525,-311,-608,-419 +494,-811,-825,-127,-812,894 +-801,890,-629,-860,574,925 +-709,-193,-213,138,-410,-403 +861,91,708,-187,5,-222 +789,646,777,154,90,-49 +-267,-830,-114,531,591,-698 +-126,-82,881,-418,82,652 +-894,130,-726,-935,393,-815 +-142,563,654,638,-712,-597 +-759,60,-23,977,100,-765 +-305,595,-570,-809,482,762 +-161,-267,53,963,998,-529 +-300,-57,798,353,703,486 +-990,696,-764,699,-565,719 +-232,-205,566,571,977,369 +740,865,151,-817,-204,-293 +94,445,-768,229,537,-406 +861,620,37,-424,-36,656 +390,-369,952,733,-464,569 +-482,-604,959,554,-705,-626 +-396,-615,-991,108,272,-723 +143,780,535,142,-917,-147 +138,-629,-217,-908,905,115 +915,103,-852,64,-468,-642 +570,734,-785,-268,-326,-759 +738,531,-332,586,-779,24 +870,440,-217,473,-383,415 +-296,-333,-330,-142,-924,950 +118,120,-35,-245,-211,-652 +61,634,153,-243,838,789 +726,-582,210,105,983,537 +-313,-323,758,234,29,848 +-847,-172,-593,733,-56,617 +54,255,-512,156,-575,675 +-873,-956,-148,623,95,200 +700,-370,926,649,-978,157 +-639,-202,719,130,747,222 +194,-33,955,943,505,114 +-226,-790,28,-930,827,783 +-392,-74,-28,714,218,-612 +209,626,-888,-683,-912,495 +487,751,614,933,631,445 +-348,-34,-411,-106,835,321 +-689,872,-29,-800,312,-542 +-52,566,827,570,-862,-77 +471,992,309,-402,389,912 +24,520,-83,-51,555,503 +-265,-317,283,-970,-472,690 +606,526,137,71,-651,150 +217,-518,663,66,-605,-331 +-562,232,-76,-503,205,-323 +842,-521,546,285,625,-186 +997,-927,344,909,-546,974 +-677,419,81,121,-705,771 +719,-379,-944,-797,784,-155 +-378,286,-317,-797,-111,964 +-288,-573,784,80,-532,-646 +-77,407,-248,-797,769,-816 +-24,-637,287,-858,-927,-333 +-902,37,894,-823,141,684 +125,467,-177,-516,686,399 +-321,-542,641,-590,527,-224 +-400,-712,-876,-208,632,-543 +-676,-429,664,-242,-269,922 +-608,-273,-141,930,687,380 +786,-12,498,494,310,326 +-739,-617,606,-960,804,188 +384,-368,-243,-350,-459,31 +-550,397,320,-868,328,-279 +969,-179,853,864,-110,514 +910,793,302,-822,-285,488 +-605,-128,218,-283,-17,-227 +16,324,667,708,750,3 +485,-813,19,585,71,930 +-218,816,-687,-97,-732,-360 +-497,-151,376,-23,3,315 +-412,-989,-610,-813,372,964 +-878,-280,87,381,-311,69 +-609,-90,-731,-679,150,585 +889,27,-162,605,75,-770 +448,617,-988,0,-103,-504 +-800,-537,-69,627,608,-668 +534,686,-664,942,830,920 +-238,775,495,932,-793,497 +-343,958,-914,-514,-691,651 +568,-136,208,359,728,28 +286,912,-794,683,556,-102 +-638,-629,-484,445,-64,-497 +58,505,-801,-110,872,632 +-390,777,353,267,976,369 +-993,515,105,-133,358,-572 +964,996,355,-212,-667,38 +-725,-614,-35,365,132,-196 +237,-536,-416,-302,312,477 +-664,574,-210,224,48,-925 +869,-261,-256,-240,-3,-698 +712,385,32,-34,916,-315 +895,-409,-100,-346,728,-624 +-806,327,-450,889,-781,-939 +-586,-403,698,318,-939,899 +557,-57,-920,659,333,-51 +-441,232,-918,-205,246,1 +783,167,-797,-595,245,-736 +-36,-531,-486,-426,-813,-160 +777,-843,817,313,-228,-572 +735,866,-309,-564,-81,190 +-413,645,101,719,-719,218 +-83,164,767,796,-430,-459 +122,779,-15,-295,-96,-892 +462,379,70,548,834,-312 +-630,-534,124,187,-737,114 +-299,-604,318,-591,936,826 +-879,218,-642,-483,-318,-866 +-691,62,-658,761,-895,-854 +-822,493,687,569,910,-202 +-223,784,304,-5,541,925 +-914,541,737,-662,-662,-195 +-622,615,414,358,881,-878 +339,745,-268,-968,-280,-227 +-364,855,148,-709,-827,472 +-890,-532,-41,664,-612,577 +-702,-859,971,-722,-660,-920 +-539,-605,737,149,973,-802 +800,42,-448,-811,152,511 +-933,377,-110,-105,-374,-937 +-766,152,482,120,-308,390 +-568,775,-292,899,732,890 +-177,-317,-502,-259,328,-511 +612,-696,-574,-660,132,31 +-119,563,-805,-864,179,-672 +425,-627,183,-331,839,318 +-711,-976,-749,152,-916,261 +181,-63,497,211,262,406 +-537,700,-859,-765,-928,77 +892,832,231,-749,-82,613 +816,216,-642,-216,-669,-912 +-6,624,-937,-370,-344,268 +737,-710,-869,983,-324,-274 +565,952,-547,-158,374,-444 +51,-683,645,-845,515,636 +-953,-631,114,-377,-764,-144 +-8,470,-242,-399,-675,-730 +-540,689,-20,47,-607,590 +-329,-710,-779,942,-388,979 +123,829,674,122,203,563 +46,782,396,-33,386,610 +872,-846,-523,-122,-55,-190 +388,-994,-525,974,127,596 +781,-680,796,-34,-959,-62 +-749,173,200,-384,-745,-446 +379,618,136,-250,-224,970 +-58,240,-921,-760,-901,-626 +366,-185,565,-100,515,688 +489,999,-893,-263,-637,816 +838,-496,-316,-513,419,479 +107,676,-15,882,98,-397 +-999,941,-903,-424,670,-325 +171,-979,835,178,169,-984 +-609,-607,378,-681,184,402 +-316,903,-575,-800,224,983 +591,-18,-460,551,-167,918 +-756,405,-117,441,163,-320 +456,24,6,881,-836,-539 +-489,-585,915,651,-892,-382 +-177,-122,73,-711,-386,591 +181,724,530,686,-131,241 +737,288,886,216,233,33 +-548,-386,-749,-153,-85,-982 +-835,227,904,160,-99,25 +-9,-42,-162,728,840,-963 +217,-763,870,771,47,-846 +-595,808,-491,556,337,-900 +-134,281,-724,441,-134,708 +-789,-508,651,-962,661,315 +-839,-923,339,402,41,-487 +300,-790,48,703,-398,-811 +955,-51,462,-685,960,-717 +910,-880,592,-255,-51,-776 +-885,169,-793,368,-565,458 +-905,940,-492,-630,-535,-988 +245,797,763,869,-82,550 +-310,38,-933,-367,-650,824 +-95,32,-83,337,226,990 +-218,-975,-191,-208,-785,-293 +-672,-953,517,-901,-247,465 +681,-148,261,-857,544,-923 +640,341,446,-618,195,769 +384,398,-846,365,671,815 +578,576,-911,907,762,-859 +548,-428,144,-630,-759,-146 +710,-73,-700,983,-97,-889 +-46,898,-973,-362,-817,-717 +151,-81,-125,-900,-478,-154 +483,615,-537,-932,181,-68 +786,-223,518,25,-306,-12 +-422,268,-809,-683,635,468 +983,-734,-694,-608,-110,4 +-786,-196,749,-354,137,-8 +-181,36,668,-200,691,-973 +-629,-838,692,-736,437,-871 +-208,-536,-159,-596,8,197 +-3,370,-686,170,913,-376 +44,-998,-149,-993,-200,512 +-519,136,859,497,536,434 +77,-985,972,-340,-705,-837 +-381,947,250,360,344,322 +-26,131,699,750,707,384 +-914,655,299,193,406,955 +-883,-921,220,595,-546,794 +-599,577,-569,-404,-704,489 +-594,-963,-624,-460,880,-760 +-603,88,-99,681,55,-328 +976,472,139,-453,-531,-860 +192,-290,513,-89,666,432 +417,487,575,293,567,-668 +655,711,-162,449,-980,972 +-505,664,-685,-239,603,-592 +-625,-802,-67,996,384,-636 +365,-593,522,-666,-200,-431 +-868,708,560,-860,-630,-355 +-702,785,-637,-611,-597,960 +-137,-696,-93,-803,408,406 +891,-123,-26,-609,-610,518 +133,-832,-198,555,708,-110 +791,617,-69,487,696,315 +-900,694,-565,517,-269,-416 +914,135,-781,600,-71,-600 +991,-915,-422,-351,-837,313 +-840,-398,-302,21,590,146 +62,-558,-702,-384,-625,831 +-363,-426,-924,-496,792,-908 +73,361,-817,-466,400,922 +-626,-164,-626,860,-524,286 +255,26,-944,809,-606,986 +-457,-256,-103,50,-867,-871 +-223,803,196,480,612,136 +-820,-928,700,780,-977,721 +717,332,53,-933,-128,793 +-602,-648,562,593,890,702 +-469,-875,-527,911,-475,-222 +110,-281,-552,-536,-816,596 +-981,654,413,-981,-75,-95 +-754,-742,-515,894,-220,-344 +795,-52,156,408,-603,76 +474,-157,423,-499,-807,-791 +260,688,40,-52,702,-122 +-584,-517,-390,-881,302,-504 +61,797,665,708,14,668 +366,166,458,-614,564,-983 +72,539,-378,796,381,-824 +-485,201,-588,842,736,379 +-149,-894,-298,705,-303,-406 +660,-935,-580,521,93,633 +-382,-282,-375,-841,-828,171 +-567,743,-100,43,144,122 +-281,-786,-749,-551,296,304 +11,-426,-792,212,857,-175 +594,143,-699,289,315,137 +341,596,-390,107,-631,-804 +-751,-636,-424,-854,193,651 +-145,384,749,675,-786,517 +224,-865,-323,96,-916,258 +-309,403,-388,826,35,-270 +-942,709,222,158,-699,-103 +-589,842,-997,29,-195,-210 +264,426,566,145,-217,623 +217,965,507,-601,-453,507 +-206,307,-982,4,64,-292 +676,-49,-38,-701,550,883 +5,-850,-438,659,745,-773 +933,238,-574,-570,91,-33 +-866,121,-928,358,459,-843 +-568,-631,-352,-580,-349,189 +-737,849,-963,-486,-662,970 +135,334,-967,-71,-365,-792 +789,21,-227,51,990,-275 +240,412,-886,230,591,256 +-609,472,-853,-754,959,661 +401,521,521,314,929,982 +-499,784,-208,71,-302,296 +-557,-948,-553,-526,-864,793 +270,-626,828,44,37,14 +-412,224,617,-593,502,699 +41,-908,81,562,-849,163 +165,917,761,-197,331,-341 +-687,314,799,755,-969,648 +-164,25,578,439,-334,-576 +213,535,874,-177,-551,24 +-689,291,-795,-225,-496,-125 +465,461,558,-118,-568,-909 +567,660,-810,46,-485,878 +-147,606,685,-690,-774,984 +568,-886,-43,854,-738,616 +-800,386,-614,585,764,-226 +-518,23,-225,-732,-79,440 +-173,-291,-689,636,642,-447 +-598,-16,227,410,496,211 +-474,-930,-656,-321,-420,36 +-435,165,-819,555,540,144 +-969,149,828,568,394,648 +65,-848,257,720,-625,-851 +981,899,275,635,465,-877 +80,290,792,760,-191,-321 +-605,-858,594,33,706,593 +585,-472,318,-35,354,-927 +-365,664,803,581,-965,-814 +-427,-238,-480,146,-55,-606 +879,-193,250,-890,336,117 +-226,-322,-286,-765,-836,-218 +-913,564,-667,-698,937,283 +872,-901,810,-623,-52,-709 +473,171,717,38,-429,-644 +225,824,-219,-475,-180,234 +-530,-797,-948,238,851,-623 +85,975,-363,529,598,28 +-799,166,-804,210,-769,851 +-687,-158,885,736,-381,-461 +447,592,928,-514,-515,-661 +-399,-777,-493,80,-544,-78 +-884,631,171,-825,-333,551 +191,268,-577,676,137,-33 +212,-853,709,798,583,-56 +-908,-172,-540,-84,-135,-56 +303,311,406,-360,-240,811 +798,-708,824,59,234,-57 +491,693,-74,585,-85,877 +509,-65,-936,329,-51,722 +-122,858,-52,467,-77,-609 +850,760,547,-495,-953,-952 +-460,-541,890,910,286,724 +-914,843,-579,-983,-387,-460 +989,-171,-877,-326,-899,458 +846,175,-915,540,-1000,-982 +-852,-920,-306,496,530,-18 +338,-991,160,85,-455,-661 +-186,-311,-460,-563,-231,-414 +-932,-302,959,597,793,748 +-366,-402,-788,-279,514,53 +-940,-956,447,-956,211,-285 +564,806,-911,-914,934,754 +575,-858,-277,15,409,-714 +848,462,100,-381,135,242 +330,718,-24,-190,860,-78 +479,458,941,108,-866,-653 +212,980,962,-962,115,841 +-827,-474,-206,881,323,765 +506,-45,-30,-293,524,-133 +832,-173,547,-852,-561,-842 +-397,-661,-708,819,-545,-228 +521,51,-489,852,36,-258 +227,-164,189,465,-987,-882 +-73,-997,641,-995,449,-615 +151,-995,-638,415,257,-400 +-663,-297,-748,537,-734,198 +-585,-401,-81,-782,-80,-105 +99,-21,238,-365,-704,-368 +45,416,849,-211,-371,-1 +-404,-443,795,-406,36,-933 +272,-363,981,-491,-380,77 +713,-342,-366,-849,643,911 +-748,671,-537,813,961,-200 +-194,-909,703,-662,-601,188 +281,500,724,286,267,197 +-832,847,-595,820,-316,637 +520,521,-54,261,923,-10 +4,-808,-682,-258,441,-695 +-793,-107,-969,905,798,446 +-108,-739,-590,69,-855,-365 +380,-623,-930,817,468,713 +759,-849,-236,433,-723,-931 +95,-320,-686,124,-69,-329 +-655,518,-210,-523,284,-866 +144,303,639,70,-171,269 +173,-333,947,-304,55,40 +274,878,-482,-888,-835,375 +-982,-854,-36,-218,-114,-230 +905,-979,488,-485,-479,114 +877,-157,553,-530,-47,-321 +350,664,-881,442,-220,-284 +434,-423,-365,878,-726,584 +535,909,-517,-447,-660,-141 +-966,191,50,353,182,-642 +-785,-634,123,-907,-162,511 +146,-850,-214,814,-704,25 +692,1,521,492,-637,274 +-662,-372,-313,597,983,-647 +-962,-526,68,-549,-819,231 +740,-890,-318,797,-666,948 +-190,-12,-468,-455,948,284 +16,478,-506,-888,628,-154 +272,630,-976,308,433,3 +-169,-391,-132,189,302,-388 +109,-784,474,-167,-265,-31 +-177,-532,283,464,421,-73 +650,635,592,-138,1,-387 +-932,703,-827,-492,-355,686 +586,-311,340,-618,645,-434 +-951,736,647,-127,-303,590 +188,444,903,718,-931,500 +-872,-642,-296,-571,337,241 +23,65,152,125,880,470 +512,823,-42,217,823,-263 +180,-831,-380,886,607,762 +722,443,-149,-216,-115,759 +-19,660,-36,901,923,231 +562,-322,-626,-968,194,-825 +204,-920,938,784,362,150 +-410,-266,-715,559,-672,124 +-198,446,-140,454,-461,-447 +83,-346,830,-493,-759,-382 +-881,601,581,234,-134,-925 +-494,914,-42,899,235,629 +-390,50,956,437,774,-700 +-514,514,44,-512,-576,-313 +63,-688,808,-534,-570,-399 +-726,572,-896,102,-294,-28 +-688,757,401,406,955,-511 +-283,423,-485,480,-767,908 +-541,952,-594,116,-854,451 +-273,-796,236,625,-626,257 +-407,-493,373,826,-309,297 +-750,955,-476,641,-809,713 +8,415,695,226,-111,2 +733,209,152,-920,401,995 +921,-103,-919,66,871,-947 +-907,89,-869,-214,851,-559 +-307,748,524,-755,314,-711 +188,897,-72,-763,482,103 +545,-821,-232,-596,-334,-754 +-217,-788,-820,388,-200,-662 +779,160,-723,-975,-142,-998 +-978,-519,-78,-981,842,904 +-504,-736,-295,21,-472,-482 +391,115,-705,574,652,-446 +813,-988,865,830,-263,487 +194,80,774,-493,-761,-872 +-415,-284,-803,7,-810,670 +-484,-4,881,-872,55,-852 +-379,822,-266,324,-48,748 +-304,-278,406,-60,959,-89 +404,756,577,-643,-332,658 +291,460,125,491,-312,83 +311,-734,-141,582,282,-557 +-450,-661,-981,710,-177,794 +328,264,-787,971,-743,-407 +-622,518,993,-241,-738,229 +273,-826,-254,-917,-710,-111 +809,770,96,368,-818,725 +-488,773,502,-342,534,745 +-28,-414,236,-315,-484,363 +179,-466,-566,713,-683,56 +560,-240,-597,619,916,-940 +893,473,872,-868,-642,-461 +799,489,383,-321,-776,-833 +980,490,-508,764,-512,-426 +917,961,-16,-675,440,559 +-812,212,784,-987,-132,554 +-886,454,747,806,190,231 +910,341,21,-66,708,725 +29,929,-831,-494,-303,389 +-103,492,-271,-174,-515,529 +-292,119,419,788,247,-951 +483,543,-347,-673,664,-549 +-926,-871,-437,337,162,-877 +299,472,-771,5,-88,-643 +-103,525,-725,-998,264,22 +-505,708,550,-545,823,347 +-738,931,59,147,-156,-259 +456,968,-162,889,132,-911 +535,120,968,-517,-864,-541 +24,-395,-593,-766,-565,-332 +834,611,825,-576,280,629 +211,-548,140,-278,-592,929 +-999,-240,-63,-78,793,573 +-573,160,450,987,529,322 +63,353,315,-187,-461,577 +189,-950,-247,656,289,241 +209,-297,397,664,-805,484 +-655,452,435,-556,917,874 +253,-756,262,-888,-778,-214 +793,-451,323,-251,-401,-458 +-396,619,-651,-287,-668,-781 +698,720,-349,742,-807,546 +738,280,680,279,-540,858 +-789,387,530,-36,-551,-491 +162,579,-427,-272,228,710 +689,356,917,-580,729,217 +-115,-638,866,424,-82,-194 +411,-338,-917,172,227,-29 +-612,63,630,-976,-64,-204 +-200,911,583,-571,682,-579 +91,298,396,-183,788,-955 +141,-873,-277,149,-396,916 +321,958,-136,573,541,-777 +797,-909,-469,-877,988,-653 +784,-198,129,883,-203,399 +-68,-810,223,-423,-467,-512 +531,-445,-603,-997,-841,641 +-274,-242,174,261,-636,-158 +-574,494,-796,-798,-798,99 +95,-82,-613,-954,-753,986 +-883,-448,-864,-401,938,-392 +913,930,-542,-988,310,410 +506,-99,43,512,790,-222 +724,31,49,-950,260,-134 +-287,-947,-234,-700,56,588 +-33,782,-144,948,105,-791 +548,-546,-652,-293,881,-520 +691,-91,76,991,-631,742 +-520,-429,-244,-296,724,-48 +778,646,377,50,-188,56 +-895,-507,-898,-165,-674,652 +654,584,-634,177,-349,-620 +114,-980,355,62,182,975 +516,9,-442,-298,274,-579 +-238,262,-431,-896,506,-850 +47,748,846,821,-537,-293 +839,726,593,285,-297,840 +634,-486,468,-304,-887,-567 +-864,914,296,-124,335,233 +88,-253,-523,-956,-554,803 +-587,417,281,-62,-409,-363 +-136,-39,-292,-768,-264,876 +-127,506,-891,-331,-744,-430 +778,584,-750,-129,-479,-94 +-876,-771,-987,-757,180,-641 +-777,-694,411,-87,329,190 +-347,-999,-882,158,-754,232 +-105,918,188,237,-110,-591 +-209,703,-838,77,838,909 +-995,-339,-762,750,860,472 +185,271,-289,173,811,-300 +2,65,-656,-22,36,-139 +765,-210,883,974,961,-905 +-212,295,-615,-840,77,474 +211,-910,-440,703,-11,859 +-559,-4,-196,841,-277,969 +-73,-159,-887,126,978,-371 +-569,633,-423,-33,512,-393 +503,143,-383,-109,-649,-998 +-663,339,-317,-523,-2,596 +690,-380,570,378,-652,132 +72,-744,-930,399,-525,935 +865,-983,115,37,995,826 +594,-621,-872,443,188,-241 +-1000,291,754,234,-435,-869 +-868,901,654,-907,59,181 +-868,-793,-431,596,-446,-564 +900,-944,-680,-796,902,-366 +331,430,943,853,-851,-942 +315,-538,-354,-909,139,721 +170,-884,-225,-818,-808,-657 +-279,-34,-533,-871,-972,552 +691,-986,-800,-950,654,-747 +603,988,899,841,-630,591 +876,-949,809,562,602,-536 +-693,363,-189,495,738,-1000 +-383,431,-633,297,665,959 +-740,686,-207,-803,188,-520 +-820,226,31,-339,10,121 +-312,-844,624,-516,483,621 +-822,-529,69,-278,800,328 +834,-82,-759,420,811,-264 +-960,-240,-921,561,173,46 +-324,909,-790,-814,-2,-785 +976,334,-290,-891,704,-581 +150,-798,689,-823,237,-639 +-551,-320,876,-502,-622,-628 +-136,845,904,595,-702,-261 +-857,-377,-522,-101,-943,-805 +-682,-787,-888,-459,-752,-985 +-571,-81,623,-133,447,643 +-375,-158,72,-387,-324,-696 +-660,-650,340,188,569,526 +727,-218,16,-7,-595,-988 +-966,-684,802,-783,-272,-194 +115,-566,-888,47,712,180 +-237,-69,45,-272,981,-812 +48,897,439,417,50,325 +348,616,180,254,104,-784 +-730,811,-548,612,-736,790 +138,-810,123,930,65,865 +-768,-299,-49,-895,-692,-418 +487,-531,802,-159,-12,634 +808,-179,552,-73,470,717 +720,-644,886,-141,625,144 +-485,-505,-347,-244,-916,66 +600,-565,995,-5,324,227 +-771,-35,904,-482,753,-303 +-701,65,426,-763,-504,-479 +409,733,-823,475,64,718 +865,975,368,893,-413,-433 +812,-597,-970,819,813,624 +193,-642,-381,-560,545,398 +711,28,-316,771,717,-865 +-509,462,809,-136,786,635 +618,-49,484,169,635,547 +-747,685,-882,-496,-332,82 +-501,-851,870,563,290,570 +-279,-829,-509,397,457,816 +-508,80,850,-188,483,-326 +860,-100,360,119,-205,787 +-870,21,-39,-827,-185,932 +826,284,-136,-866,-330,-97 +-944,-82,745,899,-97,365 +929,262,564,632,-115,632 +244,-276,713,330,-897,-214 +-890,-109,664,876,-974,-907 +716,249,816,489,723,141 +-96,-560,-272,45,-70,645 +762,-503,414,-828,-254,-646 +909,-13,903,-422,-344,-10 +658,-486,743,545,50,674 +-241,507,-367,18,-48,-241 +886,-268,884,-762,120,-486 +-412,-528,879,-647,223,-393 +851,810,234,937,-726,797 +-999,942,839,-134,-996,-189 +100,979,-527,-521,378,800 +544,-844,-832,-530,-77,-641 +43,889,31,442,-934,-503 +-330,-370,-309,-439,173,547 +169,945,62,-753,-542,-597 +208,751,-372,-647,-520,70 +765,-840,907,-257,379,918 +334,-135,-689,730,-427,618 +137,-508,66,-695,78,169 +-962,-123,400,-417,151,969 +328,689,666,427,-555,-642 +-907,343,605,-341,-647,582 +-667,-363,-571,818,-265,-399 +525,-938,904,898,725,692 +-176,-802,-858,-9,780,275 +580,170,-740,287,691,-97 +365,557,-375,361,-288,859 +193,737,842,-808,520,282 +-871,65,-799,836,179,-720 +958,-144,744,-789,797,-48 +122,582,662,912,68,757 +595,241,-801,513,388,186 +-103,-677,-259,-731,-281,-857 +921,319,-696,683,-88,-997 +775,200,78,858,648,768 +316,821,-763,68,-290,-741 +564,664,691,504,760,787 +694,-119,973,-385,309,-760 +777,-947,-57,990,74,19 +971,626,-496,-781,-602,-239 +-651,433,11,-339,939,294 +-965,-728,560,569,-708,-247 diff --git a/112.c b/112.c new file mode 100644 index 0000000..bb808be --- /dev/null +++ b/112.c @@ -0,0 +1,45 @@ + +int isbouncy(unsigned long n) +{ + char increasing=1, decreasing=1; + char lastdigit = n % 10; + n /= 10; + + while(n > 0) + { + char digit = n % 10; + if(digit > lastdigit) + increasing = 0; + else if(digit < lastdigit) + decreasing = 0; + + if(increasing == 0 && decreasing == 0) + return 1; + + lastdigit = digit; + n /= 10; + } + return 0; +} + +int main(void) +{ + unsigned long n = 100; + unsigned long bouncycount = 0; + double ratio; + + while(1) + { + if(isbouncy(++n)) + bouncycount++; + + ratio = (double)bouncycount/n; + if(ratio == 0.99) + break; + + } + printf("%ld\n", n); + + return 0; +} + diff --git a/124.py b/124.py new file mode 100644 index 0000000..19486d6 --- /dev/null +++ b/124.py @@ -0,0 +1,31 @@ +from operator import itemgetter +from common import sieve + +limit = 100000 + +primes = sieve(limit).primes() +prime_list = list(primes) +prime_list.sort() + +def rad(n): + result = 1 + if n in primes: + return n + + for p in prime_list: + if result*p > n: + break + if n % p == 0: + result *= p + return result + + + +radlist = [] + +for n in xrange(1, limit+1): + radlist.append((n, rad(n))) + +radlist.sort(key=itemgetter(1)) +print radlist[10000-1][0] + diff --git a/125.py b/125.py new file mode 100644 index 0000000..35dae6b --- /dev/null +++ b/125.py @@ -0,0 +1,22 @@ + +limit = 10**8 + +squares = [ x*x for x in xrange(1, 7200) ] + +def is_palindrome(n): + nstr = str(n) + return nstr == nstr[::-1] + + +palindromes = set() + +for i in xrange(len(squares)-1): # iterate over all starting positions + for j in xrange(2, len(squares)): # iterate over all possible lengths + sqrsum = sum(squares[i:i+j]) + if sqrsum >= limit: + break + if is_palindrome(sqrsum): + palindromes.add(sqrsum) + +print sum(palindromes) + diff --git a/134.c b/134.c new file mode 100644 index 0000000..3f6ea32 --- /dev/null +++ b/134.c @@ -0,0 +1,59 @@ +#include "common.h" +#include + +// TODO: improve performance! not yet working on 32 bit systems + +unsigned int getmod(unsigned long p1) +{ + unsigned int mod = 1; + + if(p1 < 10) + mod = 10; + else if(p1 < 100) + mod = 100; + else if(p1 < 1000) + mod = 1000; + else if(p1 < 10000) + mod = 10000; + else if(p1 < 100000) + mod = 100000; + else if(p1 < 1000000) + mod = 1000000; + else + mod = 0; // should not occur and therefore result in division by zero + + return mod; +} + +unsigned long findn(unsigned long p1, unsigned long p2) +{ + unsigned int mod = getmod(p1); + unsigned long n = mod + p1; + while(n % p2 != 0) + n += mod; + + return n; +} + +int main(void) +{ + unsigned long* p = primes(1000020); + unsigned long pcount = p[0]; + unsigned long p1, p2, pos; + unsigned long long result = 0; + + for(pos=3; p[pos]<=1000000; pos++) + { + p1 = p[pos]; + p2 = p[pos+1]; + if(pos%1000==0) + printf("p1: %li\n", p1); + result += findn(p1, p2); + } + + printf("%li\n", result); + + free(p); + return 0; +} + diff --git a/187.c b/187.c new file mode 100644 index 0000000..4bee151 --- /dev/null +++ b/187.c @@ -0,0 +1,28 @@ +#include "common.h" +#include +#include + +const unsigned long limit = 100000000; + +int main(void) +{ + unsigned long* p = primes(limit/2); // sqrt(limit) + unsigned long pcount = p[0]; + unsigned long rcount = 0; + unsigned long i1, i2; + + for(i1=1; i1<=pcount; i1++) + for(i2=i1; i2<=pcount; i2++) + { + unsigned long long result = (unsigned long long) p[i1] * p[i2]; + if(result >= limit) + break; + rcount++; + } + + printf("%li\n", rcount); + + free(p); + return 0; +} + diff --git a/206.py b/206.py new file mode 100644 index 0000000..b3eddf4 --- /dev/null +++ b/206.py @@ -0,0 +1,24 @@ + +positions = (2,4,6,8,10,12,14) +result = "1_2_3_4_5_6_7_8_9_0" + +number = 1000000030 +state = True + +while number <= 3162277630: + number += 40 if state else 60 + state = not state + + found = True + + square = str(number**2) + for i in positions: + if square[i] != result[i]: + found = False + break + + if found: + break + +print number + diff --git a/common.c b/common.c new file mode 100644 index 0000000..69f87c5 --- /dev/null +++ b/common.c @@ -0,0 +1,154 @@ +#include +#include + +// returns list of primes up to limit; count stored in first element +extern unsigned long* primes(unsigned long limit) +{ + unsigned long i = 2; // start sieving with 2 + unsigned long pos, x; + char* numbers = (char*) malloc(limit*sizeof(char)); + unsigned long* primes; + unsigned long primecount = 0; + memset(numbers, 1, limit); + numbers[0] = 0; + + while(i*i <= limit) + { + // sieve current prime + x = i*i; + while(x <= limit) + { + numbers[x-1] = 0; + x += i; + } + + // search next prime + pos = i; + while(++pos <= limit) + { + if(numbers[pos-1] == 1) + break; + } + i = pos; + } + + // count primes + pos = 0; + while(++pos <= limit) + { + if(numbers[pos-1] == 1) + primecount++; + } + + // create list of primes + primes = (unsigned long*) malloc((primecount+1)*sizeof(unsigned long)); // store count at first element + primes[0] = primecount; + pos = 0; + x = 1; + while(++pos <= limit) + { + if(numbers[pos-1] == 1) + primes[x++] = pos; + } + + free(numbers); + return primes; +} + +extern int isprime(unsigned long number, const unsigned long* primes) +{ + unsigned long count = primes[0]; + unsigned long pos = count/2 + 1; + unsigned long dist = pos/2 + 1; + unsigned long minpos = 0, maxpos = count; + + if(number > primes[count] || number < 2) + return 0; + + // some kind of binary search... + while(1) + { + if(number > primes[pos]) + { + minpos = pos; + pos += dist; + } + else if(number < primes[pos]) + { + maxpos = pos; + pos -= dist; + } + else + return 1; + + dist /= 2; + + if(dist == 1) + { + while(++minpos <= maxpos) + if(primes[minpos] == number) + return 1; + break; + } + } + + return 0; +} + +extern unsigned long phi(unsigned long n, unsigned long* primelist) +{ + double product = (double) n; + unsigned long i; + + //if(isprime(n, primelist)) + // return n-1; + + for(i=1; i<=primelist[0]; i++) + { + unsigned long p = primelist[i]; + if(p > n) + break; + if(n % p != 0) + continue; + product *= (1 - 1.0/p); + } + return (unsigned long) product; +} + +extern int ispermutation(unsigned long a, unsigned long b) +{ + char digits1[10]; + char digits2[10]; + memset(digits1, 0, 10); + memset(digits2, 0, 10); + + while(a > 0 && b > 0) + { + char d1 = a % 10; + char d2 = b % 10; + digits1[d1]++; + digits2[d2]++; + a /= 10; + b /= 10; + } + + if(a > 0 || b > 0) + return 0; + + if(memcmp(digits1, digits2, 10) == 0) + return 1; + + return 0; +} + +/*int main() +{ + long* p = primes(10000); + //printf("%i\n", isprime(9973, p)); + int i; + for(i=0; i 0: + d.add(x % 10) + x /= 10 + return self.digits - d + + def numbers(self, r): + result = set() + result |= self.digits + for i in range(2, r): + new = set() + for x in result: + for y in self.missing(x): + new.add(x*10 + y) + result |= new + return result + +def ggt(a, b): # Stein's algorithm + k = 0 + t = 0 + while a&1==0 and b&1==0: + a = a>>1 + b = b>>1 + k += 1 + if a&1==1: + t = -b + else: + t = a + while t != 0: + while t&1==0: + t = t>>1 + if t>0: + a = t + else: + b = -t + t = a - b + return a*(1< 1: + return False + a += 1 + + if n <= r*r: + return True + + #for a in xrange(1, math.floor(math.sqrt(phi(r))*logn)): + # # TODO if math.pow(x+a, n) != + + return True + +def permutation(p, q): # checks whether p is a permuation of q + digits_p = [0]*10 + digits_q = [0]*10 + while p > 0: + digit = p % 10 + digits_p[digit] += 1 + p /= 10 + while q > 0: + digit = q % 10 + digits_q[digit] += 1 + q /= 10 + return digits_p == digits_q + diff --git a/src/projecteuler/001.py b/src/projecteuler/001.py deleted file mode 100644 index dd1cbc6..0000000 --- a/src/projecteuler/001.py +++ /dev/null @@ -1,7 +0,0 @@ -result = 0 - -for i in range(1,1000): - if i % 3 == 0 or i % 5 == 0: - result += i - -print result diff --git a/src/projecteuler/002.c b/src/projecteuler/002.c deleted file mode 100644 index 7a16a80..0000000 --- a/src/projecteuler/002.c +++ /dev/null @@ -1,20 +0,0 @@ -int main() -{ - int previous = 1, next = 2; - int sum = 0, tmp = 0; - - while(next <= 4000000) - { - if(!(next & 1)) - sum += next; - - tmp = next; - next += previous; - previous = tmp; - } - - printf("%ld\n", sum); - - return 0; -} - diff --git a/src/projecteuler/003.py b/src/projecteuler/003.py deleted file mode 100644 index c5b3036..0000000 --- a/src/projecteuler/003.py +++ /dev/null @@ -1,9 +0,0 @@ -number = 600851475143 - -i = 3 -while(i < number): - while(number % i == 0 and number != i): - number = number / i - i += 2 - -print number diff --git a/src/projecteuler/004.py b/src/projecteuler/004.py deleted file mode 100644 index c22b764..0000000 --- a/src/projecteuler/004.py +++ /dev/null @@ -1,23 +0,0 @@ -max = 0 - -def palindrom(number): - tmp = number - new = 0 - while(tmp > 0): - new *= 10 - new += tmp % 10 - tmp = tmp / 10 - - if new == number: - return True - else: - return False - - -for i in xrange(100,1000): - for j in xrange(100,1000): - if palindrom(i*j) and i*j > max: - max = i*j - -print max - diff --git a/src/projecteuler/005.py b/src/projecteuler/005.py deleted file mode 100644 index 8929956..0000000 --- a/src/projecteuler/005.py +++ /dev/null @@ -1,19 +0,0 @@ -divisors = [11, 12, 13, 14, 15, 16, 17, 18, 19] # only need to check those divisors - -def divisible(number): - result = True - for i in divisors: - if number % i != 0: - result = False - break - return result - -number = 20 - -while(True): - if divisible(number): - break - number += 20 - -print number - diff --git a/src/projecteuler/006.py b/src/projecteuler/006.py deleted file mode 100644 index 2010877..0000000 --- a/src/projecteuler/006.py +++ /dev/null @@ -1,13 +0,0 @@ -def sum_of_squares(limit): - result = 0 - for i in range(1, limit+1): - result += i*i - return result - -def square_of_sums(limit): - result = 0 - for i in range(1, limit+1): - result += i - return result*result - -print abs(sum_of_squares(100) - square_of_sums(100)) diff --git a/src/projecteuler/007.py b/src/projecteuler/007.py deleted file mode 100644 index 63d565a..0000000 --- a/src/projecteuler/007.py +++ /dev/null @@ -1,20 +0,0 @@ -prime_list = [2] - -def is_prime(number): - global prime_list - prime = True - for x in prime_list: - if number % x == 0: - prime = False - break - return prime - -count = 3 - -while(len(prime_list) < 10001): - if is_prime(count): - prime_list.append(count) - count += 2 - -print prime_list[-1] - diff --git a/src/projecteuler/008.py b/src/projecteuler/008.py deleted file mode 100644 index 002b958..0000000 --- a/src/projecteuler/008.py +++ /dev/null @@ -1,22 +0,0 @@ -number = 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 - -max = 0 - -while(number > 0): - tmp = number - digit1 = tmp % 10 - tmp = tmp / 10 - digit2 = tmp % 10 - tmp = tmp / 10 - digit3 = tmp % 10 - tmp = tmp / 10 - digit4 = tmp % 10 - tmp = tmp / 10 - digit5 = tmp % 10 - tmp = tmp / 10 - number = number / 10 - product = digit1 * digit2 * digit3 * digit4 * digit5 - if product > max: - max = product - -print max diff --git a/src/projecteuler/009.py b/src/projecteuler/009.py deleted file mode 100644 index f122a7a..0000000 --- a/src/projecteuler/009.py +++ /dev/null @@ -1,7 +0,0 @@ -for a in range(1,1000): - for b in range(a, 1000): - c = 1000 - a - b - if a*a + b*b == c*c: - print a*b*c - break - diff --git a/src/projecteuler/010.py b/src/projecteuler/010.py deleted file mode 100644 index 691c7a5..0000000 --- a/src/projecteuler/010.py +++ /dev/null @@ -1,33 +0,0 @@ -limit = 2000000 - -number_list = [False] + [True]*(limit-1) -list_len = len(number_list) - -def next_prime(i): - global number_list - global list_len - x = i+1 - while(x <= list_len): - if number_list[x-1] == True: - break - x += 1 - return x - -i = 2 - -while(i*i <= list_len): - x = i*i - while(x <= list_len): - number_list[x-1] = False - x += i - i = next_prime(i) - - -sum = 0 - -for i in xrange(1, limit+1): - if number_list[i-1]: - sum += i - -print sum - diff --git a/src/projecteuler/011.py b/src/projecteuler/011.py deleted file mode 100644 index 4fff9d4..0000000 --- a/src/projecteuler/011.py +++ /dev/null @@ -1,50 +0,0 @@ - -numbers = [] - -f = open('011.txt', 'r') -for line in f: - line.rstrip('\n') - line_str = line.split(' ') - line_int = [ int(x) for x in line_str ] - numbers.append(line_int) -f.close() - - -def find_down(): - max = 0 - for i in range(0, 17): - for j in range(0, 20): - product = numbers[i][j] * numbers[i+1][j] * numbers[i+2][j] * numbers[i+3][j] - if product > max: - max = product - return max - -def find_right(): - max = 0 - for i in range(0, 20): - for j in range(0, 17): - product = numbers[i][j] * numbers[i][j+1] * numbers[i][j+2] * numbers[i][j+3] - if product > max: - max = product - return max - -def find_diagonal1(): - max = 0 - for i in range(0, 17): - for j in range(0, 17): - product = numbers[i][j] * numbers[i+1][j+1] * numbers[i+2][j+2] * numbers[i+3][j+3] - if product > max: - max = product - return max - -def find_diagonal2(): - max = 0 - for i in range(0, 17): - for j in range(0, 17): - product = numbers[i][19-j] * numbers[i+1][18-j] * numbers[i+2][17-j] * numbers[i+3][16-j] - if product > max: - max = product - return max - -print max(find_down(), find_right(), find_diagonal1(), find_diagonal2()) - diff --git a/src/projecteuler/011.txt b/src/projecteuler/011.txt deleted file mode 100644 index 4ac2451..0000000 --- a/src/projecteuler/011.txt +++ /dev/null @@ -1,20 +0,0 @@ -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 diff --git a/src/projecteuler/012.c b/src/projecteuler/012.c deleted file mode 100644 index c5cc49e..0000000 --- a/src/projecteuler/012.c +++ /dev/null @@ -1,37 +0,0 @@ -#include - -int count_divisors(unsigned int triangle) -{ - unsigned int i; - int count = 2; - int limit = (int) ceil(sqrt(triangle)); - for(i=2; i max_len: - max_start = i - max_len = len - -print max_start - diff --git a/src/projecteuler/015.py b/src/projecteuler/015.py deleted file mode 100644 index 749be04..0000000 --- a/src/projecteuler/015.py +++ /dev/null @@ -1,29 +0,0 @@ - -size = 20 - -field = [ [ 1 for i in range(0, size+1) ] for i in range(0, size+1) ] - -for i in xrange(1, size+1): - for j in xrange(1, size+1): - field[i][j] = field[i][j-1] + field[i-1][j] - -print field[size][size] - - -# -# recursive solution. too slow -# -#def count_path(width, height): -# if width == 0 and height == 0: -# return 1 -# -# count = 0 -# if width > 0: # go right -# count += count_path(width-1, height) -# if height > 0: # go down -# count += count_path(width, height-1) -# -# return count -# -#print count_path(20, 20) - diff --git a/src/projecteuler/016.py b/src/projecteuler/016.py deleted file mode 100644 index d83451e..0000000 --- a/src/projecteuler/016.py +++ /dev/null @@ -1,9 +0,0 @@ -number = 1 << 1000 - -sum = 0 - -while(number > 0): - sum += number % 10 - number = number / 10 - -print sum diff --git a/src/projecteuler/017.py b/src/projecteuler/017.py deleted file mode 100644 index 8bb95cf..0000000 --- a/src/projecteuler/017.py +++ /dev/null @@ -1,31 +0,0 @@ -n1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] -n2 = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"] -n3 = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] -n4 = ["hundred"] -n5 = ["thousand"] - -numbers = "" -for i in range(1, 1001): - current = "" - - if (i % 10000) / 1000 > 0: - current += n1[(i%10000)/1000] + n5[0] - if i % 1000 > 0: - current += "and" - - if (i % 1000) / 100 > 0: - current += n1[(i%1000)/100] + n4[0] - if i % 100 > 0: - current += "and" - - if i % 100 <= 9: - current += n1[i%10] - elif i % 100 <= 19: - current += n2[(i%10)-10] - else: - current += n3[(i%100)/10-2] + n1[i%10] - - numbers += current - -print len(numbers) - diff --git a/src/projecteuler/018.py b/src/projecteuler/018.py deleted file mode 100644 index d54d14c..0000000 --- a/src/projecteuler/018.py +++ /dev/null @@ -1,20 +0,0 @@ - -triangle = [] - -f = open('018.txt', 'r') -for line in f: - line.rstrip('\n') - row_str = line.split(' ') - row_int = [ int(x) for x in row_str ] - triangle.append(row_int) -f.close() - -for i in range(1, len(triangle)): - rowlen = len(triangle[i]) - triangle[i][0] += triangle[i-1][0] - triangle[i][rowlen-1] += triangle[i-1][rowlen-2] - for j in range(1, rowlen-1): - triangle[i][j] += max(triangle[i-1][j-1], triangle[i-1][j]) - -print max(triangle[-1]) - diff --git a/src/projecteuler/018.txt b/src/projecteuler/018.txt deleted file mode 100644 index e236c2f..0000000 --- a/src/projecteuler/018.txt +++ /dev/null @@ -1,15 +0,0 @@ -75 -95 64 -17 47 82 -18 35 87 10 -20 04 82 47 65 -19 01 23 75 03 34 -88 02 77 73 07 63 67 -99 65 04 28 06 16 70 92 -41 41 26 56 83 40 80 70 33 -41 48 72 33 47 32 37 16 94 29 -53 71 44 65 25 43 91 52 97 51 14 -70 11 33 28 77 73 17 78 39 68 17 57 -91 71 52 38 17 14 91 43 58 50 27 29 48 -63 66 04 68 89 53 67 30 73 16 69 87 40 31 -04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 diff --git a/src/projecteuler/019.py b/src/projecteuler/019.py deleted file mode 100644 index 187b45e..0000000 --- a/src/projecteuler/019.py +++ /dev/null @@ -1,17 +0,0 @@ -days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] - -day = 7 # first sunday in 1900 -count = 0 - -for year in range(1900, 2001): - for month in range(1, 13): - if day == 1 and year >= 1901: - count += 1 - if month == 2 and year % 4 == 0: - day -= 1 - while(day <= days[month-1]): - day += 7 - day -= days[month-1] - -print count - diff --git a/src/projecteuler/020.py b/src/projecteuler/020.py deleted file mode 100644 index 451d614..0000000 --- a/src/projecteuler/020.py +++ /dev/null @@ -1,16 +0,0 @@ -def fac(limit): - result = 1 - for i in range(1, limit+1): - result *= i - return result - -number = fac(100) - -sum = 0 - -while(number > 0): - sum += number % 10 - number = number / 10 - -print sum - diff --git a/src/projecteuler/021.c b/src/projecteuler/021.c deleted file mode 100644 index e236cf3..0000000 --- a/src/projecteuler/021.c +++ /dev/null @@ -1,35 +0,0 @@ -#include - -int sum_divisors(int number) -{ - int i; - int sum = 1; - int limit = (int) ceil(sqrt(number)); - for(i=2; i n: - return True - else: - return False - -def sum_abundant(n): - for i in numbers: - if n-i in numbers: - return True - return False - - -for n in xrange(2, limit+1): - if abundant(n): - numbers.add(n) - -sum = 0 - -for n in xrange(limit+1): - if not sum_abundant(n): - sum += n - -print sum - diff --git a/src/projecteuler/024.py b/src/projecteuler/024.py deleted file mode 100644 index 47546a5..0000000 --- a/src/projecteuler/024.py +++ /dev/null @@ -1,24 +0,0 @@ - -import sys - -digits = [ x for x in range(0, 10) ] - -limit = 1000000 - -count = 0 - -def permutate(start, end): - global permutations, count - if len(end) == 1: - count += 1 - if count == limit: - print start+end - sys.exit(0) - return - for i in range(0, len(end)): - s = start + [end[i]] - e = end[:i] + end[i+1:] - permutate(s, e) - -permutate([], digits) - diff --git a/src/projecteuler/025.py b/src/projecteuler/025.py deleted file mode 100644 index b69bddc..0000000 --- a/src/projecteuler/025.py +++ /dev/null @@ -1,19 +0,0 @@ -import math - -def digits(number): - return math.ceil(math.log10(number+1)) - -prev = 1 -next = 1 -count = 2 - -while(True): - if(digits(next) >= 1000): - break - tmp = next - next += prev - prev = tmp - count += 1 - -print count - diff --git a/src/projecteuler/026.py b/src/projecteuler/026.py deleted file mode 100644 index 0ddd85a..0000000 --- a/src/projecteuler/026.py +++ /dev/null @@ -1,33 +0,0 @@ - -def get_cycle(d): - remainders = [] - x = 1 - while x > 0: - if x < d: - x *= 10 - continue - - z = x / d - x = (x % d) * 10 - if x in remainders: # cycle detected - pos = 0 - for i in range(len(remainders)): - if remainders[i] == x: - return len(remainders) - i - break - remainders += [x] - - return 0 # no cycle - - -max_remainder = 0 -result = 0 - -for i in range(1, 1000): - r = get_cycle(i) - if r > max_remainder: - max_remainder = r - result = i - -print result - diff --git a/src/projecteuler/027.py b/src/projecteuler/027.py deleted file mode 100644 index 563d6af..0000000 --- a/src/projecteuler/027.py +++ /dev/null @@ -1,25 +0,0 @@ -from common import sieve - -primes = sieve(10000).primes() - -def count_primes(a, b): - n = 0 - while True: - p = n**2 + a*n + b - if p not in primes: - break - n += 1 - return n - -max_count = 0 -max_pair = (0, 0) - -for a in xrange(-999, 1000): - for b in xrange(-999, 1000): - c = count_primes(a, b) - if c > max_count: - max_count = c - max_pair = (a, b) - -print max_pair[0] * max_pair[1] - diff --git a/src/projecteuler/028.py b/src/projecteuler/028.py deleted file mode 100644 index 3ec1ff5..0000000 --- a/src/projecteuler/028.py +++ /dev/null @@ -1,13 +0,0 @@ - -width = 1001 -max_level = (width-1)/2 - -last = sum = 1 - -for level in range(1, max_level+1): - add = 2*level - sum += (last+add) + (last+2*add) + (last+3*add) + (last+4*add) - last = last+4*add - -print sum - diff --git a/src/projecteuler/029.py b/src/projecteuler/029.py deleted file mode 100644 index 0740911..0000000 --- a/src/projecteuler/029.py +++ /dev/null @@ -1,9 +0,0 @@ - -x = [] - -for i in range(2, 101): - for j in range(2, 101): - x.append(i**j) - -print len(set(x)) - diff --git a/src/projecteuler/030.c b/src/projecteuler/030.c deleted file mode 100644 index 5d044e9..0000000 --- a/src/projecteuler/030.c +++ /dev/null @@ -1,41 +0,0 @@ - -int digit_sum(int number) -{ - int sum = 0; - int digit; - int n = number; - - while(n > 0) - { - digit = n % 10; - sum += digit*digit*digit*digit*digit; - n = n / 10; - } - - if(number == sum) - return 1; - else - return 0; -} - -int main() -{ - int start = 10; - int end = 354294; // 9^5 * 6 - int sum = 0; - int i; - - for(i=start; i - -/* - * much faster than python version, though less optimized... - * - * to filter out duplicates and add numbers: - * $ ./032 | sort -u | tr "\n" "+" | sed 's/+$/\n/' | bc - * - */ - -int is_pandigital(long int a, long int b, long int c) -{ - char digits[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - char digit; - int i; - - while(a > 0) - { - digit = a % 10; - if(digit == 0 || digits[digit]++) - return 0; - a /= 10; - } - while(b > 0) - { - digit = b % 10; - if(digit == 0 || digits[digit]++) - return 0; - b /= 10; - } - while(c > 0) - { - digit = c % 10; - if(digit == 0 || digits[digit]++) - return 0; - c /= 10; - } - - for(i=1; i<10; i++) - if(digits[i] != 1) - return 0; - return 1; -} - -int main(void) -{ - long int limit = 10000; - long int a, b, c; - for(a=2; a limit) - break; - if(is_pandigital(a, b, c)) - printf("%ld\n", c); - } - } - - return 0; -} - diff --git a/src/projecteuler/032.py b/src/projecteuler/032.py deleted file mode 100644 index 0958625..0000000 --- a/src/projecteuler/032.py +++ /dev/null @@ -1,43 +0,0 @@ - -from common import pandigital - -pandigital = pandigital(9).numbers(5) -pandigital.remove(1) - -def is_pandigital(a, b, c): - d = [0]*10 - while a > 0: - digit = a % 10 - if d[digit] > 0: - return False - d[digit] += 1 - a /= 10 - while b > 0: - digit = b % 10 - if d[digit] > 0: - return False - d[digit] += 1 - b /= 10 - while c > 0: - digit = c % 10 - if d[digit] > 0: - return False - d[digit] += 1 - c /= 10 - return d[1:] == [1]*9 - -products = set() - -for a in pandigital: - for b in pandigital: - c = a * b - if c in pandigital and is_pandigital(a, b, c): - #print str(a), "*", str(b), "=", str(c) - products.add(c) - -sum = 0 -for p in products: - sum += p - -print sum - diff --git a/src/projecteuler/033.c b/src/projecteuler/033.c deleted file mode 100644 index 61a7ffd..0000000 --- a/src/projecteuler/033.c +++ /dev/null @@ -1,59 +0,0 @@ - -int curious_fraction(int a, int b) -{ - int a1 = a/10; - int a2 = a%10; - int b1 = b/10; - int b2 = b%10; - - float result = 1.0*a/b; - - if(a2 == 0) - return 0; - - if(a1 == b1) - { - float result2 = 1.0*a2/b2; - if(result == result2) - return 1; - } - - if(a1 == b2) - { - float result2 = 1.0*a2/b1; - if(result == result2) - return 1; - } - - if(a2 == b1) - { - float result2 = 1.0*a1/b2; - if(result == result2) - return 1; - } - - if(a2 == b2) - { - float result2 = 1.0*a1/b1; - if(result == result2) - return 1; - } - - return 0; -} - -int main() -{ - int a, b; - float product = 1.0; - - for(a=10; a<100; a++) - for(b=a+1; b<100; b++) - if(curious_fraction(a, b)) - product *= 1.0*a/b; - - printf("%d\n", (int)(1/product)); - - return 0; -} - diff --git a/src/projecteuler/033.py b/src/projecteuler/033.py deleted file mode 100644 index 9575983..0000000 --- a/src/projecteuler/033.py +++ /dev/null @@ -1,34 +0,0 @@ -def curious_fraction(a, b): - a1 = a/10 - a2 = a%10 - b1 = b/10 - b2 = b%10 - - result = 1.0*a/b; - - if a2 == 0 or b2 == 0: - return False - - if a1 == b1 and 1.0*a2/b2 == result: - return True - - if a1 == b2 and 1.0*a2/b1 == result: - return True - - if a2 == b1 and 1.0*a1/b2 == result: - return True - - if a2 == b2 and 1.0*a1/b1 == result: - return True - - return False - -product = 1.0 - -for a in range(10, 100): - for b in range(a+1, 100): - if curious_fraction(a, b): - product *= 1.0*a/b - -print int(1/product) - diff --git a/src/projecteuler/034.py b/src/projecteuler/034.py deleted file mode 100644 index 505a987..0000000 --- a/src/projecteuler/034.py +++ /dev/null @@ -1,27 +0,0 @@ -def fac(limit): - result = 1 - for i in range(1, limit+1): - result *= i - return result - - -facs = [ fac(i) for i in range(0, 10) ] - -def facsum(number): - global facs - sum = 0 - while number > 0: - digit = number % 10 - sum += facs[digit] - number = number / 10 - return sum - - -sum = 0 - -for i in xrange(10, 2540160): - if facsum(i) == i: - sum += i - -print sum - diff --git a/src/projecteuler/035.py b/src/projecteuler/035.py deleted file mode 100644 index 8f00da8..0000000 --- a/src/projecteuler/035.py +++ /dev/null @@ -1,33 +0,0 @@ -def circular_prime(number): - global number_list - result = True - number_str = str(number) - for i in range(1, len(number_str)): - rotated_str = number_str[i:] + number_str[:i] - rotated_nr = int(rotated_str) - if not number_list[rotated_nr-1]: - result = False - break - return result - - -limit = 1000000 - -number_list = [False] -for i in range(2, limit+1): - number_list.append(True) - -for i in range(2, limit+1): - x = i*2 - while(x <= len(number_list)): - number_list[x-1] = False - x += i - -count = 0 - -for i in range(1, limit+1): - if number_list[i-1] and circular_prime(i): - count += 1 - -print count - diff --git a/src/projecteuler/036.py b/src/projecteuler/036.py deleted file mode 100644 index bf800da..0000000 --- a/src/projecteuler/036.py +++ /dev/null @@ -1,40 +0,0 @@ - -binary = [ 2**x for x in range(20) ][::-1] - -def palindromic_decimal(n): - if n == int(str(n)[::-1]): - return True - return False - - -def dec2bin(n): - res = "" - for i in binary: - if n - i > 0 or n == i: - res += "1" - n -= i - else: - if len(res) > 0: # do not add leading 0s - res += "0" - return res - -def bin2dec(n): - res = 0 - for i in range(1, len(n)+1): - if n[-i] == "1": - res += binary[-i] - return res - -def palindromic_binary(n): - if n == bin2dec(dec2bin(n)[::-1]): - return True - return False - -sum = 0 - -for n in xrange(1000000): - if palindromic_decimal(n) and palindromic_binary(n): - sum += n - -print sum - diff --git a/src/projecteuler/037.py b/src/projecteuler/037.py deleted file mode 100644 index 5e506c2..0000000 --- a/src/projecteuler/037.py +++ /dev/null @@ -1,61 +0,0 @@ - -limit = 800000 - -number_list = [False] + [True]*(limit-1) -list_len = len(number_list) - -def next_prime(i): - global number_list - global list_len - x = i+1 - while(x <= list_len): - if number_list[x-1] == True: - break - x += 1 - return x - -i = 2 - -while(i*i <= list_len): - x = i*i - while(x <= list_len): - number_list[x-1] = False - x += i - i = next_prime(i) - - -primes = set() - -for i in xrange(1, limit+1): - if number_list[i-1]: - primes.add(i) - - -def truncatable(n): - # right truncatable - tmp = n/10 - while tmp > 0: - if not tmp in primes: - return False - tmp = tmp / 10 - - # left truncatable - tmp = n - modulo = 10**14 - while tmp > 0: - if not tmp in primes: - return False - modulo = modulo / 10 - tmp = tmp % modulo - - return True - - -result = [] - -for p in primes: - if truncatable(p) and p not in (2, 3, 5, 7): - result += [p] - -print sum(result) - diff --git a/src/projecteuler/038.py b/src/projecteuler/038.py deleted file mode 100644 index bc43644..0000000 --- a/src/projecteuler/038.py +++ /dev/null @@ -1,43 +0,0 @@ - -def is_pandigital(x): - digits = 10*[0] - - while x > 0: - digit = x % 10 - if digit == 0: - return False - digits[digit] += 1 - x /= 10 - - for i in range(1, 10): - if digits[i] != 1: - return False - - return True - - -def pandigital(x): - result = str(x * 1) - count = 1 - - while len(result) < 9: - count += 1 - result += str(x * count) - - if len(result) > 9: - return 0 - - if is_pandigital(int(result)): - return int(result) - - return 0 - -max_pd = 0 -for i in xrange(9876): - p = pandigital(i) - if p > max_pd: - max_pd = p - i += 1 - -print max_pd - diff --git a/src/projecteuler/039.c b/src/projecteuler/039.c deleted file mode 100644 index 202df6c..0000000 --- a/src/projecteuler/039.c +++ /dev/null @@ -1,37 +0,0 @@ - -int solutions(int p) -{ - int solution = 0; - int a, b, c; - - for(a=0; a

max_solutions) - { - max_solutions = n; - max_p = p; - } - } - - printf("%d\n", max_p); - - return 0; -} - diff --git a/src/projecteuler/039.py b/src/projecteuler/039.py deleted file mode 100644 index 6a6bd0b..0000000 --- a/src/projecteuler/039.py +++ /dev/null @@ -1,21 +0,0 @@ - -def solutions(p): - solution = 0 - for a in xrange(1, p/2): - for b in xrange(a, p-a): - c = p - a - b - if a*a + b*b == c*c: - solution += 1 - return solution - -max_solutions = 0 -max_p = 0 - -for p in xrange(3, 1000): - n = solutions(p) - if n > max_solutions: - max_solutions = n - max_p = p - -print max_p - diff --git a/src/projecteuler/040.py b/src/projecteuler/040.py deleted file mode 100644 index 6f20325..0000000 --- a/src/projecteuler/040.py +++ /dev/null @@ -1,34 +0,0 @@ - -# liefert zurueck an welcher Stelle die x-stelligen Zahlen beginnen -def begin(x): - stelle = 1 - for i in range(1, x): - stelle += 9 * (10**(i-1)) * i - return stelle - - -def stelle(pos): - n = 0 - i = 0 - # suche nach Anfang der x-stelligen Region in der pos liegt - while n <= pos: - i += 1 - n = begin(i) - - stellen = i-1 - startpos = begin(stellen) - startvalue = 10**(stellen-1) - diff = pos - startpos - zahl = startvalue + diff/stellen - result = (zahl / (10**(stellen-(diff%stellen)-1))) % 10 - - return result - - -product = 1 - -for i in range(0, 7): - product *= stelle(10**i) - -print product - diff --git a/src/projecteuler/041.py b/src/projecteuler/041.py deleted file mode 100644 index 04a6272..0000000 --- a/src/projecteuler/041.py +++ /dev/null @@ -1,26 +0,0 @@ -from common import pandigital, sieve - -primes = list(sieve(10**6).primes()) -numbers = [x for x in pandigital(1, 9).numbers(10) if x > 10**8] -numbers += [x for x in pandigital(1, 8).numbers(10) if x > 10**7] -numbers += [x for x in pandigital(1, 7).numbers(10) if x > 10**6] -numbers += [x for x in pandigital(1, 6).numbers(10) if x > 10**5] -numbers += [x for x in pandigital(1, 5).numbers(10) if x > 10**4] -numbers += [x for x in pandigital(1, 4).numbers(10) if x > 10**3] -numbers += [x for x in pandigital(1, 3).numbers(10) if x > 10**2] -numbers += [x for x in pandigital(1, 2).numbers(10) if x > 10**1] - -numbers.sort(reverse=True) - -# check for divisibility up to sqrt(n), as sieve requires too much memory -def is_prime(n): - for p in primes: - if n % p == 0: - return False - return True - -for n in numbers: - if is_prime(n): - print n - break - diff --git a/src/projecteuler/042.py b/src/projecteuler/042.py deleted file mode 100644 index 46f08fa..0000000 --- a/src/projecteuler/042.py +++ /dev/null @@ -1,18 +0,0 @@ -def score(name): - sum = 0 - for char in name: - sum += ord(char) - 64 - return sum - -triangle_numbers = [ int(0.5*n*(n-1)) for n in range(2, 200) ] -count = 0 - -f = open('042.txt', 'r') -for word in f: - word = word.rstrip("\n") - if score(word) in triangle_numbers: - count += 1 -f.close() - -print count - diff --git a/src/projecteuler/042.txt b/src/projecteuler/042.txt deleted file mode 100644 index 124e8b6..0000000 --- a/src/projecteuler/042.txt +++ /dev/null @@ -1,1786 +0,0 @@ -A -ABILITY -ABLE -ABOUT -ABOVE -ABSENCE -ABSOLUTELY -ACADEMIC -ACCEPT -ACCESS -ACCIDENT -ACCOMPANY -ACCORDING -ACCOUNT -ACHIEVE -ACHIEVEMENT -ACID -ACQUIRE -ACROSS -ACT -ACTION -ACTIVE -ACTIVITY -ACTUAL -ACTUALLY -ADD -ADDITION -ADDITIONAL -ADDRESS -ADMINISTRATION -ADMIT -ADOPT -ADULT -ADVANCE -ADVANTAGE -ADVICE -ADVISE -AFFAIR -AFFECT -AFFORD -AFRAID -AFTER -AFTERNOON -AFTERWARDS -AGAIN -AGAINST -AGE -AGENCY -AGENT -AGO -AGREE -AGREEMENT -AHEAD -AID -AIM -AIR -AIRCRAFT -ALL -ALLOW -ALMOST -ALONE -ALONG -ALREADY -ALRIGHT -ALSO -ALTERNATIVE -ALTHOUGH -ALWAYS -AMONG -AMONGST -AMOUNT -AN -ANALYSIS -ANCIENT -AND -ANIMAL -ANNOUNCE -ANNUAL -ANOTHER -ANSWER -ANY -ANYBODY -ANYONE -ANYTHING -ANYWAY -APART -APPARENT -APPARENTLY -APPEAL -APPEAR -APPEARANCE -APPLICATION -APPLY -APPOINT -APPOINTMENT -APPROACH -APPROPRIATE -APPROVE -AREA -ARGUE -ARGUMENT -ARISE -ARM -ARMY -AROUND -ARRANGE -ARRANGEMENT -ARRIVE -ART -ARTICLE -ARTIST -AS -ASK -ASPECT -ASSEMBLY -ASSESS -ASSESSMENT -ASSET -ASSOCIATE -ASSOCIATION -ASSUME -ASSUMPTION -AT -ATMOSPHERE -ATTACH -ATTACK -ATTEMPT -ATTEND -ATTENTION -ATTITUDE -ATTRACT -ATTRACTIVE -AUDIENCE -AUTHOR -AUTHORITY -AVAILABLE -AVERAGE -AVOID -AWARD -AWARE -AWAY -AYE -BABY -BACK -BACKGROUND -BAD -BAG -BALANCE -BALL -BAND -BANK -BAR -BASE -BASIC -BASIS -BATTLE -BE -BEAR -BEAT -BEAUTIFUL -BECAUSE -BECOME -BED -BEDROOM -BEFORE -BEGIN -BEGINNING -BEHAVIOUR -BEHIND -BELIEF -BELIEVE -BELONG -BELOW -BENEATH -BENEFIT -BESIDE -BEST -BETTER -BETWEEN -BEYOND -BIG -BILL -BIND -BIRD -BIRTH -BIT -BLACK -BLOCK -BLOOD -BLOODY -BLOW -BLUE -BOARD -BOAT -BODY -BONE -BOOK -BORDER -BOTH -BOTTLE -BOTTOM -BOX -BOY -BRAIN -BRANCH -BREAK -BREATH -BRIDGE -BRIEF -BRIGHT -BRING -BROAD -BROTHER -BUDGET -BUILD -BUILDING -BURN -BUS -BUSINESS -BUSY -BUT -BUY -BY -CABINET -CALL -CAMPAIGN -CAN -CANDIDATE -CAPABLE -CAPACITY -CAPITAL -CAR -CARD -CARE -CAREER -CAREFUL -CAREFULLY -CARRY -CASE -CASH -CAT -CATCH -CATEGORY -CAUSE -CELL -CENTRAL -CENTRE -CENTURY -CERTAIN -CERTAINLY -CHAIN -CHAIR -CHAIRMAN -CHALLENGE -CHANCE -CHANGE -CHANNEL -CHAPTER -CHARACTER -CHARACTERISTIC -CHARGE -CHEAP -CHECK -CHEMICAL -CHIEF -CHILD -CHOICE -CHOOSE -CHURCH -CIRCLE -CIRCUMSTANCE -CITIZEN -CITY -CIVIL -CLAIM -CLASS -CLEAN -CLEAR -CLEARLY -CLIENT -CLIMB -CLOSE -CLOSELY -CLOTHES -CLUB -COAL -CODE -COFFEE -COLD -COLLEAGUE -COLLECT -COLLECTION -COLLEGE -COLOUR -COMBINATION -COMBINE -COME -COMMENT -COMMERCIAL -COMMISSION -COMMIT -COMMITMENT -COMMITTEE -COMMON -COMMUNICATION -COMMUNITY -COMPANY -COMPARE -COMPARISON -COMPETITION -COMPLETE -COMPLETELY -COMPLEX -COMPONENT -COMPUTER -CONCENTRATE -CONCENTRATION -CONCEPT -CONCERN -CONCERNED -CONCLUDE -CONCLUSION -CONDITION -CONDUCT -CONFERENCE -CONFIDENCE -CONFIRM -CONFLICT -CONGRESS -CONNECT -CONNECTION -CONSEQUENCE -CONSERVATIVE -CONSIDER -CONSIDERABLE -CONSIDERATION -CONSIST -CONSTANT -CONSTRUCTION -CONSUMER -CONTACT -CONTAIN -CONTENT -CONTEXT -CONTINUE -CONTRACT -CONTRAST -CONTRIBUTE -CONTRIBUTION -CONTROL -CONVENTION -CONVERSATION -COPY -CORNER -CORPORATE -CORRECT -COS -COST -COULD -COUNCIL -COUNT -COUNTRY -COUNTY -COUPLE -COURSE -COURT -COVER -CREATE -CREATION -CREDIT -CRIME -CRIMINAL -CRISIS -CRITERION -CRITICAL -CRITICISM -CROSS -CROWD -CRY -CULTURAL -CULTURE -CUP -CURRENT -CURRENTLY -CURRICULUM -CUSTOMER -CUT -DAMAGE -DANGER -DANGEROUS -DARK -DATA -DATE -DAUGHTER -DAY -DEAD -DEAL -DEATH -DEBATE -DEBT -DECADE -DECIDE -DECISION -DECLARE -DEEP -DEFENCE -DEFENDANT -DEFINE -DEFINITION -DEGREE -DELIVER -DEMAND -DEMOCRATIC -DEMONSTRATE -DENY -DEPARTMENT -DEPEND -DEPUTY -DERIVE -DESCRIBE -DESCRIPTION -DESIGN -DESIRE -DESK -DESPITE -DESTROY -DETAIL -DETAILED -DETERMINE -DEVELOP -DEVELOPMENT -DEVICE -DIE -DIFFERENCE -DIFFERENT -DIFFICULT -DIFFICULTY -DINNER -DIRECT -DIRECTION -DIRECTLY -DIRECTOR -DISAPPEAR -DISCIPLINE -DISCOVER -DISCUSS -DISCUSSION -DISEASE -DISPLAY -DISTANCE -DISTINCTION -DISTRIBUTION -DISTRICT -DIVIDE -DIVISION -DO -DOCTOR -DOCUMENT -DOG -DOMESTIC -DOOR -DOUBLE -DOUBT -DOWN -DRAW -DRAWING -DREAM -DRESS -DRINK -DRIVE -DRIVER -DROP -DRUG -DRY -DUE -DURING -DUTY -EACH -EAR -EARLY -EARN -EARTH -EASILY -EAST -EASY -EAT -ECONOMIC -ECONOMY -EDGE -EDITOR -EDUCATION -EDUCATIONAL -EFFECT -EFFECTIVE -EFFECTIVELY -EFFORT -EGG -EITHER -ELDERLY -ELECTION -ELEMENT -ELSE -ELSEWHERE -EMERGE -EMPHASIS -EMPLOY -EMPLOYEE -EMPLOYER -EMPLOYMENT -EMPTY -ENABLE -ENCOURAGE -END -ENEMY -ENERGY -ENGINE -ENGINEERING -ENJOY -ENOUGH -ENSURE -ENTER -ENTERPRISE -ENTIRE -ENTIRELY -ENTITLE -ENTRY -ENVIRONMENT -ENVIRONMENTAL -EQUAL -EQUALLY -EQUIPMENT -ERROR -ESCAPE -ESPECIALLY -ESSENTIAL -ESTABLISH -ESTABLISHMENT -ESTATE -ESTIMATE -EVEN -EVENING -EVENT -EVENTUALLY -EVER -EVERY -EVERYBODY -EVERYONE -EVERYTHING -EVIDENCE -EXACTLY -EXAMINATION -EXAMINE -EXAMPLE -EXCELLENT -EXCEPT -EXCHANGE -EXECUTIVE -EXERCISE -EXHIBITION -EXIST -EXISTENCE -EXISTING -EXPECT -EXPECTATION -EXPENDITURE -EXPENSE -EXPENSIVE -EXPERIENCE -EXPERIMENT -EXPERT -EXPLAIN -EXPLANATION -EXPLORE -EXPRESS -EXPRESSION -EXTEND -EXTENT -EXTERNAL -EXTRA -EXTREMELY -EYE -FACE -FACILITY -FACT -FACTOR -FACTORY -FAIL -FAILURE -FAIR -FAIRLY -FAITH -FALL -FAMILIAR -FAMILY -FAMOUS -FAR -FARM -FARMER -FASHION -FAST -FATHER -FAVOUR -FEAR -FEATURE -FEE -FEEL -FEELING -FEMALE -FEW -FIELD -FIGHT -FIGURE -FILE -FILL -FILM -FINAL -FINALLY -FINANCE -FINANCIAL -FIND -FINDING -FINE -FINGER -FINISH -FIRE -FIRM -FIRST -FISH -FIT -FIX -FLAT -FLIGHT -FLOOR -FLOW -FLOWER -FLY -FOCUS -FOLLOW -FOLLOWING -FOOD -FOOT -FOOTBALL -FOR -FORCE -FOREIGN -FOREST -FORGET -FORM -FORMAL -FORMER -FORWARD -FOUNDATION -FREE -FREEDOM -FREQUENTLY -FRESH -FRIEND -FROM -FRONT -FRUIT -FUEL -FULL -FULLY -FUNCTION -FUND -FUNNY -FURTHER -FUTURE -GAIN -GAME -GARDEN -GAS -GATE -GATHER -GENERAL -GENERALLY -GENERATE -GENERATION -GENTLEMAN -GET -GIRL -GIVE -GLASS -GO -GOAL -GOD -GOLD -GOOD -GOVERNMENT -GRANT -GREAT -GREEN -GREY -GROUND -GROUP -GROW -GROWING -GROWTH -GUEST -GUIDE -GUN -HAIR -HALF -HALL -HAND -HANDLE -HANG -HAPPEN -HAPPY -HARD -HARDLY -HATE -HAVE -HE -HEAD -HEALTH -HEAR -HEART -HEAT -HEAVY -HELL -HELP -HENCE -HER -HERE -HERSELF -HIDE -HIGH -HIGHLY -HILL -HIM -HIMSELF -HIS -HISTORICAL -HISTORY -HIT -HOLD -HOLE -HOLIDAY -HOME -HOPE -HORSE -HOSPITAL -HOT -HOTEL -HOUR -HOUSE -HOUSEHOLD -HOUSING -HOW -HOWEVER -HUGE -HUMAN -HURT -HUSBAND -I -IDEA -IDENTIFY -IF -IGNORE -ILLUSTRATE -IMAGE -IMAGINE -IMMEDIATE -IMMEDIATELY -IMPACT -IMPLICATION -IMPLY -IMPORTANCE -IMPORTANT -IMPOSE -IMPOSSIBLE -IMPRESSION -IMPROVE -IMPROVEMENT -IN -INCIDENT -INCLUDE -INCLUDING -INCOME -INCREASE -INCREASED -INCREASINGLY -INDEED -INDEPENDENT -INDEX -INDICATE -INDIVIDUAL -INDUSTRIAL -INDUSTRY -INFLUENCE -INFORM -INFORMATION -INITIAL -INITIATIVE -INJURY -INSIDE -INSIST -INSTANCE -INSTEAD -INSTITUTE -INSTITUTION -INSTRUCTION -INSTRUMENT -INSURANCE -INTEND -INTENTION -INTEREST -INTERESTED -INTERESTING -INTERNAL -INTERNATIONAL -INTERPRETATION -INTERVIEW -INTO -INTRODUCE -INTRODUCTION -INVESTIGATE -INVESTIGATION -INVESTMENT -INVITE -INVOLVE -IRON -IS -ISLAND -ISSUE -IT -ITEM -ITS -ITSELF -JOB -JOIN -JOINT -JOURNEY -JUDGE -JUMP -JUST -JUSTICE -KEEP -KEY -KID -KILL -KIND -KING -KITCHEN -KNEE -KNOW -KNOWLEDGE -LABOUR -LACK -LADY -LAND -LANGUAGE -LARGE -LARGELY -LAST -LATE -LATER -LATTER -LAUGH -LAUNCH -LAW -LAWYER -LAY -LEAD -LEADER -LEADERSHIP -LEADING -LEAF -LEAGUE -LEAN -LEARN -LEAST -LEAVE -LEFT -LEG -LEGAL -LEGISLATION -LENGTH -LESS -LET -LETTER -LEVEL -LIABILITY -LIBERAL -LIBRARY -LIE -LIFE -LIFT -LIGHT -LIKE -LIKELY -LIMIT -LIMITED -LINE -LINK -LIP -LIST -LISTEN -LITERATURE -LITTLE -LIVE -LIVING -LOAN -LOCAL -LOCATION -LONG -LOOK -LORD -LOSE -LOSS -LOT -LOVE -LOVELY -LOW -LUNCH -MACHINE -MAGAZINE -MAIN -MAINLY -MAINTAIN -MAJOR -MAJORITY -MAKE -MALE -MAN -MANAGE -MANAGEMENT -MANAGER -MANNER -MANY -MAP -MARK -MARKET -MARRIAGE -MARRIED -MARRY -MASS -MASTER -MATCH -MATERIAL -MATTER -MAY -MAYBE -ME -MEAL -MEAN -MEANING -MEANS -MEANWHILE -MEASURE -MECHANISM -MEDIA -MEDICAL -MEET -MEETING -MEMBER -MEMBERSHIP -MEMORY -MENTAL -MENTION -MERELY -MESSAGE -METAL -METHOD -MIDDLE -MIGHT -MILE -MILITARY -MILK -MIND -MINE -MINISTER -MINISTRY -MINUTE -MISS -MISTAKE -MODEL -MODERN -MODULE -MOMENT -MONEY -MONTH -MORE -MORNING -MOST -MOTHER -MOTION -MOTOR -MOUNTAIN -MOUTH -MOVE -MOVEMENT -MUCH -MURDER -MUSEUM -MUSIC -MUST -MY -MYSELF -NAME -NARROW -NATION -NATIONAL -NATURAL -NATURE -NEAR -NEARLY -NECESSARILY -NECESSARY -NECK -NEED -NEGOTIATION -NEIGHBOUR -NEITHER -NETWORK -NEVER -NEVERTHELESS -NEW -NEWS -NEWSPAPER -NEXT -NICE -NIGHT -NO -NOBODY -NOD -NOISE -NONE -NOR -NORMAL -NORMALLY -NORTH -NORTHERN -NOSE -NOT -NOTE -NOTHING -NOTICE -NOTION -NOW -NUCLEAR -NUMBER -NURSE -OBJECT -OBJECTIVE -OBSERVATION -OBSERVE -OBTAIN -OBVIOUS -OBVIOUSLY -OCCASION -OCCUR -ODD -OF -OFF -OFFENCE -OFFER -OFFICE -OFFICER -OFFICIAL -OFTEN -OIL -OKAY -OLD -ON -ONCE -ONE -ONLY -ONTO -OPEN -OPERATE -OPERATION -OPINION -OPPORTUNITY -OPPOSITION -OPTION -OR -ORDER -ORDINARY -ORGANISATION -ORGANISE -ORGANIZATION -ORIGIN -ORIGINAL -OTHER -OTHERWISE -OUGHT -OUR -OURSELVES -OUT -OUTCOME -OUTPUT -OUTSIDE -OVER -OVERALL -OWN -OWNER -PACKAGE -PAGE -PAIN -PAINT -PAINTING -PAIR -PANEL -PAPER -PARENT -PARK -PARLIAMENT -PART -PARTICULAR -PARTICULARLY -PARTLY -PARTNER -PARTY -PASS -PASSAGE -PAST -PATH -PATIENT -PATTERN -PAY -PAYMENT -PEACE -PENSION -PEOPLE -PER -PERCENT -PERFECT -PERFORM -PERFORMANCE -PERHAPS -PERIOD -PERMANENT -PERSON -PERSONAL -PERSUADE -PHASE -PHONE -PHOTOGRAPH -PHYSICAL -PICK -PICTURE -PIECE -PLACE -PLAN -PLANNING -PLANT -PLASTIC -PLATE -PLAY -PLAYER -PLEASE -PLEASURE -PLENTY -PLUS -POCKET -POINT -POLICE -POLICY -POLITICAL -POLITICS -POOL -POOR -POPULAR -POPULATION -POSITION -POSITIVE -POSSIBILITY -POSSIBLE -POSSIBLY -POST -POTENTIAL -POUND -POWER -POWERFUL -PRACTICAL -PRACTICE -PREFER -PREPARE -PRESENCE -PRESENT -PRESIDENT -PRESS -PRESSURE -PRETTY -PREVENT -PREVIOUS -PREVIOUSLY -PRICE -PRIMARY -PRIME -PRINCIPLE -PRIORITY -PRISON -PRISONER -PRIVATE -PROBABLY -PROBLEM -PROCEDURE -PROCESS -PRODUCE -PRODUCT -PRODUCTION -PROFESSIONAL -PROFIT -PROGRAM -PROGRAMME -PROGRESS -PROJECT -PROMISE -PROMOTE -PROPER -PROPERLY -PROPERTY -PROPORTION -PROPOSE -PROPOSAL -PROSPECT -PROTECT -PROTECTION -PROVE -PROVIDE -PROVIDED -PROVISION -PUB -PUBLIC -PUBLICATION -PUBLISH -PULL -PUPIL -PURPOSE -PUSH -PUT -QUALITY -QUARTER -QUESTION -QUICK -QUICKLY -QUIET -QUITE -RACE -RADIO -RAILWAY -RAIN -RAISE -RANGE -RAPIDLY -RARE -RATE -RATHER -REACH -REACTION -READ -READER -READING -READY -REAL -REALISE -REALITY -REALIZE -REALLY -REASON -REASONABLE -RECALL -RECEIVE -RECENT -RECENTLY -RECOGNISE -RECOGNITION -RECOGNIZE -RECOMMEND -RECORD -RECOVER -RED -REDUCE -REDUCTION -REFER -REFERENCE -REFLECT -REFORM -REFUSE -REGARD -REGION -REGIONAL -REGULAR -REGULATION -REJECT -RELATE -RELATION -RELATIONSHIP -RELATIVE -RELATIVELY -RELEASE -RELEVANT -RELIEF -RELIGION -RELIGIOUS -RELY -REMAIN -REMEMBER -REMIND -REMOVE -REPEAT -REPLACE -REPLY -REPORT -REPRESENT -REPRESENTATION -REPRESENTATIVE -REQUEST -REQUIRE -REQUIREMENT -RESEARCH -RESOURCE -RESPECT -RESPOND -RESPONSE -RESPONSIBILITY -RESPONSIBLE -REST -RESTAURANT -RESULT -RETAIN -RETURN -REVEAL -REVENUE -REVIEW -REVOLUTION -RICH -RIDE -RIGHT -RING -RISE -RISK -RIVER -ROAD -ROCK -ROLE -ROLL -ROOF -ROOM -ROUND -ROUTE -ROW -ROYAL -RULE -RUN -RURAL -SAFE -SAFETY -SALE -SAME -SAMPLE -SATISFY -SAVE -SAY -SCALE -SCENE -SCHEME -SCHOOL -SCIENCE -SCIENTIFIC -SCIENTIST -SCORE -SCREEN -SEA -SEARCH -SEASON -SEAT -SECOND -SECONDARY -SECRETARY -SECTION -SECTOR -SECURE -SECURITY -SEE -SEEK -SEEM -SELECT -SELECTION -SELL -SEND -SENIOR -SENSE -SENTENCE -SEPARATE -SEQUENCE -SERIES -SERIOUS -SERIOUSLY -SERVANT -SERVE -SERVICE -SESSION -SET -SETTLE -SETTLEMENT -SEVERAL -SEVERE -SEX -SEXUAL -SHAKE -SHALL -SHAPE -SHARE -SHE -SHEET -SHIP -SHOE -SHOOT -SHOP -SHORT -SHOT -SHOULD -SHOULDER -SHOUT -SHOW -SHUT -SIDE -SIGHT -SIGN -SIGNAL -SIGNIFICANCE -SIGNIFICANT -SILENCE -SIMILAR -SIMPLE -SIMPLY -SINCE -SING -SINGLE -SIR -SISTER -SIT -SITE -SITUATION -SIZE -SKILL -SKIN -SKY -SLEEP -SLIGHTLY -SLIP -SLOW -SLOWLY -SMALL -SMILE -SO -SOCIAL -SOCIETY -SOFT -SOFTWARE -SOIL -SOLDIER -SOLICITOR -SOLUTION -SOME -SOMEBODY -SOMEONE -SOMETHING -SOMETIMES -SOMEWHAT -SOMEWHERE -SON -SONG -SOON -SORRY -SORT -SOUND -SOURCE -SOUTH -SOUTHERN -SPACE -SPEAK -SPEAKER -SPECIAL -SPECIES -SPECIFIC -SPEECH -SPEED -SPEND -SPIRIT -SPORT -SPOT -SPREAD -SPRING -STAFF -STAGE -STAND -STANDARD -STAR -START -STATE -STATEMENT -STATION -STATUS -STAY -STEAL -STEP -STICK -STILL -STOCK -STONE -STOP -STORE -STORY -STRAIGHT -STRANGE -STRATEGY -STREET -STRENGTH -STRIKE -STRONG -STRONGLY -STRUCTURE -STUDENT -STUDIO -STUDY -STUFF -STYLE -SUBJECT -SUBSTANTIAL -SUCCEED -SUCCESS -SUCCESSFUL -SUCH -SUDDENLY -SUFFER -SUFFICIENT -SUGGEST -SUGGESTION -SUITABLE -SUM -SUMMER -SUN -SUPPLY -SUPPORT -SUPPOSE -SURE -SURELY -SURFACE -SURPRISE -SURROUND -SURVEY -SURVIVE -SWITCH -SYSTEM -TABLE -TAKE -TALK -TALL -TAPE -TARGET -TASK -TAX -TEA -TEACH -TEACHER -TEACHING -TEAM -TEAR -TECHNICAL -TECHNIQUE -TECHNOLOGY -TELEPHONE -TELEVISION -TELL -TEMPERATURE -TEND -TERM -TERMS -TERRIBLE -TEST -TEXT -THAN -THANK -THANKS -THAT -THE -THEATRE -THEIR -THEM -THEME -THEMSELVES -THEN -THEORY -THERE -THEREFORE -THESE -THEY -THIN -THING -THINK -THIS -THOSE -THOUGH -THOUGHT -THREAT -THREATEN -THROUGH -THROUGHOUT -THROW -THUS -TICKET -TIME -TINY -TITLE -TO -TODAY -TOGETHER -TOMORROW -TONE -TONIGHT -TOO -TOOL -TOOTH -TOP -TOTAL -TOTALLY -TOUCH -TOUR -TOWARDS -TOWN -TRACK -TRADE -TRADITION -TRADITIONAL -TRAFFIC -TRAIN -TRAINING -TRANSFER -TRANSPORT -TRAVEL -TREAT -TREATMENT -TREATY -TREE -TREND -TRIAL -TRIP -TROOP -TROUBLE -TRUE -TRUST -TRUTH -TRY -TURN -TWICE -TYPE -TYPICAL -UNABLE -UNDER -UNDERSTAND -UNDERSTANDING -UNDERTAKE -UNEMPLOYMENT -UNFORTUNATELY -UNION -UNIT -UNITED -UNIVERSITY -UNLESS -UNLIKELY -UNTIL -UP -UPON -UPPER -URBAN -US -USE -USED -USEFUL -USER -USUAL -USUALLY -VALUE -VARIATION -VARIETY -VARIOUS -VARY -VAST -VEHICLE -VERSION -VERY -VIA -VICTIM -VICTORY -VIDEO -VIEW -VILLAGE -VIOLENCE -VISION -VISIT -VISITOR -VITAL -VOICE -VOLUME -VOTE -WAGE -WAIT -WALK -WALL -WANT -WAR -WARM -WARN -WASH -WATCH -WATER -WAVE -WAY -WE -WEAK -WEAPON -WEAR -WEATHER -WEEK -WEEKEND -WEIGHT -WELCOME -WELFARE -WELL -WEST -WESTERN -WHAT -WHATEVER -WHEN -WHERE -WHEREAS -WHETHER -WHICH -WHILE -WHILST -WHITE -WHO -WHOLE -WHOM -WHOSE -WHY -WIDE -WIDELY -WIFE -WILD -WILL -WIN -WIND -WINDOW -WINE -WING -WINNER -WINTER -WISH -WITH -WITHDRAW -WITHIN -WITHOUT -WOMAN -WONDER -WONDERFUL -WOOD -WORD -WORK -WORKER -WORKING -WORKS -WORLD -WORRY -WORTH -WOULD -WRITE -WRITER -WRITING -WRONG -YARD -YEAH -YEAR -YES -YESTERDAY -YET -YOU -YOUNG -YOUR -YOURSELF -YOUTH diff --git a/src/projecteuler/043.py b/src/projecteuler/043.py deleted file mode 100644 index 2dd1db9..0000000 --- a/src/projecteuler/043.py +++ /dev/null @@ -1,35 +0,0 @@ -from common import pandigital - - -def check_number(i): - x = str(i) - if int(x[1:4]) & 1 != 0: - return False - if int(x[2:5]) % 3 != 0: - return False - if int(x[3:6]) % 5 != 0: - return False - if int(x[4:7]) % 7 != 0: - return False - if int(x[5:8]) % 11 != 0: - return False - if int(x[6:9]) % 13 != 0: - return False - if int(x[7:10]) % 17 != 0: - return False - return True - - -numbers = pandigital(0, 9).numbers(11) - -result = 0 - -for i in numbers: - if i < 1000000000: - continue - - if check_number(i): - result += i - -print result - diff --git a/src/projecteuler/044.py b/src/projecteuler/044.py deleted file mode 100644 index 5baae84..0000000 --- a/src/projecteuler/044.py +++ /dev/null @@ -1,9 +0,0 @@ - -pentagonal = [n*(3*n-1)/2 for n in xrange(1, 10000)] -pentagonal_set = set(pentagonal) - -for j in pentagonal: - for k in pentagonal: - if j+k in pentagonal_set and j-k in pentagonal_set: - print abs(j-k) - diff --git a/src/projecteuler/045.py b/src/projecteuler/045.py deleted file mode 100644 index 5a8bb7c..0000000 --- a/src/projecteuler/045.py +++ /dev/null @@ -1,12 +0,0 @@ - -limit = 500000 - -triangle = set([ int(n*(n+1)/2) for n in range(1, limit) ]) -pentagonal = set([ int(n*(2*n-1)) for n in range(1, limit) ]) -hexagonal = set([ int(n*(3*n-1)/2) for n in range(1, limit) ]) - -result = triangle & pentagonal & hexagonal - -for i in result: - print i - diff --git a/src/projecteuler/046.py b/src/projecteuler/046.py deleted file mode 100644 index 24a2983..0000000 --- a/src/projecteuler/046.py +++ /dev/null @@ -1,35 +0,0 @@ - -from common import sieve - -squares = set([ x*x for x in xrange(1, 1000000) ]) - -def check_number(number, prime): - square = (number - prime) >> 1 - return square in squares - -prime_set = sieve(1000000).primes() -primes = list(prime_set) -primes.sort() - -number = 3 - -while True: - number += 2 - - if number in prime_set: - continue - - conjecture = False - - for p in primes: - if p >= number: - break - if check_number(number, p): - conjecture = True - break - - if not conjecture: - break - -print number - diff --git a/src/projecteuler/047.py b/src/projecteuler/047.py deleted file mode 100644 index 19f5185..0000000 --- a/src/projecteuler/047.py +++ /dev/null @@ -1,25 +0,0 @@ -from common import sieve - -primes = list(sieve(1000000).primes()) -primes.sort() - -factors = 4 - -def check_prime_factors(x): - distinct = set() - for p in primes: - while x % p == 0: - x /= p - distinct.add(p) - if x == 1: - break - return len(distinct) == factors - -n = 644 - -while True: - if check_prime_factors(n) and check_prime_factors(n+1) and check_prime_factors(n+2) and check_prime_factors(n+3): - print n - break - n += 1 - diff --git a/src/projecteuler/048.py b/src/projecteuler/048.py deleted file mode 100644 index 7c4102e..0000000 --- a/src/projecteuler/048.py +++ /dev/null @@ -1,6 +0,0 @@ -sum = 0 -for i in range(1, 1001): - sum += i**i - -print sum % 10**10 - diff --git a/src/projecteuler/049.py b/src/projecteuler/049.py deleted file mode 100644 index 1cb2fbf..0000000 --- a/src/projecteuler/049.py +++ /dev/null @@ -1,34 +0,0 @@ -from common import sieve, permutation - -primes = sieve(10000).primes() -primes2 = [ x for x in primes if x > 1000 ] -primes2.sort() - -end = False -ignore = 1487 -result = [] - -for p in primes2: - for q in primes2: - if p == q: - continue - if permutation(p, q): - new = 0 - if q > p: - diff = q - p - new = q + diff - else: - diff = p - q - new = p + diff - - if new in primes and permutation(q, new) and not permutation(ignore, p): - result += [p, q, new] - end = True - if end: - break - if end: - break - -result.sort() -print str(result[0]) + str(result[1]) + str(result[2]) - diff --git a/src/projecteuler/050.py b/src/projecteuler/050.py deleted file mode 100644 index 615f0d5..0000000 --- a/src/projecteuler/050.py +++ /dev/null @@ -1,28 +0,0 @@ -from common import sieve - -limit = 1000000 - -prime_set = sieve(limit).primes() -prime_list = list(prime_set) -prime_list.sort() - -n = len(prime_list) - -max_sum = 0 -max_count = 0 - -for i in xrange(n): - sum = prime_list[i] - count = 1 - for j in xrange(i+1, n): - sum += prime_list[j] - count += 1 - if sum > prime_list[-1]: - break - - if sum in prime_set and count > max_count: - max_sum = sum - max_count = count - -print max_sum - diff --git a/src/projecteuler/051.c b/src/projecteuler/051.c deleted file mode 100644 index ee79ece..0000000 --- a/src/projecteuler/051.c +++ /dev/null @@ -1,121 +0,0 @@ -#include "common.h" -#include -#include -#include - -unsigned long* p; - -const int pattern_size = 1024; -unsigned long* patterns; - -void init_patterns() -{ - int i, cur; - unsigned long n, pos; - - patterns = (unsigned long*) malloc(pattern_size*sizeof(unsigned long)); - - for(i=0; i 0) - { - n += (cur&1)*pos; - pos *= 10; - cur >>= 1; - } - patterns[i] = n; - } -} - -int valid_replacement(unsigned long prime, unsigned long number, unsigned long pattern) -{ - int digit = -1; // replaced digit in prime - - while(pattern > 0) - { - char d1 = pattern % 10; - char d2 = prime % 10; - char d3 = number % 10; - - if(d1 == 1) - { - if(digit < 0) - digit = d2; - else if(digit != d2) // not same digits replaced - return 0; - } - - if(d1 == 0 && d2 != d3) - return 0; - else if(prime == 0 && number != 0) - return 0; - - pattern /= 10; - prime /= 10; - number /= 10; - } - - if(pattern == 0 && prime != number) - return 0; - - return 1; -} - -int check_prime(unsigned long prime) -{ - int i, j; - - for(i=2; i= 10*tmp) - break; - - for(j=0; j<10; j++) - { - tmp += pat; - - if(isprime(tmp, p) && valid_replacement(prime, tmp, pat)) - count++; - } - - if(count>=8) - { - printf("Pattern: %ld\n", pat); - return 1; - } - } - - return 0; -} - -int main(void) -{ - unsigned long pcount; - unsigned long pos; - - p = primes(1000000); - pcount = p[0]; - - init_patterns(); - - for(pos=1; pos<=pcount; pos++) - { - if(check_prime(p[pos])) - { - printf("Prime: %li\n", p[pos]); - break; - } - } - - free(p); - free(patterns); - return 0; -} - diff --git a/src/projecteuler/052.py b/src/projecteuler/052.py deleted file mode 100644 index 2419a72..0000000 --- a/src/projecteuler/052.py +++ /dev/null @@ -1,22 +0,0 @@ - -def digits(n): - result = [0]*10 - while n > 0: - digit = n % 10 - n /= 10 - result[digit] += 1 - return result - -def check(n): - foo = [ digits(n*x) for x in range(1, 7) ] - return foo == foo[1:]+foo[:1] # all array entries are equal - -n = 1 - -while True: - if check(n): - break - n += 1 - -print n - diff --git a/src/projecteuler/053.py b/src/projecteuler/053.py deleted file mode 100644 index 6e9461c..0000000 --- a/src/projecteuler/053.py +++ /dev/null @@ -1,14 +0,0 @@ - -facs = [1]*101 -for i in range(1, 101): - facs[i] = facs[i-1] * i - -count = 0 -for n in range(23, 101): - for r in range(n+1): - x = facs[n] / (facs[r]*facs[n-r]) - if x > 1000000: - count += 1 - -print count - diff --git a/src/projecteuler/054.py b/src/projecteuler/054.py deleted file mode 100644 index bd7d14f..0000000 --- a/src/projecteuler/054.py +++ /dev/null @@ -1,287 +0,0 @@ - -values = { -'2': 2, -'3': 3, -'4': 4, -'5': 5, -'6': 6, -'7': 7, -'8': 8, -'9': 9, -'T': 10, -'J': 11, -'Q': 12, -'K': 13, -'A': 14 -} - -colors = { -'H': 1, -'C': 2, -'S': 3, -'D': 4 -} - - -def handvalue(hand): - return values[hand[0]]*10 + colors[hand[1]] - -def count_cards(hand): - hand = [ x/10 for x in hand ] - counter = { } - for c in hand: - if c in counter: - counter[c] += 1 - else: - counter[c] = 1 - return counter - -def high_card(hand): - hand = [ x/10 for x in hand ] - hand.sort() - return hand[-1] - -def is_flush(hand): - return (hand[0]%10 == hand[1]%10 == hand[2]%10 == hand[3]%10 == hand[4]%10) - -def is_straight(hand): - hand = [ x/10 for x in hand ] - hand.sort() - return (hand[4] == hand[3]+1 == hand[2]+2 == hand[1]+3 == hand[0]+4) - -def is_straight_flush(hand): - return is_flush(hand) and is_straight(hand) - -def is_royal_flush(hand): - return is_straight_flush(hand) and high_card(hand) == values['A'] - -def is_n_of_a_kind(hand, n): - counter = count_cards(hand) - for c in counter: - if counter[c] == n: - return True - return False - -def is_four_of_a_kind(hand): - return is_n_of_a_kind(hand, 4) - -def is_three_of_a_kind(hand): - return is_n_of_a_kind(hand, 3) - -def is_one_pair(hand): - return is_n_of_a_kind(hand, 2) - -def is_two_pairs(hand): - counter = count_cards(hand) - pairs = 0 - for c in counter: - if counter[c] == 2 or counter[c] == 3: - pairs += 1 - return pairs == 2 - -def is_full_house(hand): - return is_two_pairs(hand) and is_three_of_a_kind(hand) - - -def better_hand(hand1, hand2): - # both are straight flush - if is_straight_flush(hand1): - if high_card(hand1) > high_card(hand2): - return 1 - else: - return 2 - - # both are four of a kind - if is_four_of_a_kind(hand1): - count1 = count_cards(hand1) - count2 = count_cards(hand2) - value4_1 = 0 - value4_2 = 0 - for c in count1: - if count1[c] == 4: - value4_1 = c - break - for c in count2: - if count2[c] == 4: - value4_2 = c - break - if value4_1 > value4_2: - return 1 - else: - return 2 - - # both are full house - if is_full_house(hand1): - count1 = count_cards(hand1) - count2 = count_cards(hand2) - value3_1 = 0 - value3_2 = 0 - for c in count1: - if count1[c] == 3: - value3_1 = c - break - for c in count2: - if count2[c] == 3: - value3_2 = c - break - if value3_1 > value3_2: - return 1 - else: - return 2 - - # both are flush - if is_flush(hand1): - hand1 = [ x/10 for x in hand1 ] - hand2 = [ x/10 for x in hand2 ] - hand1.sort() - hand2.sort() - for i in range(0, 5): - if hand1[4-i] > hand2[4-i]: - return 1 - elif hand2[4-i] > hand1[4-i]: - return 2 - print "ERROR: no winner with hands: ", hand1, hand2 # should never be reached - - # both are straight - if is_straight(hand1): - if high_card(hand1) > high_card(hand2): - return 1 - else: - return 2 - - # both are three of a kind - if is_three_of_a_kind(hand1): - count1 = count_cards(hand1) - count2 = count_cards(hand2) - value3_1 = 0 - value3_2 = 0 - for c in count1: - if count1[c] == 3: - value3_1 = c - break - for c in count2: - if count2[c] == 3: - value3_2 = c - break - if value3_1 > value3_2: - return 1 - else: - return 2 - - # both are two pairs - if is_two_pairs(hand1): - count1 = count_cards(hand1) - count2 = count_cards(hand2) - value2_1 = [] - value1_1 = 0 - value2_2 = [] - value1_2 = 0 - for c in count1: - if count1[c] == 2: - value2_1.append(c) - elif count1[c] == 1: - value1_1 = c - for c in count2: - if count2[c] == 2: - value2_2.append(c) - elif count1[c] == 1: - value1_2 = c - value2_1.sort() - value2_2.sort() - if value2_1[1] > value2_2[1]: - return 1 - elif value2_2[1] > value2_1[1]: - return 2 - elif value2_1[0] > value2_2[0]: - return 1 - elif value2_2[0] > value2_1[0]: - return 2 - elif value1_1 > value1_2: - return 1 - else: - return 2 - - # both are one pair - if is_one_pair(hand1): - count1 = count_cards(hand1) - count2 = count_cards(hand2) - value2_1 = 0 - value1_1 = [] - value2_2 = 0 - value1_2 = [] - for c in count1: - if count1[c] == 2: - value2_1 = c - elif count1[c] == 1: - value1_1.append(c) - for c in count2: - if count2[c] == 2: - value2_2 = c - elif count2[c] == 1: - value1_2.append(c) - value1_1.sort() - value1_2.sort() - if value2_1 > value2_2: - return 1 - elif value2_2 > value2_1: - return 2 - elif high_card(value1_1) > high_card(value1_2): - return 1 - else: - return 2 - - - # both are high card - if high_card(hand1) > high_card(hand2): - return 1 - else: - return 2 - - -def rank(hand): - if is_royal_flush(hand): - return 10 - if is_straight_flush(hand): - return 9 - if is_four_of_a_kind(hand): - return 8 - if is_full_house(hand): - return 7 - if is_flush(hand): - return 6 - if is_straight(hand): - return 5 - if is_three_of_a_kind(hand): - return 4 - if is_two_pairs(hand): - return 3 - if is_one_pair(hand): - return 2 - return 1 # high card - -def winner(hand1, hand2): - if rank(hand1) > rank(hand2): - return 1 - if rank(hand2) > rank(hand1): - return 2 - return better_hand(hand1, hand2) - -hands = [] - -f = open('054.txt', 'r') -for line in f: - line.rstrip('\n') - hands.append([ handvalue(x) for x in line.split(' ') ]) -f.close() - -count_win1 = 0 - -for h in hands: - hand1 = h[:5] - hand2 = h[5:] - if winner(hand1, hand2) == 1: - count_win1 += 1 - -print count_win1 - - diff --git a/src/projecteuler/054.txt b/src/projecteuler/054.txt deleted file mode 100644 index 231e249..0000000 --- a/src/projecteuler/054.txt +++ /dev/null @@ -1,1000 +0,0 @@ -8C TS KC 9H 4S 7D 2S 5D 3S AC -5C AD 5D AC 9C 7C 5H 8D TD KS -3H 7H 6S KC JS QH TD JC 2D 8S -TH 8H 5C QS TC 9H 4D JC KS JS -7C 5H KC QH JD AS KH 4C AD 4S -5H KS 9C 7D 9H 8D 3S 5D 5C AH -6H 4H 5C 3H 2H 3S QH 5S 6S AS -TD 8C 4H 7C TC KC 4C 3H 7S KS -7C 9C 6D KD 3H 4C QS QC AC KH -JC 6S 5H 2H 2D KD 9D 7C AS JS -AD QH TH 9D 8H TS 6D 3S AS AC -2H 4S 5C 5S TC KC JD 6C TS 3C -QD AS 6H JS 2C 3D 9H KC 4H 8S -KD 8S 9S 7C 2S 3S 6D 6S 4H KC -3C 8C 2D 7D 4D 9S 4S QH 4H JD -8C KC 7S TC 2D TS 8H QD AC 5C -3D KH QD 6C 6S AD AS 8H 2H QS -6S 8D 4C 8S 6C QH TC 6D 7D 9D -2S 8D 8C 4C TS 9S 9D 9C AC 3D -3C QS 2S 4H JH 3D 2D TD 8S 9H -5H QS 8S 6D 3C 8C JD AS 7H 7D -6H TD 9D AS JH 6C QC 9S KD JC -AH 8S QS 4D TH AC TS 3C 3D 5C -5S 4D JS 3D 8H 6C TS 3S AD 8C -6D 7C 5D 5H 3S 5C JC 2H 5S 3D -5H 6H 2S KS 3D 5D JD 7H JS 8H -KH 4H AS JS QS QC TC 6D 7C KS -3D QS TS 2H JS 4D AS 9S JC KD -QD 5H 4D 5D KH 7H 3D JS KD 4H -2C 9H 6H 5C 9D 6C JC 2D TH 9S -7D 6D AS QD JH 4D JS 7C QS 5C -3H KH QD AD 8C 8H 3S TH 9D 5S -AH 9S 4D 9D 8S 4H JS 3C TC 8D -2C KS 5H QD 3S TS 9H AH AD 8S -5C 7H 5D KD 9H 4D 3D 2D KS AD -KS KC 9S 6D 2C QH 9D 9H TS TC -9C 6H 5D QH 4D AD 6D QC JS KH -9S 3H 9D JD 5C 4D 9H AS TC QH -2C 6D JC 9C 3C AD 9S KH 9D 7D -KC 9C 7C JC JS KD 3H AS 3C 7D -QD KH QS 2C 3S 8S 8H 9H 9C JC -QH 8D 3C KC 4C 4H 6D AD 9H 9D -3S KS QS 7H KH 7D 5H 5D JD AD -2H 2C 6H TH TC 7D 8D 4H 8C AS -4S 2H AC QC 3S 6D TH 4D 4C KH -4D TC KS AS 7C 3C 6D 2D 9H 6C -8C TD 5D QS 2C 7H 4C 9C 3H 9H -5H JH TS 7S TD 6H AD QD 8H 8S -5S AD 9C 8C 7C 8D 5H 9D 8S 2S -4H KH KS 9S 2S KC 5S AD 4S 7D -QS 9C QD 6H JS 5D AC 8D 2S AS -KH AC JC 3S 9D 9S 3C 9C 5S JS -AD 3C 3D KS 3S 5C 9C 8C TS 4S -JH 8D 5D 6H KD QS QD 3D 6C KC -8S JD 6C 3S 8C TC QC 3C QH JS -KC JC 8H 2S 9H 9C JH 8S 8C 9S -8S 2H QH 4D QC 9D KC AS TH 3C -8S 6H TH 7C 2H 6S 3C 3H AS 7S -QH 5S JS 4H 5H TS 8H AH AC JC -9D 8H 2S 4S TC JC 3C 7H 3H 5C -3D AD 3C 3S 4C QC AS 5D TH 8C -6S 9D 4C JS KH AH TS JD 8H AD -4C 6S 9D 7S AC 4D 3D 3S TC JD -AD 7H 6H 4H JH KC TD TS 7D 6S -8H JH TC 3S 8D 8C 9S 2C 5C 4D -2C 9D KC QH TH QS JC 9C 4H TS -QS 3C QD 8H KH 4H 8D TD 8S AC -7C 3C TH 5S 8H 8C 9C JD TC KD -QC TC JD TS 8C 3H 6H KD 7C TD -JH QS KS 9C 6D 6S AS 9H KH 6H -2H 4D AH 2D JH 6H TD 5D 4H JD -KD 8C 9S JH QD JS 2C QS 5C 7C -4S TC 7H 8D 2S 6H 7S 9C 7C KC -8C 5D 7H 4S TD QC 8S JS 4H KS -AD 8S JH 6D TD KD 7C 6C 2D 7D -JC 6H 6S JS 4H QH 9H AH 4C 3C -6H 5H AS 7C 7S 3D KH KC 5D 5C -JC 3D TD AS 4D 6D 6S QH JD KS -8C 7S 8S QH 2S JD 5C 7H AH QD -8S 3C 6H 6C 2C 8D TD 7D 4C 4D -5D QH KH 7C 2S 7H JS 6D QC QD -AD 6C 6S 7D TH 6H 2H 8H KH 4H -KS JS KD 5D 2D KH 7D 9C 8C 3D -9C 6D QD 3C KS 3S 7S AH JD 2D -AH QH AS JC 8S 8H 4C KC TH 7D -JC 5H TD 7C 5D KD 4C AD 8H JS -KC 2H AC AH 7D JH KH 5D 7S 6D -9S 5S 9C 6H 8S TD JD 9H 6C AC -7D 8S 6D TS KD 7H AC 5S 7C 5D -AH QC JC 4C TC 8C 2H TS 2C 7D -KD KC 6S 3D 7D 2S 8S 3H 5S 5C -8S 5D 8H 4C 6H KC 3H 7C 5S KD -JH 8C 3D 3C 6C KC TD 7H 7C 4C -JC KC 6H TS QS TD KS 8H 8C 9S -6C 5S 9C QH 7D AH KS KC 9S 2C -4D 4S 8H TD 9C 3S 7D 9D AS TH -6S 7D 3C 6H 5D KD 2C 5C 9D 9C -2H KC 3D AD 3H QD QS 8D JC 4S -8C 3H 9C 7C AD 5D JC 9D JS AS -5D 9H 5C 7H 6S 6C QC JC QD 9S -JC QS JH 2C 6S 9C QC 3D 4S TC -4H 5S 8D 3D 4D 2S KC 2H JS 2C -TD 3S TH KD 4D 7H JH JS KS AC -7S 8C 9S 2D 8S 7D 5C AD 9D AS -8C 7H 2S 6C TH 3H 4C 3S 8H AC -KD 5H JC 8H JD 2D 4H TD JH 5C -3D AS QH KS 7H JD 8S 5S 6D 5H -9S 6S TC QS JC 5C 5D 9C TH 8C -5H 3S JH 9H 2S 2C 6S 7S AS KS -8C QD JC QS TC QC 4H AC KH 6C -TC 5H 7D JH 4H 2H 8D JC KS 4D -5S 9C KH KD 9H 5C TS 3D 7D 2D -5H AS TC 4D 8C 2C TS 9D 3H 8D -6H 8D 2D 9H JD 6C 4S 5H 5S 6D -AD 9C JC 7D 6H 9S 6D JS 9H 3C -AD JH TC QS 4C 5D 9S 7C 9C AH -KD 6H 2H TH 8S QD KS 9D 9H AS -4H 8H 8D 5H 6C AH 5S AS AD 8S -QS 5D 4S 2H TD KS 5H AC 3H JC -9C 7D QD KD AC 6D 5H QH 6H 5S -KC AH QH 2H 7D QS 3H KS 7S JD -6C 8S 3H 6D KS QD 5D 5C 8H TC -9H 4D 4S 6S 9D KH QC 4H 6C JD -TD 2D QH 4S 6H JH KD 3C QD 8C -4S 6H 7C QD 9D AS AH 6S AD 3C -2C KC TH 6H 8D AH 5C 6D 8S 5D -TD TS 7C AD JC QD 9H 3C KC 7H -5D 4D 5S 8H 4H 7D 3H JD KD 2D -JH TD 6H QS 4S KD 5C 8S 7D 8H -AC 3D AS 8C TD 7H KH 5D 6C JD -9D KS 7C 6D QH TC JD KD AS KC -JH 8S 5S 7S 7D AS 2D 3D AD 2H -2H 5D AS 3C QD KC 6H 9H 9S 2C -9D 5D TH 4C JH 3H 8D TC 8H 9H -6H KD 2C TD 2H 6C 9D 2D JS 8C -KD 7S 3C 7C AS QH TS AD 8C 2S -QS 8H 6C JS 4C 9S QC AD TD TS -2H 7C TS TC 8C 3C 9H 2D 6D JC -TC 2H 8D JH KS 6D 3H TD TH 8H -9D TD 9H QC 5D 6C 8H 8C KC TS -2H 8C 3D AH 4D TH TC 7D 8H KC -TS 5C 2D 8C 6S KH AH 5H 6H KC -5S 5D AH TC 4C JD 8D 6H 8C 6C -KC QD 3D 8H 2D JC 9H 4H AD 2S -TD 6S 7D JS KD 4H QS 2S 3S 8C -4C 9H JH TS 3S 4H QC 5S 9S 9C -2C KD 9H JS 9S 3H JC TS 5D AC -AS 2H 5D AD 5H JC 7S TD JS 4C -2D 4S 8H 3D 7D 2C AD KD 9C TS -7H QD JH 5H JS AC 3D TH 4C 8H -6D KH KC QD 5C AD 7C 2D 4H AC -3D 9D TC 8S QD 2C JC 4H JD AH -6C TD 5S TC 8S AH 2C 5D AS AC -TH 7S 3D AS 6C 4C 7H 7D 4H AH -5C 2H KS 6H 7S 4H 5H 3D 3C 7H -3C 9S AC 7S QH 2H 3D 6S 3S 3H -2D 3H AS 2C 6H TC JS 6S 9C 6C -QH KD QD 6D AC 6H KH 2C TS 8C -8H 7D 3S 9H 5D 3H 4S QC 9S 5H -2D 9D 7H 6H 3C 8S 5H 4D 3S 4S -KD 9S 4S TC 7S QC 3S 8S 2H 7H -TC 3D 8C 3H 6C 2H 6H KS KD 4D -KC 3D 9S 3H JS 4S 8H 2D 6C 8S -6H QS 6C TC QD 9H 7D 7C 5H 4D -TD 9D 8D 6S 6C TC 5D TS JS 8H -4H KC JD 9H TC 2C 6S 5H 8H AS -JS 9C 5C 6S 9D JD 8H KC 4C 6D -4D 8D 8S 6C 7C 6H 7H 8H 5C KC -TC 3D JC 6D KS 9S 6H 7S 9C 2C -6C 3S KD 5H TS 7D 9H 9S 6H KH -3D QD 4C 6H TS AC 3S 5C 2H KD -4C AS JS 9S 7C TS 7H 9H JC KS -4H 8C JD 3H 6H AD 9S 4S 5S KS -4C 2C 7D 3D AS 9C 2S QS KC 6C -8S 5H 3D 2S AC 9D 6S 3S 4D TD -QD TH 7S TS 3D AC 7H 6C 5D QC -TC QD AD 9C QS 5C 8D KD 3D 3C -9D 8H AS 3S 7C 8S JD 2D 8D KC -4C TH AC QH JS 8D 7D 7S 9C KH -9D 8D 4C JH 2C 2S QD KD TS 4H -4D 6D 5D 2D JH 3S 8S 3H TC KH -AD 4D 2C QS 8C KD JH JD AH 5C -5C 6C 5H 2H JH 4H KS 7C TC 3H -3C 4C QC 5D JH 9C QD KH 8D TC -3H 9C JS 7H QH AS 7C 9H 5H JC -2D 5S QD 4S 3C KC 6S 6C 5C 4C -5D KH 2D TS 8S 9C AS 9S 7C 4C -7C AH 8C 8D 5S KD QH QS JH 2C -8C 9D AH 2H AC QC 5S 8H 7H 2C -QD 9H 5S QS QC 9C 5H JC TH 4H -6C 6S 3H 5H 3S 6H KS 8D AC 7S -AC QH 7H 8C 4S KC 6C 3D 3S TC -9D 3D JS TH AC 5H 3H 8S 3S TC -QD KH JS KS 9S QC 8D AH 3C AC -5H 6C KH 3S 9S JH 2D QD AS 8C -6C 4D 7S 7H 5S JC 6S 9H 4H JH -AH 5S 6H 9S AD 3S TH 2H 9D 8C -4C 8D 9H 7C QC AD 4S 9C KC 5S -9D 6H 4D TC 4C JH 2S 5D 3S AS -2H 6C 7C KH 5C AD QS TH JD 8S -3S 4S 7S AH AS KC JS 2S AD TH -JS KC 2S 7D 8C 5C 9C TS 5H 9D -7S 9S 4D TD JH JS KH 6H 5D 2C -JD JS JC TH 2D 3D QD 8C AC 5H -7S KH 5S 9D 5D TD 4S 6H 3C 2D -4S 5D AC 8D 4D 7C AD AS AH 9C -6S TH TS KS 2C QC AH AS 3C 4S -2H 8C 3S JC 5C 7C 3H 3C KH JH -7S 3H JC 5S 6H 4C 2S 4D KC 7H -4D 7C 4H 9S 8S 6S AD TC 6C JC -KH QS 3S TC 4C 8H 8S AC 3C TS -QD QS TH 3C TS 7H 7D AH TD JC -TD JD QC 4D 9S 7S TS AD 7D AC -AH 7H 4S 6D 7C 2H 9D KS JC TD -7C AH JD 4H 6D QS TS 2H 2C 5C -TC KC 8C 9S 4C JS 3C JC 6S AH -AS 7D QC 3D 5S JC JD 9D TD KH -TH 3C 2S 6H AH AC 5H 5C 7S 8H -QC 2D AC QD 2S 3S JD QS 6S 8H -KC 4H 3C 9D JS 6H 3S 8S AS 8C -7H KC 7D JD 2H JC QH 5S 3H QS -9H TD 3S 8H 7S AC 5C 6C AH 7C -8D 9H AH JD TD QS 7D 3S 9C 8S -AH QH 3C JD KC 4S 5S 5D TD KS -9H 7H 6S JH TH 4C 7C AD 5C 2D -7C KD 5S TC 9D 6S 6C 5D 2S TH -KC 9H 8D 5H 7H 4H QC 3D 7C AS -6S 8S QC TD 4S 5C TH QS QD 2S -8S 5H TH QC 9H 6S KC 7D 7C 5C -7H KD AH 4D KH 5C 4S 2D KC QH -6S 2C TD JC AS 4D 6C 8C 4H 5S -JC TC JD 5S 6S 8D AS 9D AD 3S -6D 6H 5D 5S TC 3D 7D QS 9D QD -4S 6C 8S 3S 7S AD KS 2D 7D 7C -KC QH JC AC QD 5D 8D QS 7H 7D -JS AH 8S 5H 3D TD 3H 4S 6C JH -4S QS 7D AS 9H JS KS 6D TC 5C -2D 5C 6H TC 4D QH 3D 9H 8S 6C -6D 7H TC TH 5S JD 5C 9C KS KD -8D TD QH 6S 4S 6C 8S KC 5C TC -5S 3D KS AC 4S 7D QD 4C TH 2S -TS 8H 9S 6S 7S QH 3C AH 7H 8C -4C 8C TS JS QC 3D 7D 5D 7S JH -8S 7S 9D QC AC 7C 6D 2H JH KC -JS KD 3C 6S 4S 7C AH QC KS 5H -KS 6S 4H JD QS TC 8H KC 6H AS -KH 7C TC 6S TD JC 5C 7D AH 3S -3H 4C 4H TC TH 6S 7H 6D 9C QH -7D 5H 4S 8C JS 4D 3D 8S QH KC -3H 6S AD 7H 3S QC 8S 4S 7S JS -3S JD KH TH 6H QS 9C 6C 2D QD -4S QH 4D 5H KC 7D 6D 8D TH 5S -TD AD 6S 7H KD KH 9H 5S KC JC -3H QC AS TS 4S QD KS 9C 7S KC -TS 6S QC 6C TH TC 9D 5C 5D KD -JS 3S 4H KD 4C QD 6D 9S JC 9D -8S JS 6D 4H JH 6H 6S 6C KS KH -AC 7D 5D TC 9S KH 6S QD 6H AS -AS 7H 6D QH 8D TH 2S KH 5C 5H -4C 7C 3D QC TC 4S KH 8C 2D JS -6H 5D 7S 5H 9C 9H JH 8S TH 7H -AS JS 2S QD KH 8H 4S AC 8D 8S -3H 4C TD KD 8C JC 5C QS 2D JD -TS 7D 5D 6C 2C QS 2H 3C AH KS -4S 7C 9C 7D JH 6C 5C 8H 9D QD -2S TD 7S 6D 9C 9S QS KH QH 5C -JC 6S 9C QH JH 8D 7S JS KH 2H -8D 5H TH KC 4D 4S 3S 6S 3D QS -2D JD 4C TD 7C 6D TH 7S JC AH -QS 7S 4C TH 9D TS AD 4D 3H 6H -2D 3H 7D JD 3D AS 2S 9C QC 8S -4H 9H 9C 2C 7S JH KD 5C 5D 6H -TC 9H 8H JC 3C 9S 8D KS AD KC -TS 5H JD QS QH QC 8D 5D KH AH -5D AS 8S 6S 4C AH QC QD TH 7H -3H 4H 7D 6S 4S 9H AS 8H JS 9D -JD 8C 2C 9D 7D 5H 5S 9S JC KD -KD 9C 4S QD AH 7C AD 9D AC TD -6S 4H 4S 9C 8D KS TC 9D JH 7C -5S JC 5H 4S QH AC 2C JS 2S 9S -8C 5H AS QD AD 5C 7D 8S QC TD -JC 4C 8D 5C KH QS 4D 6H 2H 2C -TH 4S 2D KC 3H QD AC 7H AD 9D -KH QD AS 8H TH KC 8D 7S QH 8C -JC 6C 7D 8C KH AD QS 2H 6S 2D -JC KH 2D 7D JS QC 5H 4C 5D AD -TS 3S AD 4S TD 2D TH 6S 9H JH -9H 2D QS 2C 4S 3D KH AS AC 9D -KH 6S 8H 4S KD 7D 9D TS QD QC -JH 5H AH KS AS AD JC QC 5S KH -5D 7D 6D KS KD 3D 7C 4D JD 3S -AC JS 8D 5H 9C 3H 4H 4D TS 2C -6H KS KH 9D 7C 2S 6S 8S 2H 3D -6H AC JS 7S 3S TD 8H 3H 4H TH -9H TC QC KC 5C KS 6H 4H AC 8S -TC 7D QH 4S JC TS 6D 6C AC KH -QH 7D 7C JH QS QD TH 3H 5D KS -3D 5S 8D JS 4C 2C KS 7H 9C 4H -5H 8S 4H TD 2C 3S QD QC 3H KC -QC JS KD 9C AD 5S 9D 7D 7H TS -8C JC KH 7C 7S 6C TS 2C QD TH -5S 9D TH 3C 7S QH 8S 9C 2H 5H -5D 9H 6H 2S JS KH 3H 7C 2H 5S -JD 5D 5S 2C TC 2S 6S 6C 3C 8S -4D KH 8H 4H 2D KS 3H 5C 2S 9H -3S 2D TD 7H 8S 6H JD KC 9C 8D -6S QD JH 7C 9H 5H 8S 8H TH TD -QS 7S TD 7D TS JC KD 7C 3C 2C -3C JD 8S 4H 2D 2S TD AS 4D AC -AH KS 6C 4C 4S 7D 8C 9H 6H AS -5S 3C 9S 2C QS KD 4D 4S AC 5D -2D TS 2C JS KH QH 5D 8C AS KC -KD 3H 6C TH 8S 7S KH 6H 9S AC -6H 7S 6C QS AH 2S 2H 4H 5D 5H -5H JC QD 2C 2S JD AS QC 6S 7D -6C TC AS KD 8H 9D 2C 7D JH 9S -2H 4C 6C AH 8S TD 3H TH 7C TS -KD 4S TS 6C QH 8D 9D 9C AH 7D -6D JS 5C QD QC 9C 5D 8C 2H KD -3C QH JH AD 6S AH KC 8S 6D 6H -3D 7C 4C 7S 5S 3S 6S 5H JC 3C -QH 7C 5H 3C 3S 8C TS 4C KD 9C -QD 3S 7S 5H 7H QH JC 7C 8C KD -3C KD KH 2S 4C TS AC 6S 2C 7C -2C KH 3C 4C 6H 4D 5H 5S 7S QD -4D 7C 8S QD TS 9D KS 6H KD 3C -QS 4D TS 7S 4C 3H QD 8D 9S TC -TS QH AC 6S 3C 9H 9D QS 8S 6H -3S 7S 5D 4S JS 2D 6C QH 6S TH -4C 4H AS JS 5D 3D TS 9C AC 8S -6S 9C 7C 3S 5C QS AD AS 6H 3C -9S 8C 7H 3H 6S 7C AS 9H JD KH -3D 3H 7S 4D 6C 7C AC 2H 9C TH -4H 5S 3H AC TC TH 9C 9H 9S 8D -8D 9H 5H 4D 6C 2H QD 6S 5D 3S -4C 5C JD QS 4D 3H TH AC QH 8C -QC 5S 3C 7H AD 4C KS 4H JD 6D -QS AH 3H KS 9H 2S JS JH 5H 2H -2H 5S TH 6S TS 3S KS 3C 5H JS -2D 9S 7H 3D KC JH 6D 7D JS TD -AC JS 8H 2C 8C JH JC 2D TH 7S -5D 9S 8H 2H 3D TC AH JC KD 9C -9D QD JC 2H 6D KH TS 9S QH TH -2C 8D 4S JD 5H 3H TH TC 9C KC -AS 3D 9H 7D 4D TH KH 2H 7S 3H -4H 7S KS 2S JS TS 8S 2H QD 8D -5S 6H JH KS 8H 2S QC AC 6S 3S -JC AS AD QS 8H 6C KH 4C 4D QD -2S 3D TS TD 9S KS 6S QS 5C 8D -3C 6D 4S QC KC JH QD TH KH AD -9H AH 4D KS 2S 8D JH JC 7C QS -2D 6C TH 3C 8H QD QH 2S 3S KS -6H 5D 9S 4C TS TD JS QD 9D JD -5H 8H KH 8S KS 7C TD AD 4S KD -2C 7C JC 5S AS 6C 7D 8S 5H 9C -6S QD 9S TS KH QS 5S QH 3C KC -7D 3H 3C KD 5C AS JH 7H 6H JD -9D 5C 9H KC 8H KS 4S AD 4D 2S -3S JD QD 8D 2S 7C 5S 6S 5H TS -6D 9S KC TD 3S 6H QD JD 5C 8D -5H 9D TS KD 8D 6H TD QC 4C 7D -6D 4S JD 9D AH 9S AS TD 9H QD -2D 5S 2H 9C 6H 9S TD QC 7D TC -3S 2H KS TS 2C 9C 8S JS 9D 7D -3C KC 6D 5D 6C 6H 8S AS 7S QS -JH 9S 2H 8D 4C 8H 9H AD TH KH -QC AS 2S JS 5C 6H KD 3H 7H 2C -QD 8H 2S 8D 3S 6D AH 2C TC 5C -JD JS TS 8S 3H 5D TD KC JC 6H -6S QS TC 3H 5D AH JC 7C 7D 4H -7C 5D 8H 9C 2H 9H JH KH 5S 2C -9C 7H 6S TH 3S QC QD 4C AC JD -2H 5D 9S 7D KC 3S QS 2D AS KH -2S 4S 2H 7D 5C TD TH QH 9S 4D -6D 3S TS 6H 4H KS 9D 8H 5S 2D -9H KS 4H 3S 5C 5D KH 6H 6S JS -KC AS 8C 4C JC KH QC TH QD AH -6S KH 9S 2C 5H TC 3C 7H JC 4D -JD 4S 6S 5S 8D 7H 7S 4D 4C 2H -7H 9H 5D KH 9C 7C TS TC 7S 5H -4C 8D QC TS 4S 9H 3D AD JS 7C -8C QS 5C 5D 3H JS AH KC 4S 9D -TS JD 8S QS TH JH KH 2D QD JS -JD QC 5D 6S 9H 3S 2C 8H 9S TS -2S 4C AD 7H JC 5C 2D 6D 4H 3D -7S JS 2C 4H 8C AD QD 9C 3S TD -JD TS 4C 6H 9H 7D QD 6D 3C AS -AS 7C 4C 6S 5D 5S 5C JS QC 4S -KD 6S 9S 7C 3C 5S 7D JH QD JS -4S 7S JH 2C 8S 5D 7H 3D QH AD -TD 6H 2H 8D 4H 2D 7C AD KH 5D -TS 3S 5H 2C QD AH 2S 5C KH TD -KC 4D 8C 5D AS 6C 2H 2S 9H 7C -KD JS QC TS QS KH JH 2C 5D AD -3S 5H KC 6C 9H 3H 2H AD 7D 7S -7S JS JH KD 8S 7D 2S 9H 7C 2H -9H 2D 8D QC 6S AD AS 8H 5H 6C -2S 7H 6C 6D 7D 8C 5D 9D JC 3C -7C 9C 7H JD 2H KD 3S KH AD 4S -QH AS 9H 4D JD KS KD TS KH 5H -4C 8H 5S 3S 3D 7D TD AD 7S KC -JS 8S 5S JC 8H TH 9C 4D 5D KC -7C 5S 9C QD 2C QH JS 5H 8D KH -TD 2S KS 3D AD KC 7S TC 3C 5D -4C 2S AD QS 6C 9S QD TH QH 5C -8C AD QS 2D 2S KC JD KS 6C JC -8D 4D JS 2H 5D QD 7S 7D QH TS -6S 7H 3S 8C 8S 9D QS 8H 6C 9S -4S TC 2S 5C QD 4D QS 6D TH 6S -3S 5C 9D 6H 8D 4C 7D TC 7C TD -AH 6S AS 7H 5S KD 3H 5H AC 4C -8D 8S AH KS QS 2C AD 6H 7D 5D -6H 9H 9S 2H QS 8S 9C 5D 2D KD -TS QC 5S JH 7D 7S TH 9S 9H AC -7H 3H 6S KC 4D 6D 5C 4S QD TS -TD 2S 7C QD 3H JH 9D 4H 7S 7H -KS 3D 4H 5H TC 2S AS 2D 6D 7D -8H 3C 7H TD 3H AD KC TH 9C KH -TC 4C 2C 9S 9D 9C 5C 2H JD 3C -3H AC TS 5D AD 8D 6H QC 6S 8C -2S TS 3S JD 7H 8S QH 4C 5S 8D -AC 4S 6C 3C KH 3D 7C 2D 8S 2H -4H 6C 8S TH 2H 4S 8H 9S 3H 7S -7C 4C 9C 2C 5C AS 5D KD 4D QH -9H 4H TS AS 7D 8D 5D 9S 8C 2H -QC KD AC AD 2H 7S AS 3S 2D 9S -2H QC 8H TC 6D QD QS 5D KH 3C -TH JD QS 4C 2S 5S AD 7H 3S AS -7H JS 3D 6C 3S 6D AS 9S AC QS -9C TS AS 8C TC 8S 6H 9D 8D 6C -4D JD 9C KC 7C 6D KS 3S 8C AS -3H 6S TC 8D TS 3S KC 9S 7C AS -8C QC 4H 4S 8S 6C 3S TC AH AC -4D 7D 5C AS 2H 6S TS QC AD TC -QD QC 8S 4S TH 3D AH TS JH 4H -5C 2D 9S 2C 3H 3C 9D QD QH 7D -KC 9H 6C KD 7S 3C 4D AS TC 2D -3D JS 4D 9D KS 7D TH QC 3H 3C -8D 5S 2H 9D 3H 8C 4C 4H 3C TH -JC TH 4S 6S JD 2D 4D 6C 3D 4C -TS 3S 2D 4H AC 2C 6S 2H JH 6H -TD 8S AD TC AH AC JH 9S 6S 7S -6C KC 4S JD 8D 9H 5S 7H QH AH -KD 8D TS JH 5C 5H 3H AD AS JS -2D 4H 3D 6C 8C 7S AD 5D 5C 8S -TD 5D 7S 9C 4S 5H 6C 8C 4C 8S -JS QH 9C AS 5C QS JC 3D QC 7C -JC 9C KH JH QS QC 2C TS 3D AD -5D JH AC 5C 9S TS 4C JD 8C KS -KC AS 2D KH 9H 2C 5S 4D 3D 6H -TH AH 2D 8S JC 3D 8C QH 7S 3S -8H QD 4H JC AS KH KS 3C 9S 6D -9S QH 7D 9C 4S AC 7H KH 4D KD -AH AD TH 6D 9C 9S KD KS QH 4H -QD 6H 9C 7C QS 6D 6S 9D 5S JH -AH 8D 5H QD 2H JC KS 4H KH 5S -5C 2S JS 8D 9C 8C 3D AS KC AH -JD 9S 2H QS 8H 5S 8C TH 5C 4C -QC QS 8C 2S 2C 3S 9C 4C KS KH -2D 5D 8S AH AD TD 2C JS KS 8C -TC 5S 5H 8H QC 9H 6H JD 4H 9S -3C JH 4H 9H AH 4S 2H 4C 8D AC -8S TH 4D 7D 6D QD QS 7S TC 7C -KH 6D 2D JD 5H JS QD JH 4H 4S -9C 7S JH 4S 3S TS QC 8C TC 4H -QH 9D 4D JH QS 3S 2C 7C 6C 2D -4H 9S JD 5C 5H AH 9D TS 2D 4C -KS JH TS 5D 2D AH JS 7H AS 8D -JS AH 8C AD KS 5S 8H 2C 6C TH -2H 5D AD AC KS 3D 8H TS 6H QC -6D 4H TS 9C 5H JS JH 6S JD 4C -JH QH 4H 2C 6D 3C 5D 4C QS KC -6H 4H 6C 7H 6S 2S 8S KH QC 8C -3H 3D 5D KS 4H TD AD 3S 4D TS -5S 7C 8S 7D 2C KS 7S 6C 8C JS -5D 2H 3S 7C 5C QD 5H 6D 9C 9H -JS 2S KD 9S 8D TD TS AC 8C 9D -5H QD 2S AC 8C 9H KS 7C 4S 3C -KH AS 3H 8S 9C JS QS 4S AD 4D -AS 2S TD AD 4D 9H JC 4C 5H QS -5D 7C 4H TC 2D 6C JS 4S KC 3S -4C 2C 5D AC 9H 3D JD 8S QS QH -2C 8S 6H 3C QH 6D TC KD AC AH -QC 6C 3S QS 4S AC 8D 5C AD KH -5S 4C AC KH AS QC 2C 5C 8D 9C -8H JD 3C KH 8D 5C 9C QD QH 9D -7H TS 2C 8C 4S TD JC 9C 5H QH -JS 4S 2C 7C TH 6C AS KS 7S JD -JH 7C 9H 7H TC 5H 3D 6D 5D 4D -2C QD JH 2H 9D 5S 3D TD AD KS -JD QH 3S 4D TH 7D 6S QS KS 4H -TC KS 5S 8D 8H AD 2S 2D 4C JH -5S JH TC 3S 2D QS 9D 4C KD 9S -AC KH 3H AS 9D KC 9H QD 6C 6S -9H 7S 3D 5C 7D KC TD 8H 4H 6S -3C 7H 8H TC QD 4D 7S 6S QH 6C -6D AD 4C QD 6C 5D 7D 9D KS TS -JH 2H JD 9S 7S TS KH 8D 5D 8H -2D 9S 4C 7D 9D 5H QD 6D AC 6S -7S 6D JC QD JH 4C 6S QS 2H 7D -8C TD JH KD 2H 5C QS 2C JS 7S -TC 5H 4H JH QD 3S 5S 5D 8S KH -KS KH 7C 2C 5D JH 6S 9C 6D JC -5H AH JD 9C JS KC 2H 6H 4D 5S -AS 3C TH QC 6H 9C 8S 8C TD 7C -KC 2C QD 9C KH 4D 7S 3C TS 9H -9C QC 2S TS 8C TD 9S QD 3S 3C -4D 9D TH JH AH 6S 2S JD QH JS -QD 9H 6C KD 7D 7H 5D 6S 8H AH -8H 3C 4S 2H 5H QS QH 7S 4H AC -QS 3C 7S 9S 4H 3S AH KS 9D 7C -AD 5S 6S 2H 2D 5H TC 4S 3C 8C -QH TS 6S 4D JS KS JH AS 8S 6D -2C 8S 2S TD 5H AS TC TS 6C KC -KC TS 8H 2H 3H 7C 4C 5S TH TD -KD AD KH 7H 7S 5D 5H 5S 2D 9C -AD 9S 3D 7S 8C QC 7C 9C KD KS -3C QC 9S 8C 4D 5C AS QD 6C 2C -2H KC 8S JD 7S AC 8D 5C 2S 4D -9D QH 3D 2S TC 3S KS 3C 9H TD -KD 6S AC 2C 7H 5H 3S 6C 6H 8C -QH TC 8S 6S KH TH 4H 5D TS 4D -8C JS 4H 6H 2C 2H 7D AC QD 3D -QS KC 6S 2D 5S 4H TD 3H JH 4C -7S 5H 7H 8H KH 6H QS TH KD 7D -5H AD KD 7C KH 5S TD 6D 3C 6C -8C 9C 5H JD 7C KC KH 7H 2H 3S -7S 4H AD 4D 8S QS TH 3D 7H 5S -8D TC KS KD 9S 6D AD JD 5C 2S -7H 8H 6C QD 2H 6H 9D TC 9S 7C -8D 6D 4C 7C 6C 3C TH KH JS JH -5S 3S 8S JS 9H AS AD 8H 7S KD -JH 7C 2C KC 5H AS AD 9C 9S JS -AD AC 2C 6S QD 7C 3H TH KS KD -9D JD 4H 8H 4C KH 7S TS 8C KC -3S 5S 2H 7S 6H 7D KS 5C 6D AD -5S 8C 9H QS 7H 7S 2H 6C 7D TD -QS 5S TD AC 9D KC 3D TC 2D 4D -TD 2H 7D JD QD 4C 7H 5D KC 3D -4C 3H 8S KD QH 5S QC 9H TC 5H -9C QD TH 5H TS 5C 9H AH QH 2C -4D 6S 3C AC 6C 3D 2C 2H TD TH -AC 9C 5D QC 4D AD 8D 6D 8C KC -AD 3C 4H AC 8D 8H 7S 9S TD JC -4H 9H QH JS 2D TH TD TC KD KS -5S 6S 9S 8D TH AS KH 5H 5C 8S -JD 2S 9S 6S 5S 8S 5D 7S 7H 9D -5D 8C 4C 9D AD TS 2C 7D KD TC -8S QS 4D KC 5C 8D 4S KH JD KD -AS 5C AD QH 7D 2H 9S 7H 7C TC -2S 8S JD KH 7S 6C 6D AD 5D QC -9H 6H 3S 8C 8H AH TC 4H JS TD -2C TS 4D 7H 2D QC 9C 5D TH 7C -6C 8H QC 5D TS JH 5C 5H 9H 4S -2D QC 7H AS JS 8S 2H 4C 4H 8D -JS 6S AC KD 3D 3C 4S 7H TH KC -QH KH 6S QS 5S 4H 3C QD 3S 3H -7H AS KH 8C 4H 9C 5S 3D 6S TS -9C 7C 3H 5S QD 2C 3D AD AC 5H -JH TD 2D 4C TS 3H KH AD 3S 7S -AS 4C 5H 4D 6S KD JC 3C 6H 2D -3H 6S 8C 2D TH 4S AH QH AD 5H -7C 2S 9H 7H KC 5C 6D 5S 3H JC -3C TC 9C 4H QD TD JH 6D 9H 5S -7C 6S 5C 5D 6C 4S 7H 9H 6H AH -AD 2H 7D KC 2C 4C 2S 9S 7H 3S -TH 4C 8S 6S 3S AD KS AS JH TD -5C TD 4S 4D AD 6S 5D TC 9C 7D -8H 3S 4D 4S 5S 6H 5C AC 3H 3D -9H 3C AC 4S QS 8S 9D QH 5H 4D -JC 6C 5H TS AC 9C JD 8C 7C QD -8S 8H 9C JD 2D QC QH 6H 3C 8D -KS JS 2H 6H 5H QH QS 3H 7C 6D -TC 3H 4S 7H QC 2H 3S 8C JS KH -AH 8H 5S 4C 9H JD 3H 7S JC AC -3C 2D 4C 5S 6C 4S QS 3S JD 3D -5H 2D TC AH KS 6D 7H AD 8C 6H -6C 7S 3C JD 7C 8H KS KH AH 6D -AH 7D 3H 8H 8S 7H QS 5H 9D 2D -JD AC 4H 7S 8S 9S KS AS 9D QH -7S 2C 8S 5S JH QS JC AH KD 4C -AH 2S 9H 4H 8D TS TD 6H QH JD -4H JC 3H QS 6D 7S 9C 8S 9D 8D -5H TD 4S 9S 4C 8C 8D 7H 3H 3D -QS KH 3S 2C 2S 3C 7S TD 4S QD -7C TD 4D 5S KH AC AS 7H 4C 6C -2S 5H 6D JD 9H QS 8S 2C 2H TD -2S TS 6H 9H 7S 4H JC 4C 5D 5S -2C 5H 7D 4H 3S QH JC JS 6D 8H -4C QH 7C QD 3S AD TH 8S 5S TS -9H TC 2S TD JC 7D 3S 3D TH QH -7D 4C 8S 5C JH 8H 6S 3S KC 3H -JC 3H KH TC QH TH 6H 2C AC 5H -QS 2H 9D 2C AS 6S 6C 2S 8C 8S -9H 7D QC TH 4H KD QS AC 7S 3C -4D JH 6S 5S 8H KS 9S QC 3S AS -JD 2D 6S 7S TC 9H KC 3H 7D KD -2H KH 7C 4D 4S 3H JS QD 7D KC -4C JC AS 9D 3C JS 6C 8H QD 4D -AH JS 3S 6C 4C 3D JH 6D 9C 9H -9H 2D 8C 7H 5S KS 6H 9C 2S TC -6C 8C AD 7H 6H 3D KH AS 5D TH -KS 8C 3S TS 8S 4D 5S 9S 6C 4H -9H 4S 4H 5C 7D KC 2D 2H 9D JH -5C JS TC 9D 9H 5H 7S KH JC 6S -7C 9H 8H 4D JC KH JD 2H TD TC -8H 6C 2H 2C KH 6H 9D QS QH 5H -AC 7D 2S 3D QD JC 2D 8D JD JH -2H JC 2D 7H 2C 3C 8D KD TD 4H -3S 4H 6D 8D TS 3H TD 3D 6H TH -JH JC 3S AC QH 9H 7H 8S QC 2C -7H TD QS 4S 8S 9C 2S 5D 4D 2H -3D TS 3H 2S QC 8H 6H KC JC KS -5D JD 7D TC 8C 6C 9S 3D 8D AC -8H 6H JH 6C 5D 8D 8S 4H AD 2C -9D 4H 2D 2C 3S TS AS TC 3C 5D -4D TH 5H KS QS 6C 4S 2H 3D AD -5C KC 6H 2C 5S 3C 4D 2D 9H 9S -JD 4C 3H TH QH 9H 5S AH 8S AC -7D 9S 6S 2H TD 9C 4H 8H QS 4C -3C 6H 5D 4H 8C 9C KC 6S QD QS -3S 9H KD TC 2D JS 8C 6S 4H 4S -2S 4C 8S QS 6H KH 3H TH 8C 5D -2C KH 5S 3S 7S 7H 6C 9D QD 8D -8H KS AC 2D KH TS 6C JS KC 7H -9C KS 5C TD QC AH 6C 5H 9S 7C -5D 4D 3H 4H 6S 7C 7S AH QD TD -2H 7D QC 6S TC TS AH 7S 9D 3H -TH 5H QD 9S KS 7S 7C 6H 8C TD -TH 2D 4D QC 5C 7D JD AH 9C 4H -4H 3H AH 8D 6H QC QH 9H 2H 2C -2D AD 4C TS 6H 7S TH 4H QS TD -3C KD 2H 3H QS JD TC QC 5D 8H -KS JC QD TH 9S KD 8D 8C 2D 9C -3C QD KD 6D 4D 8D AH AD QC 8S -8H 3S 9D 2S 3H KS 6H 4C 7C KC -TH 9S 5C 3D 7D 6H AC 7S 4D 2C -5C 3D JD 4D 2D 6D 5H 9H 4C KH -AS 7H TD 6C 2H 3D QD KS 4C 4S -JC 3C AC 7C JD JS 8H 9S QC 5D -JD 6S 5S 2H AS 8C 7D 5H JH 3D -8D TC 5S 9S 8S 3H JC 5H 7S AS -5C TD 3D 7D 4H 8D 7H 4D 5D JS -QS 9C KS TD 2S 8S 5C 2H 4H AS -TH 7S 4H 7D 3H JD KD 5D 2S KC -JD 7H 4S 8H 4C JS 6H QH 5S 4H -2C QS 8C 5S 3H QC 2S 6C QD AD -8C 3D JD TC 4H 2H AD 5S AC 2S -5D 2C JS 2D AD 9D 3D 4C 4S JH -8D 5H 5D 6H 7S 4D KS 9D TD JD -3D 6D 9C 2S AS 7D 5S 5C 8H JD -7C 8S 3S 6S 5H JD TC AD 7H 7S -2S 9D TS 4D AC 8D 6C QD JD 3H -9S KH 2C 3C AC 3D 5H 6H 8D 5D -KS 3D 2D 6S AS 4C 2S 7C 7H KH -AC 2H 3S JC 5C QH 4D 2D 5H 7S -TS AS JD 8C 6H JC 8S 5S 2C 5D -7S QH 7H 6C QC 8H 2D 7C JD 2S -2C QD 2S 2H JC 9C 5D 2D JD JH -7C 5C 9C 8S 7D 6D 8D 6C 9S JH -2C AD 6S 5H 3S KS 7S 9D KH 4C -7H 6C 2C 5C TH 9D 8D 3S QC AH -5S KC 6H TC 5H 8S TH 6D 3C AH -9C KD 4H AD TD 9S 4S 7D 6H 5D -7H 5C 5H 6D AS 4C KD KH 4H 9D -3C 2S 5C 6C JD QS 2H 9D 7D 3H -AC 2S 6S 7S JS QD 5C QS 6H AD -5H TH QC 7H TC 3S 7C 6D KC 3D -4H 3D QC 9S 8H 2C 3S JC KS 5C -4S 6S 2C 6H 8S 3S 3D 9H 3H JS -4S 8C 4D 2D 8H 9H 7D 9D AH TS -9S 2C 9H 4C 8D AS 7D 3D 6D 5S -6S 4C 7H 8C 3H 5H JC AH 9D 9C -2S 7C 5S JD 8C 3S 3D 4D 7D 6S -3C KC 4S 5D 7D 3D JD 7H 3H 4H -9C 9H 4H 4D TH 6D QD 8S 9S 7S -2H AC 8S 4S AD 8C 2C AH 7D TC -TS 9H 3C AD KS TC 3D 8C 8H JD -QC 8D 2C 3C 7D 7C JD 9H 9C 6C -AH 6S JS JH 5D AS QC 2C JD TD -9H KD 2H 5D 2D 3S 7D TC AH TS -TD 8H AS 5D AH QC AC 6S TC 5H -KS 4S 7H 4D 8D 9C TC 2H 6H 3H -3H KD 4S QD QH 3D 8H 8C TD 7S -8S JD TC AH JS QS 2D KH KS 4D -3C AD JC KD JS KH 4S TH 9H 2C -QC 5S JS 9S KS AS 7C QD 2S JD -KC 5S QS 3S 2D AC 5D 9H 8H KS -6H 9C TC AD 2C 6D 5S JD 6C 7C -QS KH TD QD 2C 3H 8S 2S QC AH -9D 9H JH TC QH 3C 2S JS 5C 7H -6C 3S 3D 2S 4S QD 2D TH 5D 2C -2D 6H 6D 2S JC QH AS 7H 4H KH -5H 6S KS AD TC TS 7C AC 4S 4H -AD 3C 4H QS 8C 9D KS 2H 2D 4D -4S 9D 6C 6D 9C AC 8D 3H 7H KD -JC AH 6C TS JD 6D AD 3S 5D QD -JC JH JD 3S 7S 8S JS QC 3H 4S -JD TH 5C 2C AD JS 7H 9S 2H 7S -8D 3S JH 4D QC AS JD 2C KC 6H -2C AC 5H KD 5S 7H QD JH AH 2D -JC QH 8D 8S TC 5H 5C AH 8C 6C -3H JS 8S QD JH 3C 4H 6D 5C 3S -6D 4S 4C AH 5H 5S 3H JD 7C 8D -8H AH 2H 3H JS 3C 7D QC 4H KD -6S 2H KD 5H 8H 2D 3C 8S 7S QD -2S 7S KC QC AH TC QS 6D 4C 8D -5S 9H 2C 3S QD 7S 6C 2H 7C 9D -3C 6C 5C 5S JD JC KS 3S 5D TS -7C KS 6S 5S 2S 2D TC 2H 5H QS -AS 7H 6S TS 5H 9S 9D 3C KD 2H -4S JS QS 3S 4H 7C 2S AC 6S 9D -8C JH 2H 5H 7C 5D QH QS KH QC -3S TD 3H 7C KC 8D 5H 8S KH 8C -4H KH JD TS 3C 7H AS QC JS 5S -AH 9D 2C 8D 4D 2D 6H 6C KC 6S -2S 6H 9D 3S 7H 4D KH 8H KD 3D -9C TC AC JH KH 4D JD 5H TD 3S -7S 4H 9D AS 4C 7D QS 9S 2S KH -3S 8D 8S KS 8C JC 5C KH 2H 5D -8S QH 2C 4D KC JS QC 9D AC 6H -8S 8C 7C JS JD 6S 4C 9C AC 4S -QH 5D 2C 7D JC 8S 2D JS JH 4C -JS 4C 7S TS JH KC KH 5H QD 4S -QD 8C 8D 2D 6S TD 9D AC QH 5S -QH QC JS 3D 3C 5C 4H KH 8S 7H -7C 2C 5S JC 8S 3H QC 5D 2H KC -5S 8D KD 6H 4H QD QH 6D AH 3D -7S KS 6C 2S 4D AC QS 5H TS JD -7C 2D TC 5D QS AC JS QC 6C KC -2C KS 4D 3H TS 8S AD 4H 7S 9S -QD 9H QH 5H 4H 4D KH 3S JC AD -4D AC KC 8D 6D 4C 2D KH 2C JD -2C 9H 2D AH 3H 6D 9C 7D TC KS -8C 3H KD 7C 5C 2S 4S 5H AS AH -TH JD 4H KD 3H TC 5C 3S AC KH -6D 7H AH 7S QC 6H 2D TD JD AS -JH 5D 7H TC 9S 7D JC AS 5S KH -2H 8C AD TH 6H QD KD 9H 6S 6C -QH KC 9D 4D 3S JS JH 4H 2C 9H -TC 7H KH 4H JC 7D 9S 3H QS 7S -AD 7D JH 6C 7H 4H 3S 3H 4D QH -JD 2H 5C AS 6C QC 4D 3C TC JH -AC JD 3H 6H 4C JC AD 7D 7H 9H -4H TC TS 2C 8C 6S KS 2H JD 9S -4C 3H QS QC 9S 9H 6D KC 9D 9C -5C AD 8C 2C QH TH QD JC 8D 8H -QC 2C 2S QD 9C 4D 3S 8D JH QS -9D 3S 2C 7S 7C JC TD 3C TC 9H -3C TS 8H 5C 4C 2C 6S 8D 7C 4H -KS 7H 2H TC 4H 2C 3S AS AH QS -8C 2D 2H 2C 4S 4C 6S 7D 5S 3S -TH QC 5D TD 3C QS KD KC KS AS -4D AH KD 9H KS 5C 4C 6H JC 7S -KC 4H 5C QS TC 2H JC 9S AH QH -4S 9H 3H 5H 3C QD 2H QC JH 8H -5D AS 7H 2C 3D JH 6H 4C 6S 7D -9C JD 9H AH JS 8S QH 3H KS 8H -3S AC QC TS 4D AD 3D AH 8S 9H -7H 3H QS 9C 9S 5H JH JS AH AC -8D 3C JD 2H AC 9C 7H 5S 4D 8H -7C JH 9H 6C JS 9S 7H 8C 9D 4H -2D AS 9S 6H 4D JS JH 9H AD QD -6H 7S JH KH AH 7H TD 5S 6S 2C -8H JH 6S 5H 5S 9D TC 4C QC 9S -7D 2C KD 3H 5H AS QD 7H JS 4D -TS QH 6C 8H TH 5H 3C 3H 9C 9D -AD KH JS 5D 3H AS AC 9S 5C KC -2C KH 8C JC QS 6D AH 2D KC TC -9D 3H 2S 7C 4D 6D KH KS 8D 7D -9H 2S TC JH AC QC 3H 5S 3S 8H -3S AS KD 8H 4C 3H 7C JH QH TS -7S 6D 7H 9D JH 4C 3D 3S 6C AS -4S 2H 2C 4C 8S 5H KC 8C QC QD -3H 3S 6C QS QC 2D 6S 5D 2C 9D -2H 8D JH 2S 3H 2D 6C 5C 7S AD -9H JS 5D QH 8S TS 2H 7S 6S AD -6D QC 9S 7H 5H 5C 7D KC JD 4H -QC 5S 9H 9C 4D 6S KS 2S 4C 7C -9H 7C 4H 8D 3S 6H 5C 8H JS 7S -2D 6H JS TD 4H 4D JC TH 5H KC -AC 7C 8D TH 3H 9S 2D 4C KC 4D -KD QS 9C 7S 3D KS AD TS 4C 4H -QH 9C 8H 2S 7D KS 7H 5D KD 4C -9C 2S 2H JC 6S 6C TC QC JH 5C -7S AC 8H KC 8S 6H QS JC 3D 6S -JS 2D JH 8C 4S 6H 8H 6D 5D AD -6H 7D 2S 4H 9H 7C AS AC 8H 5S -3C JS 4S 6D 5H 2S QH 6S 9C 2C -3D 5S 6S 9S 4C QS 8D QD 8S TC -9C 3D AH 9H 5S 2C 7D AD JC 3S -7H TC AS 3C 6S 6D 7S KH KC 9H -3S TC 8H 6S 5H JH 8C 7D AC 2S -QD 9D 9C 3S JC 8C KS 8H 5D 4D -JS AH JD 6D 9D 8C 9H 9S 8H 3H -2D 6S 4C 4D 8S AD 4S TC AH 9H -TS AC QC TH KC 6D 4H 7S 8C 2H -3C QD JS 9D 5S JC AH 2H TS 9H -3H 4D QH 5D 9C 5H 7D 4S JC 3S -8S TH 3H 7C 2H JD JS TS AC 8D -9C 2H TD KC JD 2S 8C 5S AD 2C -3D KD 7C 5H 4D QH QD TC 6H 7D -7H 2C KC 5S KD 6H AH QC 7S QH -6H 5C AC 5H 2C 9C 2D 7C TD 2S -4D 9D AH 3D 7C JD 4H 8C 4C KS -TH 3C JS QH 8H 4C AS 3D QS QC -4D 7S 5H JH 6D 7D 6H JS KH 3C -QD 8S 7D 2H 2C 7C JC 2S 5H 8C -QH 8S 9D TC 2H AD 7C 8D QD 6S -3S 7C AD 9H 2H 9S JD TS 4C 2D -3S AS 4H QC 2C 8H 8S 7S TD TC -JH TH TD 3S 4D 4H 5S 5D QS 2C -8C QD QH TC 6D 4S 9S 9D 4H QC -8C JS 9D 6H JD 3H AD 6S TD QC -KC 8S 3D 7C TD 7D 8D 9H 4S 3S -6C 4S 3D 9D KD TC KC KS AC 5S -7C 6S QH 3D JS KD 6H 6D 2D 8C -JD 2S 5S 4H 8S AC 2D 6S TS 5C -5H 8C 5S 3C 4S 3D 7C 8D AS 3H -AS TS 7C 3H AD 7D JC QS 6C 6H -3S 9S 4C AC QH 5H 5D 9H TS 4H -6C 5C 7H 7S TD AD JD 5S 2H 2S -7D 6C KC 3S JD 8D 8S TS QS KH -8S QS 8D 6C TH AC AH 2C 8H 9S -7H TD KH QH 8S 3D 4D AH JD AS -TS 3D 2H JC 2S JH KH 6C QC JS -KC TH 2D 6H 7S 2S TC 8C 9D QS -3C 9D 6S KH 8H 6D 5D TH 2C 2H -6H TC 7D AD 4D 8S TS 9H TD 7S -JS 6D JD JC 2H AC 6C 3D KH 8D -KH JD 9S 5D 4H 4C 3H 7S QS 5C -4H JD 5D 3S 3C 4D KH QH QS 7S -JD TS 8S QD AH 4C 6H 3S 5S 2C -QS 3D JD AS 8D TH 7C 6S QC KS -7S 2H 8C QC 7H AC 6D 2D TH KH -5S 6C 7H KH 7D AH 8C 5C 7S 3D -3C KD AD 7D 6C 4D KS 2D 8C 4S -7C 8D 5S 2D 2S AH AD 2C 9D TD -3C AD 4S KS JH 7C 5C 8C 9C TH -AS TD 4D 7C JD 8C QH 3C 5H 9S -3H 9C 8S 9S 6S QD KS AH 5H JH -QC 9C 5S 4H 2H TD 7D AS 8C 9D -8C 2C 9D KD TC 7S 3D KH QC 3C -4D AS 4C QS 5S 9D 6S JD QH KS -6D AH 6C 4C 5H TS 9H 7D 3D 5S -QS JD 7C 8D 9C AC 3S 6S 6C KH -8H JH 5D 9S 6D AS 6S 3S QC 7H -QD AD 5C JH 2H AH 4H AS KC 2C -JH 9C 2C 6H 2D JS 5D 9H KC 6D -7D 9D KD TH 3H AS 6S QC 6H AD -JD 4H 7D KC 3H JS 3C TH 3D QS -4C 3H 8C QD 5H 6H AS 8H AD JD -TH 8S KD 5D QC 7D JS 5S 5H TS -7D KC 9D QS 3H 3C 6D TS 7S AH -7C 4H 7H AH QC AC 4D 5D 6D TH -3C 4H 2S KD 8H 5H JH TC 6C JD -4S 8C 3D 4H JS TD 7S JH QS KD -7C QC KD 4D 7H 6S AD TD TC KH -5H 9H KC 3H 4D 3D AD 6S QD 6H -TH 7C 6H TS QH 5S 2C KC TD 6S -7C 4D 5S JD JH 7D AC KD KH 4H -7D 6C 8D 8H 5C JH 8S QD TH JD -8D 7D 6C 7C 9D KD AS 5C QH JH -9S 2C 8C 3C 4C KS JH 2D 8D 4H -7S 6C JH KH 8H 3H 9D 2D AH 6D -4D TC 9C 8D 7H TD KS TH KD 3C -JD 9H 8D QD AS KD 9D 2C 2S 9C -8D 3H 5C 7H KS 5H QH 2D 8C 9H -2D TH 6D QD 6C KC 3H 3S AD 4C -4H 3H JS 9D 3C TC 5H QH QC JC -3D 5C 6H 3S 3C JC 5S 7S 2S QH -AC 5C 8C 4D 5D 4H 2S QD 3C 3H -2C TD AH 9C KD JS 6S QD 4C QC -QS 8C 3S 4H TC JS 3H 7C JC AD -5H 4D 9C KS JC TD 9S TS 8S 9H -QD TS 7D AS AC 2C TD 6H 8H AH -6S AD 8C 4S 9H 8D 9D KH 8S 3C -QS 4D 2D 7S KH JS JC AD 4C 3C -QS 9S 7H KC TD TH 5H JS AC JH -6D AC 2S QS 7C AS KS 6S KH 5S -6D 8H KH 3C QS 2H 5C 9C 9D 6C -JS 2C 4C 6H 7D JC AC QD TD 3H -4H QC 8H JD 4C KD KS 5C KC 7S -6D 2D 3H 2S QD 5S 7H AS TH 6S -AS 6D 8D 2C 8S TD 8H QD JC AH -9C 9H 2D TD QH 2H 5C TC 3D 8H -KC 8S 3D KH 2S TS TC 6S 4D JH -9H 9D QS AC KC 6H 5D 4D 8D AH -9S 5C QS 4H 7C 7D 2H 8S AD JS -3D AC 9S AS 2C 2D 2H 3H JC KH -7H QH KH JD TC KS 5S 8H 4C 8D -2H 7H 3S 2S 5H QS 3C AS 9H KD -AD 3D JD 6H 5S 9C 6D AC 9S 3S -3D 5D 9C 2D AC 4S 2S AD 6C 6S -QC 4C 2D 3H 6S KC QH QD 2H JH -QC 3C 8S 4D 9S 2H 5C 8H QS QD -6D KD 6S 7H 3S KH 2H 5C JC 6C -3S 9S TC 6S 8H 2D AD 7S 8S TS -3C 6H 9C 3H 5C JC 8H QH TD QD -3C JS QD 5D TD 2C KH 9H TH AS -9S TC JD 3D 5C 5H AD QH 9H KC -TC 7H 4H 8H 3H TD 6S AC 7C 2S -QS 9D 5D 3C JC KS 4D 6C JH 2S -9S 6S 3C 7H TS 4C KD 6D 3D 9C -2D 9H AH AC 7H 2S JH 3S 7C QC -QD 9H 3C 2H AC AS 8S KD 8C KH -2D 7S TD TH 6D JD 8D 4D 2H 5S -8S QH KD JD QS JH 4D KC 5H 3S -3C KH QC 6D 8H 3S AH 7D TD 2D -5S 9H QH 4S 6S 6C 6D TS TH 7S -6C 4C 6D QS JS 9C TS 3H 8D 8S -JS 5C 7S AS 2C AH 2H AD 5S TC -KD 6C 9C 9D TS 2S JC 4H 2C QD -QS 9H TC 3H KC KS 4H 3C AD TH -KH 9C 2H KD 9D TC 7S KC JH 2D -7C 3S KC AS 8C 5D 9C 9S QH 3H -2D 8C TD 4C 2H QC 5D TC 2C 7D -KS 4D 6C QH TD KH 5D 7C AD 8D -2S 9S 8S 4C 8C 3D 6H QD 7C 7H -6C 8S QH 5H TS 5C 3C 4S 2S 2H -8S 6S 2H JC 3S 3H 9D 8C 2S 7H -QC 2C 8H 9C AC JD 4C 4H 6S 3S -3H 3S 7D 4C 9S 5H 8H JC 3D TC -QH 2S 2D 9S KD QD 9H AD 6D 9C -8D 2D KS 9S JC 4C JD KC 4S TH -KH TS 6D 4D 5C KD 5H AS 9H AD -QD JS 7C 6D 5D 5C TH 5H QH QS -9D QH KH 5H JH 4C 4D TC TH 6C -KH AS TS 9D KD 9C 7S 4D 8H 5S -KH AS 2S 7D 9D 4C TS TH AH 7C -KS 4D AC 8S 9S 8D TH QH 9D 5C -5D 5C 8C QS TC 4C 3D 3S 2C 8D -9D KS 2D 3C KC 4S 8C KH 6C JC -8H AH 6H 7D 7S QD 3C 4C 6C KC -3H 2C QH 8H AS 7D 4C 8C 4H KC -QD 5S 4H 2C TD AH JH QH 4C 8S -3H QS 5S JS 8H 2S 9H 9C 3S 2C -6H TS 7S JC QD AC TD KC 5S 3H -QH AS QS 7D JC KC 2C 4C 5C 5S -QH 3D AS JS 4H 8D 7H JC 2S 9C -5D 4D 2S 4S 9D 9C 2D QS 8H 7H -6D 7H 3H JS TS AC 2D JH 7C 8S -JH 5H KC 3C TC 5S 9H 4C 8H 9D -8S KC 5H 9H AD KS 9D KH 8D AH -JC 2H 9H KS 6S 3H QC 5H AH 9C -5C KH 5S AD 6C JC 9H QC 9C TD -5S 5D JC QH 2D KS 8H QS 2H TS -JH 5H 5S AH 7H 3C 8S AS TD KH -6H 3D JD 2C 4C KC 7S AH 6C JH -4C KS 9D AD 7S KC 7D 8H 3S 9C -7H 5C 5H 3C 8H QC 3D KH 6D JC -2D 4H 5D 7D QC AD AH 9H QH 8H -KD 8C JS 9D 3S 3C 2H 5D 6D 2S -8S 6S TS 3C 6H 8D 5S 3H TD 6C -KS 3D JH 9C 7C 9S QS 5S 4H 6H -7S 6S TH 4S KC KD 3S JC JH KS -7C 3C 2S 6D QH 2C 7S 5H 8H AH -KC 8D QD 6D KH 5C 7H 9D 3D 9C -6H 2D 8S JS 9S 2S 6D KC 7C TC -KD 9C JH 7H KC 8S 2S 7S 3D 6H -4H 9H 2D 4C 8H 7H 5S 8S 2H 8D -AD 7C 3C 7S 5S 4D 9H 3D JC KH -5D AS 7D 6D 9C JC 4C QH QS KH -KD JD 7D 3D QS QC 8S 6D JS QD -6S 8C 5S QH TH 9H AS AC 2C JD -QC KS QH 7S 3C 4C 5C KC 5D AH -6C 4H 9D AH 2C 3H KD 3D TS 5C -TD 8S QS AS JS 3H KD AC 4H KS -7D 5D TS 9H 4H 4C 9C 2H 8C QC -2C 7D 9H 4D KS 4C QH AD KD JS -QD AD AH KH 9D JS 9H JC KD JD -8S 3C 4S TS 7S 4D 5C 2S 6H 7C -JS 7S 5C KD 6D QH 8S TD 2H 6S -QH 6C TC 6H TD 4C 9D 2H QC 8H -3D TS 4D 2H 6H 6S 2C 7H 8S 6C -9H 9D JD JH 3S AH 2C 6S 3H 8S -2C QS 8C 5S 3H 2S 7D 3C AD 4S -5C QC QH AS TS 4S 6S 4C 5H JS -JH 5C TD 4C 6H JS KD KH QS 4H -TC KH JC 4D 9H 9D 8D KC 3C 8H -2H TC 8S AD 9S 4H TS 7H 2C 5C -4H 2S 6C 5S KS AH 9C 7C 8H KD -TS QH TD QS 3C JH AH 2C 8D 7D -5D KC 3H 5S AC 4S 7H QS 4C 2H -3D 7D QC KH JH 6D 6C TD TH KD -5S 8D TH 6C 9D 7D KH 8C 9S 6D -JD QS 7S QC 2S QH JC 4S KS 8D -7S 5S 9S JD KD 9C JC AD 2D 7C -4S 5H AH JH 9C 5D TD 7C 2D 6S -KC 6C 7H 6S 9C QD 5S 4H KS TD -6S 8D KS 2D TH TD 9H JD TS 3S -KH JS 4H 5D 9D TC TD QC JD TS -QS QD AC AD 4C 6S 2D AS 3H KC -4C 7C 3C TD QS 9C KC AS 8D AD -KC 7H QC 6D 8H 6S 5S AH 7S 8C -3S AD 9H JC 6D JD AS KH 6S JH -AD 3D TS KS 7H JH 2D JS QD AC -9C JD 7C 6D TC 6H 6C JC 3D 3S -QC KC 3S JC KD 2C 8D AH QS TS -AS KD 3D JD 8H 7C 8C 5C QD 6C diff --git a/src/projecteuler/055.py b/src/projecteuler/055.py deleted file mode 100644 index d623d9b..0000000 --- a/src/projecteuler/055.py +++ /dev/null @@ -1,17 +0,0 @@ - -def lychrel(x): - for i in xrange(50): - t = x + int(str(x)[::-1]) - if t == int(str(t)[::-1]): - return False - x = t - return True - -count = 0 - -for i in xrange(1, 10000): - if lychrel(i): - count += 1 - -print count - diff --git a/src/projecteuler/056.py b/src/projecteuler/056.py deleted file mode 100644 index 567f41d..0000000 --- a/src/projecteuler/056.py +++ /dev/null @@ -1,18 +0,0 @@ - -def digit_sum(n): - s = 0 - while n > 0: - s += n % 10 - n /= 10 - return s - -max_sum = 0 - -for i in range(2, 100): - for j in range(2, 100): - s = digit_sum(i**j) - if s > max_sum: - max_sum = s - -print max_sum - diff --git a/src/projecteuler/057.py b/src/projecteuler/057.py deleted file mode 100644 index 8098995..0000000 --- a/src/projecteuler/057.py +++ /dev/null @@ -1,16 +0,0 @@ - -def get_fraction(c): - (n, d) = (1, 2) - for i in xrange(1, c): - (n, d) = (2*d+n, d) # add 2 - (n, d) = (d, n) # 1/x, swap entries - return (d+n, d) # add 1 - -count = 0 -for i in xrange(1, 1000): - (n, d) = get_fraction(i) - if len(str(n)) > len(str(d)): - count += 1 - -print count - diff --git a/src/projecteuler/058.py b/src/projecteuler/058.py deleted file mode 100644 index a483fac..0000000 --- a/src/projecteuler/058.py +++ /dev/null @@ -1,39 +0,0 @@ -from common import sieve - -primes = sieve(30000).primes() -prime_list = list(primes) -prime_list.sort() - -def is_prime(n): - if n in primes: - return True - for p in prime_list: - if p*p > n: - return True - if n % p == 0: - return False - return True - -def count_primes(numbers): - prime = 0 - for n in numbers: - if is_prime(n): - prime += 1 - return prime - -#numbers = [1, 3, 5, 7, 9] -prime_count = 3 -number_count = 5 -level = 2 -last = 9 - -while 10*prime_count >= number_count: - step = 2 * level - numbers = [last+step, last+2*step, last+3*step, last+4*step] - prime_count += count_primes(numbers) - number_count += 4 - level += 1 - last += 4*step - -print 2*(level-1) + 1 - diff --git a/src/projecteuler/059.py b/src/projecteuler/059.py deleted file mode 100644 index 449afb7..0000000 --- a/src/projecteuler/059.py +++ /dev/null @@ -1,28 +0,0 @@ -import string - -keys = [] - -for a in string.lowercase: - for b in string.lowercase: - for c in string.lowercase: - keys.append(a+b+c) - -f = open('059.txt', 'r') -content = f.read().split(',') -f.close() - -cipher = [ int(i) for i in content ] -cipher_len = len(cipher) - -for key in keys: - decoded = "" - for p in range(0, cipher_len): - decoded += chr(cipher[p] ^ ord(key[p%3])) - if decoded.find(" the ") != -1 and decoded.find(" and ") != -1: - break - -#print decoded -#print key - -print sum([ ord(x) for x in decoded ]) - diff --git a/src/projecteuler/059.txt b/src/projecteuler/059.txt deleted file mode 100644 index 08cee2d..0000000 --- a/src/projecteuler/059.txt +++ /dev/null @@ -1 +0,0 @@ -79,59,12,2,79,35,8,28,20,2,3,68,8,9,68,45,0,12,9,67,68,4,7,5,23,27,1,21,79,85,78,79,85,71,38,10,71,27,12,2,79,6,2,8,13,9,1,13,9,8,68,19,7,1,71,56,11,21,11,68,6,3,22,2,14,0,30,79,1,31,6,23,19,10,0,73,79,44,2,79,19,6,28,68,16,6,16,15,79,35,8,11,72,71,14,10,3,79,12,2,79,19,6,28,68,32,0,0,73,79,86,71,39,1,71,24,5,20,79,13,9,79,16,15,10,68,5,10,3,14,1,10,14,1,3,71,24,13,19,7,68,32,0,0,73,79,87,71,39,1,71,12,22,2,14,16,2,11,68,2,25,1,21,22,16,15,6,10,0,79,16,15,10,22,2,79,13,20,65,68,41,0,16,15,6,10,0,79,1,31,6,23,19,28,68,19,7,5,19,79,12,2,79,0,14,11,10,64,27,68,10,14,15,2,65,68,83,79,40,14,9,1,71,6,16,20,10,8,1,79,19,6,28,68,14,1,68,15,6,9,75,79,5,9,11,68,19,7,13,20,79,8,14,9,1,71,8,13,17,10,23,71,3,13,0,7,16,71,27,11,71,10,18,2,29,29,8,1,1,73,79,81,71,59,12,2,79,8,14,8,12,19,79,23,15,6,10,2,28,68,19,7,22,8,26,3,15,79,16,15,10,68,3,14,22,12,1,1,20,28,72,71,14,10,3,79,16,15,10,68,3,14,22,12,1,1,20,28,68,4,14,10,71,1,1,17,10,22,71,10,28,19,6,10,0,26,13,20,7,68,14,27,74,71,89,68,32,0,0,71,28,1,9,27,68,45,0,12,9,79,16,15,10,68,37,14,20,19,6,23,19,79,83,71,27,11,71,27,1,11,3,68,2,25,1,21,22,11,9,10,68,6,13,11,18,27,68,19,7,1,71,3,13,0,7,16,71,28,11,71,27,12,6,27,68,2,25,1,21,22,11,9,10,68,10,6,3,15,27,68,5,10,8,14,10,18,2,79,6,2,12,5,18,28,1,71,0,2,71,7,13,20,79,16,2,28,16,14,2,11,9,22,74,71,87,68,45,0,12,9,79,12,14,2,23,2,3,2,71,24,5,20,79,10,8,27,68,19,7,1,71,3,13,0,7,16,92,79,12,2,79,19,6,28,68,8,1,8,30,79,5,71,24,13,19,1,1,20,28,68,19,0,68,19,7,1,71,3,13,0,7,16,73,79,93,71,59,12,2,79,11,9,10,68,16,7,11,71,6,23,71,27,12,2,79,16,21,26,1,71,3,13,0,7,16,75,79,19,15,0,68,0,6,18,2,28,68,11,6,3,15,27,68,19,0,68,2,25,1,21,22,11,9,10,72,71,24,5,20,79,3,8,6,10,0,79,16,8,79,7,8,2,1,71,6,10,19,0,68,19,7,1,71,24,11,21,3,0,73,79,85,87,79,38,18,27,68,6,3,16,15,0,17,0,7,68,19,7,1,71,24,11,21,3,0,71,24,5,20,79,9,6,11,1,71,27,12,21,0,17,0,7,68,15,6,9,75,79,16,15,10,68,16,0,22,11,11,68,3,6,0,9,72,16,71,29,1,4,0,3,9,6,30,2,79,12,14,2,68,16,7,1,9,79,12,2,79,7,6,2,1,73,79,85,86,79,33,17,10,10,71,6,10,71,7,13,20,79,11,16,1,68,11,14,10,3,79,5,9,11,68,6,2,11,9,8,68,15,6,23,71,0,19,9,79,20,2,0,20,11,10,72,71,7,1,71,24,5,20,79,10,8,27,68,6,12,7,2,31,16,2,11,74,71,94,86,71,45,17,19,79,16,8,79,5,11,3,68,16,7,11,71,13,1,11,6,1,17,10,0,71,7,13,10,79,5,9,11,68,6,12,7,2,31,16,2,11,68,15,6,9,75,79,12,2,79,3,6,25,1,71,27,12,2,79,22,14,8,12,19,79,16,8,79,6,2,12,11,10,10,68,4,7,13,11,11,22,2,1,68,8,9,68,32,0,0,73,79,85,84,79,48,15,10,29,71,14,22,2,79,22,2,13,11,21,1,69,71,59,12,14,28,68,14,28,68,9,0,16,71,14,68,23,7,29,20,6,7,6,3,68,5,6,22,19,7,68,21,10,23,18,3,16,14,1,3,71,9,22,8,2,68,15,26,9,6,1,68,23,14,23,20,6,11,9,79,11,21,79,20,11,14,10,75,79,16,15,6,23,71,29,1,5,6,22,19,7,68,4,0,9,2,28,68,1,29,11,10,79,35,8,11,74,86,91,68,52,0,68,19,7,1,71,56,11,21,11,68,5,10,7,6,2,1,71,7,17,10,14,10,71,14,10,3,79,8,14,25,1,3,79,12,2,29,1,71,0,10,71,10,5,21,27,12,71,14,9,8,1,3,71,26,23,73,79,44,2,79,19,6,28,68,1,26,8,11,79,11,1,79,17,9,9,5,14,3,13,9,8,68,11,0,18,2,79,5,9,11,68,1,14,13,19,7,2,18,3,10,2,28,23,73,79,37,9,11,68,16,10,68,15,14,18,2,79,23,2,10,10,71,7,13,20,79,3,11,0,22,30,67,68,19,7,1,71,8,8,8,29,29,71,0,2,71,27,12,2,79,11,9,3,29,71,60,11,9,79,11,1,79,16,15,10,68,33,14,16,15,10,22,73 diff --git a/src/projecteuler/060.py b/src/projecteuler/060.py deleted file mode 100644 index 22d1311..0000000 --- a/src/projecteuler/060.py +++ /dev/null @@ -1,49 +0,0 @@ -from common import sieve - -# -# WARNING: uses a lot of RAM! -# -# notes: -# - limit:1000000, sieve:50000000 -> no result when starting with ["3"] or ["7"] -# - limit:800000, sieve:50000000 -> no result! -# - limit:100000, sieve:100000000 -> [['13', '5197', '5701', '6733', '8389']] -# -# - -limit = 9000 - -primes = sieve(int(str(limit)+str(limit))).primes() -prime_list = [ p for p in primes if p < limit] -prime_list.sort() -prime_list_str = [ str(p) for p in prime_list ] - -def check_list(l): - result = [] - for sublist in l: - for p in prime_list_str: - isprime = True - for n in sublist: - if int(n+p) not in primes or int(p+n) not in primes: - isprime = False - break - if isprime: - result += [ sublist+[p] ] - - return result - - -def cleanup(l): - result = [] - for sublist in l: - sublist.sort() - if sublist not in result: - result += [sublist] - return result - - -l = [ [p] for p in prime_list_str ] -for i in range(4): - l = cleanup(check_list(l)) - -print l - diff --git a/src/projecteuler/061.py b/src/projecteuler/061.py deleted file mode 100644 index d9688e1..0000000 --- a/src/projecteuler/061.py +++ /dev/null @@ -1,53 +0,0 @@ - -import sys - -triangle = set([ n*(n+1)/2 for n in range(45,141) ]) -square = set([ n*n for n in range(32,99) ]) -pentagonal = set([ n*(3*n-1)/2 for n in range(26,82) ]) -hexagonal = set([ n*(2*n-1) for n in range(23,71) ]) -heptagonal = set([ n*(5*n-3)/2 for n in range(21,64) ]) -octagonal = set([ n*(3*n-2) for n in range(19,59) ]) - -whole = set(triangle | square | pentagonal | hexagonal | heptagonal | octagonal) - - -def check_cond(testset): - check = 0 - for e in testset: - if e in octagonal: - check |= 1 - elif e in heptagonal: - check |= 2 - elif e in hexagonal: - check |= 4 - elif e in pentagonal: - check |= 8 - elif e in square: - check |= 16 - elif e in triangle: - check |= 32 - return check == 63 - -for i0 in whole: - t0 = i0 % 100 - tail0 = [ n for n in whole if t0*100 < n < (t0+1)*100 ] - for i1 in tail0: - t1 = i1 % 100 - tail1 = [ n for n in whole if t1*100 < n < (t1+1)*100 ] - for i2 in tail1: - t2 = i2 % 100 - tail2 = [ n for n in whole if t2*100 < n < (t2+1)*100 ] - for i3 in tail2: - t3 = i3 % 100 - tail3 = [ n for n in whole if t3*100 < n < (t3+1)*100 ] - for i4 in tail3: - t4 = i4 % 100 - tail4 = [ n for n in whole if t4*100 < n < (t4+1)*100 ] - for i5 in tail4: - if i5 % 100 != i0 / 100: - continue - s = set([i0, i1, i2, i3, i4, i5]) - if len(s) == 6 and check_cond(s): - print sum(s) - sys.exit(0) - diff --git a/src/projecteuler/062.c b/src/projecteuler/062.c deleted file mode 100644 index 4ba3350..0000000 --- a/src/projecteuler/062.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include - -struct number -{ - char digits[10]; -}; - -const int cubecount = 30000; -struct number* cubedigits; - -int main(void) -{ - int i, j; - - cubedigits = (struct number*) malloc(cubecount*sizeof(struct number)); - memset(cubedigits, 0, cubecount*sizeof(struct number)); - - for(i=1; i 0) - { - char digit = c % 10; - cubedigits[i].digits[digit]++; - c /= 10; - } - - // search for permutations (i.e. same digits) - count = 0; - for(j=1; j -#include -#include -#include - - -const int size = 100; -double *fraction; -int pos = 0; - -void continued_fraction(int n) -{ - double sqrtn, x, y, an, a0; - - memset(fraction, 0, size*sizeof(double)); - pos = 0; - - sqrtn = sqrt((double)n); - a0 = floor(sqrtn); - - if((int)sqrtn*sqrtn == n) // works only for rational square roots - { - fraction[pos] = sqrtn; - return; - } - - // - // floor + ( sqrt(23) - x ) / y - // nenner = (23 - x*x) - // tmp = y * (sqrt(23) + x) / nenner) - // an = floor(tmp) - // x = an*nenner/y - x - // - x = a0; - y = 1.0; - - while(1) - { - double denominator = (n - x*x); - double tmp = y * (sqrtn + x) / denominator; - an = floor(tmp); - x = (an * denominator / y) - x; - y = denominator / y; - - fraction[pos++] = an; - - if(an == 2*a0) - break; - } - - /* - // not working because of double imprecision - while(1) - { - an = floorl(a); - r = 1/(a - an); - a = r; - - fraction[++pos] = an; - - if(an == 2*a0) - break; - } - */ -} - -int main(void) -{ - int i, count=0; - - fraction = (double*) malloc(size*sizeof(double)); - - for(i=2; i<=10000; i++) - { - continued_fraction(i); - if(pos > 0 && pos&1 == 1) - count++; - } - - printf("%i\n", count); - - return 0; -} - diff --git a/src/projecteuler/065.c b/src/projecteuler/065.c deleted file mode 100644 index 94c17fd..0000000 --- a/src/projecteuler/065.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -#define limit 100 - -unsigned int start = 2; -unsigned int factors[limit-1]; - -int main(void) -{ - int pos, k=1, sum; - mpz_t numerator, denominator; - - for(pos=0; pos=0; pos--) - { - mpz_addmul_ui(numerator, denominator, factors[pos]); // numerator += denominator * factors[pos] - mpz_swap(numerator, denominator); - } - - mpz_addmul_ui(numerator, denominator, start); // numerator += denominator * start - - sum = 0; - while(mpz_cmp_ui(numerator, 0) > 0) - sum += mpz_fdiv_q_ui(numerator, numerator, 10); - - printf("%li\n", sum); - - return 0; -} - diff --git a/src/projecteuler/066.c b/src/projecteuler/066.c deleted file mode 100644 index 3c1014e..0000000 --- a/src/projecteuler/066.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include -#include - -// numerator/denominator pairs of continued fractions are solutions to pell's equations - -/* - * taken from problem 65 - * - * numerator, denominator: resulting num / denom are stored there - * limit: depth of continued fraction - * start: decimal part (pre-period) - * factors, factor_len: period of continued fraction with factor_len elements - * - */ -void compute(mpz_t numerator, mpz_t denominator, unsigned int limit, - unsigned long start, const unsigned int* factors, unsigned int factor_len) -{ - int i; - mpz_set_ui(numerator, 1); - mpz_set_ui(denominator, factors[limit % factor_len]); - for(i=limit-1; i>=0; i--) - { - mpz_addmul_ui(numerator, denominator, factors[i % factor_len]); - mpz_swap(numerator, denominator); - } - mpz_addmul_ui(numerator, denominator, start); -} - -// taken from problem 64 -int continued_fraction(unsigned int* fraction, unsigned int n) -{ - double sqrtn, x, y; - unsigned int an, a0, pos=0; - - sqrtn = sqrt((double)n); - a0 = (int)floor(sqrtn); - - fraction[pos++] = sqrtn; - - if((int)sqrtn*sqrtn == n) // works only for rational square roots - return 1; - - x = (double)a0; - y = 1.0; - - while(1) - { - double denominator = (n - x*x); - double tmp = y * (sqrtn + x) / denominator; - an = (int)floor(tmp); - x = (an * denominator / y) - x; - y = denominator / y; - - fraction[pos++] = an; - - if(an == 2*a0) - break; - } - - return pos; -} - -const int max_period_size = 100; - -int main(void) -{ - int d, i, maxd=0; - mpz_t maxx, numerator, denominator, tmp1, tmp2; - unsigned int* fraction = (unsigned int*) malloc(max_period_size*sizeof(unsigned int)); - - mpz_init_set_ui(maxx, 0); - mpz_init(numerator); - mpz_init(denominator); - mpz_init(tmp1); - mpz_init(tmp2); - - for(d=2; d<=1000; d++) - { - - memset(fraction, 0, max_period_size*sizeof(unsigned int)); - int frac_len = continued_fraction(fraction, d); - - if(frac_len == 1) // no solution for squares - continue; - - for(i=0;;i++) - { - compute(numerator, denominator, i, fraction[0], &(fraction[1]), frac_len-1); - - // numerator^2 - denominator^2 * d - mpz_mul(tmp1, numerator, numerator); - mpz_mul(tmp2, denominator, denominator); - mpz_submul_ui(tmp1, tmp2, d); - if(mpz_cmp_ui(tmp1, 1) == 0) - break; - } - - if(mpz_cmp(numerator, maxx) > 0) - { - mpz_set(maxx, numerator); - maxd = d; - } - } - - printf("%d\n", maxd); - - return 0; -} - diff --git a/src/projecteuler/067.py b/src/projecteuler/067.py deleted file mode 100644 index 2678fd9..0000000 --- a/src/projecteuler/067.py +++ /dev/null @@ -1,20 +0,0 @@ - -triangle = [] - -f = open('067.txt', 'r') -for line in f: - line.rstrip('\n') - row_str = line.split(' ') - row_int = [ int(x) for x in row_str ] - triangle.append(row_int) -f.close() - -for i in range(1, len(triangle)): - rowlen = len(triangle[i]) - triangle[i][0] += triangle[i-1][0] - triangle[i][rowlen-1] += triangle[i-1][rowlen-2] - for j in range(1, rowlen-1): - triangle[i][j] += max(triangle[i-1][j-1], triangle[i-1][j]) - -print max(triangle[-1]) - diff --git a/src/projecteuler/067.txt b/src/projecteuler/067.txt deleted file mode 100644 index 00f98e3..0000000 --- a/src/projecteuler/067.txt +++ /dev/null @@ -1,100 +0,0 @@ -59 -73 41 -52 40 09 -26 53 06 34 -10 51 87 86 81 -61 95 66 57 25 68 -90 81 80 38 92 67 73 -30 28 51 76 81 18 75 44 -84 14 95 87 62 81 17 78 58 -21 46 71 58 02 79 62 39 31 09 -56 34 35 53 78 31 81 18 90 93 15 -78 53 04 21 84 93 32 13 97 11 37 51 -45 03 81 79 05 18 78 86 13 30 63 99 95 -39 87 96 28 03 38 42 17 82 87 58 07 22 57 -06 17 51 17 07 93 09 07 75 97 95 78 87 08 53 -67 66 59 60 88 99 94 65 55 77 55 34 27 53 78 28 -76 40 41 04 87 16 09 42 75 69 23 97 30 60 10 79 87 -12 10 44 26 21 36 32 84 98 60 13 12 36 16 63 31 91 35 -70 39 06 05 55 27 38 48 28 22 34 35 62 62 15 14 94 89 86 -66 56 68 84 96 21 34 34 34 81 62 40 65 54 62 05 98 03 02 60 -38 89 46 37 99 54 34 53 36 14 70 26 02 90 45 13 31 61 83 73 47 -36 10 63 96 60 49 41 05 37 42 14 58 84 93 96 17 09 43 05 43 06 59 -66 57 87 57 61 28 37 51 84 73 79 15 39 95 88 87 43 39 11 86 77 74 18 -54 42 05 79 30 49 99 73 46 37 50 02 45 09 54 52 27 95 27 65 19 45 26 45 -71 39 17 78 76 29 52 90 18 99 78 19 35 62 71 19 23 65 93 85 49 33 75 09 02 -33 24 47 61 60 55 32 88 57 55 91 54 46 57 07 77 98 52 80 99 24 25 46 78 79 05 -92 09 13 55 10 67 26 78 76 82 63 49 51 31 24 68 05 57 07 54 69 21 67 43 17 63 12 -24 59 06 08 98 74 66 26 61 60 13 03 09 09 24 30 71 08 88 70 72 70 29 90 11 82 41 34 -66 82 67 04 36 60 92 77 91 85 62 49 59 61 30 90 29 94 26 41 89 04 53 22 83 41 09 74 90 -48 28 26 37 28 52 77 26 51 32 18 98 79 36 62 13 17 08 19 54 89 29 73 68 42 14 08 16 70 37 -37 60 69 70 72 71 09 59 13 60 38 13 57 36 09 30 43 89 30 39 15 02 44 73 05 73 26 63 56 86 12 -55 55 85 50 62 99 84 77 28 85 03 21 27 22 19 26 82 69 54 04 13 07 85 14 01 15 70 59 89 95 10 19 -04 09 31 92 91 38 92 86 98 75 21 05 64 42 62 84 36 20 73 42 21 23 22 51 51 79 25 45 85 53 03 43 22 -75 63 02 49 14 12 89 14 60 78 92 16 44 82 38 30 72 11 46 52 90 27 08 65 78 03 85 41 57 79 39 52 33 48 -78 27 56 56 39 13 19 43 86 72 58 95 39 07 04 34 21 98 39 15 39 84 89 69 84 46 37 57 59 35 59 50 26 15 93 -42 89 36 27 78 91 24 11 17 41 05 94 07 69 51 96 03 96 47 90 90 45 91 20 50 56 10 32 36 49 04 53 85 92 25 65 -52 09 61 30 61 97 66 21 96 92 98 90 06 34 96 60 32 69 68 33 75 84 18 31 71 50 84 63 03 03 19 11 28 42 75 45 45 -61 31 61 68 96 34 49 39 05 71 76 59 62 67 06 47 96 99 34 21 32 47 52 07 71 60 42 72 94 56 82 83 84 40 94 87 82 46 -01 20 60 14 17 38 26 78 66 81 45 95 18 51 98 81 48 16 53 88 37 52 69 95 72 93 22 34 98 20 54 27 73 61 56 63 60 34 63 -93 42 94 83 47 61 27 51 79 79 45 01 44 73 31 70 83 42 88 25 53 51 30 15 65 94 80 44 61 84 12 77 02 62 02 65 94 42 14 94 -32 73 09 67 68 29 74 98 10 19 85 48 38 31 85 67 53 93 93 77 47 67 39 72 94 53 18 43 77 40 78 32 29 59 24 06 02 83 50 60 66 -32 01 44 30 16 51 15 81 98 15 10 62 86 79 50 62 45 60 70 38 31 85 65 61 64 06 69 84 14 22 56 43 09 48 66 69 83 91 60 40 36 61 -92 48 22 99 15 95 64 43 01 16 94 02 99 19 17 69 11 58 97 56 89 31 77 45 67 96 12 73 08 20 36 47 81 44 50 64 68 85 40 81 85 52 09 -91 35 92 45 32 84 62 15 19 64 21 66 06 01 52 80 62 59 12 25 88 28 91 50 40 16 22 99 92 79 87 51 21 77 74 77 07 42 38 42 74 83 02 05 -46 19 77 66 24 18 05 32 02 84 31 99 92 58 96 72 91 36 62 99 55 29 53 42 12 37 26 58 89 50 66 19 82 75 12 48 24 87 91 85 02 07 03 76 86 -99 98 84 93 07 17 33 61 92 20 66 60 24 66 40 30 67 05 37 29 24 96 03 27 70 62 13 04 45 47 59 88 43 20 66 15 46 92 30 04 71 66 78 70 53 99 -67 60 38 06 88 04 17 72 10 99 71 07 42 25 54 05 26 64 91 50 45 71 06 30 67 48 69 82 08 56 80 67 18 46 66 63 01 20 08 80 47 07 91 16 03 79 87 -18 54 78 49 80 48 77 40 68 23 60 88 58 80 33 57 11 69 55 53 64 02 94 49 60 92 16 35 81 21 82 96 25 24 96 18 02 05 49 03 50 77 06 32 84 27 18 38 -68 01 50 04 03 21 42 94 53 24 89 05 92 26 52 36 68 11 85 01 04 42 02 45 15 06 50 04 53 73 25 74 81 88 98 21 67 84 79 97 99 20 95 04 40 46 02 58 87 -94 10 02 78 88 52 21 03 88 60 06 53 49 71 20 91 12 65 07 49 21 22 11 41 58 99 36 16 09 48 17 24 52 36 23 15 72 16 84 56 02 99 43 76 81 71 29 39 49 17 -64 39 59 84 86 16 17 66 03 09 43 06 64 18 63 29 68 06 23 07 87 14 26 35 17 12 98 41 53 64 78 18 98 27 28 84 80 67 75 62 10 11 76 90 54 10 05 54 41 39 66 -43 83 18 37 32 31 52 29 95 47 08 76 35 11 04 53 35 43 34 10 52 57 12 36 20 39 40 55 78 44 07 31 38 26 08 15 56 88 86 01 52 62 10 24 32 05 60 65 53 28 57 99 -03 50 03 52 07 73 49 92 66 80 01 46 08 67 25 36 73 93 07 42 25 53 13 96 76 83 87 90 54 89 78 22 78 91 73 51 69 09 79 94 83 53 09 40 69 62 10 79 49 47 03 81 30 -71 54 73 33 51 76 59 54 79 37 56 45 84 17 62 21 98 69 41 95 65 24 39 37 62 03 24 48 54 64 46 82 71 78 33 67 09 16 96 68 52 74 79 68 32 21 13 78 96 60 09 69 20 36 -73 26 21 44 46 38 17 83 65 98 07 23 52 46 61 97 33 13 60 31 70 15 36 77 31 58 56 93 75 68 21 36 69 53 90 75 25 82 39 50 65 94 29 30 11 33 11 13 96 02 56 47 07 49 02 -76 46 73 30 10 20 60 70 14 56 34 26 37 39 48 24 55 76 84 91 39 86 95 61 50 14 53 93 64 67 37 31 10 84 42 70 48 20 10 72 60 61 84 79 69 65 99 73 89 25 85 48 92 56 97 16 -03 14 80 27 22 30 44 27 67 75 79 32 51 54 81 29 65 14 19 04 13 82 04 91 43 40 12 52 29 99 07 76 60 25 01 07 61 71 37 92 40 47 99 66 57 01 43 44 22 40 53 53 09 69 26 81 07 -49 80 56 90 93 87 47 13 75 28 87 23 72 79 32 18 27 20 28 10 37 59 21 18 70 04 79 96 03 31 45 71 81 06 14 18 17 05 31 50 92 79 23 47 09 39 47 91 43 54 69 47 42 95 62 46 32 85 -37 18 62 85 87 28 64 05 77 51 47 26 30 65 05 70 65 75 59 80 42 52 25 20 44 10 92 17 71 95 52 14 77 13 24 55 11 65 26 91 01 30 63 15 49 48 41 17 67 47 03 68 20 90 98 32 04 40 68 -90 51 58 60 06 55 23 68 05 19 76 94 82 36 96 43 38 90 87 28 33 83 05 17 70 83 96 93 06 04 78 47 80 06 23 84 75 23 87 72 99 14 50 98 92 38 90 64 61 58 76 94 36 66 87 80 51 35 61 38 -57 95 64 06 53 36 82 51 40 33 47 14 07 98 78 65 39 58 53 06 50 53 04 69 40 68 36 69 75 78 75 60 03 32 39 24 74 47 26 90 13 40 44 71 90 76 51 24 36 50 25 45 70 80 61 80 61 43 90 64 11 -18 29 86 56 68 42 79 10 42 44 30 12 96 18 23 18 52 59 02 99 67 46 60 86 43 38 55 17 44 93 42 21 55 14 47 34 55 16 49 24 23 29 96 51 55 10 46 53 27 92 27 46 63 57 30 65 43 27 21 20 24 83 -81 72 93 19 69 52 48 01 13 83 92 69 20 48 69 59 20 62 05 42 28 89 90 99 32 72 84 17 08 87 36 03 60 31 36 36 81 26 97 36 48 54 56 56 27 16 91 08 23 11 87 99 33 47 02 14 44 73 70 99 43 35 33 -90 56 61 86 56 12 70 59 63 32 01 15 81 47 71 76 95 32 65 80 54 70 34 51 40 45 33 04 64 55 78 68 88 47 31 47 68 87 03 84 23 44 89 72 35 08 31 76 63 26 90 85 96 67 65 91 19 14 17 86 04 71 32 95 -37 13 04 22 64 37 37 28 56 62 86 33 07 37 10 44 52 82 52 06 19 52 57 75 90 26 91 24 06 21 14 67 76 30 46 14 35 89 89 41 03 64 56 97 87 63 22 34 03 79 17 45 11 53 25 56 96 61 23 18 63 31 37 37 47 -77 23 26 70 72 76 77 04 28 64 71 69 14 85 96 54 95 48 06 62 99 83 86 77 97 75 71 66 30 19 57 90 33 01 60 61 14 12 90 99 32 77 56 41 18 14 87 49 10 14 90 64 18 50 21 74 14 16 88 05 45 73 82 47 74 44 -22 97 41 13 34 31 54 61 56 94 03 24 59 27 98 77 04 09 37 40 12 26 87 09 71 70 07 18 64 57 80 21 12 71 83 94 60 39 73 79 73 19 97 32 64 29 41 07 48 84 85 67 12 74 95 20 24 52 41 67 56 61 29 93 35 72 69 -72 23 63 66 01 11 07 30 52 56 95 16 65 26 83 90 50 74 60 18 16 48 43 77 37 11 99 98 30 94 91 26 62 73 45 12 87 73 47 27 01 88 66 99 21 41 95 80 02 53 23 32 61 48 32 43 43 83 14 66 95 91 19 81 80 67 25 88 -08 62 32 18 92 14 83 71 37 96 11 83 39 99 05 16 23 27 10 67 02 25 44 11 55 31 46 64 41 56 44 74 26 81 51 31 45 85 87 09 81 95 22 28 76 69 46 48 64 87 67 76 27 89 31 11 74 16 62 03 60 94 42 47 09 34 94 93 72 -56 18 90 18 42 17 42 32 14 86 06 53 33 95 99 35 29 15 44 20 49 59 25 54 34 59 84 21 23 54 35 90 78 16 93 13 37 88 54 19 86 67 68 55 66 84 65 42 98 37 87 56 33 28 58 38 28 38 66 27 52 21 81 15 08 22 97 32 85 27 -91 53 40 28 13 34 91 25 01 63 50 37 22 49 71 58 32 28 30 18 68 94 23 83 63 62 94 76 80 41 90 22 82 52 29 12 18 56 10 08 35 14 37 57 23 65 67 40 72 39 93 39 70 89 40 34 07 46 94 22 20 05 53 64 56 30 05 56 61 88 27 -23 95 11 12 37 69 68 24 66 10 87 70 43 50 75 07 62 41 83 58 95 93 89 79 45 39 02 22 05 22 95 43 62 11 68 29 17 40 26 44 25 71 87 16 70 85 19 25 59 94 90 41 41 80 61 70 55 60 84 33 95 76 42 63 15 09 03 40 38 12 03 32 -09 84 56 80 61 55 85 97 16 94 82 94 98 57 84 30 84 48 93 90 71 05 95 90 73 17 30 98 40 64 65 89 07 79 09 19 56 36 42 30 23 69 73 72 07 05 27 61 24 31 43 48 71 84 21 28 26 65 65 59 65 74 77 20 10 81 61 84 95 08 52 23 70 -47 81 28 09 98 51 67 64 35 51 59 36 92 82 77 65 80 24 72 53 22 07 27 10 21 28 30 22 48 82 80 48 56 20 14 43 18 25 50 95 90 31 77 08 09 48 44 80 90 22 93 45 82 17 13 96 25 26 08 73 34 99 06 49 24 06 83 51 40 14 15 10 25 01 -54 25 10 81 30 64 24 74 75 80 36 75 82 60 22 69 72 91 45 67 03 62 79 54 89 74 44 83 64 96 66 73 44 30 74 50 37 05 09 97 70 01 60 46 37 91 39 75 75 18 58 52 72 78 51 81 86 52 08 97 01 46 43 66 98 62 81 18 70 93 73 08 32 46 34 -96 80 82 07 59 71 92 53 19 20 88 66 03 26 26 10 24 27 50 82 94 73 63 08 51 33 22 45 19 13 58 33 90 15 22 50 36 13 55 06 35 47 82 52 33 61 36 27 28 46 98 14 73 20 73 32 16 26 80 53 47 66 76 38 94 45 02 01 22 52 47 96 64 58 52 39 -88 46 23 39 74 63 81 64 20 90 33 33 76 55 58 26 10 46 42 26 74 74 12 83 32 43 09 02 73 55 86 54 85 34 28 23 29 79 91 62 47 41 82 87 99 22 48 90 20 05 96 75 95 04 43 28 81 39 81 01 28 42 78 25 39 77 90 57 58 98 17 36 73 22 63 74 51 -29 39 74 94 95 78 64 24 38 86 63 87 93 06 70 92 22 16 80 64 29 52 20 27 23 50 14 13 87 15 72 96 81 22 08 49 72 30 70 24 79 31 16 64 59 21 89 34 96 91 48 76 43 53 88 01 57 80 23 81 90 79 58 01 80 87 17 99 86 90 72 63 32 69 14 28 88 69 -37 17 71 95 56 93 71 35 43 45 04 98 92 94 84 96 11 30 31 27 31 60 92 03 48 05 98 91 86 94 35 90 90 08 48 19 33 28 68 37 59 26 65 96 50 68 22 07 09 49 34 31 77 49 43 06 75 17 81 87 61 79 52 26 27 72 29 50 07 98 86 01 17 10 46 64 24 18 56 -51 30 25 94 88 85 79 91 40 33 63 84 49 67 98 92 15 26 75 19 82 05 18 78 65 93 61 48 91 43 59 41 70 51 22 15 92 81 67 91 46 98 11 11 65 31 66 10 98 65 83 21 05 56 05 98 73 67 46 74 69 34 08 30 05 52 07 98 32 95 30 94 65 50 24 63 28 81 99 57 -19 23 61 36 09 89 71 98 65 17 30 29 89 26 79 74 94 11 44 48 97 54 81 55 39 66 69 45 28 47 13 86 15 76 74 70 84 32 36 33 79 20 78 14 41 47 89 28 81 05 99 66 81 86 38 26 06 25 13 60 54 55 23 53 27 05 89 25 23 11 13 54 59 54 56 34 16 24 53 44 06 -13 40 57 72 21 15 60 08 04 19 11 98 34 45 09 97 86 71 03 15 56 19 15 44 97 31 90 04 87 87 76 08 12 30 24 62 84 28 12 85 82 53 99 52 13 94 06 65 97 86 09 50 94 68 69 74 30 67 87 94 63 07 78 27 80 36 69 41 06 92 32 78 37 82 30 05 18 87 99 72 19 99 -44 20 55 77 69 91 27 31 28 81 80 27 02 07 97 23 95 98 12 25 75 29 47 71 07 47 78 39 41 59 27 76 13 15 66 61 68 35 69 86 16 53 67 63 99 85 41 56 08 28 33 40 94 76 90 85 31 70 24 65 84 65 99 82 19 25 54 37 21 46 33 02 52 99 51 33 26 04 87 02 08 18 96 -54 42 61 45 91 06 64 79 80 82 32 16 83 63 42 49 19 78 65 97 40 42 14 61 49 34 04 18 25 98 59 30 82 72 26 88 54 36 21 75 03 88 99 53 46 51 55 78 22 94 34 40 68 87 84 25 30 76 25 08 92 84 42 61 40 38 09 99 40 23 29 39 46 55 10 90 35 84 56 70 63 23 91 39 -52 92 03 71 89 07 09 37 68 66 58 20 44 92 51 56 13 71 79 99 26 37 02 06 16 67 36 52 58 16 79 73 56 60 59 27 44 77 94 82 20 50 98 33 09 87 94 37 40 83 64 83 58 85 17 76 53 02 83 52 22 27 39 20 48 92 45 21 09 42 24 23 12 37 52 28 50 78 79 20 86 62 73 20 59 -54 96 80 15 91 90 99 70 10 09 58 90 93 50 81 99 54 38 36 10 30 11 35 84 16 45 82 18 11 97 36 43 96 79 97 65 40 48 23 19 17 31 64 52 65 65 37 32 65 76 99 79 34 65 79 27 55 33 03 01 33 27 61 28 66 08 04 70 49 46 48 83 01 45 19 96 13 81 14 21 31 79 93 85 50 05 -92 92 48 84 59 98 31 53 23 27 15 22 79 95 24 76 05 79 16 93 97 89 38 89 42 83 02 88 94 95 82 21 01 97 48 39 31 78 09 65 50 56 97 61 01 07 65 27 21 23 14 15 80 97 44 78 49 35 33 45 81 74 34 05 31 57 09 38 94 07 69 54 69 32 65 68 46 68 78 90 24 28 49 51 45 86 35 -41 63 89 76 87 31 86 09 46 14 87 82 22 29 47 16 13 10 70 72 82 95 48 64 58 43 13 75 42 69 21 12 67 13 64 85 58 23 98 09 37 76 05 22 31 12 66 50 29 99 86 72 45 25 10 28 19 06 90 43 29 31 67 79 46 25 74 14 97 35 76 37 65 46 23 82 06 22 30 76 93 66 94 17 96 13 20 72 -63 40 78 08 52 09 90 41 70 28 36 14 46 44 85 96 24 52 58 15 87 37 05 98 99 39 13 61 76 38 44 99 83 74 90 22 53 80 56 98 30 51 63 39 44 30 91 91 04 22 27 73 17 35 53 18 35 45 54 56 27 78 48 13 69 36 44 38 71 25 30 56 15 22 73 43 32 69 59 25 93 83 45 11 34 94 44 39 92 -12 36 56 88 13 96 16 12 55 54 11 47 19 78 17 17 68 81 77 51 42 55 99 85 66 27 81 79 93 42 65 61 69 74 14 01 18 56 12 01 58 37 91 22 42 66 83 25 19 04 96 41 25 45 18 69 96 88 36 93 10 12 98 32 44 83 83 04 72 91 04 27 73 07 34 37 71 60 59 31 01 54 54 44 96 93 83 36 04 45 -30 18 22 20 42 96 65 79 17 41 55 69 94 81 29 80 91 31 85 25 47 26 43 49 02 99 34 67 99 76 16 14 15 93 08 32 99 44 61 77 67 50 43 55 87 55 53 72 17 46 62 25 50 99 73 05 93 48 17 31 70 80 59 09 44 59 45 13 74 66 58 94 87 73 16 14 85 38 74 99 64 23 79 28 71 42 20 37 82 31 23 -51 96 39 65 46 71 56 13 29 68 53 86 45 33 51 49 12 91 21 21 76 85 02 17 98 15 46 12 60 21 88 30 92 83 44 59 42 50 27 88 46 86 94 73 45 54 23 24 14 10 94 21 20 34 23 51 04 83 99 75 90 63 60 16 22 33 83 70 11 32 10 50 29 30 83 46 11 05 31 17 86 42 49 01 44 63 28 60 07 78 95 40 -44 61 89 59 04 49 51 27 69 71 46 76 44 04 09 34 56 39 15 06 94 91 75 90 65 27 56 23 74 06 23 33 36 69 14 39 05 34 35 57 33 22 76 46 56 10 61 65 98 09 16 69 04 62 65 18 99 76 49 18 72 66 73 83 82 40 76 31 89 91 27 88 17 35 41 35 32 51 32 67 52 68 74 85 80 57 07 11 62 66 47 22 67 -65 37 19 97 26 17 16 24 24 17 50 37 64 82 24 36 32 11 68 34 69 31 32 89 79 93 96 68 49 90 14 23 04 04 67 99 81 74 70 74 36 96 68 09 64 39 88 35 54 89 96 58 66 27 88 97 32 14 06 35 78 20 71 06 85 66 57 02 58 91 72 05 29 56 73 48 86 52 09 93 22 57 79 42 12 01 31 68 17 59 63 76 07 77 -73 81 14 13 17 20 11 09 01 83 08 85 91 70 84 63 62 77 37 07 47 01 59 95 39 69 39 21 99 09 87 02 97 16 92 36 74 71 90 66 33 73 73 75 52 91 11 12 26 53 05 26 26 48 61 50 90 65 01 87 42 47 74 35 22 73 24 26 56 70 52 05 48 41 31 18 83 27 21 39 80 85 26 08 44 02 71 07 63 22 05 52 19 08 20 -17 25 21 11 72 93 33 49 64 23 53 82 03 13 91 65 85 02 40 05 42 31 77 42 05 36 06 54 04 58 07 76 87 83 25 57 66 12 74 33 85 37 74 32 20 69 03 97 91 68 82 44 19 14 89 28 85 85 80 53 34 87 58 98 88 78 48 65 98 40 11 57 10 67 70 81 60 79 74 72 97 59 79 47 30 20 54 80 89 91 14 05 33 36 79 39 -60 85 59 39 60 07 57 76 77 92 06 35 15 72 23 41 45 52 95 18 64 79 86 53 56 31 69 11 91 31 84 50 44 82 22 81 41 40 30 42 30 91 48 94 74 76 64 58 74 25 96 57 14 19 03 99 28 83 15 75 99 01 89 85 79 50 03 95 32 67 44 08 07 41 62 64 29 20 14 76 26 55 48 71 69 66 19 72 44 25 14 01 48 74 12 98 07 -64 66 84 24 18 16 27 48 20 14 47 69 30 86 48 40 23 16 61 21 51 50 26 47 35 33 91 28 78 64 43 68 04 79 51 08 19 60 52 95 06 68 46 86 35 97 27 58 04 65 30 58 99 12 12 75 91 39 50 31 42 64 70 04 46 07 98 73 98 93 37 89 77 91 64 71 64 65 66 21 78 62 81 74 42 20 83 70 73 95 78 45 92 27 34 53 71 15 -30 11 85 31 34 71 13 48 05 14 44 03 19 67 23 73 19 57 06 90 94 72 57 69 81 62 59 68 88 57 55 69 49 13 07 87 97 80 89 05 71 05 05 26 38 40 16 62 45 99 18 38 98 24 21 26 62 74 69 04 85 57 77 35 58 67 91 79 79 57 86 28 66 34 72 51 76 78 36 95 63 90 08 78 47 63 45 31 22 70 52 48 79 94 15 77 61 67 68 -23 33 44 81 80 92 93 75 94 88 23 61 39 76 22 03 28 94 32 06 49 65 41 34 18 23 08 47 62 60 03 63 33 13 80 52 31 54 73 43 70 26 16 69 57 87 83 31 03 93 70 81 47 95 77 44 29 68 39 51 56 59 63 07 25 70 07 77 43 53 64 03 94 42 95 39 18 01 66 21 16 97 20 50 90 16 70 10 95 69 29 06 25 61 41 26 15 59 63 35 diff --git a/src/projecteuler/068.py b/src/projecteuler/068.py deleted file mode 100644 index 2357156..0000000 --- a/src/projecteuler/068.py +++ /dev/null @@ -1,5 +0,0 @@ -# 16-digit string -> 10 on the outside (used once) - -# solved on paper by "trial-and-error": -print "6531031914842725" - diff --git a/src/projecteuler/069.py b/src/projecteuler/069.py deleted file mode 100644 index 99236c5..0000000 --- a/src/projecteuler/069.py +++ /dev/null @@ -1,28 +0,0 @@ -from common import sieve - -primes = sieve(1000000).primes() -prime_list = [ p for p in primes if p < 1000 ] -prime_list.sort() - -def phi(x): - if x in primes: - return x-1 - product = x - for p in prime_list: - if p*p > x: - break - if x % p != 0: - continue - product *= (1 - 1/float(p)) - return product - -maxn = 0 -maxres = 0 - -for n in xrange(2, 1000001): - if n/phi(n) >= maxres: - maxres = n/phi(n) - maxn = n - -print maxn - diff --git a/src/projecteuler/069_2.py b/src/projecteuler/069_2.py deleted file mode 100644 index c00483b..0000000 --- a/src/projecteuler/069_2.py +++ /dev/null @@ -1,22 +0,0 @@ -# -# n/phi(n) is a maximum, if phi(n) is minimal -# -# phi(n) = n*(1-1/p1)*(1-1/p2)*...*(1-1/pi) -# n/phi(n) = 1/((1-1/p1)*(1-1/p2)*...*(1-1/pi)) -# -> smallest primes -# - -from common import sieve - -primes = sieve(100).primes() -prime_list = [ x for x in primes ] -prime_list.sort() - -x = 1 -for p in prime_list: - if x*p > 1000000: - break - x *= p - -print x - diff --git a/src/projecteuler/071.py b/src/projecteuler/071.py deleted file mode 100644 index 44c38b0..0000000 --- a/src/projecteuler/071.py +++ /dev/null @@ -1,15 +0,0 @@ - -from common import ggt -import math - -limit = 1000000 - -(n1, d1) = (1, limit) - -for d2 in xrange(limit+1): - n2 = int(math.floor(float(d2) * 3.0/7.0)) - if n2*d1 > n1*d2 and ggt(n2, d2) == 1 and d2 != 7: - (n1, d1) = (n2, d2) - -print n1 - diff --git a/src/projecteuler/072.c b/src/projecteuler/072.c deleted file mode 100644 index c886291..0000000 --- a/src/projecteuler/072.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "common.h" - -const int limit = 1000000; - -int main() -{ - unsigned long* prime_list = primes(limit); - unsigned long sum = 0; - int n; - - for(n=2; n 0: - x += fac[n % 10] - n /= 10 - return x - -def count(n): - if numbers[n] != 0: - return - chain = [n] - x = next(n) - while x not in chain: - chain.append(x) - if numbers[x] != 0: - break - x = next(x) - last = numbers[chain[-1]] - l = len(chain) - for j in xrange(0, l-1): - c = chain[j] - numbers[c] = l - j - 1 + last - -c = 0 -for i in xrange(10, 1000000): - count(i) - if numbers[i] == 60: - c += 1 - -print c - diff --git a/src/projecteuler/075.py b/src/projecteuler/075.py deleted file mode 100644 index 58e9136..0000000 --- a/src/projecteuler/075.py +++ /dev/null @@ -1,29 +0,0 @@ -# generating Pythagorean triplets - -limit = 1500000 -limit_search = 900 -squares = [ x*x for x in xrange(limit) ] -triangles = [ set() for x in xrange(limit+1) ] - - -for m in xrange(1, limit_search): - for n in xrange(1, m): - (a,b,c) = (squares[m] - squares[n], 2*m*n, squares[m] + squares[n]) - if a > b: - (a,b,c) = (b,a,c) - - k = 1 - while True: - if k*(a+b+c) > limit: - break - triangles[k*a + k*b + k*c].add((k*a,k*b,k*c)) - k += 1 - - -count = 0 -for t in triangles: - if len(t) == 1: - count += 1 - -print count - diff --git a/src/projecteuler/080.py b/src/projecteuler/080.py deleted file mode 100644 index 9becd19..0000000 --- a/src/projecteuler/080.py +++ /dev/null @@ -1,55 +0,0 @@ - -# schriftliches wurzelziehen: http://www.diaware.de/html/wurzel.html - -def sqrt(x, accuracy): - a = [] # vor komma - b = [] # nach komma - - groups = [] - while x > 0: - groups.append(x % 100) - x /= 100 - groups = groups[::-1] - - result = 0 - remainder = 0 - while accuracy > 0: - group = 100 * remainder - if len(groups) > 0: - group += groups[0] - - subcount = 0 - sub = 20*result + 1 - while sub < group: - group -= sub - if group < 0: - break - subcount += 1 - sub += 2 - remainder = group - if subcount == 0: - remainder *= 100 - result *= 10 - result += subcount - - if len(groups) > 0: - a.append(subcount) - del groups[0] - else: - b.append(subcount) - accuracy -= 1 - - return (a, b) - -squares = set([ x*x for x in range(11) ]) - -digitsum = 0 - -for n in xrange(100): - if n in squares: - continue - s = sqrt(n, 100) - digitsum += sum(s[0]) + sum(s[1]) - -print digitsum - diff --git a/src/projecteuler/081.py b/src/projecteuler/081.py deleted file mode 100644 index c951abf..0000000 --- a/src/projecteuler/081.py +++ /dev/null @@ -1,71 +0,0 @@ - -# uses Dijkstra's algorithm to find minimal path - -infinity = 999999 - -matrix = [] - -width = 80 -height = 80 - -f = open('081.txt', 'r') -for line in f: - line.rstrip('\n') - line_str = line.split(',') - line_int = [ int(x) for x in line_str ] - matrix.append(line_int) -f.close() - - -# initialize -distance = [infinity] * (width*height) -pre = [None] * (width*height) -distance[0] = 0 -Q = range(width*height) - -def mindistance(Q): - mind = infinity - mini = -1 - for i in Q: - if distance[i] < mind: - mind = distance[i] - mini = i - return mini - -def neighbors(u): - n = [] - row = u / width - col = u % width - if col < width-1: - n.append(row*width + col + 1) # right neighbor - if row < height-1: - n.append((row+1)*width + col) # lower neighbor - return n - -def update(u, v): - alt = distance[u] + matrix[v/width][v%width] - if alt < distance[v]: - distance[v] = alt - pre[v] = u - -# main algorithm -while len(Q) > 0: - u = mindistance(Q) - Q.remove(u) - for v in neighbors(u): - if v in Q: - update(u, v) - -# search min distance -u = width*height-1 # target node -path = [ u ] -while pre[u] != None: - u = pre[u] - path = [u] + path - -minsum = 0 -for n in path: - minsum += matrix[n/width][n%width] - -print minsum - diff --git a/src/projecteuler/081.txt b/src/projecteuler/081.txt deleted file mode 100644 index 1e9e6cd..0000000 --- a/src/projecteuler/081.txt +++ /dev/null @@ -1,80 +0,0 @@ -4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 -1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 -9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 -7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 -3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 -1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 -4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 -510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 -9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 -3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 -6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 -7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 -4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 -356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 -9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 -192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 -1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 -4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 -5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 -1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 -1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 -8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 -7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 -3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 -9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 -5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 -6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 -9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 -5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 -6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 -5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 -1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 -4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 -4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 -8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 -2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 -6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 -2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 -6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 -3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 -5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 -3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 -1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 -8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 -3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 -8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 -8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 -9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 -3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 -1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 -7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 -9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 -7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 -3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 -1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 -126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 -8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 -7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 -4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 -4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 -7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 -7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 -6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 -4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 -9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 -3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 -2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 -3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 -4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 -171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 -3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 -2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 -7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 -8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 -2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 -6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 -8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 -2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 -2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 -5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/src/projecteuler/082.py b/src/projecteuler/082.py deleted file mode 100644 index b0fd92a..0000000 --- a/src/projecteuler/082.py +++ /dev/null @@ -1,85 +0,0 @@ - -# uses Dijkstra's algorithm to find minimal path -# (based on solution for problem 81) -# -# slow, but working - -infinity = 99999999 - -matrix = [] - -width = 80 -height = 80 - -f = open('082.txt', 'r') -for line in f: - line.rstrip('\n') - line_str = line.split(',') - line_int = [ int(x) for x in line_str ] - matrix.append(line_int) -f.close() - -globalmin = 500000 - -for currentrow in range(height): - - # initialize - distance = [infinity] * (width*height) - pre = [None] * (width*height) - distance[currentrow*width] = 0 # start node - Q = range(width*height) - - def mindistance(Q): - mini = Q[0] - mind = distance[mini] - for i in Q: - if distance[i] < mind: - mind = distance[i] - mini = i - return mini - - def neighbors(u): - n = [] - row = u / width - col = u % width - if col == 0: - return[u+1] - if col < width-1: - n.append(row*width + col + 1) # right neighbor - if row < height-1: - n.append((row+1)*width + col) # lower neighbor - if row > 0: - n.append((row-1)*width + col) # upper neighbor - return n - - def update(u, v): - alt = distance[u] + matrix[v/width][v%width] - if alt < distance[v]: - distance[v] = alt - pre[v] = u - - # main algorithm - while len(Q) > 0: - u = mindistance(Q) - Q.remove(u) - for v in neighbors(u): - if v in Q: - update(u, v) - - # search min distance - for targetrow in range(height): - u = targetrow*width-1 # target node - path = [ u ] - while pre[u] != None: - u = pre[u] - path = [u] + path - - minsum = 0 - for n in path: - minsum += matrix[n/width][n%width] - - if minsum < globalmin: - globalmin = minsum - -print globalmin - diff --git a/src/projecteuler/082.txt b/src/projecteuler/082.txt deleted file mode 100644 index 1e9e6cd..0000000 --- a/src/projecteuler/082.txt +++ /dev/null @@ -1,80 +0,0 @@ -4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 -1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 -9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 -7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 -3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 -1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 -4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 -510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 -9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 -3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 -6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 -7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 -4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 -356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 -9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 -192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 -1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 -4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 -5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 -1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 -1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 -8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 -7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 -3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 -9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 -5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 -6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 -9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 -5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 -6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 -5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 -1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 -4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 -4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 -8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 -2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 -6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 -2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 -6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 -3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 -5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 -3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 -1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 -8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 -3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 -8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 -8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 -9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 -3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 -1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 -7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 -9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 -7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 -3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 -1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 -126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 -8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 -7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 -4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 -4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 -7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 -7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 -6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 -4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 -9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 -3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 -2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 -3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 -4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 -171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 -3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 -2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 -7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 -8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 -2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 -6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 -8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 -2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 -2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 -5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/src/projecteuler/083.py b/src/projecteuler/083.py deleted file mode 100644 index f1620e5..0000000 --- a/src/projecteuler/083.py +++ /dev/null @@ -1,76 +0,0 @@ - -# uses Dijkstra's algorithm to find minimal path -# (based on solution for problem 81) - -infinity = 999999 - -matrix = [] - -width = 80 -height = 80 - -f = open('083.txt', 'r') -for line in f: - line.rstrip('\n') - line_str = line.split(',') - line_int = [ int(x) for x in line_str ] - matrix.append(line_int) -f.close() - - -# initialize -distance = [infinity] * (width*height) -pre = [None] * (width*height) -distance[0] = 0 -Q = range(width*height) - -def mindistance(Q): - mind = infinity - mini = -1 - for i in Q: - if distance[i] < mind: - mind = distance[i] - mini = i - return mini - -def neighbors(u): - n = [] - row = u / width - col = u % width - if col < width-1: - n.append(row*width + col + 1) # right neighbor - if row < height-1: - n.append((row+1)*width + col) # lower neighbor - if row > 0: - n.append((row-1)*width + col) # upper neighbor - if col > 0: - n.append(row*width + col - 1) # left neighbor - return n - -def update(u, v): - alt = distance[u] + matrix[v/width][v%width] - if alt < distance[v]: - distance[v] = alt - pre[v] = u - -# main algorithm -while len(Q) > 0: - u = mindistance(Q) - Q.remove(u) - for v in neighbors(u): - if v in Q: - update(u, v) - -# search min distance -u = width*height-1 # target node -path = [ u ] -while pre[u] != None: - u = pre[u] - path = [u] + path - -minsum = 0 -for n in path: - minsum += matrix[n/width][n%width] - -print minsum - diff --git a/src/projecteuler/083.txt b/src/projecteuler/083.txt deleted file mode 100644 index 1e9e6cd..0000000 --- a/src/projecteuler/083.txt +++ /dev/null @@ -1,80 +0,0 @@ -4445,2697,5115,718,2209,2212,654,4348,3079,6821,7668,3276,8874,4190,3785,2752,9473,7817,9137,496,7338,3434,7152,4355,4552,7917,7827,2460,2350,691,3514,5880,3145,7633,7199,3783,5066,7487,3285,1084,8985,760,872,8609,8051,1134,9536,5750,9716,9371,7619,5617,275,9721,2997,2698,1887,8825,6372,3014,2113,7122,7050,6775,5948,2758,1219,3539,348,7989,2735,9862,1263,8089,6401,9462,3168,2758,3748,5870 -1096,20,1318,7586,5167,2642,1443,5741,7621,7030,5526,4244,2348,4641,9827,2448,6918,5883,3737,300,7116,6531,567,5997,3971,6623,820,6148,3287,1874,7981,8424,7672,7575,6797,6717,1078,5008,4051,8795,5820,346,1851,6463,2117,6058,3407,8211,117,4822,1317,4377,4434,5925,8341,4800,1175,4173,690,8978,7470,1295,3799,8724,3509,9849,618,3320,7068,9633,2384,7175,544,6583,1908,9983,481,4187,9353,9377 -9607,7385,521,6084,1364,8983,7623,1585,6935,8551,2574,8267,4781,3834,2764,2084,2669,4656,9343,7709,2203,9328,8004,6192,5856,3555,2260,5118,6504,1839,9227,1259,9451,1388,7909,5733,6968,8519,9973,1663,5315,7571,3035,4325,4283,2304,6438,3815,9213,9806,9536,196,5542,6907,2475,1159,5820,9075,9470,2179,9248,1828,4592,9167,3713,4640,47,3637,309,7344,6955,346,378,9044,8635,7466,5036,9515,6385,9230 -7206,3114,7760,1094,6150,5182,7358,7387,4497,955,101,1478,7777,6966,7010,8417,6453,4955,3496,107,449,8271,131,2948,6185,784,5937,8001,6104,8282,4165,3642,710,2390,575,715,3089,6964,4217,192,5949,7006,715,3328,1152,66,8044,4319,1735,146,4818,5456,6451,4113,1063,4781,6799,602,1504,6245,6550,1417,1343,2363,3785,5448,4545,9371,5420,5068,4613,4882,4241,5043,7873,8042,8434,3939,9256,2187 -3620,8024,577,9997,7377,7682,1314,1158,6282,6310,1896,2509,5436,1732,9480,706,496,101,6232,7375,2207,2306,110,6772,3433,2878,8140,5933,8688,1399,2210,7332,6172,6403,7333,4044,2291,1790,2446,7390,8698,5723,3678,7104,1825,2040,140,3982,4905,4160,2200,5041,2512,1488,2268,1175,7588,8321,8078,7312,977,5257,8465,5068,3453,3096,1651,7906,253,9250,6021,8791,8109,6651,3412,345,4778,5152,4883,7505 -1074,5438,9008,2679,5397,5429,2652,3403,770,9188,4248,2493,4361,8327,9587,707,9525,5913,93,1899,328,2876,3604,673,8576,6908,7659,2544,3359,3883,5273,6587,3065,1749,3223,604,9925,6941,2823,8767,7039,3290,3214,1787,7904,3421,7137,9560,8451,2669,9219,6332,1576,5477,6755,8348,4164,4307,2984,4012,6629,1044,2874,6541,4942,903,1404,9125,5160,8836,4345,2581,460,8438,1538,5507,668,3352,2678,6942 -4295,1176,5596,1521,3061,9868,7037,7129,8933,6659,5947,5063,3653,9447,9245,2679,767,714,116,8558,163,3927,8779,158,5093,2447,5782,3967,1716,931,7772,8164,1117,9244,5783,7776,3846,8862,6014,2330,6947,1777,3112,6008,3491,1906,5952,314,4602,8994,5919,9214,3995,5026,7688,6809,5003,3128,2509,7477,110,8971,3982,8539,2980,4689,6343,5411,2992,5270,5247,9260,2269,7474,1042,7162,5206,1232,4556,4757 -510,3556,5377,1406,5721,4946,2635,7847,4251,8293,8281,6351,4912,287,2870,3380,3948,5322,3840,4738,9563,1906,6298,3234,8959,1562,6297,8835,7861,239,6618,1322,2553,2213,5053,5446,4402,6500,5182,8585,6900,5756,9661,903,5186,7687,5998,7997,8081,8955,4835,6069,2621,1581,732,9564,1082,1853,5442,1342,520,1737,3703,5321,4793,2776,1508,1647,9101,2499,6891,4336,7012,3329,3212,1442,9993,3988,4930,7706 -9444,3401,5891,9716,1228,7107,109,3563,2700,6161,5039,4992,2242,8541,7372,2067,1294,3058,1306,320,8881,5756,9326,411,8650,8824,5495,8282,8397,2000,1228,7817,2099,6473,3571,5994,4447,1299,5991,543,7874,2297,1651,101,2093,3463,9189,6872,6118,872,1008,1779,2805,9084,4048,2123,5877,55,3075,1737,9459,4535,6453,3644,108,5982,4437,5213,1340,6967,9943,5815,669,8074,1838,6979,9132,9315,715,5048 -3327,4030,7177,6336,9933,5296,2621,4785,2755,4832,2512,2118,2244,4407,2170,499,7532,9742,5051,7687,970,6924,3527,4694,5145,1306,2165,5940,2425,8910,3513,1909,6983,346,6377,4304,9330,7203,6605,3709,3346,970,369,9737,5811,4427,9939,3693,8436,5566,1977,3728,2399,3985,8303,2492,5366,9802,9193,7296,1033,5060,9144,2766,1151,7629,5169,5995,58,7619,7565,4208,1713,6279,3209,4908,9224,7409,1325,8540 -6882,1265,1775,3648,4690,959,5837,4520,5394,1378,9485,1360,4018,578,9174,2932,9890,3696,116,1723,1178,9355,7063,1594,1918,8574,7594,7942,1547,6166,7888,354,6932,4651,1010,7759,6905,661,7689,6092,9292,3845,9605,8443,443,8275,5163,7720,7265,6356,7779,1798,1754,5225,6661,1180,8024,5666,88,9153,1840,3508,1193,4445,2648,3538,6243,6375,8107,5902,5423,2520,1122,5015,6113,8859,9370,966,8673,2442 -7338,3423,4723,6533,848,8041,7921,8277,4094,5368,7252,8852,9166,2250,2801,6125,8093,5738,4038,9808,7359,9494,601,9116,4946,2702,5573,2921,9862,1462,1269,2410,4171,2709,7508,6241,7522,615,2407,8200,4189,5492,5649,7353,2590,5203,4274,710,7329,9063,956,8371,3722,4253,4785,1194,4828,4717,4548,940,983,2575,4511,2938,1827,2027,2700,1236,841,5760,1680,6260,2373,3851,1841,4968,1172,5179,7175,3509 -4420,1327,3560,2376,6260,2988,9537,4064,4829,8872,9598,3228,1792,7118,9962,9336,4368,9189,6857,1829,9863,6287,7303,7769,2707,8257,2391,2009,3975,4993,3068,9835,3427,341,8412,2134,4034,8511,6421,3041,9012,2983,7289,100,1355,7904,9186,6920,5856,2008,6545,8331,3655,5011,839,8041,9255,6524,3862,8788,62,7455,3513,5003,8413,3918,2076,7960,6108,3638,6999,3436,1441,4858,4181,1866,8731,7745,3744,1000 -356,8296,8325,1058,1277,4743,3850,2388,6079,6462,2815,5620,8495,5378,75,4324,3441,9870,1113,165,1544,1179,2834,562,6176,2313,6836,8839,2986,9454,5199,6888,1927,5866,8760,320,1792,8296,7898,6121,7241,5886,5814,2815,8336,1576,4314,3109,2572,6011,2086,9061,9403,3947,5487,9731,7281,3159,1819,1334,3181,5844,5114,9898,4634,2531,4412,6430,4262,8482,4546,4555,6804,2607,9421,686,8649,8860,7794,6672 -9870,152,1558,4963,8750,4754,6521,6256,8818,5208,5691,9659,8377,9725,5050,5343,2539,6101,1844,9700,7750,8114,5357,3001,8830,4438,199,9545,8496,43,2078,327,9397,106,6090,8181,8646,6414,7499,5450,4850,6273,5014,4131,7639,3913,6571,8534,9703,4391,7618,445,1320,5,1894,6771,7383,9191,4708,9706,6939,7937,8726,9382,5216,3685,2247,9029,8154,1738,9984,2626,9438,4167,6351,5060,29,1218,1239,4785 -192,5213,8297,8974,4032,6966,5717,1179,6523,4679,9513,1481,3041,5355,9303,9154,1389,8702,6589,7818,6336,3539,5538,3094,6646,6702,6266,2759,4608,4452,617,9406,8064,6379,444,5602,4950,1810,8391,1536,316,8714,1178,5182,5863,5110,5372,4954,1978,2971,5680,4863,2255,4630,5723,2168,538,1692,1319,7540,440,6430,6266,7712,7385,5702,620,641,3136,7350,1478,3155,2820,9109,6261,1122,4470,14,8493,2095 -1046,4301,6082,474,4974,7822,2102,5161,5172,6946,8074,9716,6586,9962,9749,5015,2217,995,5388,4402,7652,6399,6539,1349,8101,3677,1328,9612,7922,2879,231,5887,2655,508,4357,4964,3554,5930,6236,7384,4614,280,3093,9600,2110,7863,2631,6626,6620,68,1311,7198,7561,1768,5139,1431,221,230,2940,968,5283,6517,2146,1646,869,9402,7068,8645,7058,1765,9690,4152,2926,9504,2939,7504,6074,2944,6470,7859 -4659,736,4951,9344,1927,6271,8837,8711,3241,6579,7660,5499,5616,3743,5801,4682,9748,8796,779,1833,4549,8138,4026,775,4170,2432,4174,3741,7540,8017,2833,4027,396,811,2871,1150,9809,2719,9199,8504,1224,540,2051,3519,7982,7367,2761,308,3358,6505,2050,4836,5090,7864,805,2566,2409,6876,3361,8622,5572,5895,3280,441,7893,8105,1634,2929,274,3926,7786,6123,8233,9921,2674,5340,1445,203,4585,3837 -5759,338,7444,7968,7742,3755,1591,4839,1705,650,7061,2461,9230,9391,9373,2413,1213,431,7801,4994,2380,2703,6161,6878,8331,2538,6093,1275,5065,5062,2839,582,1014,8109,3525,1544,1569,8622,7944,2905,6120,1564,1839,5570,7579,1318,2677,5257,4418,5601,7935,7656,5192,1864,5886,6083,5580,6202,8869,1636,7907,4759,9082,5854,3185,7631,6854,5872,5632,5280,1431,2077,9717,7431,4256,8261,9680,4487,4752,4286 -1571,1428,8599,1230,7772,4221,8523,9049,4042,8726,7567,6736,9033,2104,4879,4967,6334,6716,3994,1269,8995,6539,3610,7667,6560,6065,874,848,4597,1711,7161,4811,6734,5723,6356,6026,9183,2586,5636,1092,7779,7923,8747,6887,7505,9909,1792,3233,4526,3176,1508,8043,720,5212,6046,4988,709,5277,8256,3642,1391,5803,1468,2145,3970,6301,7767,2359,8487,9771,8785,7520,856,1605,8972,2402,2386,991,1383,5963 -1822,4824,5957,6511,9868,4113,301,9353,6228,2881,2966,6956,9124,9574,9233,1601,7340,973,9396,540,4747,8590,9535,3650,7333,7583,4806,3593,2738,8157,5215,8472,2284,9473,3906,6982,5505,6053,7936,6074,7179,6688,1564,1103,6860,5839,2022,8490,910,7551,7805,881,7024,1855,9448,4790,1274,3672,2810,774,7623,4223,4850,6071,9975,4935,1915,9771,6690,3846,517,463,7624,4511,614,6394,3661,7409,1395,8127 -8738,3850,9555,3695,4383,2378,87,6256,6740,7682,9546,4255,6105,2000,1851,4073,8957,9022,6547,5189,2487,303,9602,7833,1628,4163,6678,3144,8589,7096,8913,5823,4890,7679,1212,9294,5884,2972,3012,3359,7794,7428,1579,4350,7246,4301,7779,7790,3294,9547,4367,3549,1958,8237,6758,3497,3250,3456,6318,1663,708,7714,6143,6890,3428,6853,9334,7992,591,6449,9786,1412,8500,722,5468,1371,108,3939,4199,2535 -7047,4323,1934,5163,4166,461,3544,2767,6554,203,6098,2265,9078,2075,4644,6641,8412,9183,487,101,7566,5622,1975,5726,2920,5374,7779,5631,3753,3725,2672,3621,4280,1162,5812,345,8173,9785,1525,955,5603,2215,2580,5261,2765,2990,5979,389,3907,2484,1232,5933,5871,3304,1138,1616,5114,9199,5072,7442,7245,6472,4760,6359,9053,7876,2564,9404,3043,9026,2261,3374,4460,7306,2326,966,828,3274,1712,3446 -3975,4565,8131,5800,4570,2306,8838,4392,9147,11,3911,7118,9645,4994,2028,6062,5431,2279,8752,2658,7836,994,7316,5336,7185,3289,1898,9689,2331,5737,3403,1124,2679,3241,7748,16,2724,5441,6640,9368,9081,5618,858,4969,17,2103,6035,8043,7475,2181,939,415,1617,8500,8253,2155,7843,7974,7859,1746,6336,3193,2617,8736,4079,6324,6645,8891,9396,5522,6103,1857,8979,3835,2475,1310,7422,610,8345,7615 -9248,5397,5686,2988,3446,4359,6634,9141,497,9176,6773,7448,1907,8454,916,1596,2241,1626,1384,2741,3649,5362,8791,7170,2903,2475,5325,6451,924,3328,522,90,4813,9737,9557,691,2388,1383,4021,1609,9206,4707,5200,7107,8104,4333,9860,5013,1224,6959,8527,1877,4545,7772,6268,621,4915,9349,5970,706,9583,3071,4127,780,8231,3017,9114,3836,7503,2383,1977,4870,8035,2379,9704,1037,3992,3642,1016,4303 -5093,138,4639,6609,1146,5565,95,7521,9077,2272,974,4388,2465,2650,722,4998,3567,3047,921,2736,7855,173,2065,4238,1048,5,6847,9548,8632,9194,5942,4777,7910,8971,6279,7253,2516,1555,1833,3184,9453,9053,6897,7808,8629,4877,1871,8055,4881,7639,1537,7701,2508,7564,5845,5023,2304,5396,3193,2955,1088,3801,6203,1748,3737,1276,13,4120,7715,8552,3047,2921,106,7508,304,1280,7140,2567,9135,5266 -6237,4607,7527,9047,522,7371,4883,2540,5867,6366,5301,1570,421,276,3361,527,6637,4861,2401,7522,5808,9371,5298,2045,5096,5447,7755,5115,7060,8529,4078,1943,1697,1764,5453,7085,960,2405,739,2100,5800,728,9737,5704,5693,1431,8979,6428,673,7540,6,7773,5857,6823,150,5869,8486,684,5816,9626,7451,5579,8260,3397,5322,6920,1879,2127,2884,5478,4977,9016,6165,6292,3062,5671,5968,78,4619,4763 -9905,7127,9390,5185,6923,3721,9164,9705,4341,1031,1046,5127,7376,6528,3248,4941,1178,7889,3364,4486,5358,9402,9158,8600,1025,874,1839,1783,309,9030,1843,845,8398,1433,7118,70,8071,2877,3904,8866,6722,4299,10,1929,5897,4188,600,1889,3325,2485,6473,4474,7444,6992,4846,6166,4441,2283,2629,4352,7775,1101,2214,9985,215,8270,9750,2740,8361,7103,5930,8664,9690,8302,9267,344,2077,1372,1880,9550 -5825,8517,7769,2405,8204,1060,3603,7025,478,8334,1997,3692,7433,9101,7294,7498,9415,5452,3850,3508,6857,9213,6807,4412,7310,854,5384,686,4978,892,8651,3241,2743,3801,3813,8588,6701,4416,6990,6490,3197,6838,6503,114,8343,5844,8646,8694,65,791,5979,2687,2621,2019,8097,1423,3644,9764,4921,3266,3662,5561,2476,8271,8138,6147,1168,3340,1998,9874,6572,9873,6659,5609,2711,3931,9567,4143,7833,8887 -6223,2099,2700,589,4716,8333,1362,5007,2753,2848,4441,8397,7192,8191,4916,9955,6076,3370,6396,6971,3156,248,3911,2488,4930,2458,7183,5455,170,6809,6417,3390,1956,7188,577,7526,2203,968,8164,479,8699,7915,507,6393,4632,1597,7534,3604,618,3280,6061,9793,9238,8347,568,9645,2070,5198,6482,5000,9212,6655,5961,7513,1323,3872,6170,3812,4146,2736,67,3151,5548,2781,9679,7564,5043,8587,1893,4531 -5826,3690,6724,2121,9308,6986,8106,6659,2142,1642,7170,2877,5757,6494,8026,6571,8387,9961,6043,9758,9607,6450,8631,8334,7359,5256,8523,2225,7487,1977,9555,8048,5763,2414,4948,4265,2427,8978,8088,8841,9208,9601,5810,9398,8866,9138,4176,5875,7212,3272,6759,5678,7649,4922,5422,1343,8197,3154,3600,687,1028,4579,2084,9467,4492,7262,7296,6538,7657,7134,2077,1505,7332,6890,8964,4879,7603,7400,5973,739 -1861,1613,4879,1884,7334,966,2000,7489,2123,4287,1472,3263,4726,9203,1040,4103,6075,6049,330,9253,4062,4268,1635,9960,577,1320,3195,9628,1030,4092,4979,6474,6393,2799,6967,8687,7724,7392,9927,2085,3200,6466,8702,265,7646,8665,7986,7266,4574,6587,612,2724,704,3191,8323,9523,3002,704,5064,3960,8209,2027,2758,8393,4875,4641,9584,6401,7883,7014,768,443,5490,7506,1852,2005,8850,5776,4487,4269 -4052,6687,4705,7260,6645,6715,3706,5504,8672,2853,1136,8187,8203,4016,871,1809,1366,4952,9294,5339,6872,2645,6083,7874,3056,5218,7485,8796,7401,3348,2103,426,8572,4163,9171,3176,948,7654,9344,3217,1650,5580,7971,2622,76,2874,880,2034,9929,1546,2659,5811,3754,7096,7436,9694,9960,7415,2164,953,2360,4194,2397,1047,2196,6827,575,784,2675,8821,6802,7972,5996,6699,2134,7577,2887,1412,4349,4380 -4629,2234,6240,8132,7592,3181,6389,1214,266,1910,2451,8784,2790,1127,6932,1447,8986,2492,5476,397,889,3027,7641,5083,5776,4022,185,3364,5701,2442,2840,4160,9525,4828,6602,2614,7447,3711,4505,7745,8034,6514,4907,2605,7753,6958,7270,6936,3006,8968,439,2326,4652,3085,3425,9863,5049,5361,8688,297,7580,8777,7916,6687,8683,7141,306,9569,2384,1500,3346,4601,7329,9040,6097,2727,6314,4501,4974,2829 -8316,4072,2025,6884,3027,1808,5714,7624,7880,8528,4205,8686,7587,3230,1139,7273,6163,6986,3914,9309,1464,9359,4474,7095,2212,7302,2583,9462,7532,6567,1606,4436,8981,5612,6796,4385,5076,2007,6072,3678,8331,1338,3299,8845,4783,8613,4071,1232,6028,2176,3990,2148,3748,103,9453,538,6745,9110,926,3125,473,5970,8728,7072,9062,1404,1317,5139,9862,6496,6062,3338,464,1600,2532,1088,8232,7739,8274,3873 -2341,523,7096,8397,8301,6541,9844,244,4993,2280,7689,4025,4196,5522,7904,6048,2623,9258,2149,9461,6448,8087,7245,1917,8340,7127,8466,5725,6996,3421,5313,512,9164,9837,9794,8369,4185,1488,7210,1524,1016,4620,9435,2478,7765,8035,697,6677,3724,6988,5853,7662,3895,9593,1185,4727,6025,5734,7665,3070,138,8469,6748,6459,561,7935,8646,2378,462,7755,3115,9690,8877,3946,2728,8793,244,6323,8666,4271 -6430,2406,8994,56,1267,3826,9443,7079,7579,5232,6691,3435,6718,5698,4144,7028,592,2627,217,734,6194,8156,9118,58,2640,8069,4127,3285,694,3197,3377,4143,4802,3324,8134,6953,7625,3598,3584,4289,7065,3434,2106,7132,5802,7920,9060,7531,3321,1725,1067,3751,444,5503,6785,7937,6365,4803,198,6266,8177,1470,6390,1606,2904,7555,9834,8667,2033,1723,5167,1666,8546,8152,473,4475,6451,7947,3062,3281 -2810,3042,7759,1741,2275,2609,7676,8640,4117,1958,7500,8048,1757,3954,9270,1971,4796,2912,660,5511,3553,1012,5757,4525,6084,7198,8352,5775,7726,8591,7710,9589,3122,4392,6856,5016,749,2285,3356,7482,9956,7348,2599,8944,495,3462,3578,551,4543,7207,7169,7796,1247,4278,6916,8176,3742,8385,2310,1345,8692,2667,4568,1770,8319,3585,4920,3890,4928,7343,5385,9772,7947,8786,2056,9266,3454,2807,877,2660 -6206,8252,5928,5837,4177,4333,207,7934,5581,9526,8906,1498,8411,2984,5198,5134,2464,8435,8514,8674,3876,599,5327,826,2152,4084,2433,9327,9697,4800,2728,3608,3849,3861,3498,9943,1407,3991,7191,9110,5666,8434,4704,6545,5944,2357,1163,4995,9619,6754,4200,9682,6654,4862,4744,5953,6632,1054,293,9439,8286,2255,696,8709,1533,1844,6441,430,1999,6063,9431,7018,8057,2920,6266,6799,356,3597,4024,6665 -3847,6356,8541,7225,2325,2946,5199,469,5450,7508,2197,9915,8284,7983,6341,3276,3321,16,1321,7608,5015,3362,8491,6968,6818,797,156,2575,706,9516,5344,5457,9210,5051,8099,1617,9951,7663,8253,9683,2670,1261,4710,1068,8753,4799,1228,2621,3275,6188,4699,1791,9518,8701,5932,4275,6011,9877,2933,4182,6059,2930,6687,6682,9771,654,9437,3169,8596,1827,5471,8909,2352,123,4394,3208,8756,5513,6917,2056 -5458,8173,3138,3290,4570,4892,3317,4251,9699,7973,1163,1935,5477,6648,9614,5655,9592,975,9118,2194,7322,8248,8413,3462,8560,1907,7810,6650,7355,2939,4973,6894,3933,3784,3200,2419,9234,4747,2208,2207,1945,2899,1407,6145,8023,3484,5688,7686,2737,3828,3704,9004,5190,9740,8643,8650,5358,4426,1522,1707,3613,9887,6956,2447,2762,833,1449,9489,2573,1080,4167,3456,6809,2466,227,7125,2759,6250,6472,8089 -3266,7025,9756,3914,1265,9116,7723,9788,6805,5493,2092,8688,6592,9173,4431,4028,6007,7131,4446,4815,3648,6701,759,3312,8355,4485,4187,5188,8746,7759,3528,2177,5243,8379,3838,7233,4607,9187,7216,2190,6967,2920,6082,7910,5354,3609,8958,6949,7731,494,8753,8707,1523,4426,3543,7085,647,6771,9847,646,5049,824,8417,5260,2730,5702,2513,9275,4279,2767,8684,1165,9903,4518,55,9682,8963,6005,2102,6523 -1998,8731,936,1479,5259,7064,4085,91,7745,7136,3773,3810,730,8255,2705,2653,9790,6807,2342,355,9344,2668,3690,2028,9679,8102,574,4318,6481,9175,5423,8062,2867,9657,7553,3442,3920,7430,3945,7639,3714,3392,2525,4995,4850,2867,7951,9667,486,9506,9888,781,8866,1702,3795,90,356,1483,4200,2131,6969,5931,486,6880,4404,1084,5169,4910,6567,8335,4686,5043,2614,3352,2667,4513,6472,7471,5720,1616 -8878,1613,1716,868,1906,2681,564,665,5995,2474,7496,3432,9491,9087,8850,8287,669,823,347,6194,2264,2592,7871,7616,8508,4827,760,2676,4660,4881,7572,3811,9032,939,4384,929,7525,8419,5556,9063,662,8887,7026,8534,3111,1454,2082,7598,5726,6687,9647,7608,73,3014,5063,670,5461,5631,3367,9796,8475,7908,5073,1565,5008,5295,4457,1274,4788,1728,338,600,8415,8535,9351,7750,6887,5845,1741,125 -3637,6489,9634,9464,9055,2413,7824,9517,7532,3577,7050,6186,6980,9365,9782,191,870,2497,8498,2218,2757,5420,6468,586,3320,9230,1034,1393,9886,5072,9391,1178,8464,8042,6869,2075,8275,3601,7715,9470,8786,6475,8373,2159,9237,2066,3264,5000,679,355,3069,4073,494,2308,5512,4334,9438,8786,8637,9774,1169,1949,6594,6072,4270,9158,7916,5752,6794,9391,6301,5842,3285,2141,3898,8027,4310,8821,7079,1307 -8497,6681,4732,7151,7060,5204,9030,7157,833,5014,8723,3207,9796,9286,4913,119,5118,7650,9335,809,3675,2597,5144,3945,5090,8384,187,4102,1260,2445,2792,4422,8389,9290,50,1765,1521,6921,8586,4368,1565,5727,7855,2003,4834,9897,5911,8630,5070,1330,7692,7557,7980,6028,5805,9090,8265,3019,3802,698,9149,5748,1965,9658,4417,5994,5584,8226,2937,272,5743,1278,5698,8736,2595,6475,5342,6596,1149,6920 -8188,8009,9546,6310,8772,2500,9846,6592,6872,3857,1307,8125,7042,1544,6159,2330,643,4604,7899,6848,371,8067,2062,3200,7295,1857,9505,6936,384,2193,2190,301,8535,5503,1462,7380,5114,4824,8833,1763,4974,8711,9262,6698,3999,2645,6937,7747,1128,2933,3556,7943,2885,3122,9105,5447,418,2899,5148,3699,9021,9501,597,4084,175,1621,1,1079,6067,5812,4326,9914,6633,5394,4233,6728,9084,1864,5863,1225 -9935,8793,9117,1825,9542,8246,8437,3331,9128,9675,6086,7075,319,1334,7932,3583,7167,4178,1726,7720,695,8277,7887,6359,5912,1719,2780,8529,1359,2013,4498,8072,1129,9998,1147,8804,9405,6255,1619,2165,7491,1,8882,7378,3337,503,5758,4109,3577,985,3200,7615,8058,5032,1080,6410,6873,5496,1466,2412,9885,5904,4406,3605,8770,4361,6205,9193,1537,9959,214,7260,9566,1685,100,4920,7138,9819,5637,976 -3466,9854,985,1078,7222,8888,5466,5379,3578,4540,6853,8690,3728,6351,7147,3134,6921,9692,857,3307,4998,2172,5783,3931,9417,2541,6299,13,787,2099,9131,9494,896,8600,1643,8419,7248,2660,2609,8579,91,6663,5506,7675,1947,6165,4286,1972,9645,3805,1663,1456,8853,5705,9889,7489,1107,383,4044,2969,3343,152,7805,4980,9929,5033,1737,9953,7197,9158,4071,1324,473,9676,3984,9680,3606,8160,7384,5432 -1005,4512,5186,3953,2164,3372,4097,3247,8697,3022,9896,4101,3871,6791,3219,2742,4630,6967,7829,5991,6134,1197,1414,8923,8787,1394,8852,5019,7768,5147,8004,8825,5062,9625,7988,1110,3992,7984,9966,6516,6251,8270,421,3723,1432,4830,6935,8095,9059,2214,6483,6846,3120,1587,6201,6691,9096,9627,6671,4002,3495,9939,7708,7465,5879,6959,6634,3241,3401,2355,9061,2611,7830,3941,2177,2146,5089,7079,519,6351 -7280,8586,4261,2831,7217,3141,9994,9940,5462,2189,4005,6942,9848,5350,8060,6665,7519,4324,7684,657,9453,9296,2944,6843,7499,7847,1728,9681,3906,6353,5529,2822,3355,3897,7724,4257,7489,8672,4356,3983,1948,6892,7415,4153,5893,4190,621,1736,4045,9532,7701,3671,1211,1622,3176,4524,9317,7800,5638,6644,6943,5463,3531,2821,1347,5958,3436,1438,2999,994,850,4131,2616,1549,3465,5946,690,9273,6954,7991 -9517,399,3249,2596,7736,2142,1322,968,7350,1614,468,3346,3265,7222,6086,1661,5317,2582,7959,4685,2807,2917,1037,5698,1529,3972,8716,2634,3301,3412,8621,743,8001,4734,888,7744,8092,3671,8941,1487,5658,7099,2781,99,1932,4443,4756,4652,9328,1581,7855,4312,5976,7255,6480,3996,2748,1973,9731,4530,2790,9417,7186,5303,3557,351,7182,9428,1342,9020,7599,1392,8304,2070,9138,7215,2008,9937,1106,7110 -7444,769,9688,632,1571,6820,8743,4338,337,3366,3073,1946,8219,104,4210,6986,249,5061,8693,7960,6546,1004,8857,5997,9352,4338,6105,5008,2556,6518,6694,4345,3727,7956,20,3954,8652,4424,9387,2035,8358,5962,5304,5194,8650,8282,1256,1103,2138,6679,1985,3653,2770,2433,4278,615,2863,1715,242,3790,2636,6998,3088,1671,2239,957,5411,4595,6282,2881,9974,2401,875,7574,2987,4587,3147,6766,9885,2965 -3287,3016,3619,6818,9073,6120,5423,557,2900,2015,8111,3873,1314,4189,1846,4399,7041,7583,2427,2864,3525,5002,2069,748,1948,6015,2684,438,770,8367,1663,7887,7759,1885,157,7770,4520,4878,3857,1137,3525,3050,6276,5569,7649,904,4533,7843,2199,5648,7628,9075,9441,3600,7231,2388,5640,9096,958,3058,584,5899,8150,1181,9616,1098,8162,6819,8171,1519,1140,7665,8801,2632,1299,9192,707,9955,2710,7314 -1772,2963,7578,3541,3095,1488,7026,2634,6015,4633,4370,2762,1650,2174,909,8158,2922,8467,4198,4280,9092,8856,8835,5457,2790,8574,9742,5054,9547,4156,7940,8126,9824,7340,8840,6574,3547,1477,3014,6798,7134,435,9484,9859,3031,4,1502,4133,1738,1807,4825,463,6343,9701,8506,9822,9555,8688,8168,3467,3234,6318,1787,5591,419,6593,7974,8486,9861,6381,6758,194,3061,4315,2863,4665,3789,2201,1492,4416 -126,8927,6608,5682,8986,6867,1715,6076,3159,788,3140,4744,830,9253,5812,5021,7616,8534,1546,9590,1101,9012,9821,8132,7857,4086,1069,7491,2988,1579,2442,4321,2149,7642,6108,250,6086,3167,24,9528,7663,2685,1220,9196,1397,5776,1577,1730,5481,977,6115,199,6326,2183,3767,5928,5586,7561,663,8649,9688,949,5913,9160,1870,5764,9887,4477,6703,1413,4995,5494,7131,2192,8969,7138,3997,8697,646,1028 -8074,1731,8245,624,4601,8706,155,8891,309,2552,8208,8452,2954,3124,3469,4246,3352,1105,4509,8677,9901,4416,8191,9283,5625,7120,2952,8881,7693,830,4580,8228,9459,8611,4499,1179,4988,1394,550,2336,6089,6872,269,7213,1848,917,6672,4890,656,1478,6536,3165,4743,4990,1176,6211,7207,5284,9730,4738,1549,4986,4942,8645,3698,9429,1439,2175,6549,3058,6513,1574,6988,8333,3406,5245,5431,7140,7085,6407 -7845,4694,2530,8249,290,5948,5509,1588,5940,4495,5866,5021,4626,3979,3296,7589,4854,1998,5627,3926,8346,6512,9608,1918,7070,4747,4182,2858,2766,4606,6269,4107,8982,8568,9053,4244,5604,102,2756,727,5887,2566,7922,44,5986,621,1202,374,6988,4130,3627,6744,9443,4568,1398,8679,397,3928,9159,367,2917,6127,5788,3304,8129,911,2669,1463,9749,264,4478,8940,1109,7309,2462,117,4692,7724,225,2312 -4164,3637,2000,941,8903,39,3443,7172,1031,3687,4901,8082,4945,4515,7204,9310,9349,9535,9940,218,1788,9245,2237,1541,5670,6538,6047,5553,9807,8101,1925,8714,445,8332,7309,6830,5786,5736,7306,2710,3034,1838,7969,6318,7912,2584,2080,7437,6705,2254,7428,820,782,9861,7596,3842,3631,8063,5240,6666,394,4565,7865,4895,9890,6028,6117,4724,9156,4473,4552,602,470,6191,4927,5387,884,3146,1978,3000 -4258,6880,1696,3582,5793,4923,2119,1155,9056,9698,6603,3768,5514,9927,9609,6166,6566,4536,4985,4934,8076,9062,6741,6163,7399,4562,2337,5600,2919,9012,8459,1308,6072,1225,9306,8818,5886,7243,7365,8792,6007,9256,6699,7171,4230,7002,8720,7839,4533,1671,478,7774,1607,2317,5437,4705,7886,4760,6760,7271,3081,2997,3088,7675,6208,3101,6821,6840,122,9633,4900,2067,8546,4549,2091,7188,5605,8599,6758,5229 -7854,5243,9155,3556,8812,7047,2202,1541,5993,4600,4760,713,434,7911,7426,7414,8729,322,803,7960,7563,4908,6285,6291,736,3389,9339,4132,8701,7534,5287,3646,592,3065,7582,2592,8755,6068,8597,1982,5782,1894,2900,6236,4039,6569,3037,5837,7698,700,7815,2491,7272,5878,3083,6778,6639,3589,5010,8313,2581,6617,5869,8402,6808,2951,2321,5195,497,2190,6187,1342,1316,4453,7740,4154,2959,1781,1482,8256 -7178,2046,4419,744,8312,5356,6855,8839,319,2962,5662,47,6307,8662,68,4813,567,2712,9931,1678,3101,8227,6533,4933,6656,92,5846,4780,6256,6361,4323,9985,1231,2175,7178,3034,9744,6155,9165,7787,5836,9318,7860,9644,8941,6480,9443,8188,5928,161,6979,2352,5628,6991,1198,8067,5867,6620,3778,8426,2994,3122,3124,6335,3918,8897,2655,9670,634,1088,1576,8935,7255,474,8166,7417,9547,2886,5560,3842 -6957,3111,26,7530,7143,1295,1744,6057,3009,1854,8098,5405,2234,4874,9447,2620,9303,27,7410,969,40,2966,5648,7596,8637,4238,3143,3679,7187,690,9980,7085,7714,9373,5632,7526,6707,3951,9734,4216,2146,3602,5371,6029,3039,4433,4855,4151,1449,3376,8009,7240,7027,4602,2947,9081,4045,8424,9352,8742,923,2705,4266,3232,2264,6761,363,2651,3383,7770,6730,7856,7340,9679,2158,610,4471,4608,910,6241 -4417,6756,1013,8797,658,8809,5032,8703,7541,846,3357,2920,9817,1745,9980,7593,4667,3087,779,3218,6233,5568,4296,2289,2654,7898,5021,9461,5593,8214,9173,4203,2271,7980,2983,5952,9992,8399,3468,1776,3188,9314,1720,6523,2933,621,8685,5483,8986,6163,3444,9539,4320,155,3992,2828,2150,6071,524,2895,5468,8063,1210,3348,9071,4862,483,9017,4097,6186,9815,3610,5048,1644,1003,9865,9332,2145,1944,2213 -9284,3803,4920,1927,6706,4344,7383,4786,9890,2010,5228,1224,3158,6967,8580,8990,8883,5213,76,8306,2031,4980,5639,9519,7184,5645,7769,3259,8077,9130,1317,3096,9624,3818,1770,695,2454,947,6029,3474,9938,3527,5696,4760,7724,7738,2848,6442,5767,6845,8323,4131,2859,7595,2500,4815,3660,9130,8580,7016,8231,4391,8369,3444,4069,4021,556,6154,627,2778,1496,4206,6356,8434,8491,3816,8231,3190,5575,1015 -3787,7572,1788,6803,5641,6844,1961,4811,8535,9914,9999,1450,8857,738,4662,8569,6679,2225,7839,8618,286,2648,5342,2294,3205,4546,176,8705,3741,6134,8324,8021,7004,5205,7032,6637,9442,5539,5584,4819,5874,5807,8589,6871,9016,983,1758,3786,1519,6241,185,8398,495,3370,9133,3051,4549,9674,7311,9738,3316,9383,2658,2776,9481,7558,619,3943,3324,6491,4933,153,9738,4623,912,3595,7771,7939,1219,4405 -2650,3883,4154,5809,315,7756,4430,1788,4451,1631,6461,7230,6017,5751,138,588,5282,2442,9110,9035,6349,2515,1570,6122,4192,4174,3530,1933,4186,4420,4609,5739,4135,2963,6308,1161,8809,8619,2796,3819,6971,8228,4188,1492,909,8048,2328,6772,8467,7671,9068,2226,7579,6422,7056,8042,3296,2272,3006,2196,7320,3238,3490,3102,37,1293,3212,4767,5041,8773,5794,4456,6174,7279,7054,2835,7053,9088,790,6640 -3101,1057,7057,3826,6077,1025,2955,1224,1114,6729,5902,4698,6239,7203,9423,1804,4417,6686,1426,6941,8071,1029,4985,9010,6122,6597,1622,1574,3513,1684,7086,5505,3244,411,9638,4150,907,9135,829,981,1707,5359,8781,9751,5,9131,3973,7159,1340,6955,7514,7993,6964,8198,1933,2797,877,3993,4453,8020,9349,8646,2779,8679,2961,3547,3374,3510,1129,3568,2241,2625,9138,5974,8206,7669,7678,1833,8700,4480 -4865,9912,8038,8238,782,3095,8199,1127,4501,7280,2112,2487,3626,2790,9432,1475,6312,8277,4827,2218,5806,7132,8752,1468,7471,6386,739,8762,8323,8120,5169,9078,9058,3370,9560,7987,8585,8531,5347,9312,1058,4271,1159,5286,5404,6925,8606,9204,7361,2415,560,586,4002,2644,1927,2824,768,4409,2942,3345,1002,808,4941,6267,7979,5140,8643,7553,9438,7320,4938,2666,4609,2778,8158,6730,3748,3867,1866,7181 -171,3771,7134,8927,4778,2913,3326,2004,3089,7853,1378,1729,4777,2706,9578,1360,5693,3036,1851,7248,2403,2273,8536,6501,9216,613,9671,7131,7719,6425,773,717,8803,160,1114,7554,7197,753,4513,4322,8499,4533,2609,4226,8710,6627,644,9666,6260,4870,5744,7385,6542,6203,7703,6130,8944,5589,2262,6803,6381,7414,6888,5123,7320,9392,9061,6780,322,8975,7050,5089,1061,2260,3199,1150,1865,5386,9699,6501 -3744,8454,6885,8277,919,1923,4001,6864,7854,5519,2491,6057,8794,9645,1776,5714,9786,9281,7538,6916,3215,395,2501,9618,4835,8846,9708,2813,3303,1794,8309,7176,2206,1602,1838,236,4593,2245,8993,4017,10,8215,6921,5206,4023,5932,6997,7801,262,7640,3107,8275,4938,7822,2425,3223,3886,2105,8700,9526,2088,8662,8034,7004,5710,2124,7164,3574,6630,9980,4242,2901,9471,1491,2117,4562,1130,9086,4117,6698 -2810,2280,2331,1170,4554,4071,8387,1215,2274,9848,6738,1604,7281,8805,439,1298,8318,7834,9426,8603,6092,7944,1309,8828,303,3157,4638,4439,9175,1921,4695,7716,1494,1015,1772,5913,1127,1952,1950,8905,4064,9890,385,9357,7945,5035,7082,5369,4093,6546,5187,5637,2041,8946,1758,7111,6566,1027,1049,5148,7224,7248,296,6169,375,1656,7993,2816,3717,4279,4675,1609,3317,42,6201,3100,3144,163,9530,4531 -7096,6070,1009,4988,3538,5801,7149,3063,2324,2912,7911,7002,4338,7880,2481,7368,3516,2016,7556,2193,1388,3865,8125,4637,4096,8114,750,3144,1938,7002,9343,4095,1392,4220,3455,6969,9647,1321,9048,1996,1640,6626,1788,314,9578,6630,2813,6626,4981,9908,7024,4355,3201,3521,3864,3303,464,1923,595,9801,3391,8366,8084,9374,1041,8807,9085,1892,9431,8317,9016,9221,8574,9981,9240,5395,2009,6310,2854,9255 -8830,3145,2960,9615,8220,6061,3452,2918,6481,9278,2297,3385,6565,7066,7316,5682,107,7646,4466,68,1952,9603,8615,54,7191,791,6833,2560,693,9733,4168,570,9127,9537,1925,8287,5508,4297,8452,8795,6213,7994,2420,4208,524,5915,8602,8330,2651,8547,6156,1812,6271,7991,9407,9804,1553,6866,1128,2119,4691,9711,8315,5879,9935,6900,482,682,4126,1041,428,6247,3720,5882,7526,2582,4327,7725,3503,2631 -2738,9323,721,7434,1453,6294,2957,3786,5722,6019,8685,4386,3066,9057,6860,499,5315,3045,5194,7111,3137,9104,941,586,3066,755,4177,8819,7040,5309,3583,3897,4428,7788,4721,7249,6559,7324,825,7311,3760,6064,6070,9672,4882,584,1365,9739,9331,5783,2624,7889,1604,1303,1555,7125,8312,425,8936,3233,7724,1480,403,7440,1784,1754,4721,1569,652,3893,4574,5692,9730,4813,9844,8291,9199,7101,3391,8914 -6044,2928,9332,3328,8588,447,3830,1176,3523,2705,8365,6136,5442,9049,5526,8575,8869,9031,7280,706,2794,8814,5767,4241,7696,78,6570,556,5083,1426,4502,3336,9518,2292,1885,3740,3153,9348,9331,8051,2759,5407,9028,7840,9255,831,515,2612,9747,7435,8964,4971,2048,4900,5967,8271,1719,9670,2810,6777,1594,6367,6259,8316,3815,1689,6840,9437,4361,822,9619,3065,83,6344,7486,8657,8228,9635,6932,4864 -8478,4777,6334,4678,7476,4963,6735,3096,5860,1405,5127,7269,7793,4738,227,9168,2996,8928,765,733,1276,7677,6258,1528,9558,3329,302,8901,1422,8277,6340,645,9125,8869,5952,141,8141,1816,9635,4025,4184,3093,83,2344,2747,9352,7966,1206,1126,1826,218,7939,2957,2729,810,8752,5247,4174,4038,8884,7899,9567,301,5265,5752,7524,4381,1669,3106,8270,6228,6373,754,2547,4240,2313,5514,3022,1040,9738 -2265,8192,1763,1369,8469,8789,4836,52,1212,6690,5257,8918,6723,6319,378,4039,2421,8555,8184,9577,1432,7139,8078,5452,9628,7579,4161,7490,5159,8559,1011,81,478,5840,1964,1334,6875,8670,9900,739,1514,8692,522,9316,6955,1345,8132,2277,3193,9773,3923,4177,2183,1236,6747,6575,4874,6003,6409,8187,745,8776,9440,7543,9825,2582,7381,8147,7236,5185,7564,6125,218,7991,6394,391,7659,7456,5128,5294 -2132,8992,8160,5782,4420,3371,3798,5054,552,5631,7546,4716,1332,6486,7892,7441,4370,6231,4579,2121,8615,1145,9391,1524,1385,2400,9437,2454,7896,7467,2928,8400,3299,4025,7458,4703,7206,6358,792,6200,725,4275,4136,7390,5984,4502,7929,5085,8176,4600,119,3568,76,9363,6943,2248,9077,9731,6213,5817,6729,4190,3092,6910,759,2682,8380,1254,9604,3011,9291,5329,9453,9746,2739,6522,3765,5634,1113,5789 -5304,5499,564,2801,679,2653,1783,3608,7359,7797,3284,796,3222,437,7185,6135,8571,2778,7488,5746,678,6140,861,7750,803,9859,9918,2425,3734,2698,9005,4864,9818,6743,2475,132,9486,3825,5472,919,292,4411,7213,7699,6435,9019,6769,1388,802,2124,1345,8493,9487,8558,7061,8777,8833,2427,2238,5409,4957,8503,3171,7622,5779,6145,2417,5873,5563,5693,9574,9491,1937,7384,4563,6842,5432,2751,3406,7981 diff --git a/src/projecteuler/087.c b/src/projecteuler/087.c deleted file mode 100644 index e1b1ad8..0000000 --- a/src/projecteuler/087.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "common.h" -#include -#include - -const unsigned long limit = 50000000; - -int main(void) -{ - unsigned long* p = primes(8000); - unsigned long count = p[0]; - unsigned long i2, i3, i4, counter; - char* numbers = malloc(limit*sizeof(char)); - memset(numbers, 0, limit); - - for(i2=1; i2<=count; i2++) - for(i3=1; i3<=count; i3++) - for(i4=1; i4<=count; i4++) - { - unsigned long p4 = p[i4]; - unsigned long p3 = p[i3]; - unsigned long p2 = p[i2]; - unsigned long long result = (unsigned long long)p4*p4*p4*p4; - if(result >= limit) break; - result += (unsigned long long)p3*p3*p3; - if(result >= limit) break; - result += (unsigned long long)p2*p2; - if(result >= limit) break; - - numbers[result] = 1; - } - - counter = 0; - for(i2=0; i2 0: - if n - 1000 >= 0: - n -= 1000 - result += "M" - elif n - 900 >= 0: - n -= 900 - result += "CM" - elif n - 500 >= 0: - n -= 500 - result += "D" - elif n - 400 >= 0: - n -= 400 - result += "CD" - elif n - 100 >= 0: - n -= 100 - result += "C" - elif n - 90 >= 0: - n -= 90 - result += "XC" - elif n - 50 >= 0: - n -= 50 - result += "L" - elif n - 40 >= 0: - n -= 40 - result += "XL" - elif n - 10 >= 0: - n -= 10 - result += "X" - elif n - 9 >= 0: - n -= 9 - result += "IX" - elif n - 5 >= 0: - n -= 5 - result += "V" - elif n - 4 >= 0: - n -= 4 - result += "IV" - elif n - 1 >= 0: - n -= 1 - result += "I" - return result - - -numbers = [] - -f = open('089.txt', 'r') -for line in f: - line = line.rstrip('\r\n') - numbers.append(line) -f.close() - -saved = 0 - -for number in numbers: - n = decode_roman(number) - m = minimal_roman(n) - saved += len(number) - len(m) - -print saved - diff --git a/src/projecteuler/089.txt b/src/projecteuler/089.txt deleted file mode 100644 index 721ab99..0000000 --- a/src/projecteuler/089.txt +++ /dev/null @@ -1,1000 +0,0 @@ -MMMMDCLXXII -MMDCCCLXXXIII -MMMDLXVIIII -MMMMDXCV -DCCCLXXII -MMCCCVI -MMMCDLXXXVII -MMMMCCXXI -MMMCCXX -MMMMDCCCLXXIII -MMMCCXXXVII -MMCCCLXXXXIX -MDCCCXXIIII -MMCXCVI -CCXCVIII -MMMCCCXXXII -MDCCXXX -MMMDCCCL -MMMMCCLXXXVI -MMDCCCXCVI -MMMDCII -MMMCCXII -MMMMDCCCCI -MMDCCCXCII -MDCXX -CMLXXXVII -MMMXXI -MMMMCCCXIV -MLXXII -MCCLXXVIIII -MMMMCCXXXXI -MMDCCCLXXII -MMMMXXXI -MMMDCCLXXX -MMDCCCLXXIX -MMMMLXXXV -MCXXI -MDCCCXXXVII -MMCCCLXVII -MCDXXXV -CCXXXIII -CMXX -MMMCLXIV -MCCCLXXXVI -DCCCXCVIII -MMMDCCCCXXXIV -CDXVIIII -MMCCXXXV -MDCCCXXXII -MMMMD -MMDCCLXIX -MMMMCCCLXXXXVI -MMDCCXLII -MMMDCCCVIIII -DCCLXXXIIII -MDCCCCXXXII -MMCXXVII -DCCCXXX -CCLXIX -MMMXI -MMMMCMLXXXXVIII -MMMMDLXXXVII -MMMMDCCCLX -MMCCLIV -CMIX -MMDCCCLXXXIIII -CLXXXII -MMCCCCXXXXV -MMMMDLXXXVIIII -MMMDCCCXXI -MMDCCCCLXXVI -MCCCCLXX -MMCDLVIIII -MMMDCCCLIX -MMMMCCCCXIX -MMMDCCCLXXV -XXXI -CDLXXXIII -MMMCXV -MMDCCLXIII -MMDXXX -MMMMCCCLVII -MMMDCI -MMMMCDLXXXIIII -MMMMCCCXVI -CCCLXXXVIII -MMMMCML -MMMMXXIV -MMMCCCCXXX -DCCX -MMMCCLX -MMDXXXIII -CCCLXIII -MMDCCXIII -MMMCCCXLIV -CLXXXXI -CXVI -MMMMCXXXIII -CLXX -DCCCXVIII -MLXVII -DLXXXX -MMDXXI -MMMMDLXXXXVIII -MXXII -LXI -DCCCCXLIII -MMMMDV -MMMMXXXIV -MDCCCLVIII -MMMCCLXXII -MMMMDCCXXXVI -MMMMLXXXIX -MDCCCLXXXI -MMMMDCCCXV -MMMMCCCCXI -MMMMCCCLIII -MDCCCLXXI -MMCCCCXI -MLXV -MMCDLXII -MMMMDXXXXII -MMMMDCCCXL -MMMMCMLVI -CCLXXXIV -MMMDCCLXXXVI -MMCLII -MMMCCCCXV -MMLXXXIII -MMMV -MMMV -DCCLXII -MMDCCCCXVI -MMDCXLVIII -CCLIIII -CCCXXV -MMDCCLXXXVIIII -MMMMDCLXXVIII -MMMMDCCCXCI -MMMMCCCXX -MMCCXLV -MMMDCCCLXIX -MMCCLXIIII -MMMDCCCXLIX -MMMMCCCLXIX -CMLXXXXI -MCMLXXXIX -MMCDLXI -MMDCLXXVIII -MMMMDCCLXI -MCDXXV -DL -CCCLXXII -MXVIIII -MCCCCLXVIII -CIII -MMMDCCLXXIIII -MMMDVIII -MMMMCCCLXXXXVII -MMDXXVII -MMDCCLXXXXV -MMMMCXLVI -MMMDCCLXXXII -MMMDXXXVI -MCXXII -CLI -DCLXXXIX -MMMCLI -MDCLXIII -MMMMDCCXCVII -MMCCCLXXXV -MMMDCXXVIII -MMMCDLX -MMMCMLII -MMMIV -MMMMDCCCLVIII -MMMDLXXXVIII -MCXXIV -MMMMLXXVI -CLXXIX -MMMCCCCXXVIIII -DCCLXXXV -MMMDCCCVI -LI -CLXXXVI -MMMMCCCLXXVI -MCCCLXVI -CCXXXIX -MMDXXXXI -MMDCCCXLI -DCCCLXXXVIII -MMMMDCCCIV -MDCCCCXV -MMCMVI -MMMMCMLXXXXV -MMDCCLVI -MMMMCCXLVIII -DCCCCIIII -MMCCCCIII -MMMDCCLXXXVIIII -MDCCCLXXXXV -DVII -MMMV -DCXXV -MMDCCCXCV -DCVIII -MMCDLXVI -MCXXVIII -MDCCXCVIII -MMDCLX -MMMDCCLXIV -MMCDLXXVII -MMDLXXXIIII -MMMMCCCXXII -MMMDCCCXLIIII -DCCCCLXVII -MMMCLXXXXIII -MCCXV -MMMMDCXI -MMMMDCLXXXXV -MMMCCCLII -MMCMIX -MMDCCXXV -MMDLXXXVI -MMMMDCXXVIIII -DCCCCXXXVIIII -MMCCXXXIIII -MMDCCLXXVIII -MDCCLXVIIII -MMCCLXXXV -MMMMDCCCLXXXVIII -MMCMXCI -MDXLII -MMMMDCCXIV -MMMMLI -DXXXXIII -MMDCCXI -MMMMCCLXXXIII -MMMDCCCLXXIII -MDCLVII -MMCD -MCCCXXVII -MMMMDCCIIII -MMMDCCXLVI -MMMCLXXXVII -MMMCCVIIII -MCCCCLXXIX -DL -DCCCLXXVI -MMDXCI -MMMMDCCCCXXXVI -MMCII -MMMDCCCXXXXV -MMMCDXLV -MMDCXXXXIV -MMD -MDCCCLXXXX -MMDCXLIII -MMCCXXXII -MMDCXXXXVIIII -DCCCLXXI -MDXCVIIII -MMMMCCLXXVIII -MDCLVIIII -MMMCCCLXXXIX -MDCLXXXV -MDLVIII -MMMMCCVII -MMMMDCXIV -MMMCCCLXIIII -MMIIII -MMMMCCCLXXIII -CCIII -MMMCCLV -MMMDXIII -MMMCCCXC -MMMDCCCXXI -MMMMCCCCXXXII -CCCLVI -MMMCCCLXXXVI -MXVIIII -MMMCCCCXIIII -CLXVII -MMMCCLXX -CCCCLXIV -MMXXXXII -MMMMCCLXXXX -MXL -CCXVI -CCCCLVIIII -MMCCCII -MCCCLVIII -MMMMCCCX -MCDLXXXXIV -MDCCCXIII -MMDCCCXL -MMMMCCCXXIII -DXXXIV -CVI -MMMMDCLXXX -DCCCVII -MMCMLXIIII -MMMDCCCXXXIII -DCCC -MDIII -MMCCCLXVI -MMMCCCCLXXI -MMDCCCCXVIII -CCXXXVII -CCCXXV -MDCCCXII -MMMCMV -MMMMCMXV -MMMMDCXCI -DXXI -MMCCXLVIIII -MMMMCMLII -MDLXXX -MMDCLXVI -CXXI -MMMDCCCLIIII -MMMCXXI -MCCIII -MMDCXXXXI -CCXCII -MMMMDXXXV -MMMCCCLXV -MMMMDLXV -MMMCCCCXXXII -MMMCCCVIII -DCCCCLXXXXII -MMCLXIV -MMMMCXI -MLXXXXVII -MMMCDXXXVIII -MDXXII -MLV -MMMMDLXVI -MMMCXII -XXXIII -MMMMDCCCXXVI -MMMLXVIIII -MMMLX -MMMCDLXVII -MDCCCLVII -MMCXXXVII -MDCCCCXXX -MMDCCCLXIII -MMMMDCXLIX -MMMMCMXLVIII -DCCCLXXVIIII -MDCCCLIII -MMMCMLXI -MMMMCCLXI -MMDCCCLIII -MMMDCCCVI -MMDXXXXIX -MMCLXXXXV -MMDXXX -MMMXIII -DCLXXIX -DCCLXII -MMMMDCCLXVIII -MDCCXXXXIII -CCXXXII -MMMMDCXXV -MMMCCCXXVIII -MDCVIII -MMMCLXXXXIIII -CLXXXI -MDCCCCXXXIII -MMMMDCXXX -MMMDCXXIV -MMMCCXXXVII -MCCCXXXXIIII -CXVIII -MMDCCCCIV -MMMMCDLXXV -MMMDLXIV -MDXCIII -MCCLXXXI -MMMDCCCXXIV -MCXLIII -MMMDCCCI -MCCLXXX -CCXV -MMDCCLXXI -MMDLXXXIII -MMMMDCXVII -MMMCMLXV -MCLXVIII -MMMMCCLXXVI -MMMDCCLXVIIII -MMMMDCCCIX -DLXXXXIX -DCCCXXII -MMMMIII -MMMMCCCLXXVI -DCCCXCIII -DXXXI -MXXXIIII -CCXII -MMMDCCLXXXIIII -MMMCXX -MMMCMXXVII -DCCCXXXX -MMCDXXXVIIII -MMMMDCCXVIII -LV -MMMDCCCCVI -MCCCII -MMCMLXVIIII -MDCCXI -MMMMDLXVII -MMCCCCLXI -MMDCCV -MMMCCCXXXIIII -MMMMDI -MMMDCCCXCV -MMDCCLXXXXI -MMMDXXVI -MMMDCCCLVI -MMDCXXX -MCCCVII -MMMMCCCLXII -MMMMXXV -MMCMXXV -MMLVI -MMDXXX -MMMMCVII -MDC -MCCIII -MMMMDCC -MMCCLXXV -MMDCCCXXXXVI -MMMMCCCLXV -CDXIIII -MLXIIII -CCV -MMMCMXXXI -CCCCLXVI -MDXXXII -MMMMCCCLVIII -MMV -MMMCLII -MCMLI -MMDCCXX -MMMMCCCCXXXVI -MCCLXXXI -MMMCMVI -DCCXXX -MMMMCCCLXV -DCCCXI -MMMMDCCCXIV -CCCXXI -MMDLXXV -CCCCLXXXX -MCCCLXXXXII -MMDCIX -DCCXLIIII -DXIV -MMMMCLII -CDLXI -MMMCXXVII -MMMMDCCCCLXIII -MMMDCLIIII -MCCCCXXXXII -MMCCCLX -CCCCLIII -MDCCLXXVI -MCMXXIII -MMMMDLXXVIII -MMDCCCCLX -MMMCCCLXXXX -MMMCDXXVI -MMMDLVIII -CCCLXI -MMMMDCXXII -MMDCCCXXI -MMDCCXIII -MMMMCLXXXVI -MDCCCCXXVI -MDV -MMDCCCCLXXVI -MMMMCCXXXVII -MMMDCCLXXVIIII -MMMCCCCLXVII -DCCXLI -MMCLXXXVIII -MCCXXXVI -MMDCXLVIII -MMMMCXXXII -MMMMDCCLXVI -MMMMCMLI -MMMMCLXV -MMMMDCCCXCIV -MCCLXXVII -LXXVIIII -DCCLII -MMMCCCXCVI -MMMCLV -MMDCCCXXXXVIII -DCCCXV -MXC -MMDCCLXXXXVII -MMMMCML -MMDCCCLXXVIII -DXXI -MCCCXLI -DCLXXXXI -MMCCCLXXXXVIII -MDCCCCLXXVIII -MMMMDXXV -MMMDCXXXVI -MMMCMXCVII -MMXVIIII -MMMDCCLXXIV -MMMCXXV -DXXXVIII -MMMMCLXVI -MDXII -MMCCCLXX -CCLXXI -DXIV -MMMCLIII -DLII -MMMCCCXLIX -MMCCCCXXVI -MMDCXLIII -MXXXXII -CCCLXXXV -MDCLXXVI -MDCXII -MMMCCCLXXXIII -MMDCCCCLXXXII -MMMMCCCLXXXV -MMDCXXI -DCCCXXX -MMMDCCCCLII -MMMDCCXXII -MMMMCDXCVIII -MMMCCLXVIIII -MMXXV -MMMMCDXIX -MMMMCCCX -MMMCCCCLXVI -MMMMDCLXXVIIII -MMMMDCXXXXIV -MMMCMXII -MMMMXXXIII -MMMMDLXXXII -DCCCLIV -MDXVIIII -MMMCLXXXXV -CCCCXX -MMDIX -MMCMLXXXVIII -DCCXLIII -DCCLX -D -MCCCVII -MMMMCCCLXXXIII -MDCCCLXXIIII -MMMDCCCCLXXXVII -MMMMCCCVII -MMMDCCLXXXXVI -CDXXXIV -MCCLXVIII -MMMMDLX -MMMMDXII -MMMMCCCCLIIII -MCMLXXXXIII -MMMMDCCCIII -MMDCLXXXIII -MDCCCXXXXIV -XXXXVII -MMMDCCCXXXII -MMMDCCCXLII -MCXXXV -MDCXXVIIII -MMMCXXXXIIII -MMMMCDXVII -MMMDXXIII -MMMMCCCCLXI -DCLXXXXVIIII -LXXXXI -CXXXIII -MCDX -MCCLVII -MDCXXXXII -MMMCXXIV -MMMMLXXXX -MMDCCCCXLV -MLXXX -MMDCCCCLX -MCDLIII -MMMCCCLXVII -MMMMCCCLXXIV -MMMDCVIII -DCCCCXXIII -MMXCI -MMDCCIV -MMMMDCCCXXXIV -CCCLXXI -MCCLXXXII -MCMIII -CCXXXI -DCCXXXVIII -MMMMDCCXLVIIII -MMMMCMXXXV -DCCCLXXV -DCCXCI -MMMMDVII -MMMMDCCCLXVIIII -CCCXCV -MMMMDCCXX -MCCCCII -MMMCCCXC -MMMCCCII -MMDCCLXXVII -MMDCLIIII -CCXLIII -MMMDCXVIII -MMMCCCIX -MCXV -MMCCXXV -MLXXIIII -MDCCXXVI -MMMCCCXX -MMDLXX -MMCCCCVI -MMDCCXX -MMMMDCCCCXCV -MDCCCXXXII -MMMMDCCCCXXXX -XCIV -MMCCCCLX -MMXVII -MLXXI -MMMDXXVIII -MDCCCCII -MMMCMLVII -MMCLXXXXVIII -MDCCCCLV -MCCCCLXXIIII -MCCCLII -MCDXLVI -MMMMDXVIII -DCCLXXXIX -MMMDCCLXIV -MDCCCCXLIII -CLXXXXV -MMMMCCXXXVI -MMMDCCCXXI -MMMMCDLXXVII -MCDLIII -MMCCXLVI -DCCCLV -MCDLXX -DCLXXVIII -MMDCXXXIX -MMMMDCLX -MMDCCLI -MMCXXXV -MMMCCXII -MMMMCMLXII -MMMMCCV -MCCCCLXIX -MMMMCCIII -CLXVII -MCCCLXXXXIIII -MMMMDCVIII -MMDCCCLXI -MMLXXIX -CMLXIX -MMDCCCXLVIIII -DCLXII -MMMCCCXLVII -MDCCCXXXV -MMMMDCCXCVI -DCXXX -XXVI -MMLXIX -MMCXI -DCXXXVII -MMMMCCCXXXXVIII -MMMMDCLXI -MMMMDCLXXIIII -MMMMVIII -MMMMDCCCLXII -MDCXCI -MMCCCXXIIII -CCCCXXXXV -MMDCCCXXI -MCVI -MMDCCLXVIII -MMMMCXL -MLXVIII -CMXXVII -CCCLV -MDCCLXXXIX -MMMCCCCLXV -MMDCCLXII -MDLXVI -MMMCCCXVIII -MMMMCCLXXXI -MMCXXVII -MMDCCCLXVIII -MMMCXCII -MMMMDCLVIII -MMMMDCCCXXXXII -MMDCCCCLXXXXVI -MDCCXL -MDCCLVII -MMMMDCCCLXXXVI -DCCXXXIII -MMMMDCCCCLXXXV -MMCCXXXXVIII -MMMCCLXXVIII -MMMDCLXXVIII -DCCCI -MMMMLXXXXVIIII -MMMCCCCLXXII -MMCLXXXVII -CCLXVI -MCDXLIII -MMCXXVIII -MDXIV -CCCXCVIII -CLXXVIII -MMCXXXXVIIII -MMMDCLXXXIV -CMLVIII -MCDLIX -MMMMDCCCXXXII -MMMMDCXXXIIII -MDCXXI -MMMDCXLV -MCLXXVIII -MCDXXII -IV -MCDLXXXXIII -MMMMDCCLXV -CCLI -MMMMDCCCXXXVIII -DCLXII -MCCCLXVII -MMMMDCCCXXXVI -MMDCCXLI -MLXI -MMMCDLXVIII -MCCCCXCIII -XXXIII -MMMDCLXIII -MMMMDCL -DCCCXXXXIIII -MMDLVII -DXXXVII -MCCCCXXIIII -MCVII -MMMMDCCXL -MMMMCXXXXIIII -MCCCCXXIV -MMCLXVIII -MMXCIII -MDCCLXXX -MCCCLIIII -MMDCLXXI -MXI -MCMLIV -MMMCCIIII -DCCLXXXVIIII -MDCLIV -MMMDCXIX -CMLXXXI -DCCLXXXVII -XXV -MMMXXXVI -MDVIIII -CLXIII -MMMCDLVIIII -MMCCCCVII -MMMLXX -MXXXXII -MMMMCCCLXVIII -MMDCCCXXVIII -MMMMDCXXXXI -MMMMDCCCXXXXV -MMMXV -MMMMCCXVIIII -MMDCCXIIII -MMMXXVII -MDCCLVIIII -MMCXXIIII -MCCCLXXIV -DCLVIII -MMMLVII -MMMCXLV -MMXCVII -MMMCCCLXXXVII -MMMMCCXXII -DXII -MMMDLV -MCCCLXXVIII -MMMCLIIII -MMMMCLXXXX -MMMCLXXXIIII -MDCXXIII -MMMMCCXVI -MMMMDLXXXIII -MMMDXXXXIII -MMMMCCCCLV -MMMDLXXXI -MMMCCLXXVI -MMMMXX -MMMMDLVI -MCCCCLXXX -MMMXXII -MMXXII -MMDCCCCXXXI -MMMDXXV -MMMDCLXXXVIIII -MMMDLXXXXVII -MDLXIIII -CMXC -MMMXXXVIII -MDLXXXVIII -MCCCLXXVI -MMCDLIX -MMDCCCXVIII -MDCCCXXXXVI -MMMMCMIV -MMMMDCIIII -MMCCXXXV -XXXXVI -MMMMCCXVII -MMCCXXIV -MCMLVIIII -MLXXXIX -MMMMLXXXIX -CLXXXXIX -MMMDCCCCLVIII -MMMMCCLXXIII -MCCCC -DCCCLIX -MMMCCCLXXXII -MMMCCLXVIIII -MCLXXXV -CDLXXXVII -DCVI -MMX -MMCCXIII -MMMMDCXX -MMMMXXVIII -DCCCLXII -MMMMCCCXLIII -MMMMCLXV -DXCI -MMMMCLXXX -MMMDCCXXXXI -MMMMXXXXVI -DCLX -MMMCCCXI -MCCLXXX -MMCDLXXII -DCCLXXI -MMMCCCXXXVI -MCCCCLXXXVIIII -CDLVIII -DCCLVI -MMMMDCXXXVIII -MMCCCLXXXIII -MMMMDCCLXXV -MMMXXXVI -CCCLXXXXIX -CV -CCCCXIII -CCCCXVI -MDCCCLXXXIIII -MMDCCLXXXII -MMMMCCCCLXXXI -MXXV -MMCCCLXXVIIII -MMMCCXII -MMMMCCXXXIII -MMCCCLXXXVI -MMMDCCCLVIIII -MCCXXXVII -MDCLXXV -XXXV -MMDLI -MMMCCXXX -MMMMCXXXXV -CCCCLIX -MMMMDCCCLXXIII -MMCCCXVII -DCCCXVI -MMMCCCXXXXV -MDCCCCXCV -CLXXXI -MMMMDCCLXX -MMMDCCCIII -MMCLXXVII -MMMDCCXXIX -MMDCCCXCIIII -MMMCDXXIIII -MMMMXXVIII -MMMMDCCCCLXVIII -MDCCCXX -MMMMCDXXI -MMMMDLXXXIX -CCXVI -MDVIII -MMCCLXXI -MMMDCCCLXXI -MMMCCCLXXVI -MMCCLXI -MMMMDCCCXXXIV -DLXXXVI -MMMMDXXXII -MMMXXIIII -MMMMCDIV -MMMMCCCXLVIII -MMMMCXXXVIII -MMMCCCLXVI -MDCCXVIII -MMCXX -CCCLIX -MMMMDCCLXXII -MDCCCLXXV -MMMMDCCCXXIV -DCCCXXXXVIII -MMMDCCCCXXXVIIII -MMMMCCXXXV -MDCLXXXIII -MMCCLXXXIV -MCLXXXXIIII -DXXXXIII -MCCCXXXXVIII -MMCLXXIX -MMMMCCLXIV -MXXII -MMMCXIX -MDCXXXVII -MMDCCVI -MCLXXXXVIII -MMMCXVI -MCCCLX -MMMCDX -CCLXVIIII -MMMCCLX -MCXXVIII -LXXXII -MCCCCLXXXI -MMMI -MMMCCCLXIV -MMMCCCXXVIIII -CXXXVIII -MMCCCXX -MMMCCXXVIIII -MCCLXVI -MMMCCCCXXXXVI -MMDCCXCIX -MCMLXXI -MMCCLXVIII -CDLXXXXIII -MMMMDCCXXII -MMMMDCCLXXXVII -MMMDCCLIV -MMCCLXIII -MDXXXVII -DCCXXXIIII -MCII -MMMDCCCLXXI -MMMLXXIII -MDCCCLIII -MMXXXVIII -MDCCXVIIII -MDCCCCXXXVII -MMCCCXVI -MCMXXII -MMMCCCLVIII -MMMMDCCCXX -MCXXIII -MMMDLXI -MMMMDXXII -MDCCCX -MMDXCVIIII -MMMDCCCCVIII -MMMMDCCCCXXXXVI -MMDCCCXXXV -MMCXCIV -MCMLXXXXIII -MMMCCCLXXVI -MMMMDCLXXXV -CMLXIX -DCXCII -MMXXVIII -MMMMCCCXXX -XXXXVIIII \ No newline at end of file diff --git a/src/projecteuler/092.c b/src/projecteuler/092.c deleted file mode 100644 index 8616cf8..0000000 --- a/src/projecteuler/092.c +++ /dev/null @@ -1,45 +0,0 @@ - - -const int limit = 10000000; - -const int squares[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 }; - -int next_chain(int number) -{ - int sum = 0; - int digit; - while(number > 0) - { - digit = number % 10; - number = number / 10; - sum += squares[digit]; - } - return sum; -} - -int main() -{ - int* numbers = calloc(limit, sizeof(int)); - int i, count; - - for(i=0; i{$n}; - } -} - -sub numbers_in_row { - my $field = shift; - my $row = shift; - my $numbers = {}; - - for(my $i=0; $i<9; $i++) { - my $number = $field->[9*$row + $i]; - $numbers->{$number} = 1 if $number; - } - - return $numbers; -} - -sub numbers_in_col { - my $field = shift; - my $col = shift; - my $numbers = {}; - - for(my $i=0; $i<9; $i++) { - my $number = $field->[9*$i + $col]; - $numbers->{$number} = 1 if $number; - } - - return $numbers; -} - -sub numbers_in_block { - my $field = shift; - my $block = shift; - my $numbers = {}; - - my $blk_row = int($block / 3); - my $blk_col = $block % 3; - - for(my $row=0; $row<3; $row++) { - for (my $col=0; $col<3; $col++) { - my $number = $field->[9*(3*$blk_row + $row) + (3*$blk_col + $col)]; - $numbers->{$number} = 1 if $number; - } - } - - return $numbers; -} - -sub collect_numbers { - my $field = shift; - - my $row_n = []; - my $col_n = []; - my $blk_n = []; - - for(my $i=0; $i<9; $i++) { - $row_n->[$i] = numbers_in_row($field, $i); - } - for(my $i=0; $i<9; $i++) { - $col_n->[$i] = numbers_in_col($field, $i); - } - for(my $i=0; $i<9; $i++) { - $blk_n->[$i] = numbers_in_block($field, $i); - } - - return ($row_n, $col_n, $blk_n); -} - -sub print_field { - my $field = shift || return; - - for(my $i=0; $i<9; $i++) { - for(my $j=0; $j<9; $j++) { - print $field->[9*$i + $j] . " "; - } - print "\n"; - } - print "\n"; -} - -sub find_candidates { - my $field = shift; - my ($row_n, $col_n, $blk_n) = collect_numbers($field); - -restart: - my $candidates = {}; - for(my $row=0; $row<9; $row++) { - for(my $col=0; $col<9; $col++) { - next if $field->[9*$row + $col]; - - my $blk = 3*int($row / 3) + int($col / 3); - my %numbers = map { $_ => 1 } 1..9; - remove_numbers(\%numbers, $row_n->[$row]); - remove_numbers(\%numbers, $col_n->[$col]); - remove_numbers(\%numbers, $blk_n->[$blk]); - - if (scalar keys %numbers == 1) { - # there is only one possibility -> restart search with updated field - my $n = (keys %numbers)[0]; - $field->[9*$row + $col] = $n; - $row_n->[$row]->{$n} = 1; - $col_n->[$col]->{$n} = 1; - $blk_n->[$blk]->{$n} = 1; - goto restart; - } elsif (scalar keys %numbers > 1) { - $candidates->{9*$row + $col} = [ sort keys %numbers ]; - } else { - # no candidate possible on this position - return; - } - } - } - return $candidates; -} - -sub solve { - my @field = @_; - - my $candidates = find_candidates(\@field) || return; - - if (scalar keys %$candidates == 0) { - return \@field; - } - - my @field_copy = @field; - - # iterate remaining positions with multiple possibilities - foreach my $pos (sort { scalar @{$candidates->{$a}} <=> scalar @{$candidates->{$b}} } keys %$candidates) { - @field = @field_copy; - foreach my $cand (@{$candidates->{$pos}}) { - @field[$pos] = $cand; - my $solved_field = solve(@field); - return $solved_field if $solved_field; - } - return; - } -} - -sub main { - my $content; - open FILE, "<096.txt" or die "Can't open file: $!\n"; - while() { - $content .= $_; - } - close FILE; - - my @sudokus = split('\n?Grid [0-9]+\n', $content); - shift @sudokus; # remove empty first element - - my $sum = 0; - - foreach my $sudoku (@sudokus) { - my @field = split("\n?", $sudoku); - my $solution = solve(@field); - $sum += 100*$solution->[0] + 10*$solution->[1] + 1*$solution->[2] . "\n"; - } - - print $sum . "\n"; -} - -main(); - diff --git a/src/projecteuler/096.txt b/src/projecteuler/096.txt deleted file mode 100644 index be23f6a..0000000 --- a/src/projecteuler/096.txt +++ /dev/null @@ -1,500 +0,0 @@ -Grid 01 -003020600 -900305001 -001806400 -008102900 -700000008 -006708200 -002609500 -800203009 -005010300 -Grid 02 -200080300 -060070084 -030500209 -000105408 -000000000 -402706000 -301007040 -720040060 -004010003 -Grid 03 -000000907 -000420180 -000705026 -100904000 -050000040 -000507009 -920108000 -034059000 -507000000 -Grid 04 -030050040 -008010500 -460000012 -070502080 -000603000 -040109030 -250000098 -001020600 -080060020 -Grid 05 -020810740 -700003100 -090002805 -009040087 -400208003 -160030200 -302700060 -005600008 -076051090 -Grid 06 -100920000 -524010000 -000000070 -050008102 -000000000 -402700090 -060000000 -000030945 -000071006 -Grid 07 -043080250 -600000000 -000001094 -900004070 -000608000 -010200003 -820500000 -000000005 -034090710 -Grid 08 -480006902 -002008001 -900370060 -840010200 -003704100 -001060049 -020085007 -700900600 -609200018 -Grid 09 -000900002 -050123400 -030000160 -908000000 -070000090 -000000205 -091000050 -007439020 -400007000 -Grid 10 -001900003 -900700160 -030005007 -050000009 -004302600 -200000070 -600100030 -042007006 -500006800 -Grid 11 -000125400 -008400000 -420800000 -030000095 -060902010 -510000060 -000003049 -000007200 -001298000 -Grid 12 -062340750 -100005600 -570000040 -000094800 -400000006 -005830000 -030000091 -006400007 -059083260 -Grid 13 -300000000 -005009000 -200504000 -020000700 -160000058 -704310600 -000890100 -000067080 -000005437 -Grid 14 -630000000 -000500008 -005674000 -000020000 -003401020 -000000345 -000007004 -080300902 -947100080 -Grid 15 -000020040 -008035000 -000070602 -031046970 -200000000 -000501203 -049000730 -000000010 -800004000 -Grid 16 -361025900 -080960010 -400000057 -008000471 -000603000 -259000800 -740000005 -020018060 -005470329 -Grid 17 -050807020 -600010090 -702540006 -070020301 -504000908 -103080070 -900076205 -060090003 -080103040 -Grid 18 -080005000 -000003457 -000070809 -060400903 -007010500 -408007020 -901020000 -842300000 -000100080 -Grid 19 -003502900 -000040000 -106000305 -900251008 -070408030 -800763001 -308000104 -000020000 -005104800 -Grid 20 -000000000 -009805100 -051907420 -290401065 -000000000 -140508093 -026709580 -005103600 -000000000 -Grid 21 -020030090 -000907000 -900208005 -004806500 -607000208 -003102900 -800605007 -000309000 -030020050 -Grid 22 -005000006 -070009020 -000500107 -804150000 -000803000 -000092805 -907006000 -030400010 -200000600 -Grid 23 -040000050 -001943600 -009000300 -600050002 -103000506 -800020007 -005000200 -002436700 -030000040 -Grid 24 -004000000 -000030002 -390700080 -400009001 -209801307 -600200008 -010008053 -900040000 -000000800 -Grid 25 -360020089 -000361000 -000000000 -803000602 -400603007 -607000108 -000000000 -000418000 -970030014 -Grid 26 -500400060 -009000800 -640020000 -000001008 -208000501 -700500000 -000090084 -003000600 -060003002 -Grid 27 -007256400 -400000005 -010030060 -000508000 -008060200 -000107000 -030070090 -200000004 -006312700 -Grid 28 -000000000 -079050180 -800000007 -007306800 -450708096 -003502700 -700000005 -016030420 -000000000 -Grid 29 -030000080 -009000500 -007509200 -700105008 -020090030 -900402001 -004207100 -002000800 -070000090 -Grid 30 -200170603 -050000100 -000006079 -000040700 -000801000 -009050000 -310400000 -005000060 -906037002 -Grid 31 -000000080 -800701040 -040020030 -374000900 -000030000 -005000321 -010060050 -050802006 -080000000 -Grid 32 -000000085 -000210009 -960080100 -500800016 -000000000 -890006007 -009070052 -300054000 -480000000 -Grid 33 -608070502 -050608070 -002000300 -500090006 -040302050 -800050003 -005000200 -010704090 -409060701 -Grid 34 -050010040 -107000602 -000905000 -208030501 -040070020 -901080406 -000401000 -304000709 -020060010 -Grid 35 -053000790 -009753400 -100000002 -090080010 -000907000 -080030070 -500000003 -007641200 -061000940 -Grid 36 -006080300 -049070250 -000405000 -600317004 -007000800 -100826009 -000702000 -075040190 -003090600 -Grid 37 -005080700 -700204005 -320000084 -060105040 -008000500 -070803010 -450000091 -600508007 -003010600 -Grid 38 -000900800 -128006400 -070800060 -800430007 -500000009 -600079008 -090004010 -003600284 -001007000 -Grid 39 -000080000 -270000054 -095000810 -009806400 -020403060 -006905100 -017000620 -460000038 -000090000 -Grid 40 -000602000 -400050001 -085010620 -038206710 -000000000 -019407350 -026040530 -900020007 -000809000 -Grid 41 -000900002 -050123400 -030000160 -908000000 -070000090 -000000205 -091000050 -007439020 -400007000 -Grid 42 -380000000 -000400785 -009020300 -060090000 -800302009 -000040070 -001070500 -495006000 -000000092 -Grid 43 -000158000 -002060800 -030000040 -027030510 -000000000 -046080790 -050000080 -004070100 -000325000 -Grid 44 -010500200 -900001000 -002008030 -500030007 -008000500 -600080004 -040100700 -000700006 -003004050 -Grid 45 -080000040 -000469000 -400000007 -005904600 -070608030 -008502100 -900000005 -000781000 -060000010 -Grid 46 -904200007 -010000000 -000706500 -000800090 -020904060 -040002000 -001607000 -000000030 -300005702 -Grid 47 -000700800 -006000031 -040002000 -024070000 -010030080 -000060290 -000800070 -860000500 -002006000 -Grid 48 -001007090 -590080001 -030000080 -000005800 -050060020 -004100000 -080000030 -100020079 -020700400 -Grid 49 -000003017 -015009008 -060000000 -100007000 -009000200 -000500004 -000000020 -500600340 -340200000 -Grid 50 -300200000 -000107000 -706030500 -070009080 -900020004 -010800050 -009040301 -000702000 -000008006 \ No newline at end of file diff --git a/src/projecteuler/097.py b/src/projecteuler/097.py deleted file mode 100644 index ec263b0..0000000 --- a/src/projecteuler/097.py +++ /dev/null @@ -1 +0,0 @@ -print (28433*(1<<7830457)+1) % 10**10 diff --git a/src/projecteuler/098.py b/src/projecteuler/098.py deleted file mode 100644 index 452e15e..0000000 --- a/src/projecteuler/098.py +++ /dev/null @@ -1,77 +0,0 @@ -from math import sqrt, ceil - -# is x anagram of y? -def anagram(x, y): - x2 = [c for c in x] - y2 = [c for c in y] - x2.sort() - y2.sort() - return x2 == y2 - - -# returns replacement list -def replacement(word, number): - digits = [False] * 10 - for char in word[::-1]: - digit = number % 10 - number /= 10 - - if char in digits and digits[digit] != char: - return None - - if digits[digit] == False: - digits[digit] = char - elif digits[digit] != char: - return None - return digits - - -# find numbers matching the specified word in descending order -def match(word, numbers): - result = [] - for n in numbers: - digits = replacement(word, n) - if digits != None: - result.append(n) - - result.sort(reverse=True) - return result - - -f = open('098.txt', 'r') -words = f.read() -f.close() - -maxlen = 14 - -words = set([ w.strip('"') for w in words.split(',') ]) -squares = [ [ x*x for x in xrange(int(ceil(sqrt(10**n)))-1, int(ceil(sqrt(10**(n-1))))-1, -1) ] for n in xrange(1, maxlen+1) ] - -maxsquare = 0 - -for l in xrange(1, maxlen+1): - cur = [ w for w in words if len(w) == l ] - - for word1 in cur: - for word2 in cur: - if word1 == word2 or word1 == word2[::-1] or not anagram(word1, word2): - continue - - m1 = match(word1, squares[l-1]) - m2 = match(word2, squares[l-1]) - - # compare result lists - for n1 in m1: - found = False - for n2 in m2: - if replacement(word1, n1) == replacement(word2, n2): - #print word1, word2, n1, n2 - if n1 > maxsquare: - maxsquare = n1 - found = True - break - if found: - break - -print maxsquare - diff --git a/src/projecteuler/098.txt b/src/projecteuler/098.txt deleted file mode 100644 index 7177624..0000000 --- a/src/projecteuler/098.txt +++ /dev/null @@ -1 +0,0 @@ -"A","ABILITY","ABLE","ABOUT","ABOVE","ABSENCE","ABSOLUTELY","ACADEMIC","ACCEPT","ACCESS","ACCIDENT","ACCOMPANY","ACCORDING","ACCOUNT","ACHIEVE","ACHIEVEMENT","ACID","ACQUIRE","ACROSS","ACT","ACTION","ACTIVE","ACTIVITY","ACTUAL","ACTUALLY","ADD","ADDITION","ADDITIONAL","ADDRESS","ADMINISTRATION","ADMIT","ADOPT","ADULT","ADVANCE","ADVANTAGE","ADVICE","ADVISE","AFFAIR","AFFECT","AFFORD","AFRAID","AFTER","AFTERNOON","AFTERWARDS","AGAIN","AGAINST","AGE","AGENCY","AGENT","AGO","AGREE","AGREEMENT","AHEAD","AID","AIM","AIR","AIRCRAFT","ALL","ALLOW","ALMOST","ALONE","ALONG","ALREADY","ALRIGHT","ALSO","ALTERNATIVE","ALTHOUGH","ALWAYS","AMONG","AMONGST","AMOUNT","AN","ANALYSIS","ANCIENT","AND","ANIMAL","ANNOUNCE","ANNUAL","ANOTHER","ANSWER","ANY","ANYBODY","ANYONE","ANYTHING","ANYWAY","APART","APPARENT","APPARENTLY","APPEAL","APPEAR","APPEARANCE","APPLICATION","APPLY","APPOINT","APPOINTMENT","APPROACH","APPROPRIATE","APPROVE","AREA","ARGUE","ARGUMENT","ARISE","ARM","ARMY","AROUND","ARRANGE","ARRANGEMENT","ARRIVE","ART","ARTICLE","ARTIST","AS","ASK","ASPECT","ASSEMBLY","ASSESS","ASSESSMENT","ASSET","ASSOCIATE","ASSOCIATION","ASSUME","ASSUMPTION","AT","ATMOSPHERE","ATTACH","ATTACK","ATTEMPT","ATTEND","ATTENTION","ATTITUDE","ATTRACT","ATTRACTIVE","AUDIENCE","AUTHOR","AUTHORITY","AVAILABLE","AVERAGE","AVOID","AWARD","AWARE","AWAY","AYE","BABY","BACK","BACKGROUND","BAD","BAG","BALANCE","BALL","BAND","BANK","BAR","BASE","BASIC","BASIS","BATTLE","BE","BEAR","BEAT","BEAUTIFUL","BECAUSE","BECOME","BED","BEDROOM","BEFORE","BEGIN","BEGINNING","BEHAVIOUR","BEHIND","BELIEF","BELIEVE","BELONG","BELOW","BENEATH","BENEFIT","BESIDE","BEST","BETTER","BETWEEN","BEYOND","BIG","BILL","BIND","BIRD","BIRTH","BIT","BLACK","BLOCK","BLOOD","BLOODY","BLOW","BLUE","BOARD","BOAT","BODY","BONE","BOOK","BORDER","BOTH","BOTTLE","BOTTOM","BOX","BOY","BRAIN","BRANCH","BREAK","BREATH","BRIDGE","BRIEF","BRIGHT","BRING","BROAD","BROTHER","BUDGET","BUILD","BUILDING","BURN","BUS","BUSINESS","BUSY","BUT","BUY","BY","CABINET","CALL","CAMPAIGN","CAN","CANDIDATE","CAPABLE","CAPACITY","CAPITAL","CAR","CARD","CARE","CAREER","CAREFUL","CAREFULLY","CARRY","CASE","CASH","CAT","CATCH","CATEGORY","CAUSE","CELL","CENTRAL","CENTRE","CENTURY","CERTAIN","CERTAINLY","CHAIN","CHAIR","CHAIRMAN","CHALLENGE","CHANCE","CHANGE","CHANNEL","CHAPTER","CHARACTER","CHARACTERISTIC","CHARGE","CHEAP","CHECK","CHEMICAL","CHIEF","CHILD","CHOICE","CHOOSE","CHURCH","CIRCLE","CIRCUMSTANCE","CITIZEN","CITY","CIVIL","CLAIM","CLASS","CLEAN","CLEAR","CLEARLY","CLIENT","CLIMB","CLOSE","CLOSELY","CLOTHES","CLUB","COAL","CODE","COFFEE","COLD","COLLEAGUE","COLLECT","COLLECTION","COLLEGE","COLOUR","COMBINATION","COMBINE","COME","COMMENT","COMMERCIAL","COMMISSION","COMMIT","COMMITMENT","COMMITTEE","COMMON","COMMUNICATION","COMMUNITY","COMPANY","COMPARE","COMPARISON","COMPETITION","COMPLETE","COMPLETELY","COMPLEX","COMPONENT","COMPUTER","CONCENTRATE","CONCENTRATION","CONCEPT","CONCERN","CONCERNED","CONCLUDE","CONCLUSION","CONDITION","CONDUCT","CONFERENCE","CONFIDENCE","CONFIRM","CONFLICT","CONGRESS","CONNECT","CONNECTION","CONSEQUENCE","CONSERVATIVE","CONSIDER","CONSIDERABLE","CONSIDERATION","CONSIST","CONSTANT","CONSTRUCTION","CONSUMER","CONTACT","CONTAIN","CONTENT","CONTEXT","CONTINUE","CONTRACT","CONTRAST","CONTRIBUTE","CONTRIBUTION","CONTROL","CONVENTION","CONVERSATION","COPY","CORNER","CORPORATE","CORRECT","COS","COST","COULD","COUNCIL","COUNT","COUNTRY","COUNTY","COUPLE","COURSE","COURT","COVER","CREATE","CREATION","CREDIT","CRIME","CRIMINAL","CRISIS","CRITERION","CRITICAL","CRITICISM","CROSS","CROWD","CRY","CULTURAL","CULTURE","CUP","CURRENT","CURRENTLY","CURRICULUM","CUSTOMER","CUT","DAMAGE","DANGER","DANGEROUS","DARK","DATA","DATE","DAUGHTER","DAY","DEAD","DEAL","DEATH","DEBATE","DEBT","DECADE","DECIDE","DECISION","DECLARE","DEEP","DEFENCE","DEFENDANT","DEFINE","DEFINITION","DEGREE","DELIVER","DEMAND","DEMOCRATIC","DEMONSTRATE","DENY","DEPARTMENT","DEPEND","DEPUTY","DERIVE","DESCRIBE","DESCRIPTION","DESIGN","DESIRE","DESK","DESPITE","DESTROY","DETAIL","DETAILED","DETERMINE","DEVELOP","DEVELOPMENT","DEVICE","DIE","DIFFERENCE","DIFFERENT","DIFFICULT","DIFFICULTY","DINNER","DIRECT","DIRECTION","DIRECTLY","DIRECTOR","DISAPPEAR","DISCIPLINE","DISCOVER","DISCUSS","DISCUSSION","DISEASE","DISPLAY","DISTANCE","DISTINCTION","DISTRIBUTION","DISTRICT","DIVIDE","DIVISION","DO","DOCTOR","DOCUMENT","DOG","DOMESTIC","DOOR","DOUBLE","DOUBT","DOWN","DRAW","DRAWING","DREAM","DRESS","DRINK","DRIVE","DRIVER","DROP","DRUG","DRY","DUE","DURING","DUTY","EACH","EAR","EARLY","EARN","EARTH","EASILY","EAST","EASY","EAT","ECONOMIC","ECONOMY","EDGE","EDITOR","EDUCATION","EDUCATIONAL","EFFECT","EFFECTIVE","EFFECTIVELY","EFFORT","EGG","EITHER","ELDERLY","ELECTION","ELEMENT","ELSE","ELSEWHERE","EMERGE","EMPHASIS","EMPLOY","EMPLOYEE","EMPLOYER","EMPLOYMENT","EMPTY","ENABLE","ENCOURAGE","END","ENEMY","ENERGY","ENGINE","ENGINEERING","ENJOY","ENOUGH","ENSURE","ENTER","ENTERPRISE","ENTIRE","ENTIRELY","ENTITLE","ENTRY","ENVIRONMENT","ENVIRONMENTAL","EQUAL","EQUALLY","EQUIPMENT","ERROR","ESCAPE","ESPECIALLY","ESSENTIAL","ESTABLISH","ESTABLISHMENT","ESTATE","ESTIMATE","EVEN","EVENING","EVENT","EVENTUALLY","EVER","EVERY","EVERYBODY","EVERYONE","EVERYTHING","EVIDENCE","EXACTLY","EXAMINATION","EXAMINE","EXAMPLE","EXCELLENT","EXCEPT","EXCHANGE","EXECUTIVE","EXERCISE","EXHIBITION","EXIST","EXISTENCE","EXISTING","EXPECT","EXPECTATION","EXPENDITURE","EXPENSE","EXPENSIVE","EXPERIENCE","EXPERIMENT","EXPERT","EXPLAIN","EXPLANATION","EXPLORE","EXPRESS","EXPRESSION","EXTEND","EXTENT","EXTERNAL","EXTRA","EXTREMELY","EYE","FACE","FACILITY","FACT","FACTOR","FACTORY","FAIL","FAILURE","FAIR","FAIRLY","FAITH","FALL","FAMILIAR","FAMILY","FAMOUS","FAR","FARM","FARMER","FASHION","FAST","FATHER","FAVOUR","FEAR","FEATURE","FEE","FEEL","FEELING","FEMALE","FEW","FIELD","FIGHT","FIGURE","FILE","FILL","FILM","FINAL","FINALLY","FINANCE","FINANCIAL","FIND","FINDING","FINE","FINGER","FINISH","FIRE","FIRM","FIRST","FISH","FIT","FIX","FLAT","FLIGHT","FLOOR","FLOW","FLOWER","FLY","FOCUS","FOLLOW","FOLLOWING","FOOD","FOOT","FOOTBALL","FOR","FORCE","FOREIGN","FOREST","FORGET","FORM","FORMAL","FORMER","FORWARD","FOUNDATION","FREE","FREEDOM","FREQUENTLY","FRESH","FRIEND","FROM","FRONT","FRUIT","FUEL","FULL","FULLY","FUNCTION","FUND","FUNNY","FURTHER","FUTURE","GAIN","GAME","GARDEN","GAS","GATE","GATHER","GENERAL","GENERALLY","GENERATE","GENERATION","GENTLEMAN","GET","GIRL","GIVE","GLASS","GO","GOAL","GOD","GOLD","GOOD","GOVERNMENT","GRANT","GREAT","GREEN","GREY","GROUND","GROUP","GROW","GROWING","GROWTH","GUEST","GUIDE","GUN","HAIR","HALF","HALL","HAND","HANDLE","HANG","HAPPEN","HAPPY","HARD","HARDLY","HATE","HAVE","HE","HEAD","HEALTH","HEAR","HEART","HEAT","HEAVY","HELL","HELP","HENCE","HER","HERE","HERSELF","HIDE","HIGH","HIGHLY","HILL","HIM","HIMSELF","HIS","HISTORICAL","HISTORY","HIT","HOLD","HOLE","HOLIDAY","HOME","HOPE","HORSE","HOSPITAL","HOT","HOTEL","HOUR","HOUSE","HOUSEHOLD","HOUSING","HOW","HOWEVER","HUGE","HUMAN","HURT","HUSBAND","I","IDEA","IDENTIFY","IF","IGNORE","ILLUSTRATE","IMAGE","IMAGINE","IMMEDIATE","IMMEDIATELY","IMPACT","IMPLICATION","IMPLY","IMPORTANCE","IMPORTANT","IMPOSE","IMPOSSIBLE","IMPRESSION","IMPROVE","IMPROVEMENT","IN","INCIDENT","INCLUDE","INCLUDING","INCOME","INCREASE","INCREASED","INCREASINGLY","INDEED","INDEPENDENT","INDEX","INDICATE","INDIVIDUAL","INDUSTRIAL","INDUSTRY","INFLUENCE","INFORM","INFORMATION","INITIAL","INITIATIVE","INJURY","INSIDE","INSIST","INSTANCE","INSTEAD","INSTITUTE","INSTITUTION","INSTRUCTION","INSTRUMENT","INSURANCE","INTEND","INTENTION","INTEREST","INTERESTED","INTERESTING","INTERNAL","INTERNATIONAL","INTERPRETATION","INTERVIEW","INTO","INTRODUCE","INTRODUCTION","INVESTIGATE","INVESTIGATION","INVESTMENT","INVITE","INVOLVE","IRON","IS","ISLAND","ISSUE","IT","ITEM","ITS","ITSELF","JOB","JOIN","JOINT","JOURNEY","JUDGE","JUMP","JUST","JUSTICE","KEEP","KEY","KID","KILL","KIND","KING","KITCHEN","KNEE","KNOW","KNOWLEDGE","LABOUR","LACK","LADY","LAND","LANGUAGE","LARGE","LARGELY","LAST","LATE","LATER","LATTER","LAUGH","LAUNCH","LAW","LAWYER","LAY","LEAD","LEADER","LEADERSHIP","LEADING","LEAF","LEAGUE","LEAN","LEARN","LEAST","LEAVE","LEFT","LEG","LEGAL","LEGISLATION","LENGTH","LESS","LET","LETTER","LEVEL","LIABILITY","LIBERAL","LIBRARY","LIE","LIFE","LIFT","LIGHT","LIKE","LIKELY","LIMIT","LIMITED","LINE","LINK","LIP","LIST","LISTEN","LITERATURE","LITTLE","LIVE","LIVING","LOAN","LOCAL","LOCATION","LONG","LOOK","LORD","LOSE","LOSS","LOT","LOVE","LOVELY","LOW","LUNCH","MACHINE","MAGAZINE","MAIN","MAINLY","MAINTAIN","MAJOR","MAJORITY","MAKE","MALE","MAN","MANAGE","MANAGEMENT","MANAGER","MANNER","MANY","MAP","MARK","MARKET","MARRIAGE","MARRIED","MARRY","MASS","MASTER","MATCH","MATERIAL","MATTER","MAY","MAYBE","ME","MEAL","MEAN","MEANING","MEANS","MEANWHILE","MEASURE","MECHANISM","MEDIA","MEDICAL","MEET","MEETING","MEMBER","MEMBERSHIP","MEMORY","MENTAL","MENTION","MERELY","MESSAGE","METAL","METHOD","MIDDLE","MIGHT","MILE","MILITARY","MILK","MIND","MINE","MINISTER","MINISTRY","MINUTE","MISS","MISTAKE","MODEL","MODERN","MODULE","MOMENT","MONEY","MONTH","MORE","MORNING","MOST","MOTHER","MOTION","MOTOR","MOUNTAIN","MOUTH","MOVE","MOVEMENT","MUCH","MURDER","MUSEUM","MUSIC","MUST","MY","MYSELF","NAME","NARROW","NATION","NATIONAL","NATURAL","NATURE","NEAR","NEARLY","NECESSARILY","NECESSARY","NECK","NEED","NEGOTIATION","NEIGHBOUR","NEITHER","NETWORK","NEVER","NEVERTHELESS","NEW","NEWS","NEWSPAPER","NEXT","NICE","NIGHT","NO","NOBODY","NOD","NOISE","NONE","NOR","NORMAL","NORMALLY","NORTH","NORTHERN","NOSE","NOT","NOTE","NOTHING","NOTICE","NOTION","NOW","NUCLEAR","NUMBER","NURSE","OBJECT","OBJECTIVE","OBSERVATION","OBSERVE","OBTAIN","OBVIOUS","OBVIOUSLY","OCCASION","OCCUR","ODD","OF","OFF","OFFENCE","OFFER","OFFICE","OFFICER","OFFICIAL","OFTEN","OIL","OKAY","OLD","ON","ONCE","ONE","ONLY","ONTO","OPEN","OPERATE","OPERATION","OPINION","OPPORTUNITY","OPPOSITION","OPTION","OR","ORDER","ORDINARY","ORGANISATION","ORGANISE","ORGANIZATION","ORIGIN","ORIGINAL","OTHER","OTHERWISE","OUGHT","OUR","OURSELVES","OUT","OUTCOME","OUTPUT","OUTSIDE","OVER","OVERALL","OWN","OWNER","PACKAGE","PAGE","PAIN","PAINT","PAINTING","PAIR","PANEL","PAPER","PARENT","PARK","PARLIAMENT","PART","PARTICULAR","PARTICULARLY","PARTLY","PARTNER","PARTY","PASS","PASSAGE","PAST","PATH","PATIENT","PATTERN","PAY","PAYMENT","PEACE","PENSION","PEOPLE","PER","PERCENT","PERFECT","PERFORM","PERFORMANCE","PERHAPS","PERIOD","PERMANENT","PERSON","PERSONAL","PERSUADE","PHASE","PHONE","PHOTOGRAPH","PHYSICAL","PICK","PICTURE","PIECE","PLACE","PLAN","PLANNING","PLANT","PLASTIC","PLATE","PLAY","PLAYER","PLEASE","PLEASURE","PLENTY","PLUS","POCKET","POINT","POLICE","POLICY","POLITICAL","POLITICS","POOL","POOR","POPULAR","POPULATION","POSITION","POSITIVE","POSSIBILITY","POSSIBLE","POSSIBLY","POST","POTENTIAL","POUND","POWER","POWERFUL","PRACTICAL","PRACTICE","PREFER","PREPARE","PRESENCE","PRESENT","PRESIDENT","PRESS","PRESSURE","PRETTY","PREVENT","PREVIOUS","PREVIOUSLY","PRICE","PRIMARY","PRIME","PRINCIPLE","PRIORITY","PRISON","PRISONER","PRIVATE","PROBABLY","PROBLEM","PROCEDURE","PROCESS","PRODUCE","PRODUCT","PRODUCTION","PROFESSIONAL","PROFIT","PROGRAM","PROGRAMME","PROGRESS","PROJECT","PROMISE","PROMOTE","PROPER","PROPERLY","PROPERTY","PROPORTION","PROPOSE","PROPOSAL","PROSPECT","PROTECT","PROTECTION","PROVE","PROVIDE","PROVIDED","PROVISION","PUB","PUBLIC","PUBLICATION","PUBLISH","PULL","PUPIL","PURPOSE","PUSH","PUT","QUALITY","QUARTER","QUESTION","QUICK","QUICKLY","QUIET","QUITE","RACE","RADIO","RAILWAY","RAIN","RAISE","RANGE","RAPIDLY","RARE","RATE","RATHER","REACH","REACTION","READ","READER","READING","READY","REAL","REALISE","REALITY","REALIZE","REALLY","REASON","REASONABLE","RECALL","RECEIVE","RECENT","RECENTLY","RECOGNISE","RECOGNITION","RECOGNIZE","RECOMMEND","RECORD","RECOVER","RED","REDUCE","REDUCTION","REFER","REFERENCE","REFLECT","REFORM","REFUSE","REGARD","REGION","REGIONAL","REGULAR","REGULATION","REJECT","RELATE","RELATION","RELATIONSHIP","RELATIVE","RELATIVELY","RELEASE","RELEVANT","RELIEF","RELIGION","RELIGIOUS","RELY","REMAIN","REMEMBER","REMIND","REMOVE","REPEAT","REPLACE","REPLY","REPORT","REPRESENT","REPRESENTATION","REPRESENTATIVE","REQUEST","REQUIRE","REQUIREMENT","RESEARCH","RESOURCE","RESPECT","RESPOND","RESPONSE","RESPONSIBILITY","RESPONSIBLE","REST","RESTAURANT","RESULT","RETAIN","RETURN","REVEAL","REVENUE","REVIEW","REVOLUTION","RICH","RIDE","RIGHT","RING","RISE","RISK","RIVER","ROAD","ROCK","ROLE","ROLL","ROOF","ROOM","ROUND","ROUTE","ROW","ROYAL","RULE","RUN","RURAL","SAFE","SAFETY","SALE","SAME","SAMPLE","SATISFY","SAVE","SAY","SCALE","SCENE","SCHEME","SCHOOL","SCIENCE","SCIENTIFIC","SCIENTIST","SCORE","SCREEN","SEA","SEARCH","SEASON","SEAT","SECOND","SECONDARY","SECRETARY","SECTION","SECTOR","SECURE","SECURITY","SEE","SEEK","SEEM","SELECT","SELECTION","SELL","SEND","SENIOR","SENSE","SENTENCE","SEPARATE","SEQUENCE","SERIES","SERIOUS","SERIOUSLY","SERVANT","SERVE","SERVICE","SESSION","SET","SETTLE","SETTLEMENT","SEVERAL","SEVERE","SEX","SEXUAL","SHAKE","SHALL","SHAPE","SHARE","SHE","SHEET","SHIP","SHOE","SHOOT","SHOP","SHORT","SHOT","SHOULD","SHOULDER","SHOUT","SHOW","SHUT","SIDE","SIGHT","SIGN","SIGNAL","SIGNIFICANCE","SIGNIFICANT","SILENCE","SIMILAR","SIMPLE","SIMPLY","SINCE","SING","SINGLE","SIR","SISTER","SIT","SITE","SITUATION","SIZE","SKILL","SKIN","SKY","SLEEP","SLIGHTLY","SLIP","SLOW","SLOWLY","SMALL","SMILE","SO","SOCIAL","SOCIETY","SOFT","SOFTWARE","SOIL","SOLDIER","SOLICITOR","SOLUTION","SOME","SOMEBODY","SOMEONE","SOMETHING","SOMETIMES","SOMEWHAT","SOMEWHERE","SON","SONG","SOON","SORRY","SORT","SOUND","SOURCE","SOUTH","SOUTHERN","SPACE","SPEAK","SPEAKER","SPECIAL","SPECIES","SPECIFIC","SPEECH","SPEED","SPEND","SPIRIT","SPORT","SPOT","SPREAD","SPRING","STAFF","STAGE","STAND","STANDARD","STAR","START","STATE","STATEMENT","STATION","STATUS","STAY","STEAL","STEP","STICK","STILL","STOCK","STONE","STOP","STORE","STORY","STRAIGHT","STRANGE","STRATEGY","STREET","STRENGTH","STRIKE","STRONG","STRONGLY","STRUCTURE","STUDENT","STUDIO","STUDY","STUFF","STYLE","SUBJECT","SUBSTANTIAL","SUCCEED","SUCCESS","SUCCESSFUL","SUCH","SUDDENLY","SUFFER","SUFFICIENT","SUGGEST","SUGGESTION","SUITABLE","SUM","SUMMER","SUN","SUPPLY","SUPPORT","SUPPOSE","SURE","SURELY","SURFACE","SURPRISE","SURROUND","SURVEY","SURVIVE","SWITCH","SYSTEM","TABLE","TAKE","TALK","TALL","TAPE","TARGET","TASK","TAX","TEA","TEACH","TEACHER","TEACHING","TEAM","TEAR","TECHNICAL","TECHNIQUE","TECHNOLOGY","TELEPHONE","TELEVISION","TELL","TEMPERATURE","TEND","TERM","TERMS","TERRIBLE","TEST","TEXT","THAN","THANK","THANKS","THAT","THE","THEATRE","THEIR","THEM","THEME","THEMSELVES","THEN","THEORY","THERE","THEREFORE","THESE","THEY","THIN","THING","THINK","THIS","THOSE","THOUGH","THOUGHT","THREAT","THREATEN","THROUGH","THROUGHOUT","THROW","THUS","TICKET","TIME","TINY","TITLE","TO","TODAY","TOGETHER","TOMORROW","TONE","TONIGHT","TOO","TOOL","TOOTH","TOP","TOTAL","TOTALLY","TOUCH","TOUR","TOWARDS","TOWN","TRACK","TRADE","TRADITION","TRADITIONAL","TRAFFIC","TRAIN","TRAINING","TRANSFER","TRANSPORT","TRAVEL","TREAT","TREATMENT","TREATY","TREE","TREND","TRIAL","TRIP","TROOP","TROUBLE","TRUE","TRUST","TRUTH","TRY","TURN","TWICE","TYPE","TYPICAL","UNABLE","UNDER","UNDERSTAND","UNDERSTANDING","UNDERTAKE","UNEMPLOYMENT","UNFORTUNATELY","UNION","UNIT","UNITED","UNIVERSITY","UNLESS","UNLIKELY","UNTIL","UP","UPON","UPPER","URBAN","US","USE","USED","USEFUL","USER","USUAL","USUALLY","VALUE","VARIATION","VARIETY","VARIOUS","VARY","VAST","VEHICLE","VERSION","VERY","VIA","VICTIM","VICTORY","VIDEO","VIEW","VILLAGE","VIOLENCE","VISION","VISIT","VISITOR","VITAL","VOICE","VOLUME","VOTE","WAGE","WAIT","WALK","WALL","WANT","WAR","WARM","WARN","WASH","WATCH","WATER","WAVE","WAY","WE","WEAK","WEAPON","WEAR","WEATHER","WEEK","WEEKEND","WEIGHT","WELCOME","WELFARE","WELL","WEST","WESTERN","WHAT","WHATEVER","WHEN","WHERE","WHEREAS","WHETHER","WHICH","WHILE","WHILST","WHITE","WHO","WHOLE","WHOM","WHOSE","WHY","WIDE","WIDELY","WIFE","WILD","WILL","WIN","WIND","WINDOW","WINE","WING","WINNER","WINTER","WISH","WITH","WITHDRAW","WITHIN","WITHOUT","WOMAN","WONDER","WONDERFUL","WOOD","WORD","WORK","WORKER","WORKING","WORKS","WORLD","WORRY","WORTH","WOULD","WRITE","WRITER","WRITING","WRONG","YARD","YEAH","YEAR","YES","YESTERDAY","YET","YOU","YOUNG","YOUR","YOURSELF","YOUTH" \ No newline at end of file diff --git a/src/projecteuler/099.py b/src/projecteuler/099.py deleted file mode 100644 index bc72d07..0000000 --- a/src/projecteuler/099.py +++ /dev/null @@ -1,21 +0,0 @@ -import math - -numbers = [] - -f = open('099.txt', 'r') -for line in f: - line.rstrip('\n') - l = [int(x) for x in line.split(',')] - numbers.append(l[1] * math.log(l[0])) # log(x^r) = r*log(x) -f.close() - -maxline = 0 -maxn = 0 - -for n in xrange(0, len(numbers)-1): - if numbers[n] > maxn: - maxn = numbers[n] - maxline = n - -print maxline+1 - diff --git a/src/projecteuler/099.txt b/src/projecteuler/099.txt deleted file mode 100644 index 92201db..0000000 --- a/src/projecteuler/099.txt +++ /dev/null @@ -1,1000 +0,0 @@ -519432,525806 -632382,518061 -78864,613712 -466580,530130 -780495,510032 -525895,525320 -15991,714883 -960290,502358 -760018,511029 -166800,575487 -210884,564478 -555151,523163 -681146,515199 -563395,522587 -738250,512126 -923525,503780 -595148,520429 -177108,572629 -750923,511482 -440902,532446 -881418,505504 -422489,534197 -979858,501616 -685893,514935 -747477,511661 -167214,575367 -234140,559696 -940238,503122 -728969,512609 -232083,560102 -900971,504694 -688801,514772 -189664,569402 -891022,505104 -445689,531996 -119570,591871 -821453,508118 -371084,539600 -911745,504251 -623655,518600 -144361,582486 -352442,541775 -420726,534367 -295298,549387 -6530,787777 -468397,529976 -672336,515696 -431861,533289 -84228,610150 -805376,508857 -444409,532117 -33833,663511 -381850,538396 -402931,536157 -92901,604930 -304825,548004 -731917,512452 -753734,511344 -51894,637373 -151578,580103 -295075,549421 -303590,548183 -333594,544123 -683952,515042 -60090,628880 -951420,502692 -28335,674991 -714940,513349 -343858,542826 -549279,523586 -804571,508887 -260653,554881 -291399,549966 -402342,536213 -408889,535550 -40328,652524 -375856,539061 -768907,510590 -165993,575715 -976327,501755 -898500,504795 -360404,540830 -478714,529095 -694144,514472 -488726,528258 -841380,507226 -328012,544839 -22389,690868 -604053,519852 -329514,544641 -772965,510390 -492798,527927 -30125,670983 -895603,504906 -450785,531539 -840237,507276 -380711,538522 -63577,625673 -76801,615157 -502694,527123 -597706,520257 -310484,547206 -944468,502959 -121283,591152 -451131,531507 -566499,522367 -425373,533918 -40240,652665 -39130,654392 -714926,513355 -469219,529903 -806929,508783 -287970,550487 -92189,605332 -103841,599094 -671839,515725 -452048,531421 -987837,501323 -935192,503321 -88585,607450 -613883,519216 -144551,582413 -647359,517155 -213902,563816 -184120,570789 -258126,555322 -502546,527130 -407655,535678 -401528,536306 -477490,529193 -841085,507237 -732831,512408 -833000,507595 -904694,504542 -581435,521348 -455545,531110 -873558,505829 -94916,603796 -720176,513068 -545034,523891 -246348,557409 -556452,523079 -832015,507634 -173663,573564 -502634,527125 -250732,556611 -569786,522139 -216919,563178 -521815,525623 -92304,605270 -164446,576167 -753413,511364 -11410,740712 -448845,531712 -925072,503725 -564888,522477 -7062,780812 -641155,517535 -738878,512100 -636204,517828 -372540,539436 -443162,532237 -571192,522042 -655350,516680 -299741,548735 -581914,521307 -965471,502156 -513441,526277 -808682,508700 -237589,559034 -543300,524025 -804712,508889 -247511,557192 -543486,524008 -504383,526992 -326529,545039 -792493,509458 -86033,609017 -126554,589005 -579379,521481 -948026,502823 -404777,535969 -265767,554022 -266876,553840 -46631,643714 -492397,527958 -856106,506581 -795757,509305 -748946,511584 -294694,549480 -409781,535463 -775887,510253 -543747,523991 -210592,564536 -517119,525990 -520253,525751 -247926,557124 -592141,520626 -346580,542492 -544969,523902 -506501,526817 -244520,557738 -144745,582349 -69274,620858 -292620,549784 -926027,503687 -736320,512225 -515528,526113 -407549,535688 -848089,506927 -24141,685711 -9224,757964 -980684,501586 -175259,573121 -489160,528216 -878970,505604 -969546,502002 -525207,525365 -690461,514675 -156510,578551 -659778,516426 -468739,529945 -765252,510770 -76703,615230 -165151,575959 -29779,671736 -928865,503569 -577538,521605 -927555,503618 -185377,570477 -974756,501809 -800130,509093 -217016,563153 -365709,540216 -774508,510320 -588716,520851 -631673,518104 -954076,502590 -777828,510161 -990659,501222 -597799,520254 -786905,509727 -512547,526348 -756449,511212 -869787,505988 -653747,516779 -84623,609900 -839698,507295 -30159,670909 -797275,509234 -678136,515373 -897144,504851 -989554,501263 -413292,535106 -55297,633667 -788650,509637 -486748,528417 -150724,580377 -56434,632490 -77207,614869 -588631,520859 -611619,519367 -100006,601055 -528924,525093 -190225,569257 -851155,506789 -682593,515114 -613043,519275 -514673,526183 -877634,505655 -878905,505602 -1926,914951 -613245,519259 -152481,579816 -841774,507203 -71060,619442 -865335,506175 -90244,606469 -302156,548388 -399059,536557 -478465,529113 -558601,522925 -69132,620966 -267663,553700 -988276,501310 -378354,538787 -529909,525014 -161733,576968 -758541,511109 -823425,508024 -149821,580667 -269258,553438 -481152,528891 -120871,591322 -972322,501901 -981350,501567 -676129,515483 -950860,502717 -119000,592114 -392252,537272 -191618,568919 -946699,502874 -289555,550247 -799322,509139 -703886,513942 -194812,568143 -261823,554685 -203052,566221 -217330,563093 -734748,512313 -391759,537328 -807052,508777 -564467,522510 -59186,629748 -113447,594545 -518063,525916 -905944,504492 -613922,519213 -439093,532607 -445946,531981 -230530,560399 -297887,549007 -459029,530797 -403692,536075 -855118,506616 -963127,502245 -841711,507208 -407411,535699 -924729,503735 -914823,504132 -333725,544101 -176345,572832 -912507,504225 -411273,535308 -259774,555036 -632853,518038 -119723,591801 -163902,576321 -22691,689944 -402427,536212 -175769,572988 -837260,507402 -603432,519893 -313679,546767 -538165,524394 -549026,523608 -61083,627945 -898345,504798 -992556,501153 -369999,539727 -32847,665404 -891292,505088 -152715,579732 -824104,507997 -234057,559711 -730507,512532 -960529,502340 -388395,537687 -958170,502437 -57105,631806 -186025,570311 -993043,501133 -576770,521664 -215319,563513 -927342,503628 -521353,525666 -39563,653705 -752516,511408 -110755,595770 -309749,547305 -374379,539224 -919184,503952 -990652,501226 -647780,517135 -187177,570017 -168938,574877 -649558,517023 -278126,552016 -162039,576868 -658512,516499 -498115,527486 -896583,504868 -561170,522740 -747772,511647 -775093,510294 -652081,516882 -724905,512824 -499707,527365 -47388,642755 -646668,517204 -571700,522007 -180430,571747 -710015,513617 -435522,532941 -98137,602041 -759176,511070 -486124,528467 -526942,525236 -878921,505604 -408313,535602 -926980,503640 -882353,505459 -566887,522345 -3326,853312 -911981,504248 -416309,534800 -392991,537199 -622829,518651 -148647,581055 -496483,527624 -666314,516044 -48562,641293 -672618,515684 -443676,532187 -274065,552661 -265386,554079 -347668,542358 -31816,667448 -181575,571446 -961289,502320 -365689,540214 -987950,501317 -932299,503440 -27388,677243 -746701,511701 -492258,527969 -147823,581323 -57918,630985 -838849,507333 -678038,515375 -27852,676130 -850241,506828 -818403,508253 -131717,587014 -850216,506834 -904848,504529 -189758,569380 -392845,537217 -470876,529761 -925353,503711 -285431,550877 -454098,531234 -823910,508003 -318493,546112 -766067,510730 -261277,554775 -421530,534289 -694130,514478 -120439,591498 -213308,563949 -854063,506662 -365255,540263 -165437,575872 -662240,516281 -289970,550181 -847977,506933 -546083,523816 -413252,535113 -975829,501767 -361540,540701 -235522,559435 -224643,561577 -736350,512229 -328303,544808 -35022,661330 -307838,547578 -474366,529458 -873755,505819 -73978,617220 -827387,507845 -670830,515791 -326511,545034 -309909,547285 -400970,536363 -884827,505352 -718307,513175 -28462,674699 -599384,520150 -253565,556111 -284009,551093 -343403,542876 -446557,531921 -992372,501160 -961601,502308 -696629,514342 -919537,503945 -894709,504944 -892201,505051 -358160,541097 -448503,531745 -832156,507636 -920045,503924 -926137,503675 -416754,534757 -254422,555966 -92498,605151 -826833,507873 -660716,516371 -689335,514746 -160045,577467 -814642,508425 -969939,501993 -242856,558047 -76302,615517 -472083,529653 -587101,520964 -99066,601543 -498005,527503 -709800,513624 -708000,513716 -20171,698134 -285020,550936 -266564,553891 -981563,501557 -846502,506991 -334,1190800 -209268,564829 -9844,752610 -996519,501007 -410059,535426 -432931,533188 -848012,506929 -966803,502110 -983434,501486 -160700,577267 -504374,526989 -832061,507640 -392825,537214 -443842,532165 -440352,532492 -745125,511776 -13718,726392 -661753,516312 -70500,619875 -436952,532814 -424724,533973 -21954,692224 -262490,554567 -716622,513264 -907584,504425 -60086,628882 -837123,507412 -971345,501940 -947162,502855 -139920,584021 -68330,621624 -666452,516038 -731446,512481 -953350,502619 -183157,571042 -845400,507045 -651548,516910 -20399,697344 -861779,506331 -629771,518229 -801706,509026 -189207,569512 -737501,512168 -719272,513115 -479285,529045 -136046,585401 -896746,504860 -891735,505067 -684771,514999 -865309,506184 -379066,538702 -503117,527090 -621780,518717 -209518,564775 -677135,515423 -987500,501340 -197049,567613 -329315,544673 -236756,559196 -357092,541226 -520440,525733 -213471,563911 -956852,502490 -702223,514032 -404943,535955 -178880,572152 -689477,514734 -691351,514630 -866669,506128 -370561,539656 -739805,512051 -71060,619441 -624861,518534 -261660,554714 -366137,540160 -166054,575698 -601878,519990 -153445,579501 -279899,551729 -379166,538691 -423209,534125 -675310,515526 -145641,582050 -691353,514627 -917468,504026 -284778,550976 -81040,612235 -161699,576978 -616394,519057 -767490,510661 -156896,578431 -427408,533714 -254849,555884 -737217,512182 -897133,504851 -203815,566051 -270822,553189 -135854,585475 -778805,510111 -784373,509847 -305426,547921 -733418,512375 -732087,512448 -540668,524215 -702898,513996 -628057,518328 -640280,517587 -422405,534204 -10604,746569 -746038,511733 -839808,507293 -457417,530938 -479030,529064 -341758,543090 -620223,518824 -251661,556451 -561790,522696 -497733,527521 -724201,512863 -489217,528217 -415623,534867 -624610,518548 -847541,506953 -432295,533249 -400391,536421 -961158,502319 -139173,584284 -421225,534315 -579083,521501 -74274,617000 -701142,514087 -374465,539219 -217814,562985 -358972,540995 -88629,607424 -288597,550389 -285819,550812 -538400,524385 -809930,508645 -738326,512126 -955461,502535 -163829,576343 -826475,507891 -376488,538987 -102234,599905 -114650,594002 -52815,636341 -434037,533082 -804744,508880 -98385,601905 -856620,506559 -220057,562517 -844734,507078 -150677,580387 -558697,522917 -621751,518719 -207067,565321 -135297,585677 -932968,503404 -604456,519822 -579728,521462 -244138,557813 -706487,513800 -711627,513523 -853833,506674 -497220,527562 -59428,629511 -564845,522486 -623621,518603 -242689,558077 -125091,589591 -363819,540432 -686453,514901 -656813,516594 -489901,528155 -386380,537905 -542819,524052 -243987,557841 -693412,514514 -488484,528271 -896331,504881 -336730,543721 -728298,512647 -604215,519840 -153729,579413 -595687,520398 -540360,524240 -245779,557511 -924873,503730 -509628,526577 -528523,525122 -3509,847707 -522756,525555 -895447,504922 -44840,646067 -45860,644715 -463487,530404 -398164,536654 -894483,504959 -619415,518874 -966306,502129 -990922,501212 -835756,507474 -548881,523618 -453578,531282 -474993,529410 -80085,612879 -737091,512193 -50789,638638 -979768,501620 -792018,509483 -665001,516122 -86552,608694 -462772,530469 -589233,520821 -891694,505072 -592605,520594 -209645,564741 -42531,649269 -554376,523226 -803814,508929 -334157,544042 -175836,572970 -868379,506051 -658166,516520 -278203,551995 -966198,502126 -627162,518387 -296774,549165 -311803,547027 -843797,507118 -702304,514032 -563875,522553 -33103,664910 -191932,568841 -543514,524006 -506835,526794 -868368,506052 -847025,506971 -678623,515342 -876139,505726 -571997,521984 -598632,520198 -213590,563892 -625404,518497 -726508,512738 -689426,514738 -332495,544264 -411366,535302 -242546,558110 -315209,546555 -797544,509219 -93889,604371 -858879,506454 -124906,589666 -449072,531693 -235960,559345 -642403,517454 -720567,513047 -705534,513858 -603692,519870 -488137,528302 -157370,578285 -63515,625730 -666326,516041 -619226,518883 -443613,532186 -597717,520257 -96225,603069 -86940,608450 -40725,651929 -460976,530625 -268875,553508 -270671,553214 -363254,540500 -384248,538137 -762889,510892 -377941,538833 -278878,551890 -176615,572755 -860008,506412 -944392,502967 -608395,519571 -225283,561450 -45095,645728 -333798,544090 -625733,518476 -995584,501037 -506135,526853 -238050,558952 -557943,522972 -530978,524938 -634244,517949 -177168,572616 -85200,609541 -953043,502630 -523661,525484 -999295,500902 -840803,507246 -961490,502312 -471747,529685 -380705,538523 -911180,504275 -334149,544046 -478992,529065 -325789,545133 -335884,543826 -426976,533760 -749007,511582 -667067,516000 -607586,519623 -674054,515599 -188534,569675 -565185,522464 -172090,573988 -87592,608052 -907432,504424 -8912,760841 -928318,503590 -757917,511138 -718693,513153 -315141,546566 -728326,512645 -353492,541647 -638429,517695 -628892,518280 -877286,505672 -620895,518778 -385878,537959 -423311,534113 -633501,517997 -884833,505360 -883402,505416 -999665,500894 -708395,513697 -548142,523667 -756491,511205 -987352,501340 -766520,510705 -591775,520647 -833758,507563 -843890,507108 -925551,503698 -74816,616598 -646942,517187 -354923,541481 -256291,555638 -634470,517942 -930904,503494 -134221,586071 -282663,551304 -986070,501394 -123636,590176 -123678,590164 -481717,528841 -423076,534137 -866246,506145 -93313,604697 -783632,509880 -317066,546304 -502977,527103 -141272,583545 -71708,618938 -617748,518975 -581190,521362 -193824,568382 -682368,515131 -352956,541712 -351375,541905 -505362,526909 -905165,504518 -128645,588188 -267143,553787 -158409,577965 -482776,528754 -628896,518282 -485233,528547 -563606,522574 -111001,595655 -115920,593445 -365510,540237 -959724,502374 -938763,503184 -930044,503520 -970959,501956 -913658,504176 -68117,621790 -989729,501253 -567697,522288 -820427,508163 -54236,634794 -291557,549938 -124961,589646 -403177,536130 -405421,535899 -410233,535417 -815111,508403 -213176,563974 -83099,610879 -998588,500934 -513640,526263 -129817,587733 -1820,921851 -287584,550539 -299160,548820 -860621,506386 -529258,525059 -586297,521017 -953406,502616 -441234,532410 -986217,501386 -781938,509957 -461247,530595 -735424,512277 -146623,581722 -839838,507288 -510667,526494 -935085,503327 -737523,512167 -303455,548204 -992779,501145 -60240,628739 -939095,503174 -794368,509370 -501825,527189 -459028,530798 -884641,505363 -512287,526364 -835165,507499 -307723,547590 -160587,577304 -735043,512300 -493289,527887 -110717,595785 -306480,547772 -318593,546089 -179810,571911 -200531,566799 -314999,546580 -197020,567622 -301465,548487 -237808,559000 -131944,586923 -882527,505449 -468117,530003 -711319,513541 -156240,578628 -965452,502162 -992756,501148 -437959,532715 -739938,512046 -614249,519196 -391496,537356 -62746,626418 -688215,514806 -75501,616091 -883573,505412 -558824,522910 -759371,511061 -173913,573489 -891351,505089 -727464,512693 -164833,576051 -812317,508529 -540320,524243 -698061,514257 -69149,620952 -471673,529694 -159092,577753 -428134,533653 -89997,606608 -711061,513557 -779403,510081 -203327,566155 -798176,509187 -667688,515963 -636120,517833 -137410,584913 -217615,563034 -556887,523038 -667229,515991 -672276,515708 -325361,545187 -172115,573985 -13846,725685 \ No newline at end of file diff --git a/src/projecteuler/102.py b/src/projecteuler/102.py deleted file mode 100644 index a2108f6..0000000 --- a/src/projecteuler/102.py +++ /dev/null @@ -1,43 +0,0 @@ - -# check if r*(AC) + s*(AB) == P - -def point_in_triangle((x_a, y_a), (x_b, y_b), (x_c, y_c), (x_p, y_p)): - t = x_c - x_a - u = x_b - x_a - v = y_c - y_a - w = y_b - y_a - - # Cramer's rule - detA = t*w - u*v - detR = x_p*w - u*y_p - detS = t*y_p - x_p*v - - if detA == 0: - print "Not solvable" - - r = detR / float(detA) - s = detS / float(detA) - - return 0 <= r <= 1 and 0 <= s <= 1 and r + s < 1 - - -count = 0 - -f = open('102.txt', 'r') -for line in f: - line = line.rstrip('\r\n') - coords = [ int(x) for x in line.split(',') ] - - # move one point to origin, adjust other points - (a1, a2) = (coords[0], coords[1]) - A = (0, 0) - B = (coords[2]-a1, coords[3]-a2) - C = (coords[4]-a1, coords[5]-a2) - P = (-a1, -a2) - - if point_in_triangle(A, B, C, P): - count += 1 -f.close() - -print count - diff --git a/src/projecteuler/102.txt b/src/projecteuler/102.txt deleted file mode 100644 index d43312a..0000000 --- a/src/projecteuler/102.txt +++ /dev/null @@ -1,1000 +0,0 @@ --340,495,-153,-910,835,-947 --175,41,-421,-714,574,-645 --547,712,-352,579,951,-786 -419,-864,-83,650,-399,171 --429,-89,-357,-930,296,-29 --734,-702,823,-745,-684,-62 --971,762,925,-776,-663,-157 -162,570,628,485,-807,-896 -641,91,-65,700,887,759 -215,-496,46,-931,422,-30 --119,359,668,-609,-358,-494 -440,929,968,214,760,-857 --700,785,838,29,-216,411 --770,-458,-325,-53,-505,633 --752,-805,349,776,-799,687 -323,5,561,-36,919,-560 --907,358,264,320,204,274 --728,-466,350,969,292,-345 -940,836,272,-533,748,185 -411,998,813,520,316,-949 --152,326,658,-762,148,-651 -330,507,-9,-628,101,174 -551,-496,772,-541,-702,-45 --164,-489,-90,322,631,-59 -673,366,-4,-143,-606,-704 -428,-609,801,-449,740,-269 -453,-924,-785,-346,-853,111 --738,555,-181,467,-426,-20 -958,-692,784,-343,505,-569 -620,27,263,54,-439,-726 -804,87,998,859,871,-78 --119,-453,-709,-292,-115,-56 --626,138,-940,-476,-177,-274 --11,160,142,588,446,158 -538,727,550,787,330,810 -420,-689,854,-546,337,516 -872,-998,-607,748,473,-192 -653,440,-516,-985,808,-857 -374,-158,331,-940,-338,-641 -137,-925,-179,771,734,-715 --314,198,-115,29,-641,-39 -759,-574,-385,355,590,-603 --189,-63,-168,204,289,305 --182,-524,-715,-621,911,-255 -331,-816,-833,471,168,126 --514,581,-855,-220,-731,-507 -129,169,576,651,-87,-458 -783,-444,-881,658,-266,298 -603,-430,-598,585,368,899 -43,-724,962,-376,851,409 --610,-646,-883,-261,-482,-881 --117,-237,978,641,101,-747 -579,125,-715,-712,208,534 -672,-214,-762,372,874,533 --564,965,38,715,367,242 -500,951,-700,-981,-61,-178 --382,-224,-959,903,-282,-60 --355,295,426,-331,-591,655 -892,128,958,-271,-993,274 --454,-619,302,138,-790,-874 --642,601,-574,159,-290,-318 -266,-109,257,-686,54,975 -162,628,-478,840,264,-266 -466,-280,982,1,904,-810 -721,839,730,-807,777,981 --129,-430,748,263,943,96 -434,-94,410,-990,249,-704 -237,42,122,-732,44,-51 -909,-116,-229,545,292,717 -824,-768,-807,-370,-262,30 -675,58,332,-890,-651,791 -363,825,-717,254,684,240 -405,-715,900,166,-589,422 --476,686,-830,-319,634,-807 -633,837,-971,917,-764,207 --116,-44,-193,-70,908,809 --26,-252,998,408,70,-713 --601,645,-462,842,-644,-591 --160,653,274,113,-138,687 -369,-273,-181,925,-167,-693 --338,135,480,-967,-13,-840 --90,-270,-564,695,161,907 -607,-430,869,-713,461,-469 -919,-165,-776,522,606,-708 --203,465,288,207,-339,-458 --453,-534,-715,975,838,-677 --973,310,-350,934,546,-805 --835,385,708,-337,-594,-772 --14,914,900,-495,-627,594 -833,-713,-213,578,-296,699 --27,-748,484,455,915,291 -270,889,739,-57,442,-516 -119,811,-679,905,184,130 --678,-469,925,553,612,482 -101,-571,-732,-842,644,588 --71,-737,566,616,957,-663 --634,-356,90,-207,936,622 -598,443,964,-895,-58,529 -847,-467,929,-742,91,10 --633,829,-780,-408,222,-30 --818,57,275,-38,-746,198 --722,-825,-549,597,-391,99 --570,908,430,873,-103,-360 -342,-681,512,434,542,-528 -297,850,479,609,543,-357 -9,784,212,548,56,859 --152,560,-240,-969,-18,713 -140,-133,34,-635,250,-163 --272,-22,-169,-662,989,-604 -471,-765,355,633,-742,-118 --118,146,942,663,547,-376 -583,16,162,264,715,-33 --230,-446,997,-838,561,555 -372,397,-729,-318,-276,649 -92,982,-970,-390,-922,922 --981,713,-951,-337,-669,670 --999,846,-831,-504,7,-128 -455,-954,-370,682,-510,45 -822,-960,-892,-385,-662,314 --668,-686,-367,-246,530,-341 --723,-720,-926,-836,-142,757 --509,-134,384,-221,-873,-639 --803,-52,-706,-669,373,-339 -933,578,631,-616,770,555 -741,-564,-33,-605,-576,275 --715,445,-233,-730,734,-704 -120,-10,-266,-685,-490,-17 --232,-326,-457,-946,-457,-116 -811,52,639,826,-200,147 --329,279,293,612,943,955 --721,-894,-393,-969,-642,453 --688,-826,-352,-75,371,79 --809,-979,407,497,858,-248 --485,-232,-242,-582,-81,849 -141,-106,123,-152,806,-596 --428,57,-992,811,-192,478 -864,393,122,858,255,-876 --284,-780,240,457,354,-107 -956,605,-477,44,26,-678 -86,710,-533,-815,439,327 --906,-626,-834,763,426,-48 -201,-150,-904,652,475,412 --247,149,81,-199,-531,-148 -923,-76,-353,175,-121,-223 -427,-674,453,472,-410,585 -931,776,-33,85,-962,-865 --655,-908,-902,208,869,792 --316,-102,-45,-436,-222,885 --309,768,-574,653,745,-975 -896,27,-226,993,332,198 -323,655,-89,260,240,-902 -501,-763,-424,793,813,616 -993,375,-938,-621,672,-70 --880,-466,-283,770,-824,143 -63,-283,886,-142,879,-116 --964,-50,-521,-42,-306,-161 -724,-22,866,-871,933,-383 --344,135,282,966,-80,917 --281,-189,420,810,362,-582 --515,455,-588,814,162,332 -555,-436,-123,-210,869,-943 -589,577,232,286,-554,876 --773,127,-58,-171,-452,125 --428,575,906,-232,-10,-224 -437,276,-335,-348,605,878 --964,511,-386,-407,168,-220 -307,513,912,-463,-423,-416 --445,539,273,886,-18,760 --396,-585,-670,414,47,364 -143,-506,754,906,-971,-203 --544,472,-180,-541,869,-465 --779,-15,-396,890,972,-220 --430,-564,503,182,-119,456 -89,-10,-739,399,506,499 -954,162,-810,-973,127,870 -890,952,-225,158,828,237 --868,952,349,465,574,750 --915,369,-975,-596,-395,-134 --135,-601,575,582,-667,640 -413,890,-560,-276,-555,-562 --633,-269,561,-820,-624,499 -371,-92,-784,-593,864,-717 --971,655,-439,367,754,-951 -172,-347,36,279,-247,-402 -633,-301,364,-349,-683,-387 --780,-211,-713,-948,-648,543 -72,58,762,-465,-66,462 -78,502,781,-832,713,836 --431,-64,-484,-392,208,-343 --64,101,-29,-860,-329,844 -398,391,828,-858,700,395 -578,-896,-326,-604,314,180 -97,-321,-695,185,-357,852 -854,839,283,-375,951,-209 -194,96,-564,-847,162,524 --354,532,494,621,580,560 -419,-678,-450,926,-5,-924 --661,905,519,621,-143,394 --573,268,296,-562,-291,-319 --211,266,-196,158,564,-183 -18,-585,-398,777,-581,864 -790,-894,-745,-604,-418,70 -848,-339,150,773,11,851 --954,-809,-53,-20,-648,-304 -658,-336,-658,-905,853,407 --365,-844,350,-625,852,-358 -986,-315,-230,-159,21,180 --15,599,45,-286,-941,847 --613,-68,184,639,-987,550 -334,675,-56,-861,923,340 --848,-596,960,231,-28,-34 -707,-811,-994,-356,-167,-171 --470,-764,72,576,-600,-204 -379,189,-542,-576,585,800 -440,540,-445,-563,379,-334 --155,64,514,-288,853,106 --304,751,481,-520,-708,-694 --709,132,594,126,-844,63 -723,471,421,-138,-962,892 --440,-263,39,513,-672,-954 -775,809,-581,330,752,-107 --376,-158,335,-708,-514,578 --343,-769,456,-187,25,413 -548,-877,-172,300,-500,928 -938,-102,423,-488,-378,-969 --36,564,-55,131,958,-800 --322,511,-413,503,700,-847 --966,547,-88,-17,-359,-67 -637,-341,-437,-181,527,-153 --74,449,-28,3,485,189 --997,658,-224,-948,702,-807 --224,736,-896,127,-945,-850 --395,-106,439,-553,-128,124 --841,-445,-758,-572,-489,212 -633,-327,13,-512,952,771 --940,-171,-6,-46,-923,-425 --142,-442,-817,-998,843,-695 -340,847,-137,-920,-988,-658 --653,217,-679,-257,651,-719 --294,365,-41,342,74,-892 -690,-236,-541,494,408,-516 -180,-807,225,790,494,59 -707,605,-246,656,284,271 -65,294,152,824,442,-442 --321,781,-540,341,316,415 -420,371,-2,545,995,248 -56,-191,-604,971,615,449 --981,-31,510,592,-390,-362 --317,-968,913,365,97,508 -832,63,-864,-510,86,202 --483,456,-636,340,-310,676 -981,-847,751,-508,-962,-31 --157,99,73,797,63,-172 -220,858,872,924,866,-381 -996,-169,805,321,-164,971 -896,11,-625,-973,-782,76 -578,-280,730,-729,307,-905 --580,-749,719,-698,967,603 --821,874,-103,-623,662,-491 --763,117,661,-644,672,-607 -592,787,-798,-169,-298,690 -296,644,-526,-762,-447,665 -534,-818,852,-120,57,-379 --986,-549,-329,294,954,258 --133,352,-660,-77,904,-356 -748,343,215,500,317,-277 -311,7,910,-896,-809,795 -763,-602,-753,313,-352,917 -668,619,-474,-597,-650,650 --297,563,-701,-987,486,-902 --461,-740,-657,233,-482,-328 --446,-250,-986,-458,-629,520 -542,-49,-327,-469,257,-947 -121,-575,-634,-143,-184,521 -30,504,455,-645,-229,-945 --12,-295,377,764,771,125 --686,-133,225,-25,-376,-143 --6,-46,338,270,-405,-872 --623,-37,582,467,963,898 --804,869,-477,420,-475,-303 -94,41,-842,-193,-768,720 --656,-918,415,645,-357,460 --47,-486,-911,468,-608,-686 --158,251,419,-394,-655,-895 -272,-695,979,508,-358,959 --776,650,-918,-467,-690,-534 --85,-309,-626,167,-366,-429 --880,-732,-186,-924,970,-875 -517,645,-274,962,-804,544 -721,402,104,640,478,-499 -198,684,-134,-723,-452,-905 --245,745,239,238,-826,441 --217,206,-32,462,-981,-895 --51,989,526,-173,560,-676 --480,-659,-976,-580,-727,466 --996,-90,-995,158,-239,642 -302,288,-194,-294,17,924 --943,969,-326,114,-500,103 --619,163,339,-880,230,421 --344,-601,-795,557,565,-779 -590,345,-129,-202,-125,-58 --777,-195,159,674,775,411 --939,312,-665,810,121,855 --971,254,712,815,452,581 -442,-9,327,-750,61,757 --342,869,869,-160,390,-772 -620,601,565,-169,-69,-183 --25,924,-817,964,321,-970 --64,-6,-133,978,825,-379 -601,436,-24,98,-115,940 --97,502,614,-574,922,513 --125,262,-946,695,99,-220 -429,-721,719,-694,197,-558 -326,689,-70,-908,-673,338 --468,-856,-902,-254,-358,305 --358,530,542,355,-253,-47 --438,-74,-362,963,988,788 -137,717,467,622,319,-380 --86,310,-336,851,918,-288 -721,395,646,-53,255,-425 -255,175,912,84,-209,878 --632,-485,-400,-357,991,-608 -235,-559,992,-297,857,-591 -87,-71,148,130,647,578 --290,-584,-639,-788,-21,592 -386,984,625,-731,-993,-336 --538,634,-209,-828,-150,-774 --754,-387,607,-781,976,-199 -412,-798,-664,295,709,-537 --412,932,-880,-232,561,852 --656,-358,-198,-964,-433,-848 --762,-668,-632,186,-673,-11 --876,237,-282,-312,-83,682 -403,73,-57,-436,-622,781 --587,873,798,976,-39,329 --369,-622,553,-341,817,794 --108,-616,920,-849,-679,96 -290,-974,234,239,-284,-321 --22,394,-417,-419,264,58 --473,-551,69,923,591,-228 --956,662,-113,851,-581,-794 --258,-681,413,-471,-637,-817 --866,926,992,-653,-7,794 -556,-350,602,917,831,-610 -188,245,-906,361,492,174 --720,384,-818,329,638,-666 --246,846,890,-325,-59,-850 --118,-509,620,-762,-256,15 --787,-536,-452,-338,-399,813 -458,560,525,-311,-608,-419 -494,-811,-825,-127,-812,894 --801,890,-629,-860,574,925 --709,-193,-213,138,-410,-403 -861,91,708,-187,5,-222 -789,646,777,154,90,-49 --267,-830,-114,531,591,-698 --126,-82,881,-418,82,652 --894,130,-726,-935,393,-815 --142,563,654,638,-712,-597 --759,60,-23,977,100,-765 --305,595,-570,-809,482,762 --161,-267,53,963,998,-529 --300,-57,798,353,703,486 --990,696,-764,699,-565,719 --232,-205,566,571,977,369 -740,865,151,-817,-204,-293 -94,445,-768,229,537,-406 -861,620,37,-424,-36,656 -390,-369,952,733,-464,569 --482,-604,959,554,-705,-626 --396,-615,-991,108,272,-723 -143,780,535,142,-917,-147 -138,-629,-217,-908,905,115 -915,103,-852,64,-468,-642 -570,734,-785,-268,-326,-759 -738,531,-332,586,-779,24 -870,440,-217,473,-383,415 --296,-333,-330,-142,-924,950 -118,120,-35,-245,-211,-652 -61,634,153,-243,838,789 -726,-582,210,105,983,537 --313,-323,758,234,29,848 --847,-172,-593,733,-56,617 -54,255,-512,156,-575,675 --873,-956,-148,623,95,200 -700,-370,926,649,-978,157 --639,-202,719,130,747,222 -194,-33,955,943,505,114 --226,-790,28,-930,827,783 --392,-74,-28,714,218,-612 -209,626,-888,-683,-912,495 -487,751,614,933,631,445 --348,-34,-411,-106,835,321 --689,872,-29,-800,312,-542 --52,566,827,570,-862,-77 -471,992,309,-402,389,912 -24,520,-83,-51,555,503 --265,-317,283,-970,-472,690 -606,526,137,71,-651,150 -217,-518,663,66,-605,-331 --562,232,-76,-503,205,-323 -842,-521,546,285,625,-186 -997,-927,344,909,-546,974 --677,419,81,121,-705,771 -719,-379,-944,-797,784,-155 --378,286,-317,-797,-111,964 --288,-573,784,80,-532,-646 --77,407,-248,-797,769,-816 --24,-637,287,-858,-927,-333 --902,37,894,-823,141,684 -125,467,-177,-516,686,399 --321,-542,641,-590,527,-224 --400,-712,-876,-208,632,-543 --676,-429,664,-242,-269,922 --608,-273,-141,930,687,380 -786,-12,498,494,310,326 --739,-617,606,-960,804,188 -384,-368,-243,-350,-459,31 --550,397,320,-868,328,-279 -969,-179,853,864,-110,514 -910,793,302,-822,-285,488 --605,-128,218,-283,-17,-227 -16,324,667,708,750,3 -485,-813,19,585,71,930 --218,816,-687,-97,-732,-360 --497,-151,376,-23,3,315 --412,-989,-610,-813,372,964 --878,-280,87,381,-311,69 --609,-90,-731,-679,150,585 -889,27,-162,605,75,-770 -448,617,-988,0,-103,-504 --800,-537,-69,627,608,-668 -534,686,-664,942,830,920 --238,775,495,932,-793,497 --343,958,-914,-514,-691,651 -568,-136,208,359,728,28 -286,912,-794,683,556,-102 --638,-629,-484,445,-64,-497 -58,505,-801,-110,872,632 --390,777,353,267,976,369 --993,515,105,-133,358,-572 -964,996,355,-212,-667,38 --725,-614,-35,365,132,-196 -237,-536,-416,-302,312,477 --664,574,-210,224,48,-925 -869,-261,-256,-240,-3,-698 -712,385,32,-34,916,-315 -895,-409,-100,-346,728,-624 --806,327,-450,889,-781,-939 --586,-403,698,318,-939,899 -557,-57,-920,659,333,-51 --441,232,-918,-205,246,1 -783,167,-797,-595,245,-736 --36,-531,-486,-426,-813,-160 -777,-843,817,313,-228,-572 -735,866,-309,-564,-81,190 --413,645,101,719,-719,218 --83,164,767,796,-430,-459 -122,779,-15,-295,-96,-892 -462,379,70,548,834,-312 --630,-534,124,187,-737,114 --299,-604,318,-591,936,826 --879,218,-642,-483,-318,-866 --691,62,-658,761,-895,-854 --822,493,687,569,910,-202 --223,784,304,-5,541,925 --914,541,737,-662,-662,-195 --622,615,414,358,881,-878 -339,745,-268,-968,-280,-227 --364,855,148,-709,-827,472 --890,-532,-41,664,-612,577 --702,-859,971,-722,-660,-920 --539,-605,737,149,973,-802 -800,42,-448,-811,152,511 --933,377,-110,-105,-374,-937 --766,152,482,120,-308,390 --568,775,-292,899,732,890 --177,-317,-502,-259,328,-511 -612,-696,-574,-660,132,31 --119,563,-805,-864,179,-672 -425,-627,183,-331,839,318 --711,-976,-749,152,-916,261 -181,-63,497,211,262,406 --537,700,-859,-765,-928,77 -892,832,231,-749,-82,613 -816,216,-642,-216,-669,-912 --6,624,-937,-370,-344,268 -737,-710,-869,983,-324,-274 -565,952,-547,-158,374,-444 -51,-683,645,-845,515,636 --953,-631,114,-377,-764,-144 --8,470,-242,-399,-675,-730 --540,689,-20,47,-607,590 --329,-710,-779,942,-388,979 -123,829,674,122,203,563 -46,782,396,-33,386,610 -872,-846,-523,-122,-55,-190 -388,-994,-525,974,127,596 -781,-680,796,-34,-959,-62 --749,173,200,-384,-745,-446 -379,618,136,-250,-224,970 --58,240,-921,-760,-901,-626 -366,-185,565,-100,515,688 -489,999,-893,-263,-637,816 -838,-496,-316,-513,419,479 -107,676,-15,882,98,-397 --999,941,-903,-424,670,-325 -171,-979,835,178,169,-984 --609,-607,378,-681,184,402 --316,903,-575,-800,224,983 -591,-18,-460,551,-167,918 --756,405,-117,441,163,-320 -456,24,6,881,-836,-539 --489,-585,915,651,-892,-382 --177,-122,73,-711,-386,591 -181,724,530,686,-131,241 -737,288,886,216,233,33 --548,-386,-749,-153,-85,-982 --835,227,904,160,-99,25 --9,-42,-162,728,840,-963 -217,-763,870,771,47,-846 --595,808,-491,556,337,-900 --134,281,-724,441,-134,708 --789,-508,651,-962,661,315 --839,-923,339,402,41,-487 -300,-790,48,703,-398,-811 -955,-51,462,-685,960,-717 -910,-880,592,-255,-51,-776 --885,169,-793,368,-565,458 --905,940,-492,-630,-535,-988 -245,797,763,869,-82,550 --310,38,-933,-367,-650,824 --95,32,-83,337,226,990 --218,-975,-191,-208,-785,-293 --672,-953,517,-901,-247,465 -681,-148,261,-857,544,-923 -640,341,446,-618,195,769 -384,398,-846,365,671,815 -578,576,-911,907,762,-859 -548,-428,144,-630,-759,-146 -710,-73,-700,983,-97,-889 --46,898,-973,-362,-817,-717 -151,-81,-125,-900,-478,-154 -483,615,-537,-932,181,-68 -786,-223,518,25,-306,-12 --422,268,-809,-683,635,468 -983,-734,-694,-608,-110,4 --786,-196,749,-354,137,-8 --181,36,668,-200,691,-973 --629,-838,692,-736,437,-871 --208,-536,-159,-596,8,197 --3,370,-686,170,913,-376 -44,-998,-149,-993,-200,512 --519,136,859,497,536,434 -77,-985,972,-340,-705,-837 --381,947,250,360,344,322 --26,131,699,750,707,384 --914,655,299,193,406,955 --883,-921,220,595,-546,794 --599,577,-569,-404,-704,489 --594,-963,-624,-460,880,-760 --603,88,-99,681,55,-328 -976,472,139,-453,-531,-860 -192,-290,513,-89,666,432 -417,487,575,293,567,-668 -655,711,-162,449,-980,972 --505,664,-685,-239,603,-592 --625,-802,-67,996,384,-636 -365,-593,522,-666,-200,-431 --868,708,560,-860,-630,-355 --702,785,-637,-611,-597,960 --137,-696,-93,-803,408,406 -891,-123,-26,-609,-610,518 -133,-832,-198,555,708,-110 -791,617,-69,487,696,315 --900,694,-565,517,-269,-416 -914,135,-781,600,-71,-600 -991,-915,-422,-351,-837,313 --840,-398,-302,21,590,146 -62,-558,-702,-384,-625,831 --363,-426,-924,-496,792,-908 -73,361,-817,-466,400,922 --626,-164,-626,860,-524,286 -255,26,-944,809,-606,986 --457,-256,-103,50,-867,-871 --223,803,196,480,612,136 --820,-928,700,780,-977,721 -717,332,53,-933,-128,793 --602,-648,562,593,890,702 --469,-875,-527,911,-475,-222 -110,-281,-552,-536,-816,596 --981,654,413,-981,-75,-95 --754,-742,-515,894,-220,-344 -795,-52,156,408,-603,76 -474,-157,423,-499,-807,-791 -260,688,40,-52,702,-122 --584,-517,-390,-881,302,-504 -61,797,665,708,14,668 -366,166,458,-614,564,-983 -72,539,-378,796,381,-824 --485,201,-588,842,736,379 --149,-894,-298,705,-303,-406 -660,-935,-580,521,93,633 --382,-282,-375,-841,-828,171 --567,743,-100,43,144,122 --281,-786,-749,-551,296,304 -11,-426,-792,212,857,-175 -594,143,-699,289,315,137 -341,596,-390,107,-631,-804 --751,-636,-424,-854,193,651 --145,384,749,675,-786,517 -224,-865,-323,96,-916,258 --309,403,-388,826,35,-270 --942,709,222,158,-699,-103 --589,842,-997,29,-195,-210 -264,426,566,145,-217,623 -217,965,507,-601,-453,507 --206,307,-982,4,64,-292 -676,-49,-38,-701,550,883 -5,-850,-438,659,745,-773 -933,238,-574,-570,91,-33 --866,121,-928,358,459,-843 --568,-631,-352,-580,-349,189 --737,849,-963,-486,-662,970 -135,334,-967,-71,-365,-792 -789,21,-227,51,990,-275 -240,412,-886,230,591,256 --609,472,-853,-754,959,661 -401,521,521,314,929,982 --499,784,-208,71,-302,296 --557,-948,-553,-526,-864,793 -270,-626,828,44,37,14 --412,224,617,-593,502,699 -41,-908,81,562,-849,163 -165,917,761,-197,331,-341 --687,314,799,755,-969,648 --164,25,578,439,-334,-576 -213,535,874,-177,-551,24 --689,291,-795,-225,-496,-125 -465,461,558,-118,-568,-909 -567,660,-810,46,-485,878 --147,606,685,-690,-774,984 -568,-886,-43,854,-738,616 --800,386,-614,585,764,-226 --518,23,-225,-732,-79,440 --173,-291,-689,636,642,-447 --598,-16,227,410,496,211 --474,-930,-656,-321,-420,36 --435,165,-819,555,540,144 --969,149,828,568,394,648 -65,-848,257,720,-625,-851 -981,899,275,635,465,-877 -80,290,792,760,-191,-321 --605,-858,594,33,706,593 -585,-472,318,-35,354,-927 --365,664,803,581,-965,-814 --427,-238,-480,146,-55,-606 -879,-193,250,-890,336,117 --226,-322,-286,-765,-836,-218 --913,564,-667,-698,937,283 -872,-901,810,-623,-52,-709 -473,171,717,38,-429,-644 -225,824,-219,-475,-180,234 --530,-797,-948,238,851,-623 -85,975,-363,529,598,28 --799,166,-804,210,-769,851 --687,-158,885,736,-381,-461 -447,592,928,-514,-515,-661 --399,-777,-493,80,-544,-78 --884,631,171,-825,-333,551 -191,268,-577,676,137,-33 -212,-853,709,798,583,-56 --908,-172,-540,-84,-135,-56 -303,311,406,-360,-240,811 -798,-708,824,59,234,-57 -491,693,-74,585,-85,877 -509,-65,-936,329,-51,722 --122,858,-52,467,-77,-609 -850,760,547,-495,-953,-952 --460,-541,890,910,286,724 --914,843,-579,-983,-387,-460 -989,-171,-877,-326,-899,458 -846,175,-915,540,-1000,-982 --852,-920,-306,496,530,-18 -338,-991,160,85,-455,-661 --186,-311,-460,-563,-231,-414 --932,-302,959,597,793,748 --366,-402,-788,-279,514,53 --940,-956,447,-956,211,-285 -564,806,-911,-914,934,754 -575,-858,-277,15,409,-714 -848,462,100,-381,135,242 -330,718,-24,-190,860,-78 -479,458,941,108,-866,-653 -212,980,962,-962,115,841 --827,-474,-206,881,323,765 -506,-45,-30,-293,524,-133 -832,-173,547,-852,-561,-842 --397,-661,-708,819,-545,-228 -521,51,-489,852,36,-258 -227,-164,189,465,-987,-882 --73,-997,641,-995,449,-615 -151,-995,-638,415,257,-400 --663,-297,-748,537,-734,198 --585,-401,-81,-782,-80,-105 -99,-21,238,-365,-704,-368 -45,416,849,-211,-371,-1 --404,-443,795,-406,36,-933 -272,-363,981,-491,-380,77 -713,-342,-366,-849,643,911 --748,671,-537,813,961,-200 --194,-909,703,-662,-601,188 -281,500,724,286,267,197 --832,847,-595,820,-316,637 -520,521,-54,261,923,-10 -4,-808,-682,-258,441,-695 --793,-107,-969,905,798,446 --108,-739,-590,69,-855,-365 -380,-623,-930,817,468,713 -759,-849,-236,433,-723,-931 -95,-320,-686,124,-69,-329 --655,518,-210,-523,284,-866 -144,303,639,70,-171,269 -173,-333,947,-304,55,40 -274,878,-482,-888,-835,375 --982,-854,-36,-218,-114,-230 -905,-979,488,-485,-479,114 -877,-157,553,-530,-47,-321 -350,664,-881,442,-220,-284 -434,-423,-365,878,-726,584 -535,909,-517,-447,-660,-141 --966,191,50,353,182,-642 --785,-634,123,-907,-162,511 -146,-850,-214,814,-704,25 -692,1,521,492,-637,274 --662,-372,-313,597,983,-647 --962,-526,68,-549,-819,231 -740,-890,-318,797,-666,948 --190,-12,-468,-455,948,284 -16,478,-506,-888,628,-154 -272,630,-976,308,433,3 --169,-391,-132,189,302,-388 -109,-784,474,-167,-265,-31 --177,-532,283,464,421,-73 -650,635,592,-138,1,-387 --932,703,-827,-492,-355,686 -586,-311,340,-618,645,-434 --951,736,647,-127,-303,590 -188,444,903,718,-931,500 --872,-642,-296,-571,337,241 -23,65,152,125,880,470 -512,823,-42,217,823,-263 -180,-831,-380,886,607,762 -722,443,-149,-216,-115,759 --19,660,-36,901,923,231 -562,-322,-626,-968,194,-825 -204,-920,938,784,362,150 --410,-266,-715,559,-672,124 --198,446,-140,454,-461,-447 -83,-346,830,-493,-759,-382 --881,601,581,234,-134,-925 --494,914,-42,899,235,629 --390,50,956,437,774,-700 --514,514,44,-512,-576,-313 -63,-688,808,-534,-570,-399 --726,572,-896,102,-294,-28 --688,757,401,406,955,-511 --283,423,-485,480,-767,908 --541,952,-594,116,-854,451 --273,-796,236,625,-626,257 --407,-493,373,826,-309,297 --750,955,-476,641,-809,713 -8,415,695,226,-111,2 -733,209,152,-920,401,995 -921,-103,-919,66,871,-947 --907,89,-869,-214,851,-559 --307,748,524,-755,314,-711 -188,897,-72,-763,482,103 -545,-821,-232,-596,-334,-754 --217,-788,-820,388,-200,-662 -779,160,-723,-975,-142,-998 --978,-519,-78,-981,842,904 --504,-736,-295,21,-472,-482 -391,115,-705,574,652,-446 -813,-988,865,830,-263,487 -194,80,774,-493,-761,-872 --415,-284,-803,7,-810,670 --484,-4,881,-872,55,-852 --379,822,-266,324,-48,748 --304,-278,406,-60,959,-89 -404,756,577,-643,-332,658 -291,460,125,491,-312,83 -311,-734,-141,582,282,-557 --450,-661,-981,710,-177,794 -328,264,-787,971,-743,-407 --622,518,993,-241,-738,229 -273,-826,-254,-917,-710,-111 -809,770,96,368,-818,725 --488,773,502,-342,534,745 --28,-414,236,-315,-484,363 -179,-466,-566,713,-683,56 -560,-240,-597,619,916,-940 -893,473,872,-868,-642,-461 -799,489,383,-321,-776,-833 -980,490,-508,764,-512,-426 -917,961,-16,-675,440,559 --812,212,784,-987,-132,554 --886,454,747,806,190,231 -910,341,21,-66,708,725 -29,929,-831,-494,-303,389 --103,492,-271,-174,-515,529 --292,119,419,788,247,-951 -483,543,-347,-673,664,-549 --926,-871,-437,337,162,-877 -299,472,-771,5,-88,-643 --103,525,-725,-998,264,22 --505,708,550,-545,823,347 --738,931,59,147,-156,-259 -456,968,-162,889,132,-911 -535,120,968,-517,-864,-541 -24,-395,-593,-766,-565,-332 -834,611,825,-576,280,629 -211,-548,140,-278,-592,929 --999,-240,-63,-78,793,573 --573,160,450,987,529,322 -63,353,315,-187,-461,577 -189,-950,-247,656,289,241 -209,-297,397,664,-805,484 --655,452,435,-556,917,874 -253,-756,262,-888,-778,-214 -793,-451,323,-251,-401,-458 --396,619,-651,-287,-668,-781 -698,720,-349,742,-807,546 -738,280,680,279,-540,858 --789,387,530,-36,-551,-491 -162,579,-427,-272,228,710 -689,356,917,-580,729,217 --115,-638,866,424,-82,-194 -411,-338,-917,172,227,-29 --612,63,630,-976,-64,-204 --200,911,583,-571,682,-579 -91,298,396,-183,788,-955 -141,-873,-277,149,-396,916 -321,958,-136,573,541,-777 -797,-909,-469,-877,988,-653 -784,-198,129,883,-203,399 --68,-810,223,-423,-467,-512 -531,-445,-603,-997,-841,641 --274,-242,174,261,-636,-158 --574,494,-796,-798,-798,99 -95,-82,-613,-954,-753,986 --883,-448,-864,-401,938,-392 -913,930,-542,-988,310,410 -506,-99,43,512,790,-222 -724,31,49,-950,260,-134 --287,-947,-234,-700,56,588 --33,782,-144,948,105,-791 -548,-546,-652,-293,881,-520 -691,-91,76,991,-631,742 --520,-429,-244,-296,724,-48 -778,646,377,50,-188,56 --895,-507,-898,-165,-674,652 -654,584,-634,177,-349,-620 -114,-980,355,62,182,975 -516,9,-442,-298,274,-579 --238,262,-431,-896,506,-850 -47,748,846,821,-537,-293 -839,726,593,285,-297,840 -634,-486,468,-304,-887,-567 --864,914,296,-124,335,233 -88,-253,-523,-956,-554,803 --587,417,281,-62,-409,-363 --136,-39,-292,-768,-264,876 --127,506,-891,-331,-744,-430 -778,584,-750,-129,-479,-94 --876,-771,-987,-757,180,-641 --777,-694,411,-87,329,190 --347,-999,-882,158,-754,232 --105,918,188,237,-110,-591 --209,703,-838,77,838,909 --995,-339,-762,750,860,472 -185,271,-289,173,811,-300 -2,65,-656,-22,36,-139 -765,-210,883,974,961,-905 --212,295,-615,-840,77,474 -211,-910,-440,703,-11,859 --559,-4,-196,841,-277,969 --73,-159,-887,126,978,-371 --569,633,-423,-33,512,-393 -503,143,-383,-109,-649,-998 --663,339,-317,-523,-2,596 -690,-380,570,378,-652,132 -72,-744,-930,399,-525,935 -865,-983,115,37,995,826 -594,-621,-872,443,188,-241 --1000,291,754,234,-435,-869 --868,901,654,-907,59,181 --868,-793,-431,596,-446,-564 -900,-944,-680,-796,902,-366 -331,430,943,853,-851,-942 -315,-538,-354,-909,139,721 -170,-884,-225,-818,-808,-657 --279,-34,-533,-871,-972,552 -691,-986,-800,-950,654,-747 -603,988,899,841,-630,591 -876,-949,809,562,602,-536 --693,363,-189,495,738,-1000 --383,431,-633,297,665,959 --740,686,-207,-803,188,-520 --820,226,31,-339,10,121 --312,-844,624,-516,483,621 --822,-529,69,-278,800,328 -834,-82,-759,420,811,-264 --960,-240,-921,561,173,46 --324,909,-790,-814,-2,-785 -976,334,-290,-891,704,-581 -150,-798,689,-823,237,-639 --551,-320,876,-502,-622,-628 --136,845,904,595,-702,-261 --857,-377,-522,-101,-943,-805 --682,-787,-888,-459,-752,-985 --571,-81,623,-133,447,643 --375,-158,72,-387,-324,-696 --660,-650,340,188,569,526 -727,-218,16,-7,-595,-988 --966,-684,802,-783,-272,-194 -115,-566,-888,47,712,180 --237,-69,45,-272,981,-812 -48,897,439,417,50,325 -348,616,180,254,104,-784 --730,811,-548,612,-736,790 -138,-810,123,930,65,865 --768,-299,-49,-895,-692,-418 -487,-531,802,-159,-12,634 -808,-179,552,-73,470,717 -720,-644,886,-141,625,144 --485,-505,-347,-244,-916,66 -600,-565,995,-5,324,227 --771,-35,904,-482,753,-303 --701,65,426,-763,-504,-479 -409,733,-823,475,64,718 -865,975,368,893,-413,-433 -812,-597,-970,819,813,624 -193,-642,-381,-560,545,398 -711,28,-316,771,717,-865 --509,462,809,-136,786,635 -618,-49,484,169,635,547 --747,685,-882,-496,-332,82 --501,-851,870,563,290,570 --279,-829,-509,397,457,816 --508,80,850,-188,483,-326 -860,-100,360,119,-205,787 --870,21,-39,-827,-185,932 -826,284,-136,-866,-330,-97 --944,-82,745,899,-97,365 -929,262,564,632,-115,632 -244,-276,713,330,-897,-214 --890,-109,664,876,-974,-907 -716,249,816,489,723,141 --96,-560,-272,45,-70,645 -762,-503,414,-828,-254,-646 -909,-13,903,-422,-344,-10 -658,-486,743,545,50,674 --241,507,-367,18,-48,-241 -886,-268,884,-762,120,-486 --412,-528,879,-647,223,-393 -851,810,234,937,-726,797 --999,942,839,-134,-996,-189 -100,979,-527,-521,378,800 -544,-844,-832,-530,-77,-641 -43,889,31,442,-934,-503 --330,-370,-309,-439,173,547 -169,945,62,-753,-542,-597 -208,751,-372,-647,-520,70 -765,-840,907,-257,379,918 -334,-135,-689,730,-427,618 -137,-508,66,-695,78,169 --962,-123,400,-417,151,969 -328,689,666,427,-555,-642 --907,343,605,-341,-647,582 --667,-363,-571,818,-265,-399 -525,-938,904,898,725,692 --176,-802,-858,-9,780,275 -580,170,-740,287,691,-97 -365,557,-375,361,-288,859 -193,737,842,-808,520,282 --871,65,-799,836,179,-720 -958,-144,744,-789,797,-48 -122,582,662,912,68,757 -595,241,-801,513,388,186 --103,-677,-259,-731,-281,-857 -921,319,-696,683,-88,-997 -775,200,78,858,648,768 -316,821,-763,68,-290,-741 -564,664,691,504,760,787 -694,-119,973,-385,309,-760 -777,-947,-57,990,74,19 -971,626,-496,-781,-602,-239 --651,433,11,-339,939,294 --965,-728,560,569,-708,-247 diff --git a/src/projecteuler/112.c b/src/projecteuler/112.c deleted file mode 100644 index bb808be..0000000 --- a/src/projecteuler/112.c +++ /dev/null @@ -1,45 +0,0 @@ - -int isbouncy(unsigned long n) -{ - char increasing=1, decreasing=1; - char lastdigit = n % 10; - n /= 10; - - while(n > 0) - { - char digit = n % 10; - if(digit > lastdigit) - increasing = 0; - else if(digit < lastdigit) - decreasing = 0; - - if(increasing == 0 && decreasing == 0) - return 1; - - lastdigit = digit; - n /= 10; - } - return 0; -} - -int main(void) -{ - unsigned long n = 100; - unsigned long bouncycount = 0; - double ratio; - - while(1) - { - if(isbouncy(++n)) - bouncycount++; - - ratio = (double)bouncycount/n; - if(ratio == 0.99) - break; - - } - printf("%ld\n", n); - - return 0; -} - diff --git a/src/projecteuler/124.py b/src/projecteuler/124.py deleted file mode 100644 index 19486d6..0000000 --- a/src/projecteuler/124.py +++ /dev/null @@ -1,31 +0,0 @@ -from operator import itemgetter -from common import sieve - -limit = 100000 - -primes = sieve(limit).primes() -prime_list = list(primes) -prime_list.sort() - -def rad(n): - result = 1 - if n in primes: - return n - - for p in prime_list: - if result*p > n: - break - if n % p == 0: - result *= p - return result - - - -radlist = [] - -for n in xrange(1, limit+1): - radlist.append((n, rad(n))) - -radlist.sort(key=itemgetter(1)) -print radlist[10000-1][0] - diff --git a/src/projecteuler/125.py b/src/projecteuler/125.py deleted file mode 100644 index 35dae6b..0000000 --- a/src/projecteuler/125.py +++ /dev/null @@ -1,22 +0,0 @@ - -limit = 10**8 - -squares = [ x*x for x in xrange(1, 7200) ] - -def is_palindrome(n): - nstr = str(n) - return nstr == nstr[::-1] - - -palindromes = set() - -for i in xrange(len(squares)-1): # iterate over all starting positions - for j in xrange(2, len(squares)): # iterate over all possible lengths - sqrsum = sum(squares[i:i+j]) - if sqrsum >= limit: - break - if is_palindrome(sqrsum): - palindromes.add(sqrsum) - -print sum(palindromes) - diff --git a/src/projecteuler/134.c b/src/projecteuler/134.c deleted file mode 100644 index 3f6ea32..0000000 --- a/src/projecteuler/134.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "common.h" -#include - -// TODO: improve performance! not yet working on 32 bit systems - -unsigned int getmod(unsigned long p1) -{ - unsigned int mod = 1; - - if(p1 < 10) - mod = 10; - else if(p1 < 100) - mod = 100; - else if(p1 < 1000) - mod = 1000; - else if(p1 < 10000) - mod = 10000; - else if(p1 < 100000) - mod = 100000; - else if(p1 < 1000000) - mod = 1000000; - else - mod = 0; // should not occur and therefore result in division by zero - - return mod; -} - -unsigned long findn(unsigned long p1, unsigned long p2) -{ - unsigned int mod = getmod(p1); - unsigned long n = mod + p1; - while(n % p2 != 0) - n += mod; - - return n; -} - -int main(void) -{ - unsigned long* p = primes(1000020); - unsigned long pcount = p[0]; - unsigned long p1, p2, pos; - unsigned long long result = 0; - - for(pos=3; p[pos]<=1000000; pos++) - { - p1 = p[pos]; - p2 = p[pos+1]; - if(pos%1000==0) - printf("p1: %li\n", p1); - result += findn(p1, p2); - } - - printf("%li\n", result); - - free(p); - return 0; -} - diff --git a/src/projecteuler/187.c b/src/projecteuler/187.c deleted file mode 100644 index 4bee151..0000000 --- a/src/projecteuler/187.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "common.h" -#include -#include - -const unsigned long limit = 100000000; - -int main(void) -{ - unsigned long* p = primes(limit/2); // sqrt(limit) - unsigned long pcount = p[0]; - unsigned long rcount = 0; - unsigned long i1, i2; - - for(i1=1; i1<=pcount; i1++) - for(i2=i1; i2<=pcount; i2++) - { - unsigned long long result = (unsigned long long) p[i1] * p[i2]; - if(result >= limit) - break; - rcount++; - } - - printf("%li\n", rcount); - - free(p); - return 0; -} - diff --git a/src/projecteuler/206.py b/src/projecteuler/206.py deleted file mode 100644 index b3eddf4..0000000 --- a/src/projecteuler/206.py +++ /dev/null @@ -1,24 +0,0 @@ - -positions = (2,4,6,8,10,12,14) -result = "1_2_3_4_5_6_7_8_9_0" - -number = 1000000030 -state = True - -while number <= 3162277630: - number += 40 if state else 60 - state = not state - - found = True - - square = str(number**2) - for i in positions: - if square[i] != result[i]: - found = False - break - - if found: - break - -print number - diff --git a/src/projecteuler/common.c b/src/projecteuler/common.c deleted file mode 100644 index 69f87c5..0000000 --- a/src/projecteuler/common.c +++ /dev/null @@ -1,154 +0,0 @@ -#include -#include - -// returns list of primes up to limit; count stored in first element -extern unsigned long* primes(unsigned long limit) -{ - unsigned long i = 2; // start sieving with 2 - unsigned long pos, x; - char* numbers = (char*) malloc(limit*sizeof(char)); - unsigned long* primes; - unsigned long primecount = 0; - memset(numbers, 1, limit); - numbers[0] = 0; - - while(i*i <= limit) - { - // sieve current prime - x = i*i; - while(x <= limit) - { - numbers[x-1] = 0; - x += i; - } - - // search next prime - pos = i; - while(++pos <= limit) - { - if(numbers[pos-1] == 1) - break; - } - i = pos; - } - - // count primes - pos = 0; - while(++pos <= limit) - { - if(numbers[pos-1] == 1) - primecount++; - } - - // create list of primes - primes = (unsigned long*) malloc((primecount+1)*sizeof(unsigned long)); // store count at first element - primes[0] = primecount; - pos = 0; - x = 1; - while(++pos <= limit) - { - if(numbers[pos-1] == 1) - primes[x++] = pos; - } - - free(numbers); - return primes; -} - -extern int isprime(unsigned long number, const unsigned long* primes) -{ - unsigned long count = primes[0]; - unsigned long pos = count/2 + 1; - unsigned long dist = pos/2 + 1; - unsigned long minpos = 0, maxpos = count; - - if(number > primes[count] || number < 2) - return 0; - - // some kind of binary search... - while(1) - { - if(number > primes[pos]) - { - minpos = pos; - pos += dist; - } - else if(number < primes[pos]) - { - maxpos = pos; - pos -= dist; - } - else - return 1; - - dist /= 2; - - if(dist == 1) - { - while(++minpos <= maxpos) - if(primes[minpos] == number) - return 1; - break; - } - } - - return 0; -} - -extern unsigned long phi(unsigned long n, unsigned long* primelist) -{ - double product = (double) n; - unsigned long i; - - //if(isprime(n, primelist)) - // return n-1; - - for(i=1; i<=primelist[0]; i++) - { - unsigned long p = primelist[i]; - if(p > n) - break; - if(n % p != 0) - continue; - product *= (1 - 1.0/p); - } - return (unsigned long) product; -} - -extern int ispermutation(unsigned long a, unsigned long b) -{ - char digits1[10]; - char digits2[10]; - memset(digits1, 0, 10); - memset(digits2, 0, 10); - - while(a > 0 && b > 0) - { - char d1 = a % 10; - char d2 = b % 10; - digits1[d1]++; - digits2[d2]++; - a /= 10; - b /= 10; - } - - if(a > 0 || b > 0) - return 0; - - if(memcmp(digits1, digits2, 10) == 0) - return 1; - - return 0; -} - -/*int main() -{ - long* p = primes(10000); - //printf("%i\n", isprime(9973, p)); - int i; - for(i=0; i 0: - d.add(x % 10) - x /= 10 - return self.digits - d - - def numbers(self, r): - result = set() - result |= self.digits - for i in range(2, r): - new = set() - for x in result: - for y in self.missing(x): - new.add(x*10 + y) - result |= new - return result - -def ggt(a, b): # Stein's algorithm - k = 0 - t = 0 - while a&1==0 and b&1==0: - a = a>>1 - b = b>>1 - k += 1 - if a&1==1: - t = -b - else: - t = a - while t != 0: - while t&1==0: - t = t>>1 - if t>0: - a = t - else: - b = -t - t = a - b - return a*(1< 1: - return False - a += 1 - - if n <= r*r: - return True - - #for a in xrange(1, math.floor(math.sqrt(phi(r))*logn)): - # # TODO if math.pow(x+a, n) != - - return True - -def permutation(p, q): # checks whether p is a permuation of q - digits_p = [0]*10 - digits_q = [0]*10 - while p > 0: - digit = p % 10 - digits_p[digit] += 1 - p /= 10 - while q > 0: - digit = q % 10 - digits_q[digit] += 1 - q /= 10 - return digits_p == digits_q - -- cgit v1.2.3