├── .gitignore ├── .pre-commit-config.yaml ├── 0001_Multiples_of_3_and_5 └── 0001_Multiples_of_3_and_5.py ├── 0002_Even_Fibonacci_numbers └── 0002_Even_Fibonacci_numbers.py ├── 0003_Largest_prime_factor └── 0003_Largest_prime_factor.py ├── 0004_Largest_palindrome_product └── 0004_Largest_palindrome_product.py ├── 0005_Smallest_multiple └── 0005_Smallest_multiple.py ├── 0006_Sum_square_difference └── 0006_Sum_square_difference.py ├── 0007_10001st_prime └── 0007_10001st_prime.py ├── 0008_Largest_product_in_a_series └── 0008_Largest_product_in_a_series.py ├── 0009_Special_Pythagorean_triplet └── 0009_Special_Pythagorean_triplet.py ├── 0010_Summation_of_primes └── 0010_Summation_of_primes.py ├── 0011_Largest_product_in_a_grid └── 0011_Largest_product_in_a_grid.py ├── 0012_Highly_divisible_triangular_number └── 0012_Highly_divisible_triangular_number.py ├── 0013_Large_sum └── 0013_Large_sum.py ├── 0014_Longest_Collatz_sequence └── 0014_Longest_Collatz_sequence.py ├── 0015_Lattice_paths └── 0015_Lattice_paths.py ├── 0016_Power_digit_sum └── 0016_Power_digit_sum.py ├── 0017_Number_letter_counts └── 0017_Number_letter_counts.py ├── 0018_Maximum_path_sum_I └── 0018_Maximum_path_sum_I.py ├── 0019_Counting_Sundays └── 0019_Counting_Sundays.py ├── 0020_Factorial_digit_sum └── 0020_Factorial_digit_sum.py ├── 0021_Amicable_numbers └── 0021_Amicable_numbers.py ├── 0022_Names_scores ├── 0022_Names_scores.py └── p022_names.txt ├── 0023_Non-abundant_sums └── 0023_Non-abundant_sums.py ├── 0024_Lexicographic_permutations └── 0024_Lexicographic_permutations.py ├── 0025_1000-digit_Fibonacci_number └── 0025_1000-digit_Fibonacci_number.py ├── 0026_Reciprocal_cycles └── 0026_Reciprocal_cycles.py ├── 0027_Quadratic_primes └── 0027_Quadratic_primes.py ├── 0028_Number_spiral_diagonals └── 0028_Number_spiral_diagonals.py ├── 0029_Distinct_powers └── 0029_Distinct_powers.py ├── 0030_Digit_fifth_powers └── 0030_Digit_fifth_powers.py ├── 0031_Coin_sums └── 0031_Coin_sums.py ├── 0032_Pandigital_products └── 0032_Pandigital_products.py ├── 0033_Digit_cancelling_fractions └── 0033_Digit_cancelling_fractions.py ├── 0034_Digit_factorials └── 0034_Digit_factorials.py ├── 0035_Circular_primes └── 0035_Circular_primes.py ├── 0036_Double-base_palindromes └── 0036_Double-base_palindromes.py ├── 0037_Truncatable_primes └── 0037_Truncatable_primes.py ├── 0038_Pandigital_multiples └── 0038_Pandigital_multiples.py ├── 0039_Integer_right_triangles └── 0039_Integer_right_triangles.py ├── 0040_Champernowne_s_constant └── 0040_Champernowne_s_constant.py ├── 0041_Pandigital_prime └── 0041_Pandigital_prime.py ├── 0042_Coded_triangle_numbers ├── 0042_Coded_triangle_numbers.py └── p042_words.txt ├── 0043_Sub-string_divisibility └── 0043_Sub-string_divisibility.py ├── 0044_Pentagon_numbers └── 0044_Pentagon_numbers.py ├── 0045_Triangular_Pentagonal_and_Hexagonal └── 0045_Triangular_Pentagonal_and_Hexagonal.py ├── 0046_Goldbach_s_other_conjecture └── 0046_Goldbach_s_other_conjecture.py ├── 0047_Distinct_primes_factors └── 0047_Distinct_primes_factors.py ├── 0048_Self_powers └── 0048_Self_powers.py ├── 0049_Prime_permutations └── 0049_Prime_permutations.py ├── 0050_Consecutive_prime_sum └── 0050_Consecutive_prime_sum.py ├── 0055_Lychrel_numbers └── 0055_Lychrel_numbers.py ├── 0065_Convergents_of_e └── 0065_Convergents_of_e.py ├── 0081_Path_sum_two_ways ├── 0081_Path_sum_two_ways.py └── p081_matrix.txt ├── 0089_Roman_numerals ├── 0089_Roman_numerals.py └── p089_roman.txt ├── 0092_Square_digit_chains └── 0092_Square_digit_chains.py ├── 0142_Perfect_Square_Collection └── 0142_Perfect_Square_Collection.py ├── 0243_Resilience └── 0243_Resilience.py ├── 0277_A_Modified_Collatz_sequence └── 0277_A_Modified_Collatz_sequence.py └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/python,pycharm,eclipse,java,intellij+all,c++ 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,pycharm,eclipse,java,intellij+all,c++ 4 | 5 | ### C++ ### 6 | # Prerequisites 7 | *.d 8 | 9 | # Compiled Object files 10 | *.slo 11 | *.lo 12 | *.o 13 | *.obj 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Compiled Dynamic libraries 20 | *.so 21 | *.dylib 22 | *.dll 23 | 24 | # Fortran module files 25 | *.mod 26 | *.smod 27 | 28 | # Compiled Static libraries 29 | *.lai 30 | *.la 31 | *.a 32 | *.lib 33 | 34 | # Executables 35 | *.exe 36 | *.out 37 | *.app 38 | 39 | ### Eclipse ### 40 | .metadata 41 | bin/ 42 | tmp/ 43 | *.tmp 44 | *.bak 45 | *.swp 46 | *~.nib 47 | local.properties 48 | .settings/ 49 | .loadpath 50 | .recommenders 51 | 52 | # External tool builders 53 | .externalToolBuilders/ 54 | 55 | # Locally stored "Eclipse launch configurations" 56 | *.launch 57 | 58 | # PyDev specific (Python IDE for Eclipse) 59 | *.pydevproject 60 | 61 | # CDT-specific (C/C++ Development Tooling) 62 | .cproject 63 | 64 | # CDT- autotools 65 | .autotools 66 | 67 | # Java annotation processor (APT) 68 | .factorypath 69 | 70 | # PDT-specific (PHP Development Tools) 71 | .buildpath 72 | 73 | # sbteclipse plugin 74 | .target 75 | 76 | # Tern plugin 77 | .tern-project 78 | 79 | # TeXlipse plugin 80 | .texlipse 81 | 82 | # STS (Spring Tool Suite) 83 | .springBeans 84 | 85 | # Code Recommenders 86 | .recommenders/ 87 | 88 | # Annotation Processing 89 | .apt_generated/ 90 | .apt_generated_test/ 91 | 92 | # Scala IDE specific (Scala & Java development for Eclipse) 93 | .cache-main 94 | .scala_dependencies 95 | .worksheet 96 | 97 | # Uncomment this line if you wish to ignore the project description file. 98 | # Typically, this file would be tracked if it contains build/dependency configurations: 99 | #.project 100 | 101 | ### Eclipse Patch ### 102 | # Spring Boot Tooling 103 | .sts4-cache/ 104 | 105 | ### Intellij+all ### 106 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 107 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 108 | 109 | # User-specific stuff 110 | .idea/**/workspace.xml 111 | .idea/**/tasks.xml 112 | .idea/**/usage.statistics.xml 113 | .idea/**/dictionaries 114 | .idea/**/shelf 115 | 116 | # AWS User-specific 117 | .idea/**/aws.xml 118 | 119 | # Generated files 120 | .idea/**/contentModel.xml 121 | 122 | # Sensitive or high-churn files 123 | .idea/**/dataSources/ 124 | .idea/**/dataSources.ids 125 | .idea/**/dataSources.local.xml 126 | .idea/**/sqlDataSources.xml 127 | .idea/**/dynamic.xml 128 | .idea/**/uiDesigner.xml 129 | .idea/**/dbnavigator.xml 130 | 131 | # Gradle 132 | .idea/**/gradle.xml 133 | .idea/**/libraries 134 | 135 | # Gradle and Maven with auto-import 136 | # When using Gradle or Maven with auto-import, you should exclude module files, 137 | # since they will be recreated, and may cause churn. Uncomment if using 138 | # auto-import. 139 | # .idea/artifacts 140 | # .idea/compiler.xml 141 | # .idea/jarRepositories.xml 142 | # .idea/modules.xml 143 | # .idea/*.iml 144 | # .idea/modules 145 | # *.iml 146 | # *.ipr 147 | 148 | # CMake 149 | cmake-build-*/ 150 | 151 | # Mongo Explorer plugin 152 | .idea/**/mongoSettings.xml 153 | 154 | # File-based project format 155 | *.iws 156 | 157 | # IntelliJ 158 | out/ 159 | 160 | # mpeltonen/sbt-idea plugin 161 | .idea_modules/ 162 | 163 | # JIRA plugin 164 | atlassian-ide-plugin.xml 165 | 166 | # Cursive Clojure plugin 167 | .idea/replstate.xml 168 | 169 | # Crashlytics plugin (for Android Studio and IntelliJ) 170 | com_crashlytics_export_strings.xml 171 | crashlytics.properties 172 | crashlytics-build.properties 173 | fabric.properties 174 | 175 | # Editor-based Rest Client 176 | .idea/httpRequests 177 | 178 | # Android studio 3.1+ serialized cache file 179 | .idea/caches/build_file_checksums.ser 180 | 181 | ### Intellij+all Patch ### 182 | # Ignores the whole .idea folder and all .iml files 183 | # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 184 | 185 | .idea/ 186 | 187 | # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 188 | 189 | *.iml 190 | modules.xml 191 | .idea/misc.xml 192 | *.ipr 193 | 194 | # Sonarlint plugin 195 | .idea/sonarlint 196 | 197 | ### Java ### 198 | # Compiled class file 199 | *.class 200 | 201 | # Log file 202 | *.log 203 | 204 | # BlueJ files 205 | *.ctxt 206 | 207 | # Mobile Tools for Java (J2ME) 208 | .mtj.tmp/ 209 | 210 | # Package Files # 211 | *.jar 212 | *.war 213 | *.nar 214 | *.ear 215 | *.zip 216 | *.tar.gz 217 | *.rar 218 | 219 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 220 | hs_err_pid* 221 | 222 | ### PyCharm ### 223 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 224 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 225 | 226 | # User-specific stuff 227 | 228 | # AWS User-specific 229 | 230 | # Generated files 231 | 232 | # Sensitive or high-churn files 233 | 234 | # Gradle 235 | 236 | # Gradle and Maven with auto-import 237 | # When using Gradle or Maven with auto-import, you should exclude module files, 238 | # since they will be recreated, and may cause churn. Uncomment if using 239 | # auto-import. 240 | # .idea/artifacts 241 | # .idea/compiler.xml 242 | # .idea/jarRepositories.xml 243 | # .idea/modules.xml 244 | # .idea/*.iml 245 | # .idea/modules 246 | # *.iml 247 | # *.ipr 248 | 249 | # CMake 250 | 251 | # Mongo Explorer plugin 252 | 253 | # File-based project format 254 | 255 | # IntelliJ 256 | 257 | # mpeltonen/sbt-idea plugin 258 | 259 | # JIRA plugin 260 | 261 | # Cursive Clojure plugin 262 | 263 | # Crashlytics plugin (for Android Studio and IntelliJ) 264 | 265 | # Editor-based Rest Client 266 | 267 | # Android studio 3.1+ serialized cache file 268 | 269 | ### PyCharm Patch ### 270 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 271 | 272 | # *.iml 273 | # modules.xml 274 | # .idea/misc.xml 275 | # *.ipr 276 | 277 | # Sonarlint plugin 278 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 279 | .idea/**/sonarlint/ 280 | 281 | # SonarQube Plugin 282 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 283 | .idea/**/sonarIssues.xml 284 | 285 | # Markdown Navigator plugin 286 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 287 | .idea/**/markdown-navigator.xml 288 | .idea/**/markdown-navigator-enh.xml 289 | .idea/**/markdown-navigator/ 290 | 291 | # Cache file creation bug 292 | # See https://youtrack.jetbrains.com/issue/JBR-2257 293 | .idea/$CACHE_FILE$ 294 | 295 | # CodeStream plugin 296 | # https://plugins.jetbrains.com/plugin/12206-codestream 297 | .idea/codestream.xml 298 | 299 | ### Python ### 300 | # Byte-compiled / optimized / DLL files 301 | __pycache__/ 302 | *.py[cod] 303 | *$py.class 304 | 305 | # C extensions 306 | 307 | # Distribution / packaging 308 | .Python 309 | build/ 310 | develop-eggs/ 311 | dist/ 312 | downloads/ 313 | eggs/ 314 | .eggs/ 315 | lib/ 316 | lib64/ 317 | parts/ 318 | sdist/ 319 | var/ 320 | wheels/ 321 | share/python-wheels/ 322 | *.egg-info/ 323 | .installed.cfg 324 | *.egg 325 | MANIFEST 326 | 327 | # PyInstaller 328 | # Usually these files are written by a python script from a template 329 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 330 | *.manifest 331 | *.spec 332 | 333 | # Installer logs 334 | pip-log.txt 335 | pip-delete-this-directory.txt 336 | 337 | # Unit test / coverage reports 338 | htmlcov/ 339 | .tox/ 340 | .nox/ 341 | .coverage 342 | .coverage.* 343 | .cache 344 | nosetests.xml 345 | coverage.xml 346 | *.cover 347 | *.py,cover 348 | .hypothesis/ 349 | .pytest_cache/ 350 | cover/ 351 | 352 | # Translations 353 | *.mo 354 | *.pot 355 | 356 | # Django stuff: 357 | local_settings.py 358 | db.sqlite3 359 | db.sqlite3-journal 360 | 361 | # Flask stuff: 362 | instance/ 363 | .webassets-cache 364 | 365 | # Scrapy stuff: 366 | .scrapy 367 | 368 | # Sphinx documentation 369 | docs/_build/ 370 | 371 | # PyBuilder 372 | .pybuilder/ 373 | target/ 374 | 375 | # Jupyter Notebook 376 | .ipynb_checkpoints 377 | 378 | # IPython 379 | profile_default/ 380 | ipython_config.py 381 | 382 | # pyenv 383 | # For a library or package, you might want to ignore these files since the code is 384 | # intended to run in multiple environments; otherwise, check them in: 385 | # .python-version 386 | 387 | # pipenv 388 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 389 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 390 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 391 | # install all needed dependencies. 392 | #Pipfile.lock 393 | 394 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 395 | __pypackages__/ 396 | 397 | # Celery stuff 398 | celerybeat-schedule 399 | celerybeat.pid 400 | 401 | # SageMath parsed files 402 | *.sage.py 403 | 404 | # Environments 405 | .env 406 | .venv 407 | env/ 408 | venv/ 409 | ENV/ 410 | env.bak/ 411 | venv.bak/ 412 | 413 | # Spyder project settings 414 | .spyderproject 415 | .spyproject 416 | 417 | # Rope project settings 418 | .ropeproject 419 | 420 | # mkdocs documentation 421 | /site 422 | 423 | # mypy 424 | .mypy_cache/ 425 | .dmypy.json 426 | dmypy.json 427 | 428 | # Pyre type checker 429 | .pyre/ 430 | 431 | # pytype static type analyzer 432 | .pytype/ 433 | 434 | # Cython debug symbols 435 | cython_debug/ 436 | 437 | # End of https://www.toptal.com/developers/gitignore/api/python,pycharm,eclipse,java,intellij+all,c++ 438 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v4.1.0 4 | hooks: 5 | - id: check-yaml 6 | - id: end-of-file-fixer 7 | - id: trailing-whitespace 8 | - id: check-added-large-files 9 | 10 | # isort 11 | - repo: https://github.com/pre-commit/mirrors-isort 12 | rev: v5.10.1 13 | hooks: 14 | - id: isort 15 | 16 | # black 17 | - repo: https://github.com/ambv/black 18 | rev: 22.1.0 19 | hooks: 20 | - id: black 21 | args: # arguments to configure black 22 | - --line-length=120 23 | - --include='\.pyi?$' 24 | 25 | # these folders wont be formatted by black 26 | - --exclude="""\.git | 27 | \.__pycache__| 28 | \.hg| 29 | \.mypy_cache| 30 | \.tox| 31 | \.venv| 32 | _build| 33 | buck-out| 34 | build| 35 | dist"" 36 | # flake8 37 | - repo: https://github.com/PyCQA/flake8 38 | rev: 4.0.1 39 | hooks: 40 | - id: flake8 41 | args: 42 | - "--max-line-length=120" # default is 79 43 | - "--ignore=E203,E266,E501,W503,F403,F401,E402" 44 | -------------------------------------------------------------------------------- /0001_Multiples_of_3_and_5/0001_Multiples_of_3_and_5.py: -------------------------------------------------------------------------------- 1 | sum = 0 2 | for i in range(2, 1000): 3 | if i % 3 == 0 or i % 5 == 0: 4 | sum = sum + i 5 | print(sum) 6 | -------------------------------------------------------------------------------- /0002_Even_Fibonacci_numbers/0002_Even_Fibonacci_numbers.py: -------------------------------------------------------------------------------- 1 | number1 = 1 2 | number2 = 2 3 | summation = 0 4 | while number2 < 4000000: 5 | summation += number2 6 | number1, number2 = number2, number1 + number2 7 | number1, number2 = number2, number1 + number2 8 | number1, number2 = number2, number1 + number2 9 | print(summation) 10 | -------------------------------------------------------------------------------- /0003_Largest_prime_factor/0003_Largest_prime_factor.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | 3 | 4 | def factors(n): 5 | return list(set(reduce(list.__add__, ([i, n // i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))) 6 | 7 | 8 | def isPrime(n): 9 | if n <= 1: 10 | return False 11 | if n <= 3: 12 | return True 13 | if n % 2 == 0 or n % 3 == 0: 14 | return False 15 | 16 | i = 5 17 | while i * i <= n: 18 | if n % i == 0 or n % (i + 2) == 0: 19 | return False 20 | i = i + 6 21 | 22 | return True 23 | 24 | 25 | num = 600851475143 26 | factors = factors(num) 27 | factors.sort(reverse=True) 28 | for i in range(len(factors)): 29 | if isPrime(factors[i]): 30 | print(factors[i]) 31 | break 32 | -------------------------------------------------------------------------------- /0004_Largest_palindrome_product/0004_Largest_palindrome_product.py: -------------------------------------------------------------------------------- 1 | def palindromicstring(numstr): 2 | return list(reversed(numstr)) == list(numstr) 3 | 4 | 5 | def palindromicdecimal(n): 6 | return palindromicstring(str(n)) 7 | 8 | 9 | largestfound = 0 10 | for i in range(100, 1000): 11 | for j in range(i, 1000): 12 | if palindromicdecimal(i * j): 13 | if i * j > largestfound: 14 | largestfound = i * j 15 | print(largestfound) 16 | -------------------------------------------------------------------------------- /0005_Smallest_multiple/0005_Smallest_multiple.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | from math import gcd 3 | 4 | lcm = reduce(lambda x, y: x * y // gcd(x, y), range(1, 21)) 5 | print(lcm) 6 | -------------------------------------------------------------------------------- /0006_Sum_square_difference/0006_Sum_square_difference.py: -------------------------------------------------------------------------------- 1 | def sumofsquares(n): 2 | ans = 0 3 | for i in range(1, n + 1): 4 | ans += i**2 5 | return ans 6 | 7 | 8 | def squareofsum(n): 9 | return sum(list(range(1, n + 1))) ** 2 10 | 11 | 12 | print(abs(sumofsquares(10) - squareofsum(10))) 13 | print(abs(sumofsquares(100) - squareofsum(100))) 14 | -------------------------------------------------------------------------------- /0007_10001st_prime/0007_10001st_prime.py: -------------------------------------------------------------------------------- 1 | def isPrime(n): 2 | if n <= 1: 3 | return False 4 | if n <= 3: 5 | return True 6 | if n % 2 == 0 or n % 3 == 0: 7 | return False 8 | 9 | i = 5 10 | while i * i <= n: 11 | if n % i == 0 or n % (i + 2) == 0: 12 | return False 13 | i = i + 6 14 | 15 | return True 16 | 17 | 18 | primes = [2] 19 | i = 3 20 | while len(primes) < 10001: 21 | if isPrime(i): 22 | primes.append(i) 23 | i += 1 24 | print(primes[-1]) 25 | -------------------------------------------------------------------------------- /0008_Largest_product_in_a_series/0008_Largest_product_in_a_series.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | from operator import mul 3 | 4 | numst = ( 5 | "73167176531330624919225119674426574742355349194934" 6 | "96983520312774506326239578318016984801869478851843" 7 | "85861560789112949495459501737958331952853208805511" 8 | "12540698747158523863050715693290963295227443043557" 9 | "66896648950445244523161731856403098711121722383113" 10 | "62229893423380308135336276614282806444486645238749" 11 | "30358907296290491560440772390713810515859307960866" 12 | "70172427121883998797908792274921901699720888093776" 13 | "65727333001053367881220235421809751254540594752243" 14 | "52584907711670556013604839586446706324415722155397" 15 | "53697817977846174064955149290862569321978468622482" 16 | "83972241375657056057490261407972968652414535100474" 17 | "82166370484403199890008895243450658541227588666881" 18 | "16427171479924442928230863465674813919123162824586" 19 | "17866458359124566529476545682848912883142607690042" 20 | "24219022671055626321111109370544217506941658960408" 21 | "07198403850962455444362981230987879927244284909188" 22 | "84580156166097919133875499200524063689912560717606" 23 | "05886116467109405077541002256983155200055935729725" 24 | "71636269561882670428252483600823257530420752963450 " 25 | ) 26 | 27 | greatestproduct = 1 28 | for i in range(13, len(numst)): 29 | thirteennums = list(map(int, numst[i - 13 : i])) 30 | greatestproduct = max(greatestproduct, reduce(mul, thirteennums, 1)) 31 | print(greatestproduct) 32 | -------------------------------------------------------------------------------- /0009_Special_Pythagorean_triplet/0009_Special_Pythagorean_triplet.py: -------------------------------------------------------------------------------- 1 | found = False 2 | for a in range(1, 334): 3 | for b in range(a + 1, 500): 4 | c = 1000 - a - b 5 | if 1000 * c + a * b == 500000: 6 | found = True 7 | break 8 | if found: 9 | break 10 | print( 11 | "a = {}, b = {}, c = {},\n" 12 | "a2 + b2 = c2: {} + {} = {},\n" 13 | "a + b + c = {},\n" 14 | "abc = {}".format(a, b, c, a**2, b**2, c**2, a + b + c, a * b * c) 15 | ) 16 | -------------------------------------------------------------------------------- /0010_Summation_of_primes/0010_Summation_of_primes.py: -------------------------------------------------------------------------------- 1 | def isPrime(n): 2 | if n <= 1: 3 | return False 4 | if n <= 3: 5 | return True 6 | if n % 2 == 0 or n % 3 == 0: 7 | return False 8 | 9 | i = 5 10 | while i * i <= n: 11 | if n % i == 0 or n % (i + 2) == 0: 12 | return False 13 | i = i + 6 14 | 15 | return True 16 | 17 | 18 | summation = 0 19 | i = 2 20 | while i < 2000000: 21 | if isPrime(i): 22 | summation += i 23 | i += 1 24 | print(summation) 25 | -------------------------------------------------------------------------------- /0011_Largest_product_in_a_grid/0011_Largest_product_in_a_grid.py: -------------------------------------------------------------------------------- 1 | numbers_str = [ 2 | "08", 3 | "02", 4 | "22", 5 | "97", 6 | "38", 7 | "15", 8 | "00", 9 | "40", 10 | "00", 11 | "75", 12 | "04", 13 | "05", 14 | "07", 15 | "78", 16 | "52", 17 | "12", 18 | "50", 19 | "77", 20 | "91", 21 | "08", 22 | "49", 23 | "49", 24 | "99", 25 | "40", 26 | "17", 27 | "81", 28 | "18", 29 | "57", 30 | "60", 31 | "87", 32 | "17", 33 | "40", 34 | "98", 35 | "43", 36 | "69", 37 | "48", 38 | "04", 39 | "56", 40 | "62", 41 | "00", 42 | "81", 43 | "49", 44 | "31", 45 | "73", 46 | "55", 47 | "79", 48 | "14", 49 | "29", 50 | "93", 51 | "71", 52 | "40", 53 | "67", 54 | "53", 55 | "88", 56 | "30", 57 | "03", 58 | "49", 59 | "13", 60 | "36", 61 | "65", 62 | "52", 63 | "70", 64 | "95", 65 | "23", 66 | "04", 67 | "60", 68 | "11", 69 | "42", 70 | "69", 71 | "24", 72 | "68", 73 | "56", 74 | "01", 75 | "32", 76 | "56", 77 | "71", 78 | "37", 79 | "02", 80 | "36", 81 | "91", 82 | "22", 83 | "31", 84 | "16", 85 | "71", 86 | "51", 87 | "67", 88 | "63", 89 | "89", 90 | "41", 91 | "92", 92 | "36", 93 | "54", 94 | "22", 95 | "40", 96 | "40", 97 | "28", 98 | "66", 99 | "33", 100 | "13", 101 | "80", 102 | "24", 103 | "47", 104 | "32", 105 | "60", 106 | "99", 107 | "03", 108 | "45", 109 | "02", 110 | "44", 111 | "75", 112 | "33", 113 | "53", 114 | "78", 115 | "36", 116 | "84", 117 | "20", 118 | "35", 119 | "17", 120 | "12", 121 | "50", 122 | "32", 123 | "98", 124 | "81", 125 | "28", 126 | "64", 127 | "23", 128 | "67", 129 | "10", 130 | "26", 131 | "38", 132 | "40", 133 | "67", 134 | "59", 135 | "54", 136 | "70", 137 | "66", 138 | "18", 139 | "38", 140 | "64", 141 | "70", 142 | "67", 143 | "26", 144 | "20", 145 | "68", 146 | "02", 147 | "62", 148 | "12", 149 | "20", 150 | "95", 151 | "63", 152 | "94", 153 | "39", 154 | "63", 155 | "08", 156 | "40", 157 | "91", 158 | "66", 159 | "49", 160 | "94", 161 | "21", 162 | "24", 163 | "55", 164 | "58", 165 | "05", 166 | "66", 167 | "73", 168 | "99", 169 | "26", 170 | "97", 171 | "17", 172 | "78", 173 | "78", 174 | "96", 175 | "83", 176 | "14", 177 | "88", 178 | "34", 179 | "89", 180 | "63", 181 | "72", 182 | "21", 183 | "36", 184 | "23", 185 | "09", 186 | "75", 187 | "00", 188 | "76", 189 | "44", 190 | "20", 191 | "45", 192 | "35", 193 | "14", 194 | "00", 195 | "61", 196 | "33", 197 | "97", 198 | "34", 199 | "31", 200 | "33", 201 | "95", 202 | "78", 203 | "17", 204 | "53", 205 | "28", 206 | "22", 207 | "75", 208 | "31", 209 | "67", 210 | "15", 211 | "94", 212 | "03", 213 | "80", 214 | "04", 215 | "62", 216 | "16", 217 | "14", 218 | "09", 219 | "53", 220 | "56", 221 | "92", 222 | "16", 223 | "39", 224 | "05", 225 | "42", 226 | "96", 227 | "35", 228 | "31", 229 | "47", 230 | "55", 231 | "58", 232 | "88", 233 | "24", 234 | "00", 235 | "17", 236 | "54", 237 | "24", 238 | "36", 239 | "29", 240 | "85", 241 | "57", 242 | "86", 243 | "56", 244 | "00", 245 | "48", 246 | "35", 247 | "71", 248 | "89", 249 | "07", 250 | "05", 251 | "44", 252 | "44", 253 | "37", 254 | "44", 255 | "60", 256 | "21", 257 | "58", 258 | "51", 259 | "54", 260 | "17", 261 | "58", 262 | "19", 263 | "80", 264 | "81", 265 | "68", 266 | "05", 267 | "94", 268 | "47", 269 | "69", 270 | "28", 271 | "73", 272 | "92", 273 | "13", 274 | "86", 275 | "52", 276 | "17", 277 | "77", 278 | "04", 279 | "89", 280 | "55", 281 | "40", 282 | "04", 283 | "52", 284 | "08", 285 | "83", 286 | "97", 287 | "35", 288 | "99", 289 | "16", 290 | "07", 291 | "97", 292 | "57", 293 | "32", 294 | "16", 295 | "26", 296 | "26", 297 | "79", 298 | "33", 299 | "27", 300 | "98", 301 | "66", 302 | "88", 303 | "36", 304 | "68", 305 | "87", 306 | "57", 307 | "62", 308 | "20", 309 | "72", 310 | "03", 311 | "46", 312 | "33", 313 | "67", 314 | "46", 315 | "55", 316 | "12", 317 | "32", 318 | "63", 319 | "93", 320 | "53", 321 | "69", 322 | "04", 323 | "42", 324 | "16", 325 | "73", 326 | "38", 327 | "25", 328 | "39", 329 | "11", 330 | "24", 331 | "94", 332 | "72", 333 | "18", 334 | "08", 335 | "46", 336 | "29", 337 | "32", 338 | "40", 339 | "62", 340 | "76", 341 | "36", 342 | "20", 343 | "69", 344 | "36", 345 | "41", 346 | "72", 347 | "30", 348 | "23", 349 | "88", 350 | "34", 351 | "62", 352 | "99", 353 | "69", 354 | "82", 355 | "67", 356 | "59", 357 | "85", 358 | "74", 359 | "04", 360 | "36", 361 | "16", 362 | "20", 363 | "73", 364 | "35", 365 | "29", 366 | "78", 367 | "31", 368 | "90", 369 | "01", 370 | "74", 371 | "31", 372 | "49", 373 | "71", 374 | "48", 375 | "86", 376 | "81", 377 | "16", 378 | "23", 379 | "57", 380 | "05", 381 | "54", 382 | "01", 383 | "70", 384 | "54", 385 | "71", 386 | "83", 387 | "51", 388 | "54", 389 | "69", 390 | "16", 391 | "92", 392 | "33", 393 | "48", 394 | "61", 395 | "43", 396 | "52", 397 | "01", 398 | "89", 399 | "19", 400 | "67", 401 | "48", 402 | ] 403 | 404 | numbers_int = [int(x) for x in numbers_str] 405 | numbers_bidimensional_array = [numbers_int[i : i + 20] for i in range(0, len(numbers_int), 20)] 406 | 407 | max_product = 0 408 | for i in range(0, len(numbers_bidimensional_array) - 3): 409 | for j in range(0, len(numbers_bidimensional_array[i]) - 3): 410 | product = ( 411 | numbers_bidimensional_array[i][j] 412 | * numbers_bidimensional_array[i][j + 1] 413 | * numbers_bidimensional_array[i][j + 2] 414 | * numbers_bidimensional_array[i][j + 3] 415 | ) 416 | if product > max_product: 417 | max_product = product 418 | product = ( 419 | numbers_bidimensional_array[i][j] 420 | * numbers_bidimensional_array[i + 1][j] 421 | * numbers_bidimensional_array[i + 2][j] 422 | * numbers_bidimensional_array[i + 3][j] 423 | ) 424 | if product > max_product: 425 | max_product = product 426 | product = ( 427 | numbers_bidimensional_array[i][j] 428 | * numbers_bidimensional_array[i + 1][j + 1] 429 | * numbers_bidimensional_array[i + 2][j + 2] 430 | * numbers_bidimensional_array[i + 3][j + 3] 431 | ) 432 | if product > max_product: 433 | max_product = product 434 | product = ( 435 | numbers_bidimensional_array[i][j + 3] 436 | * numbers_bidimensional_array[i + 1][j + 2] 437 | * numbers_bidimensional_array[i + 2][j + 1] 438 | * numbers_bidimensional_array[i + 3][j] 439 | ) 440 | if product > max_product: 441 | max_product = product 442 | print(max_product) 443 | -------------------------------------------------------------------------------- /0012_Highly_divisible_triangular_number/0012_Highly_divisible_triangular_number.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | 3 | 4 | def factors(n): 5 | return set(reduce(list.__add__, ([i, n // i] for i in range(1, int(n**0.5) + 1) if n % i == 0))) 6 | 7 | 8 | num = 1 9 | i = 2 10 | while True: 11 | num = num + i 12 | if len(factors(num)) > 500: 13 | print(num) 14 | break 15 | i = i + 1 16 | -------------------------------------------------------------------------------- /0013_Large_sum/0013_Large_sum.py: -------------------------------------------------------------------------------- 1 | n = [ 2 | "37107287533902102798797998220837590246510135740250", 3 | "46376937677490009712648124896970078050417018260538", 4 | "74324986199524741059474233309513058123726617309629", 5 | "91942213363574161572522430563301811072406154908250", 6 | "23067588207539346171171980310421047513778063246676", 7 | "89261670696623633820136378418383684178734361726757", 8 | "28112879812849979408065481931592621691275889832738", 9 | "44274228917432520321923589422876796487670272189318", 10 | "47451445736001306439091167216856844588711603153276", 11 | "70386486105843025439939619828917593665686757934951", 12 | "62176457141856560629502157223196586755079324193331", 13 | "64906352462741904929101432445813822663347944758178", 14 | "92575867718337217661963751590579239728245598838407", 15 | "58203565325359399008402633568948830189458628227828", 16 | "80181199384826282014278194139940567587151170094390", 17 | "35398664372827112653829987240784473053190104293586", 18 | "86515506006295864861532075273371959191420517255829", 19 | "71693888707715466499115593487603532921714970056938", 20 | "54370070576826684624621495650076471787294438377604", 21 | "53282654108756828443191190634694037855217779295145", 22 | "36123272525000296071075082563815656710885258350721", 23 | "45876576172410976447339110607218265236877223636045", 24 | "17423706905851860660448207621209813287860733969412", 25 | "81142660418086830619328460811191061556940512689692", 26 | "51934325451728388641918047049293215058642563049483", 27 | "62467221648435076201727918039944693004732956340691", 28 | "15732444386908125794514089057706229429197107928209", 29 | "55037687525678773091862540744969844508330393682126", 30 | "18336384825330154686196124348767681297534375946515", 31 | "80386287592878490201521685554828717201219257766954", 32 | "78182833757993103614740356856449095527097864797581", 33 | "16726320100436897842553539920931837441497806860984", 34 | "48403098129077791799088218795327364475675590848030", 35 | "87086987551392711854517078544161852424320693150332", 36 | "59959406895756536782107074926966537676326235447210", 37 | "69793950679652694742597709739166693763042633987085", 38 | "41052684708299085211399427365734116182760315001271", 39 | "65378607361501080857009149939512557028198746004375", 40 | "35829035317434717326932123578154982629742552737307", 41 | "94953759765105305946966067683156574377167401875275", 42 | "88902802571733229619176668713819931811048770190271", 43 | "25267680276078003013678680992525463401061632866526", 44 | "36270218540497705585629946580636237993140746255962", 45 | "24074486908231174977792365466257246923322810917141", 46 | "91430288197103288597806669760892938638285025333403", 47 | "34413065578016127815921815005561868836468420090470", 48 | "23053081172816430487623791969842487255036638784583", 49 | "11487696932154902810424020138335124462181441773470", 50 | "63783299490636259666498587618221225225512486764533", 51 | "67720186971698544312419572409913959008952310058822", 52 | "95548255300263520781532296796249481641953868218774", 53 | "76085327132285723110424803456124867697064507995236", 54 | "37774242535411291684276865538926205024910326572967", 55 | "23701913275725675285653248258265463092207058596522", 56 | "29798860272258331913126375147341994889534765745501", 57 | "18495701454879288984856827726077713721403798879715", 58 | "38298203783031473527721580348144513491373226651381", 59 | "34829543829199918180278916522431027392251122869539", 60 | "40957953066405232632538044100059654939159879593635", 61 | "29746152185502371307642255121183693803580388584903", 62 | "41698116222072977186158236678424689157993532961922", 63 | "62467957194401269043877107275048102390895523597457", 64 | "23189706772547915061505504953922979530901129967519", 65 | "86188088225875314529584099251203829009407770775672", 66 | "11306739708304724483816533873502340845647058077308", 67 | "82959174767140363198008187129011875491310547126581", 68 | "97623331044818386269515456334926366572897563400500", 69 | "42846280183517070527831839425882145521227251250327", 70 | "55121603546981200581762165212827652751691296897789", 71 | "32238195734329339946437501907836945765883352399886", 72 | "75506164965184775180738168837861091527357929701337", 73 | "62177842752192623401942399639168044983993173312731", 74 | "32924185707147349566916674687634660915035914677504", 75 | "99518671430235219628894890102423325116913619626622", 76 | "73267460800591547471830798392868535206946944540724", 77 | "76841822524674417161514036427982273348055556214818", 78 | "97142617910342598647204516893989422179826088076852", 79 | "87783646182799346313767754307809363333018982642090", 80 | "10848802521674670883215120185883543223812876952786", 81 | "71329612474782464538636993009049310363619763878039", 82 | "62184073572399794223406235393808339651327408011116", 83 | "66627891981488087797941876876144230030984490851411", 84 | "60661826293682836764744779239180335110989069790714", 85 | "85786944089552990653640447425576083659976645795096", 86 | "66024396409905389607120198219976047599490197230297", 87 | "64913982680032973156037120041377903785566085089252", 88 | "16730939319872750275468906903707539413042652315011", 89 | "94809377245048795150954100921645863754710598436791", 90 | "78639167021187492431995700641917969777599028300699", 91 | "15368713711936614952811305876380278410754449733078", 92 | "40789923115535562561142322423255033685442488917353", 93 | "44889911501440648020369068063960672322193204149535", 94 | "41503128880339536053299340368006977710650566631954", 95 | "81234880673210146739058568557934581403627822703280", 96 | "82616570773948327592232845941706525094512325230608", 97 | "22918802058777319719839450180888072429661980811197", 98 | "77158542502016545090413245809786882778948721859617", 99 | "72107838435069186155435662884062257473692284509516", 100 | "20849603980134001723930671666823555245252804609722", 101 | "53503534226472524250874054075591789781264330331690", 102 | ] 103 | 104 | total_sum = sum(int(x) for x in n) 105 | print(str(total_sum)[0:10]) 106 | -------------------------------------------------------------------------------- /0014_Longest_Collatz_sequence/0014_Longest_Collatz_sequence.py: -------------------------------------------------------------------------------- 1 | collatz_sequences = {} 2 | collatz_sequences[1] = 1 3 | 4 | 5 | def len_of_collatz_sequence(n): 6 | count = 1 7 | if n in collatz_sequences.keys(): 8 | return collatz_sequences[n] 9 | if n % 2 == 0: 10 | count = 1 + len_of_collatz_sequence(n // 2) 11 | else: 12 | count = 1 + len_of_collatz_sequence(3 * n + 1) 13 | collatz_sequences[n] = count 14 | return count 15 | 16 | 17 | max_chain_length = 0 18 | for i in range(1, 1000000): 19 | max_chain_length = max(max_chain_length, len_of_collatz_sequence(i)) 20 | for k in collatz_sequences.keys(): 21 | if collatz_sequences[k] == max_chain_length: 22 | print(k) 23 | break 24 | -------------------------------------------------------------------------------- /0015_Lattice_paths/0015_Lattice_paths.py: -------------------------------------------------------------------------------- 1 | paths = {} 2 | paths[0] = [1] 3 | paths[1] = [1, 2, 1] 4 | paths[2] = [1, 4, 6, 4, 1] 5 | 6 | 7 | def lattice_paths(n): 8 | if n in paths.keys(): 9 | return paths[n] 10 | lower_path = lattice_paths(n - 1) 11 | for times in range(2): 12 | new_path = [1] 13 | for i in range(1, len(lower_path)): 14 | new_path.append(lower_path[i - 1] + lower_path[i]) 15 | new_path.append(1) 16 | lower_path = new_path 17 | return lower_path 18 | 19 | 20 | print(max(lattice_paths(20))) 21 | -------------------------------------------------------------------------------- /0016_Power_digit_sum/0016_Power_digit_sum.py: -------------------------------------------------------------------------------- 1 | print(sum(map(int, str(2**1000)))) 2 | -------------------------------------------------------------------------------- /0017_Number_letter_counts/0017_Number_letter_counts.py: -------------------------------------------------------------------------------- 1 | def convert(num): 2 | units = ( 3 | "", 4 | "one ", 5 | "two ", 6 | "three ", 7 | "four ", 8 | "five ", 9 | "six ", 10 | "seven ", 11 | "eight ", 12 | "nine ", 13 | "ten ", 14 | "eleven ", 15 | "twelve ", 16 | "thirteen ", 17 | "fourteen ", 18 | "fifteen ", 19 | "sixteen ", 20 | "seventeen ", 21 | "eighteen ", 22 | "nineteen ", 23 | ) 24 | tens = ("", "", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety ") 25 | 26 | if num < 0: 27 | return "minus " + convert(-num) 28 | 29 | if num < 20: 30 | return units[num] 31 | 32 | if num < 100: 33 | return tens[num // 10] + units[int(num % 10)] 34 | 35 | if num < 1000 and num % 100 == 0: 36 | return units[num // 100] + "hundred " 37 | 38 | if num < 1000: 39 | return units[num // 100] + "hundred and " + convert(int(num % 100)) 40 | 41 | if num < 1000000 and num % 1000 == 0: 42 | return convert(num // 1000) + "thousand " 43 | 44 | if num < 1000000: 45 | return convert(num // 1000) + "thousand and " + convert(int(num % 1000)) 46 | 47 | if num < 1000000000 and num % 1000000 == 0: 48 | return convert(num // 1000000) + "million " 49 | 50 | if num < 1000000000: 51 | return convert(num // 1000000) + "million and " + convert(int(num % 1000000)) 52 | 53 | return convert(num // 1000000000) + "billion and " + convert(int(num % 1000000000)) 54 | 55 | 56 | count_letters = 0 57 | for i in range(1, 1001): 58 | count_letters += len(convert(i).replace(" ", "")) 59 | print(count_letters) 60 | -------------------------------------------------------------------------------- /0018_Maximum_path_sum_I/0018_Maximum_path_sum_I.py: -------------------------------------------------------------------------------- 1 | triangle = ( 2 | "75" 3 | + "\n" 4 | + "95 64" 5 | + "\n" 6 | + "17 47 82" 7 | + "\n" 8 | + "18 35 87 10" 9 | + "\n" 10 | + "20 04 82 47 65" 11 | + "\n" 12 | + "19 01 23 75 03 34" 13 | + "\n" 14 | + "88 02 77 73 07 63 67" 15 | + "\n" 16 | + "99 65 04 28 06 16 70 92" 17 | + "\n" 18 | + "41 41 26 56 83 40 80 70 33" 19 | + "\n" 20 | + "41 48 72 33 47 32 37 16 94 29" 21 | + "\n" 22 | + "53 71 44 65 25 43 91 52 97 51 14" 23 | + "\n" 24 | + "70 11 33 28 77 73 17 78 39 68 17 57" 25 | + "\n" 26 | + "91 71 52 38 17 14 91 43 58 50 27 29 48" 27 | + "\n" 28 | + "63 66 04 68 89 53 67 30 73 16 69 87 40 31" 29 | + "\n" 30 | + "04 62 98 27 23 09 70 98 73 93 38 53 60 04 23" 31 | ) 32 | 33 | triangle_arr = [] 34 | for line in triangle.split("\n"): 35 | triangle_arr.append(list(map(int, line.split(" ")))) 36 | 37 | for i in range(len(triangle_arr) - 2, -1, -1): 38 | for j in range(len(triangle_arr[i])): 39 | triangle_arr[i][j] += max(triangle_arr[i + 1][j], triangle_arr[i + 1][j + 1]) 40 | 41 | print(triangle_arr[0][0]) 42 | -------------------------------------------------------------------------------- /0019_Counting_Sundays/0019_Counting_Sundays.py: -------------------------------------------------------------------------------- 1 | from datetime import date 2 | 3 | # 1 Jan 1900 was a Monday. 4 | # Thirty days has September, April, June and November. 5 | # All the rest have thirty-one, 6 | # Saving February alone, which has twenty-eight, rain or shine and on leap years, twenty-nine. 7 | # A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400. 8 | # 9 | # How many Sundays fell on the first of the month during the twentieth century(1 Jan 1901 to 31 Dec 2000)? 10 | 11 | 12 | def is_leap_year(year): 13 | if year % 400 == 0: 14 | return True 15 | if year % 100 == 0: 16 | return False 17 | if year % 4 == 0: 18 | return True 19 | return False 20 | 21 | 22 | years = range(1901, 2001) 23 | months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 24 | first_of_months = [date(year, month, 1) for year in years for month in months] 25 | count_sundays = 0 26 | for d in first_of_months: 27 | if d.weekday() == 6: 28 | count_sundays += 1 29 | 30 | print(count_sundays) 31 | -------------------------------------------------------------------------------- /0020_Factorial_digit_sum/0020_Factorial_digit_sum.py: -------------------------------------------------------------------------------- 1 | # Find the sum of the digits in the number 100! 2 | from functools import reduce 3 | 4 | print(sum(list(map(int, str(reduce(lambda x, y: x * y, range(1, 101))))))) 5 | -------------------------------------------------------------------------------- /0021_Amicable_numbers/0021_Amicable_numbers.py: -------------------------------------------------------------------------------- 1 | # Let d(n) be defined as the sum of proper divisors of n(numbers less than n which divide evenly into n). 2 | # If d(a) = b and d(b) = a, where a != b, then a and b are an amicable pair and each of a and b are called amicable numbers. 3 | 4 | # For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 and 110 5 | # therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4, 71 and 142 6 | # so d(284) = 220. 7 | 8 | # Evaluate the sum of all the amicable numbers under 10000. 9 | 10 | 11 | from itertools import compress 12 | 13 | 14 | def pr(n): # primes 15 | """Returns a list of primes < n for n > 2""" 16 | sieve = bytearray([True]) * (n // 2) 17 | for i in range(3, int(n**0.5) + 1, 2): 18 | if sieve[i // 2]: 19 | sieve[i * i // 2 :: i] = bytearray((n - i * i - 1) // (2 * i) + 1) 20 | return [2, *list(compress(range(3, n, 2), sieve[1:]))] 21 | 22 | 23 | def f(n): # factorization 24 | """Returns a list of the prime factorization of n""" 25 | pf = [] 26 | for p in pr(n): 27 | if p * p > n: 28 | break 29 | count = 0 30 | while not n % p: 31 | n //= p 32 | count += 1 33 | if count > 0: 34 | pf.append((p, count)) 35 | if n > 1: 36 | pf.append((n, 1)) 37 | return pf 38 | 39 | 40 | def d(n, exclude_n=False): # divisors 41 | """Returns an unsorted list of the divisors of n""" 42 | divs = [1] 43 | for p, e in f(n): 44 | divs += [x * p**k for k in range(1, e + 1) for x in divs] 45 | if exclude_n and n in divs: 46 | divs.remove(n) 47 | return divs 48 | 49 | 50 | def amicable(n, exclude_n=False): # amicable numbers 51 | """Returns a list of the amicable numbers under n""" 52 | amicables = [] 53 | for a in range(2, n): 54 | b = sum(d(a, exclude_n)) 55 | if b < n and sum(d(b, exclude_n)) == a and a != b: 56 | amicables.append((a, b)) 57 | return amicables 58 | 59 | 60 | print("Proper divisors of n=220:", d(220, True)) 61 | print("Amicable pairs of numbers under 1000:", amicable(1000, True)) 62 | amicable_numbers = set() 63 | for a, b in amicable(10000, True): 64 | amicable_numbers.add(a) 65 | amicable_numbers.add(b) 66 | print("Set of amicable numbers under 10000:", amicable_numbers) 67 | print("Sum of all amicable numbers under 10000:", sum(amicable_numbers)) 68 | -------------------------------------------------------------------------------- /0022_Names_scores/0022_Names_scores.py: -------------------------------------------------------------------------------- 1 | # Using names.txt(right click and 'Save Link/Target As...'), 2 | # a 46K text file containing over five-thousand first names, 3 | # begin by sorting it into alphabetical order. 4 | # Then working out the alphabetical value for each name, 5 | # multiply this value by its alphabetical position in the list to obtain a name score. 6 | 7 | # For example, when the list is sorted into alphabetical order, 8 | # COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, 9 | # is the 938th name in the list. 10 | # So, COLIN would obtain a score of 938 × 53 = 49714. 11 | 12 | # What is the total of all the name scores in the file? 13 | 14 | 15 | def read_sorted_names(filename): 16 | with open(filename) as f: 17 | names = f.read().replace('"', "").split(",") 18 | return sorted(names) 19 | 20 | 21 | def name_scores(names): 22 | result = {} 23 | for ind, name in enumerate(names): 24 | # print(result) 25 | sum_letters = 0 26 | for letter in name: 27 | sum_letters += ord(letter) - 64 28 | result[name] = sum_letters * (ind + 1) 29 | return result 30 | 31 | 32 | sorted_names = read_sorted_names("p022_names.txt") 33 | scores = name_scores(sorted_names) 34 | # print(scores) 35 | # print(name_scores(['COLIN'])) 36 | print("COLIN score:", scores.get("COLIN")) 37 | print("Total:", sum(scores.values())) 38 | -------------------------------------------------------------------------------- /0022_Names_scores/p022_names.txt: -------------------------------------------------------------------------------- 1 | "MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY","KAREN","BETTY","HELEN","SANDRA","DONNA","CAROL","RUTH","SHARON","MICHELLE","LAURA","SARAH","KIMBERLY","DEBORAH","JESSICA","SHIRLEY","CYNTHIA","ANGELA","MELISSA","BRENDA","AMY","ANNA","REBECCA","VIRGINIA","KATHLEEN","PAMELA","MARTHA","DEBRA","AMANDA","STEPHANIE","CAROLYN","CHRISTINE","MARIE","JANET","CATHERINE","FRANCES","ANN","JOYCE","DIANE","ALICE","JULIE","HEATHER","TERESA","DORIS","GLORIA","EVELYN","JEAN","CHERYL","MILDRED","KATHERINE","JOAN","ASHLEY","JUDITH","ROSE","JANICE","KELLY","NICOLE","JUDY","CHRISTINA","KATHY","THERESA","BEVERLY","DENISE","TAMMY","IRENE","JANE","LORI","RACHEL","MARILYN","ANDREA","KATHRYN","LOUISE","SARA","ANNE","JACQUELINE","WANDA","BONNIE","JULIA","RUBY","LOIS","TINA","PHYLLIS","NORMA","PAULA","DIANA","ANNIE","LILLIAN","EMILY","ROBIN","PEGGY","CRYSTAL","GLADYS","RITA","DAWN","CONNIE","FLORENCE","TRACY","EDNA","TIFFANY","CARMEN","ROSA","CINDY","GRACE","WENDY","VICTORIA","EDITH","KIM","SHERRY","SYLVIA","JOSEPHINE","THELMA","SHANNON","SHEILA","ETHEL","ELLEN","ELAINE","MARJORIE","CARRIE","CHARLOTTE","MONICA","ESTHER","PAULINE","EMMA","JUANITA","ANITA","RHONDA","HAZEL","AMBER","EVA","DEBBIE","APRIL","LESLIE","CLARA","LUCILLE","JAMIE","JOANNE","ELEANOR","VALERIE","DANIELLE","MEGAN","ALICIA","SUZANNE","MICHELE","GAIL","BERTHA","DARLENE","VERONICA","JILL","ERIN","GERALDINE","LAUREN","CATHY","JOANN","LORRAINE","LYNN","SALLY","REGINA","ERICA","BEATRICE","DOLORES","BERNICE","AUDREY","YVONNE","ANNETTE","JUNE","SAMANTHA","MARION","DANA","STACY","ANA","RENEE","IDA","VIVIAN","ROBERTA","HOLLY","BRITTANY","MELANIE","LORETTA","YOLANDA","JEANETTE","LAURIE","KATIE","KRISTEN","VANESSA","ALMA","SUE","ELSIE","BETH","JEANNE","VICKI","CARLA","TARA","ROSEMARY","EILEEN","TERRI","GERTRUDE","LUCY","TONYA","ELLA","STACEY","WILMA","GINA","KRISTIN","JESSIE","NATALIE","AGNES","VERA","WILLIE","CHARLENE","BESSIE","DELORES","MELINDA","PEARL","ARLENE","MAUREEN","COLLEEN","ALLISON","TAMARA","JOY","GEORGIA","CONSTANCE","LILLIE","CLAUDIA","JACKIE","MARCIA","TANYA","NELLIE","MINNIE","MARLENE","HEIDI","GLENDA","LYDIA","VIOLA","COURTNEY","MARIAN","STELLA","CAROLINE","DORA","JO","VICKIE","MATTIE","TERRY","MAXINE","IRMA","MABEL","MARSHA","MYRTLE","LENA","CHRISTY","DEANNA","PATSY","HILDA","GWENDOLYN","JENNIE","NORA","MARGIE","NINA","CASSANDRA","LEAH","PENNY","KAY","PRISCILLA","NAOMI","CAROLE","BRANDY","OLGA","BILLIE","DIANNE","TRACEY","LEONA","JENNY","FELICIA","SONIA","MIRIAM","VELMA","BECKY","BOBBIE","VIOLET","KRISTINA","TONI","MISTY","MAE","SHELLY","DAISY","RAMONA","SHERRI","ERIKA","KATRINA","CLAIRE","LINDSEY","LINDSAY","GENEVA","GUADALUPE","BELINDA","MARGARITA","SHERYL","CORA","FAYE","ADA","NATASHA","SABRINA","ISABEL","MARGUERITE","HATTIE","HARRIET","MOLLY","CECILIA","KRISTI","BRANDI","BLANCHE","SANDY","ROSIE","JOANNA","IRIS","EUNICE","ANGIE","INEZ","LYNDA","MADELINE","AMELIA","ALBERTA","GENEVIEVE","MONIQUE","JODI","JANIE","MAGGIE","KAYLA","SONYA","JAN","LEE","KRISTINE","CANDACE","FANNIE","MARYANN","OPAL","ALISON","YVETTE","MELODY","LUZ","SUSIE","OLIVIA","FLORA","SHELLEY","KRISTY","MAMIE","LULA","LOLA","VERNA","BEULAH","ANTOINETTE","CANDICE","JUANA","JEANNETTE","PAM","KELLI","HANNAH","WHITNEY","BRIDGET","KARLA","CELIA","LATOYA","PATTY","SHELIA","GAYLE","DELLA","VICKY","LYNNE","SHERI","MARIANNE","KARA","JACQUELYN","ERMA","BLANCA","MYRA","LETICIA","PAT","KRISTA","ROXANNE","ANGELICA","JOHNNIE","ROBYN","FRANCIS","ADRIENNE","ROSALIE","ALEXANDRA","BROOKE","BETHANY","SADIE","BERNADETTE","TRACI","JODY","KENDRA","JASMINE","NICHOLE","RACHAEL","CHELSEA","MABLE","ERNESTINE","MURIEL","MARCELLA","ELENA","KRYSTAL","ANGELINA","NADINE","KARI","ESTELLE","DIANNA","PAULETTE","LORA","MONA","DOREEN","ROSEMARIE","ANGEL","DESIREE","ANTONIA","HOPE","GINGER","JANIS","BETSY","CHRISTIE","FREDA","MERCEDES","MEREDITH","LYNETTE","TERI","CRISTINA","EULA","LEIGH","MEGHAN","SOPHIA","ELOISE","ROCHELLE","GRETCHEN","CECELIA","RAQUEL","HENRIETTA","ALYSSA","JANA","KELLEY","GWEN","KERRY","JENNA","TRICIA","LAVERNE","OLIVE","ALEXIS","TASHA","SILVIA","ELVIRA","CASEY","DELIA","SOPHIE","KATE","PATTI","LORENA","KELLIE","SONJA","LILA","LANA","DARLA","MAY","MINDY","ESSIE","MANDY","LORENE","ELSA","JOSEFINA","JEANNIE","MIRANDA","DIXIE","LUCIA","MARTA","FAITH","LELA","JOHANNA","SHARI","CAMILLE","TAMI","SHAWNA","ELISA","EBONY","MELBA","ORA","NETTIE","TABITHA","OLLIE","JAIME","WINIFRED","KRISTIE","MARINA","ALISHA","AIMEE","RENA","MYRNA","MARLA","TAMMIE","LATASHA","BONITA","PATRICE","RONDA","SHERRIE","ADDIE","FRANCINE","DELORIS","STACIE","ADRIANA","CHERI","SHELBY","ABIGAIL","CELESTE","JEWEL","CARA","ADELE","REBEKAH","LUCINDA","DORTHY","CHRIS","EFFIE","TRINA","REBA","SHAWN","SALLIE","AURORA","LENORA","ETTA","LOTTIE","KERRI","TRISHA","NIKKI","ESTELLA","FRANCISCA","JOSIE","TRACIE","MARISSA","KARIN","BRITTNEY","JANELLE","LOURDES","LAUREL","HELENE","FERN","ELVA","CORINNE","KELSEY","INA","BETTIE","ELISABETH","AIDA","CAITLIN","INGRID","IVA","EUGENIA","CHRISTA","GOLDIE","CASSIE","MAUDE","JENIFER","THERESE","FRANKIE","DENA","LORNA","JANETTE","LATONYA","CANDY","MORGAN","CONSUELO","TAMIKA","ROSETTA","DEBORA","CHERIE","POLLY","DINA","JEWELL","FAY","JILLIAN","DOROTHEA","NELL","TRUDY","ESPERANZA","PATRICA","KIMBERLEY","SHANNA","HELENA","CAROLINA","CLEO","STEFANIE","ROSARIO","OLA","JANINE","MOLLIE","LUPE","ALISA","LOU","MARIBEL","SUSANNE","BETTE","SUSANA","ELISE","CECILE","ISABELLE","LESLEY","JOCELYN","PAIGE","JONI","RACHELLE","LEOLA","DAPHNE","ALTA","ESTER","PETRA","GRACIELA","IMOGENE","JOLENE","KEISHA","LACEY","GLENNA","GABRIELA","KERI","URSULA","LIZZIE","KIRSTEN","SHANA","ADELINE","MAYRA","JAYNE","JACLYN","GRACIE","SONDRA","CARMELA","MARISA","ROSALIND","CHARITY","TONIA","BEATRIZ","MARISOL","CLARICE","JEANINE","SHEENA","ANGELINE","FRIEDA","LILY","ROBBIE","SHAUNA","MILLIE","CLAUDETTE","CATHLEEN","ANGELIA","GABRIELLE","AUTUMN","KATHARINE","SUMMER","JODIE","STACI","LEA","CHRISTI","JIMMIE","JUSTINE","ELMA","LUELLA","MARGRET","DOMINIQUE","SOCORRO","RENE","MARTINA","MARGO","MAVIS","CALLIE","BOBBI","MARITZA","LUCILE","LEANNE","JEANNINE","DEANA","AILEEN","LORIE","LADONNA","WILLA","MANUELA","GALE","SELMA","DOLLY","SYBIL","ABBY","LARA","DALE","IVY","DEE","WINNIE","MARCY","LUISA","JERI","MAGDALENA","OFELIA","MEAGAN","AUDRA","MATILDA","LEILA","CORNELIA","BIANCA","SIMONE","BETTYE","RANDI","VIRGIE","LATISHA","BARBRA","GEORGINA","ELIZA","LEANN","BRIDGETTE","RHODA","HALEY","ADELA","NOLA","BERNADINE","FLOSSIE","ILA","GRETA","RUTHIE","NELDA","MINERVA","LILLY","TERRIE","LETHA","HILARY","ESTELA","VALARIE","BRIANNA","ROSALYN","EARLINE","CATALINA","AVA","MIA","CLARISSA","LIDIA","CORRINE","ALEXANDRIA","CONCEPCION","TIA","SHARRON","RAE","DONA","ERICKA","JAMI","ELNORA","CHANDRA","LENORE","NEVA","MARYLOU","MELISA","TABATHA","SERENA","AVIS","ALLIE","SOFIA","JEANIE","ODESSA","NANNIE","HARRIETT","LORAINE","PENELOPE","MILAGROS","EMILIA","BENITA","ALLYSON","ASHLEE","TANIA","TOMMIE","ESMERALDA","KARINA","EVE","PEARLIE","ZELMA","MALINDA","NOREEN","TAMEKA","SAUNDRA","HILLARY","AMIE","ALTHEA","ROSALINDA","JORDAN","LILIA","ALANA","GAY","CLARE","ALEJANDRA","ELINOR","MICHAEL","LORRIE","JERRI","DARCY","EARNESTINE","CARMELLA","TAYLOR","NOEMI","MARCIE","LIZA","ANNABELLE","LOUISA","EARLENE","MALLORY","CARLENE","NITA","SELENA","TANISHA","KATY","JULIANNE","JOHN","LAKISHA","EDWINA","MARICELA","MARGERY","KENYA","DOLLIE","ROXIE","ROSLYN","KATHRINE","NANETTE","CHARMAINE","LAVONNE","ILENE","KRIS","TAMMI","SUZETTE","CORINE","KAYE","JERRY","MERLE","CHRYSTAL","LINA","DEANNE","LILIAN","JULIANA","ALINE","LUANN","KASEY","MARYANNE","EVANGELINE","COLETTE","MELVA","LAWANDA","YESENIA","NADIA","MADGE","KATHIE","EDDIE","OPHELIA","VALERIA","NONA","MITZI","MARI","GEORGETTE","CLAUDINE","FRAN","ALISSA","ROSEANN","LAKEISHA","SUSANNA","REVA","DEIDRE","CHASITY","SHEREE","CARLY","JAMES","ELVIA","ALYCE","DEIRDRE","GENA","BRIANA","ARACELI","KATELYN","ROSANNE","WENDI","TESSA","BERTA","MARVA","IMELDA","MARIETTA","MARCI","LEONOR","ARLINE","SASHA","MADELYN","JANNA","JULIETTE","DEENA","AURELIA","JOSEFA","AUGUSTA","LILIANA","YOUNG","CHRISTIAN","LESSIE","AMALIA","SAVANNAH","ANASTASIA","VILMA","NATALIA","ROSELLA","LYNNETTE","CORINA","ALFREDA","LEANNA","CAREY","AMPARO","COLEEN","TAMRA","AISHA","WILDA","KARYN","CHERRY","QUEEN","MAURA","MAI","EVANGELINA","ROSANNA","HALLIE","ERNA","ENID","MARIANA","LACY","JULIET","JACKLYN","FREIDA","MADELEINE","MARA","HESTER","CATHRYN","LELIA","CASANDRA","BRIDGETT","ANGELITA","JANNIE","DIONNE","ANNMARIE","KATINA","BERYL","PHOEBE","MILLICENT","KATHERYN","DIANN","CARISSA","MARYELLEN","LIZ","LAURI","HELGA","GILDA","ADRIAN","RHEA","MARQUITA","HOLLIE","TISHA","TAMERA","ANGELIQUE","FRANCESCA","BRITNEY","KAITLIN","LOLITA","FLORINE","ROWENA","REYNA","TWILA","FANNY","JANELL","INES","CONCETTA","BERTIE","ALBA","BRIGITTE","ALYSON","VONDA","PANSY","ELBA","NOELLE","LETITIA","KITTY","DEANN","BRANDIE","LOUELLA","LETA","FELECIA","SHARLENE","LESA","BEVERLEY","ROBERT","ISABELLA","HERMINIA","TERRA","CELINA","TORI","OCTAVIA","JADE","DENICE","GERMAINE","SIERRA","MICHELL","CORTNEY","NELLY","DORETHA","SYDNEY","DEIDRA","MONIKA","LASHONDA","JUDI","CHELSEY","ANTIONETTE","MARGOT","BOBBY","ADELAIDE","NAN","LEEANN","ELISHA","DESSIE","LIBBY","KATHI","GAYLA","LATANYA","MINA","MELLISA","KIMBERLEE","JASMIN","RENAE","ZELDA","ELDA","MA","JUSTINA","GUSSIE","EMILIE","CAMILLA","ABBIE","ROCIO","KAITLYN","JESSE","EDYTHE","ASHLEIGH","SELINA","LAKESHA","GERI","ALLENE","PAMALA","MICHAELA","DAYNA","CARYN","ROSALIA","SUN","JACQULINE","REBECA","MARYBETH","KRYSTLE","IOLA","DOTTIE","BENNIE","BELLE","AUBREY","GRISELDA","ERNESTINA","ELIDA","ADRIANNE","DEMETRIA","DELMA","CHONG","JAQUELINE","DESTINY","ARLEEN","VIRGINA","RETHA","FATIMA","TILLIE","ELEANORE","CARI","TREVA","BIRDIE","WILHELMINA","ROSALEE","MAURINE","LATRICE","YONG","JENA","TARYN","ELIA","DEBBY","MAUDIE","JEANNA","DELILAH","CATRINA","SHONDA","HORTENCIA","THEODORA","TERESITA","ROBBIN","DANETTE","MARYJANE","FREDDIE","DELPHINE","BRIANNE","NILDA","DANNA","CINDI","BESS","IONA","HANNA","ARIEL","WINONA","VIDA","ROSITA","MARIANNA","WILLIAM","RACHEAL","GUILLERMINA","ELOISA","CELESTINE","CAREN","MALISSA","LONA","CHANTEL","SHELLIE","MARISELA","LEORA","AGATHA","SOLEDAD","MIGDALIA","IVETTE","CHRISTEN","ATHENA","JANEL","CHLOE","VEDA","PATTIE","TESSIE","TERA","MARILYNN","LUCRETIA","KARRIE","DINAH","DANIELA","ALECIA","ADELINA","VERNICE","SHIELA","PORTIA","MERRY","LASHAWN","DEVON","DARA","TAWANA","OMA","VERDA","CHRISTIN","ALENE","ZELLA","SANDI","RAFAELA","MAYA","KIRA","CANDIDA","ALVINA","SUZAN","SHAYLA","LYN","LETTIE","ALVA","SAMATHA","ORALIA","MATILDE","MADONNA","LARISSA","VESTA","RENITA","INDIA","DELOIS","SHANDA","PHILLIS","LORRI","ERLINDA","CRUZ","CATHRINE","BARB","ZOE","ISABELL","IONE","GISELA","CHARLIE","VALENCIA","ROXANNA","MAYME","KISHA","ELLIE","MELLISSA","DORRIS","DALIA","BELLA","ANNETTA","ZOILA","RETA","REINA","LAURETTA","KYLIE","CHRISTAL","PILAR","CHARLA","ELISSA","TIFFANI","TANA","PAULINA","LEOTA","BREANNA","JAYME","CARMEL","VERNELL","TOMASA","MANDI","DOMINGA","SANTA","MELODIE","LURA","ALEXA","TAMELA","RYAN","MIRNA","KERRIE","VENUS","NOEL","FELICITA","CRISTY","CARMELITA","BERNIECE","ANNEMARIE","TIARA","ROSEANNE","MISSY","CORI","ROXANA","PRICILLA","KRISTAL","JUNG","ELYSE","HAYDEE","ALETHA","BETTINA","MARGE","GILLIAN","FILOMENA","CHARLES","ZENAIDA","HARRIETTE","CARIDAD","VADA","UNA","ARETHA","PEARLINE","MARJORY","MARCELA","FLOR","EVETTE","ELOUISE","ALINA","TRINIDAD","DAVID","DAMARIS","CATHARINE","CARROLL","BELVA","NAKIA","MARLENA","LUANNE","LORINE","KARON","DORENE","DANITA","BRENNA","TATIANA","SAMMIE","LOUANN","LOREN","JULIANNA","ANDRIA","PHILOMENA","LUCILA","LEONORA","DOVIE","ROMONA","MIMI","JACQUELIN","GAYE","TONJA","MISTI","JOE","GENE","CHASTITY","STACIA","ROXANN","MICAELA","NIKITA","MEI","VELDA","MARLYS","JOHNNA","AURA","LAVERN","IVONNE","HAYLEY","NICKI","MAJORIE","HERLINDA","GEORGE","ALPHA","YADIRA","PERLA","GREGORIA","DANIEL","ANTONETTE","SHELLI","MOZELLE","MARIAH","JOELLE","CORDELIA","JOSETTE","CHIQUITA","TRISTA","LOUIS","LAQUITA","GEORGIANA","CANDI","SHANON","LONNIE","HILDEGARD","CECIL","VALENTINA","STEPHANY","MAGDA","KAROL","GERRY","GABRIELLA","TIANA","ROMA","RICHELLE","RAY","PRINCESS","OLETA","JACQUE","IDELLA","ALAINA","SUZANNA","JOVITA","BLAIR","TOSHA","RAVEN","NEREIDA","MARLYN","KYLA","JOSEPH","DELFINA","TENA","STEPHENIE","SABINA","NATHALIE","MARCELLE","GERTIE","DARLEEN","THEA","SHARONDA","SHANTEL","BELEN","VENESSA","ROSALINA","ONA","GENOVEVA","COREY","CLEMENTINE","ROSALBA","RENATE","RENATA","MI","IVORY","GEORGIANNA","FLOY","DORCAS","ARIANA","TYRA","THEDA","MARIAM","JULI","JESICA","DONNIE","VIKKI","VERLA","ROSELYN","MELVINA","JANNETTE","GINNY","DEBRAH","CORRIE","ASIA","VIOLETA","MYRTIS","LATRICIA","COLLETTE","CHARLEEN","ANISSA","VIVIANA","TWYLA","PRECIOUS","NEDRA","LATONIA","LAN","HELLEN","FABIOLA","ANNAMARIE","ADELL","SHARYN","CHANTAL","NIKI","MAUD","LIZETTE","LINDY","KIA","KESHA","JEANA","DANELLE","CHARLINE","CHANEL","CARROL","VALORIE","LIA","DORTHA","CRISTAL","SUNNY","LEONE","LEILANI","GERRI","DEBI","ANDRA","KESHIA","IMA","EULALIA","EASTER","DULCE","NATIVIDAD","LINNIE","KAMI","GEORGIE","CATINA","BROOK","ALDA","WINNIFRED","SHARLA","RUTHANN","MEAGHAN","MAGDALENE","LISSETTE","ADELAIDA","VENITA","TRENA","SHIRLENE","SHAMEKA","ELIZEBETH","DIAN","SHANTA","MICKEY","LATOSHA","CARLOTTA","WINDY","SOON","ROSINA","MARIANN","LEISA","JONNIE","DAWNA","CATHIE","BILLY","ASTRID","SIDNEY","LAUREEN","JANEEN","HOLLI","FAWN","VICKEY","TERESSA","SHANTE","RUBYE","MARCELINA","CHANDA","CARY","TERESE","SCARLETT","MARTY","MARNIE","LULU","LISETTE","JENIFFER","ELENOR","DORINDA","DONITA","CARMAN","BERNITA","ALTAGRACIA","ALETA","ADRIANNA","ZORAIDA","RONNIE","NICOLA","LYNDSEY","KENDALL","JANINA","CHRISSY","AMI","STARLA","PHYLIS","PHUONG","KYRA","CHARISSE","BLANCH","SANJUANITA","RONA","NANCI","MARILEE","MARANDA","CORY","BRIGETTE","SANJUANA","MARITA","KASSANDRA","JOYCELYN","IRA","FELIPA","CHELSIE","BONNY","MIREYA","LORENZA","KYONG","ILEANA","CANDELARIA","TONY","TOBY","SHERIE","OK","MARK","LUCIE","LEATRICE","LAKESHIA","GERDA","EDIE","BAMBI","MARYLIN","LAVON","HORTENSE","GARNET","EVIE","TRESSA","SHAYNA","LAVINA","KYUNG","JEANETTA","SHERRILL","SHARA","PHYLISS","MITTIE","ANABEL","ALESIA","THUY","TAWANDA","RICHARD","JOANIE","TIFFANIE","LASHANDA","KARISSA","ENRIQUETA","DARIA","DANIELLA","CORINNA","ALANNA","ABBEY","ROXANE","ROSEANNA","MAGNOLIA","LIDA","KYLE","JOELLEN","ERA","CORAL","CARLEEN","TRESA","PEGGIE","NOVELLA","NILA","MAYBELLE","JENELLE","CARINA","NOVA","MELINA","MARQUERITE","MARGARETTE","JOSEPHINA","EVONNE","DEVIN","CINTHIA","ALBINA","TOYA","TAWNYA","SHERITA","SANTOS","MYRIAM","LIZABETH","LISE","KEELY","JENNI","GISELLE","CHERYLE","ARDITH","ARDIS","ALESHA","ADRIANE","SHAINA","LINNEA","KAROLYN","HONG","FLORIDA","FELISHA","DORI","DARCI","ARTIE","ARMIDA","ZOLA","XIOMARA","VERGIE","SHAMIKA","NENA","NANNETTE","MAXIE","LOVIE","JEANE","JAIMIE","INGE","FARRAH","ELAINA","CAITLYN","STARR","FELICITAS","CHERLY","CARYL","YOLONDA","YASMIN","TEENA","PRUDENCE","PENNIE","NYDIA","MACKENZIE","ORPHA","MARVEL","LIZBETH","LAURETTE","JERRIE","HERMELINDA","CAROLEE","TIERRA","MIRIAN","META","MELONY","KORI","JENNETTE","JAMILA","ENA","ANH","YOSHIKO","SUSANNAH","SALINA","RHIANNON","JOLEEN","CRISTINE","ASHTON","ARACELY","TOMEKA","SHALONDA","MARTI","LACIE","KALA","JADA","ILSE","HAILEY","BRITTANI","ZONA","SYBLE","SHERRYL","RANDY","NIDIA","MARLO","KANDICE","KANDI","DEB","DEAN","AMERICA","ALYCIA","TOMMY","RONNA","NORENE","MERCY","JOSE","INGEBORG","GIOVANNA","GEMMA","CHRISTEL","AUDRY","ZORA","VITA","VAN","TRISH","STEPHAINE","SHIRLEE","SHANIKA","MELONIE","MAZIE","JAZMIN","INGA","HOA","HETTIE","GERALYN","FONDA","ESTRELLA","ADELLA","SU","SARITA","RINA","MILISSA","MARIBETH","GOLDA","EVON","ETHELYN","ENEDINA","CHERISE","CHANA","VELVA","TAWANNA","SADE","MIRTA","LI","KARIE","JACINTA","ELNA","DAVINA","CIERRA","ASHLIE","ALBERTHA","TANESHA","STEPHANI","NELLE","MINDI","LU","LORINDA","LARUE","FLORENE","DEMETRA","DEDRA","CIARA","CHANTELLE","ASHLY","SUZY","ROSALVA","NOELIA","LYDA","LEATHA","KRYSTYNA","KRISTAN","KARRI","DARLINE","DARCIE","CINDA","CHEYENNE","CHERRIE","AWILDA","ALMEDA","ROLANDA","LANETTE","JERILYN","GISELE","EVALYN","CYNDI","CLETA","CARIN","ZINA","ZENA","VELIA","TANIKA","PAUL","CHARISSA","THOMAS","TALIA","MARGARETE","LAVONDA","KAYLEE","KATHLENE","JONNA","IRENA","ILONA","IDALIA","CANDIS","CANDANCE","BRANDEE","ANITRA","ALIDA","SIGRID","NICOLETTE","MARYJO","LINETTE","HEDWIG","CHRISTIANA","CASSIDY","ALEXIA","TRESSIE","MODESTA","LUPITA","LITA","GLADIS","EVELIA","DAVIDA","CHERRI","CECILY","ASHELY","ANNABEL","AGUSTINA","WANITA","SHIRLY","ROSAURA","HULDA","EUN","BAILEY","YETTA","VERONA","THOMASINA","SIBYL","SHANNAN","MECHELLE","LUE","LEANDRA","LANI","KYLEE","KANDY","JOLYNN","FERNE","EBONI","CORENE","ALYSIA","ZULA","NADA","MOIRA","LYNDSAY","LORRETTA","JUAN","JAMMIE","HORTENSIA","GAYNELL","CAMERON","ADRIA","VINA","VICENTA","TANGELA","STEPHINE","NORINE","NELLA","LIANA","LESLEE","KIMBERELY","ILIANA","GLORY","FELICA","EMOGENE","ELFRIEDE","EDEN","EARTHA","CARMA","BEA","OCIE","MARRY","LENNIE","KIARA","JACALYN","CARLOTA","ARIELLE","YU","STAR","OTILIA","KIRSTIN","KACEY","JOHNETTA","JOEY","JOETTA","JERALDINE","JAUNITA","ELANA","DORTHEA","CAMI","AMADA","ADELIA","VERNITA","TAMAR","SIOBHAN","RENEA","RASHIDA","OUIDA","ODELL","NILSA","MERYL","KRISTYN","JULIETA","DANICA","BREANNE","AUREA","ANGLEA","SHERRON","ODETTE","MALIA","LORELEI","LIN","LEESA","KENNA","KATHLYN","FIONA","CHARLETTE","SUZIE","SHANTELL","SABRA","RACQUEL","MYONG","MIRA","MARTINE","LUCIENNE","LAVADA","JULIANN","JOHNIE","ELVERA","DELPHIA","CLAIR","CHRISTIANE","CHAROLETTE","CARRI","AUGUSTINE","ASHA","ANGELLA","PAOLA","NINFA","LEDA","LAI","EDA","SUNSHINE","STEFANI","SHANELL","PALMA","MACHELLE","LISSA","KECIA","KATHRYNE","KARLENE","JULISSA","JETTIE","JENNIFFER","HUI","CORRINA","CHRISTOPHER","CAROLANN","ALENA","TESS","ROSARIA","MYRTICE","MARYLEE","LIANE","KENYATTA","JUDIE","JANEY","IN","ELMIRA","ELDORA","DENNA","CRISTI","CATHI","ZAIDA","VONNIE","VIVA","VERNIE","ROSALINE","MARIELA","LUCIANA","LESLI","KARAN","FELICE","DENEEN","ADINA","WYNONA","TARSHA","SHERON","SHASTA","SHANITA","SHANI","SHANDRA","RANDA","PINKIE","PARIS","NELIDA","MARILOU","LYLA","LAURENE","LACI","JOI","JANENE","DOROTHA","DANIELE","DANI","CAROLYNN","CARLYN","BERENICE","AYESHA","ANNELIESE","ALETHEA","THERSA","TAMIKO","RUFINA","OLIVA","MOZELL","MARYLYN","MADISON","KRISTIAN","KATHYRN","KASANDRA","KANDACE","JANAE","GABRIEL","DOMENICA","DEBBRA","DANNIELLE","CHUN","BUFFY","BARBIE","ARCELIA","AJA","ZENOBIA","SHAREN","SHAREE","PATRICK","PAGE","MY","LAVINIA","KUM","KACIE","JACKELINE","HUONG","FELISA","EMELIA","ELEANORA","CYTHIA","CRISTIN","CLYDE","CLARIBEL","CARON","ANASTACIA","ZULMA","ZANDRA","YOKO","TENISHA","SUSANN","SHERILYN","SHAY","SHAWANDA","SABINE","ROMANA","MATHILDA","LINSEY","KEIKO","JOANA","ISELA","GRETTA","GEORGETTA","EUGENIE","DUSTY","DESIRAE","DELORA","CORAZON","ANTONINA","ANIKA","WILLENE","TRACEE","TAMATHA","REGAN","NICHELLE","MICKIE","MAEGAN","LUANA","LANITA","KELSIE","EDELMIRA","BREE","AFTON","TEODORA","TAMIE","SHENA","MEG","LINH","KELI","KACI","DANYELLE","BRITT","ARLETTE","ALBERTINE","ADELLE","TIFFINY","STORMY","SIMONA","NUMBERS","NICOLASA","NICHOL","NIA","NAKISHA","MEE","MAIRA","LOREEN","KIZZY","JOHNNY","JAY","FALLON","CHRISTENE","BOBBYE","ANTHONY","YING","VINCENZA","TANJA","RUBIE","RONI","QUEENIE","MARGARETT","KIMBERLI","IRMGARD","IDELL","HILMA","EVELINA","ESTA","EMILEE","DENNISE","DANIA","CARL","CARIE","ANTONIO","WAI","SANG","RISA","RIKKI","PARTICIA","MUI","MASAKO","MARIO","LUVENIA","LOREE","LONI","LIEN","KEVIN","GIGI","FLORENCIA","DORIAN","DENITA","DALLAS","CHI","BILLYE","ALEXANDER","TOMIKA","SHARITA","RANA","NIKOLE","NEOMA","MARGARITE","MADALYN","LUCINA","LAILA","KALI","JENETTE","GABRIELE","EVELYNE","ELENORA","CLEMENTINA","ALEJANDRINA","ZULEMA","VIOLETTE","VANNESSA","THRESA","RETTA","PIA","PATIENCE","NOELLA","NICKIE","JONELL","DELTA","CHUNG","CHAYA","CAMELIA","BETHEL","ANYA","ANDREW","THANH","SUZANN","SPRING","SHU","MILA","LILLA","LAVERNA","KEESHA","KATTIE","GIA","GEORGENE","EVELINE","ESTELL","ELIZBETH","VIVIENNE","VALLIE","TRUDIE","STEPHANE","MICHEL","MAGALY","MADIE","KENYETTA","KARREN","JANETTA","HERMINE","HARMONY","DRUCILLA","DEBBI","CELESTINA","CANDIE","BRITNI","BECKIE","AMINA","ZITA","YUN","YOLANDE","VIVIEN","VERNETTA","TRUDI","SOMMER","PEARLE","PATRINA","OSSIE","NICOLLE","LOYCE","LETTY","LARISA","KATHARINA","JOSELYN","JONELLE","JENELL","IESHA","HEIDE","FLORINDA","FLORENTINA","FLO","ELODIA","DORINE","BRUNILDA","BRIGID","ASHLI","ARDELLA","TWANA","THU","TARAH","SUNG","SHEA","SHAVON","SHANE","SERINA","RAYNA","RAMONITA","NGA","MARGURITE","LUCRECIA","KOURTNEY","KATI","JESUS","JESENIA","DIAMOND","CRISTA","AYANA","ALICA","ALIA","VINNIE","SUELLEN","ROMELIA","RACHELL","PIPER","OLYMPIA","MICHIKO","KATHALEEN","JOLIE","JESSI","JANESSA","HANA","HA","ELEASE","CARLETTA","BRITANY","SHONA","SALOME","ROSAMOND","REGENA","RAINA","NGOC","NELIA","LOUVENIA","LESIA","LATRINA","LATICIA","LARHONDA","JINA","JACKI","HOLLIS","HOLLEY","EMMY","DEEANN","CORETTA","ARNETTA","VELVET","THALIA","SHANICE","NETA","MIKKI","MICKI","LONNA","LEANA","LASHUNDA","KILEY","JOYE","JACQULYN","IGNACIA","HYUN","HIROKO","HENRY","HENRIETTE","ELAYNE","DELINDA","DARNELL","DAHLIA","COREEN","CONSUELA","CONCHITA","CELINE","BABETTE","AYANNA","ANETTE","ALBERTINA","SKYE","SHAWNEE","SHANEKA","QUIANA","PAMELIA","MIN","MERRI","MERLENE","MARGIT","KIESHA","KIERA","KAYLENE","JODEE","JENISE","ERLENE","EMMIE","ELSE","DARYL","DALILA","DAISEY","CODY","CASIE","BELIA","BABARA","VERSIE","VANESA","SHELBA","SHAWNDA","SAM","NORMAN","NIKIA","NAOMA","MARNA","MARGERET","MADALINE","LAWANA","KINDRA","JUTTA","JAZMINE","JANETT","HANNELORE","GLENDORA","GERTRUD","GARNETT","FREEDA","FREDERICA","FLORANCE","FLAVIA","DENNIS","CARLINE","BEVERLEE","ANJANETTE","VALDA","TRINITY","TAMALA","STEVIE","SHONNA","SHA","SARINA","ONEIDA","MICAH","MERILYN","MARLEEN","LURLINE","LENNA","KATHERIN","JIN","JENI","HAE","GRACIA","GLADY","FARAH","ERIC","ENOLA","EMA","DOMINQUE","DEVONA","DELANA","CECILA","CAPRICE","ALYSHA","ALI","ALETHIA","VENA","THERESIA","TAWNY","SONG","SHAKIRA","SAMARA","SACHIKO","RACHELE","PAMELLA","NICKY","MARNI","MARIEL","MAREN","MALISA","LIGIA","LERA","LATORIA","LARAE","KIMBER","KATHERN","KAREY","JENNEFER","JANETH","HALINA","FREDIA","DELISA","DEBROAH","CIERA","CHIN","ANGELIKA","ANDREE","ALTHA","YEN","VIVAN","TERRESA","TANNA","SUK","SUDIE","SOO","SIGNE","SALENA","RONNI","REBBECCA","MYRTIE","MCKENZIE","MALIKA","MAIDA","LOAN","LEONARDA","KAYLEIGH","FRANCE","ETHYL","ELLYN","DAYLE","CAMMIE","BRITTNI","BIRGIT","AVELINA","ASUNCION","ARIANNA","AKIKO","VENICE","TYESHA","TONIE","TIESHA","TAKISHA","STEFFANIE","SINDY","SANTANA","MEGHANN","MANDA","MACIE","LADY","KELLYE","KELLEE","JOSLYN","JASON","INGER","INDIRA","GLINDA","GLENNIS","FERNANDA","FAUSTINA","ENEIDA","ELICIA","DOT","DIGNA","DELL","ARLETTA","ANDRE","WILLIA","TAMMARA","TABETHA","SHERRELL","SARI","REFUGIO","REBBECA","PAULETTA","NIEVES","NATOSHA","NAKITA","MAMMIE","KENISHA","KAZUKO","KASSIE","GARY","EARLEAN","DAPHINE","CORLISS","CLOTILDE","CAROLYNE","BERNETTA","AUGUSTINA","AUDREA","ANNIS","ANNABELL","YAN","TENNILLE","TAMICA","SELENE","SEAN","ROSANA","REGENIA","QIANA","MARKITA","MACY","LEEANNE","LAURINE","KYM","JESSENIA","JANITA","GEORGINE","GENIE","EMIKO","ELVIE","DEANDRA","DAGMAR","CORIE","COLLEN","CHERISH","ROMAINE","PORSHA","PEARLENE","MICHELINE","MERNA","MARGORIE","MARGARETTA","LORE","KENNETH","JENINE","HERMINA","FREDERICKA","ELKE","DRUSILLA","DORATHY","DIONE","DESIRE","CELENA","BRIGIDA","ANGELES","ALLEGRA","THEO","TAMEKIA","SYNTHIA","STEPHEN","SOOK","SLYVIA","ROSANN","REATHA","RAYE","MARQUETTA","MARGART","LING","LAYLA","KYMBERLY","KIANA","KAYLEEN","KATLYN","KARMEN","JOELLA","IRINA","EMELDA","ELENI","DETRA","CLEMMIE","CHERYLL","CHANTELL","CATHEY","ARNITA","ARLA","ANGLE","ANGELIC","ALYSE","ZOFIA","THOMASINE","TENNIE","SON","SHERLY","SHERLEY","SHARYL","REMEDIOS","PETRINA","NICKOLE","MYUNG","MYRLE","MOZELLA","LOUANNE","LISHA","LATIA","LANE","KRYSTA","JULIENNE","JOEL","JEANENE","JACQUALINE","ISAURA","GWENDA","EARLEEN","DONALD","CLEOPATRA","CARLIE","AUDIE","ANTONIETTA","ALISE","ALEX","VERDELL","VAL","TYLER","TOMOKO","THAO","TALISHA","STEVEN","SO","SHEMIKA","SHAUN","SCARLET","SAVANNA","SANTINA","ROSIA","RAEANN","ODILIA","NANA","MINNA","MAGAN","LYNELLE","LE","KARMA","JOEANN","IVANA","INELL","ILANA","HYE","HONEY","HEE","GUDRUN","FRANK","DREAMA","CRISSY","CHANTE","CARMELINA","ARVILLA","ARTHUR","ANNAMAE","ALVERA","ALEIDA","AARON","YEE","YANIRA","VANDA","TIANNA","TAM","STEFANIA","SHIRA","PERRY","NICOL","NANCIE","MONSERRATE","MINH","MELYNDA","MELANY","MATTHEW","LOVELLA","LAURE","KIRBY","KACY","JACQUELYNN","HYON","GERTHA","FRANCISCO","ELIANA","CHRISTENA","CHRISTEEN","CHARISE","CATERINA","CARLEY","CANDYCE","ARLENA","AMMIE","YANG","WILLETTE","VANITA","TUYET","TINY","SYREETA","SILVA","SCOTT","RONALD","PENNEY","NYLA","MICHAL","MAURICE","MARYAM","MARYA","MAGEN","LUDIE","LOMA","LIVIA","LANELL","KIMBERLIE","JULEE","DONETTA","DIEDRA","DENISHA","DEANE","DAWNE","CLARINE","CHERRYL","BRONWYN","BRANDON","ALLA","VALERY","TONDA","SUEANN","SORAYA","SHOSHANA","SHELA","SHARLEEN","SHANELLE","NERISSA","MICHEAL","MERIDITH","MELLIE","MAYE","MAPLE","MAGARET","LUIS","LILI","LEONILA","LEONIE","LEEANNA","LAVONIA","LAVERA","KRISTEL","KATHEY","KATHE","JUSTIN","JULIAN","JIMMY","JANN","ILDA","HILDRED","HILDEGARDE","GENIA","FUMIKO","EVELIN","ERMELINDA","ELLY","DUNG","DOLORIS","DIONNA","DANAE","BERNEICE","ANNICE","ALIX","VERENA","VERDIE","TRISTAN","SHAWNNA","SHAWANA","SHAUNNA","ROZELLA","RANDEE","RANAE","MILAGRO","LYNELL","LUISE","LOUIE","LOIDA","LISBETH","KARLEEN","JUNITA","JONA","ISIS","HYACINTH","HEDY","GWENN","ETHELENE","ERLINE","EDWARD","DONYA","DOMONIQUE","DELICIA","DANNETTE","CICELY","BRANDA","BLYTHE","BETHANN","ASHLYN","ANNALEE","ALLINE","YUKO","VELLA","TRANG","TOWANDA","TESHA","SHERLYN","NARCISA","MIGUELINA","MERI","MAYBELL","MARLANA","MARGUERITA","MADLYN","LUNA","LORY","LORIANN","LIBERTY","LEONORE","LEIGHANN","LAURICE","LATESHA","LARONDA","KATRICE","KASIE","KARL","KALEY","JADWIGA","GLENNIE","GEARLDINE","FRANCINA","EPIFANIA","DYAN","DORIE","DIEDRE","DENESE","DEMETRICE","DELENA","DARBY","CRISTIE","CLEORA","CATARINA","CARISA","BERNIE","BARBERA","ALMETA","TRULA","TEREASA","SOLANGE","SHEILAH","SHAVONNE","SANORA","ROCHELL","MATHILDE","MARGARETA","MAIA","LYNSEY","LAWANNA","LAUNA","KENA","KEENA","KATIA","JAMEY","GLYNDA","GAYLENE","ELVINA","ELANOR","DANUTA","DANIKA","CRISTEN","CORDIE","COLETTA","CLARITA","CARMON","BRYNN","AZUCENA","AUNDREA","ANGELE","YI","WALTER","VERLIE","VERLENE","TAMESHA","SILVANA","SEBRINA","SAMIRA","REDA","RAYLENE","PENNI","PANDORA","NORAH","NOMA","MIREILLE","MELISSIA","MARYALICE","LARAINE","KIMBERY","KARYL","KARINE","KAM","JOLANDA","JOHANA","JESUSA","JALEESA","JAE","JACQUELYNE","IRISH","ILUMINADA","HILARIA","HANH","GENNIE","FRANCIE","FLORETTA","EXIE","EDDA","DREMA","DELPHA","BEV","BARBAR","ASSUNTA","ARDELL","ANNALISA","ALISIA","YUKIKO","YOLANDO","WONDA","WEI","WALTRAUD","VETA","TEQUILA","TEMEKA","TAMEIKA","SHIRLEEN","SHENITA","PIEDAD","OZELLA","MIRTHA","MARILU","KIMIKO","JULIANE","JENICE","JEN","JANAY","JACQUILINE","HILDE","FE","FAE","EVAN","EUGENE","ELOIS","ECHO","DEVORAH","CHAU","BRINDA","BETSEY","ARMINDA","ARACELIS","APRYL","ANNETT","ALISHIA","VEOLA","USHA","TOSHIKO","THEOLA","TASHIA","TALITHA","SHERY","RUDY","RENETTA","REIKO","RASHEEDA","OMEGA","OBDULIA","MIKA","MELAINE","MEGGAN","MARTIN","MARLEN","MARGET","MARCELINE","MANA","MAGDALEN","LIBRADA","LEZLIE","LEXIE","LATASHIA","LASANDRA","KELLE","ISIDRA","ISA","INOCENCIA","GWYN","FRANCOISE","ERMINIA","ERINN","DIMPLE","DEVORA","CRISELDA","ARMANDA","ARIE","ARIANE","ANGELO","ANGELENA","ALLEN","ALIZA","ADRIENE","ADALINE","XOCHITL","TWANNA","TRAN","TOMIKO","TAMISHA","TAISHA","SUSY","SIU","RUTHA","ROXY","RHONA","RAYMOND","OTHA","NORIKO","NATASHIA","MERRIE","MELVIN","MARINDA","MARIKO","MARGERT","LORIS","LIZZETTE","LEISHA","KAILA","KA","JOANNIE","JERRICA","JENE","JANNET","JANEE","JACINDA","HERTA","ELENORE","DORETTA","DELAINE","DANIELL","CLAUDIE","CHINA","BRITTA","APOLONIA","AMBERLY","ALEASE","YURI","YUK","WEN","WANETA","UTE","TOMI","SHARRI","SANDIE","ROSELLE","REYNALDA","RAGUEL","PHYLICIA","PATRIA","OLIMPIA","ODELIA","MITZIE","MITCHELL","MISS","MINDA","MIGNON","MICA","MENDY","MARIVEL","MAILE","LYNETTA","LAVETTE","LAURYN","LATRISHA","LAKIESHA","KIERSTEN","KARY","JOSPHINE","JOLYN","JETTA","JANISE","JACQUIE","IVELISSE","GLYNIS","GIANNA","GAYNELLE","EMERALD","DEMETRIUS","DANYELL","DANILLE","DACIA","CORALEE","CHER","CEOLA","BRETT","BELL","ARIANNE","ALESHIA","YUNG","WILLIEMAE","TROY","TRINH","THORA","TAI","SVETLANA","SHERIKA","SHEMEKA","SHAUNDA","ROSELINE","RICKI","MELDA","MALLIE","LAVONNA","LATINA","LARRY","LAQUANDA","LALA","LACHELLE","KLARA","KANDIS","JOHNA","JEANMARIE","JAYE","HANG","GRAYCE","GERTUDE","EMERITA","EBONIE","CLORINDA","CHING","CHERY","CAROLA","BREANN","BLOSSOM","BERNARDINE","BECKI","ARLETHA","ARGELIA","ARA","ALITA","YULANDA","YON","YESSENIA","TOBI","TASIA","SYLVIE","SHIRL","SHIRELY","SHERIDAN","SHELLA","SHANTELLE","SACHA","ROYCE","REBECKA","REAGAN","PROVIDENCIA","PAULENE","MISHA","MIKI","MARLINE","MARICA","LORITA","LATOYIA","LASONYA","KERSTIN","KENDA","KEITHA","KATHRIN","JAYMIE","JACK","GRICELDA","GINETTE","ERYN","ELINA","ELFRIEDA","DANYEL","CHEREE","CHANELLE","BARRIE","AVERY","AURORE","ANNAMARIA","ALLEEN","AILENE","AIDE","YASMINE","VASHTI","VALENTINE","TREASA","TORY","TIFFANEY","SHERYLL","SHARIE","SHANAE","SAU","RAISA","PA","NEDA","MITSUKO","MIRELLA","MILDA","MARYANNA","MARAGRET","MABELLE","LUETTA","LORINA","LETISHA","LATARSHA","LANELLE","LAJUANA","KRISSY","KARLY","KARENA","JON","JESSIKA","JERICA","JEANELLE","JANUARY","JALISA","JACELYN","IZOLA","IVEY","GREGORY","EUNA","ETHA","DREW","DOMITILA","DOMINICA","DAINA","CREOLA","CARLI","CAMIE","BUNNY","BRITTNY","ASHANTI","ANISHA","ALEEN","ADAH","YASUKO","WINTER","VIKI","VALRIE","TONA","TINISHA","THI","TERISA","TATUM","TANEKA","SIMONNE","SHALANDA","SERITA","RESSIE","REFUGIA","PAZ","OLENE","NA","MERRILL","MARGHERITA","MANDIE","MAN","MAIRE","LYNDIA","LUCI","LORRIANE","LORETA","LEONIA","LAVONA","LASHAWNDA","LAKIA","KYOKO","KRYSTINA","KRYSTEN","KENIA","KELSI","JUDE","JEANICE","ISOBEL","GEORGIANN","GENNY","FELICIDAD","EILENE","DEON","DELOISE","DEEDEE","DANNIE","CONCEPTION","CLORA","CHERILYN","CHANG","CALANDRA","BERRY","ARMANDINA","ANISA","ULA","TIMOTHY","TIERA","THERESSA","STEPHANIA","SIMA","SHYLA","SHONTA","SHERA","SHAQUITA","SHALA","SAMMY","ROSSANA","NOHEMI","NERY","MORIAH","MELITA","MELIDA","MELANI","MARYLYNN","MARISHA","MARIETTE","MALORIE","MADELENE","LUDIVINA","LORIA","LORETTE","LORALEE","LIANNE","LEON","LAVENIA","LAURINDA","LASHON","KIT","KIMI","KEILA","KATELYNN","KAI","JONE","JOANE","JI","JAYNA","JANELLA","JA","HUE","HERTHA","FRANCENE","ELINORE","DESPINA","DELSIE","DEEDRA","CLEMENCIA","CARRY","CAROLIN","CARLOS","BULAH","BRITTANIE","BOK","BLONDELL","BIBI","BEAULAH","BEATA","ANNITA","AGRIPINA","VIRGEN","VALENE","UN","TWANDA","TOMMYE","TOI","TARRA","TARI","TAMMERA","SHAKIA","SADYE","RUTHANNE","ROCHEL","RIVKA","PURA","NENITA","NATISHA","MING","MERRILEE","MELODEE","MARVIS","LUCILLA","LEENA","LAVETA","LARITA","LANIE","KEREN","ILEEN","GEORGEANN","GENNA","GENESIS","FRIDA","EWA","EUFEMIA","EMELY","ELA","EDYTH","DEONNA","DEADRA","DARLENA","CHANELL","CHAN","CATHERN","CASSONDRA","CASSAUNDRA","BERNARDA","BERNA","ARLINDA","ANAMARIA","ALBERT","WESLEY","VERTIE","VALERI","TORRI","TATYANA","STASIA","SHERISE","SHERILL","SEASON","SCOTTIE","SANDA","RUTHE","ROSY","ROBERTO","ROBBI","RANEE","QUYEN","PEARLY","PALMIRA","ONITA","NISHA","NIESHA","NIDA","NEVADA","NAM","MERLYN","MAYOLA","MARYLOUISE","MARYLAND","MARX","MARTH","MARGENE","MADELAINE","LONDA","LEONTINE","LEOMA","LEIA","LAWRENCE","LAURALEE","LANORA","LAKITA","KIYOKO","KETURAH","KATELIN","KAREEN","JONIE","JOHNETTE","JENEE","JEANETT","IZETTA","HIEDI","HEIKE","HASSIE","HAROLD","GIUSEPPINA","GEORGANN","FIDELA","FERNANDE","ELWANDA","ELLAMAE","ELIZ","DUSTI","DOTTY","CYNDY","CORALIE","CELESTA","ARGENTINA","ALVERTA","XENIA","WAVA","VANETTA","TORRIE","TASHINA","TANDY","TAMBRA","TAMA","STEPANIE","SHILA","SHAUNTA","SHARAN","SHANIQUA","SHAE","SETSUKO","SERAFINA","SANDEE","ROSAMARIA","PRISCILA","OLINDA","NADENE","MUOI","MICHELINA","MERCEDEZ","MARYROSE","MARIN","MARCENE","MAO","MAGALI","MAFALDA","LOGAN","LINN","LANNIE","KAYCE","KAROLINE","KAMILAH","KAMALA","JUSTA","JOLINE","JENNINE","JACQUETTA","IRAIDA","GERALD","GEORGEANNA","FRANCHESCA","FAIRY","EMELINE","ELANE","EHTEL","EARLIE","DULCIE","DALENE","CRIS","CLASSIE","CHERE","CHARIS","CAROYLN","CARMINA","CARITA","BRIAN","BETHANIE","AYAKO","ARICA","AN","ALYSA","ALESSANDRA","AKILAH","ADRIEN","ZETTA","YOULANDA","YELENA","YAHAIRA","XUAN","WENDOLYN","VICTOR","TIJUANA","TERRELL","TERINA","TERESIA","SUZI","SUNDAY","SHERELL","SHAVONDA","SHAUNTE","SHARDA","SHAKITA","SENA","RYANN","RUBI","RIVA","REGINIA","REA","RACHAL","PARTHENIA","PAMULA","MONNIE","MONET","MICHAELE","MELIA","MARINE","MALKA","MAISHA","LISANDRA","LEO","LEKISHA","LEAN","LAURENCE","LAKENDRA","KRYSTIN","KORTNEY","KIZZIE","KITTIE","KERA","KENDAL","KEMBERLY","KANISHA","JULENE","JULE","JOSHUA","JOHANNE","JEFFREY","JAMEE","HAN","HALLEY","GIDGET","GALINA","FREDRICKA","FLETA","FATIMAH","EUSEBIA","ELZA","ELEONORE","DORTHEY","DORIA","DONELLA","DINORAH","DELORSE","CLARETHA","CHRISTINIA","CHARLYN","BONG","BELKIS","AZZIE","ANDERA","AIKO","ADENA","YER","YAJAIRA","WAN","VANIA","ULRIKE","TOSHIA","TIFANY","STEFANY","SHIZUE","SHENIKA","SHAWANNA","SHAROLYN","SHARILYN","SHAQUANA","SHANTAY","SEE","ROZANNE","ROSELEE","RICKIE","REMONA","REANNA","RAELENE","QUINN","PHUNG","PETRONILA","NATACHA","NANCEY","MYRL","MIYOKO","MIESHA","MERIDETH","MARVELLA","MARQUITTA","MARHTA","MARCHELLE","LIZETH","LIBBIE","LAHOMA","LADAWN","KINA","KATHELEEN","KATHARYN","KARISA","KALEIGH","JUNIE","JULIEANN","JOHNSIE","JANEAN","JAIMEE","JACKQUELINE","HISAKO","HERMA","HELAINE","GWYNETH","GLENN","GITA","EUSTOLIA","EMELINA","ELIN","EDRIS","DONNETTE","DONNETTA","DIERDRE","DENAE","DARCEL","CLAUDE","CLARISA","CINDERELLA","CHIA","CHARLESETTA","CHARITA","CELSA","CASSY","CASSI","CARLEE","BRUNA","BRITTANEY","BRANDE","BILLI","BAO","ANTONETTA","ANGLA","ANGELYN","ANALISA","ALANE","WENONA","WENDIE","VERONIQUE","VANNESA","TOBIE","TEMPIE","SUMIKO","SULEMA","SPARKLE","SOMER","SHEBA","SHAYNE","SHARICE","SHANEL","SHALON","SAGE","ROY","ROSIO","ROSELIA","RENAY","REMA","REENA","PORSCHE","PING","PEG","OZIE","ORETHA","ORALEE","ODA","NU","NGAN","NAKESHA","MILLY","MARYBELLE","MARLIN","MARIS","MARGRETT","MARAGARET","MANIE","LURLENE","LILLIA","LIESELOTTE","LAVELLE","LASHAUNDA","LAKEESHA","KEITH","KAYCEE","KALYN","JOYA","JOETTE","JENAE","JANIECE","ILLA","GRISEL","GLAYDS","GENEVIE","GALA","FREDDA","FRED","ELMER","ELEONOR","DEBERA","DEANDREA","DAN","CORRINNE","CORDIA","CONTESSA","COLENE","CLEOTILDE","CHARLOTT","CHANTAY","CECILLE","BEATRIS","AZALEE","ARLEAN","ARDATH","ANJELICA","ANJA","ALFREDIA","ALEISHA","ADAM","ZADA","YUONNE","XIAO","WILLODEAN","WHITLEY","VENNIE","VANNA","TYISHA","TOVA","TORIE","TONISHA","TILDA","TIEN","TEMPLE","SIRENA","SHERRIL","SHANTI","SHAN","SENAIDA","SAMELLA","ROBBYN","RENDA","REITA","PHEBE","PAULITA","NOBUKO","NGUYET","NEOMI","MOON","MIKAELA","MELANIA","MAXIMINA","MARG","MAISIE","LYNNA","LILLI","LAYNE","LASHAUN","LAKENYA","LAEL","KIRSTIE","KATHLINE","KASHA","KARLYN","KARIMA","JOVAN","JOSEFINE","JENNELL","JACQUI","JACKELYN","HYO","HIEN","GRAZYNA","FLORRIE","FLORIA","ELEONORA","DWANA","DORLA","DONG","DELMY","DEJA","DEDE","DANN","CRYSTA","CLELIA","CLARIS","CLARENCE","CHIEKO","CHERLYN","CHERELLE","CHARMAIN","CHARA","CAMMY","BEE","ARNETTE","ARDELLE","ANNIKA","AMIEE","AMEE","ALLENA","YVONE","YUKI","YOSHIE","YEVETTE","YAEL","WILLETTA","VONCILE","VENETTA","TULA","TONETTE","TIMIKA","TEMIKA","TELMA","TEISHA","TAREN","TA","STACEE","SHIN","SHAWNTA","SATURNINA","RICARDA","POK","PASTY","ONIE","NUBIA","MORA","MIKE","MARIELLE","MARIELLA","MARIANELA","MARDELL","MANY","LUANNA","LOISE","LISABETH","LINDSY","LILLIANA","LILLIAM","LELAH","LEIGHA","LEANORA","LANG","KRISTEEN","KHALILAH","KEELEY","KANDRA","JUNKO","JOAQUINA","JERLENE","JANI","JAMIKA","JAME","HSIU","HERMILA","GOLDEN","GENEVIVE","EVIA","EUGENA","EMMALINE","ELFREDA","ELENE","DONETTE","DELCIE","DEEANNA","DARCEY","CUC","CLARINDA","CIRA","CHAE","CELINDA","CATHERYN","CATHERIN","CASIMIRA","CARMELIA","CAMELLIA","BREANA","BOBETTE","BERNARDINA","BEBE","BASILIA","ARLYNE","AMAL","ALAYNA","ZONIA","ZENIA","YURIKO","YAEKO","WYNELL","WILLOW","WILLENA","VERNIA","TU","TRAVIS","TORA","TERRILYN","TERICA","TENESHA","TAWNA","TAJUANA","TAINA","STEPHNIE","SONA","SOL","SINA","SHONDRA","SHIZUKO","SHERLENE","SHERICE","SHARIKA","ROSSIE","ROSENA","RORY","RIMA","RIA","RHEBA","RENNA","PETER","NATALYA","NANCEE","MELODI","MEDA","MAXIMA","MATHA","MARKETTA","MARICRUZ","MARCELENE","MALVINA","LUBA","LOUETTA","LEIDA","LECIA","LAURAN","LASHAWNA","LAINE","KHADIJAH","KATERINE","KASI","KALLIE","JULIETTA","JESUSITA","JESTINE","JESSIA","JEREMY","JEFFIE","JANYCE","ISADORA","GEORGIANNE","FIDELIA","EVITA","EURA","EULAH","ESTEFANA","ELSY","ELIZABET","ELADIA","DODIE","DION","DIA","DENISSE","DELORAS","DELILA","DAYSI","DAKOTA","CURTIS","CRYSTLE","CONCHA","COLBY","CLARETTA","CHU","CHRISTIA","CHARLSIE","CHARLENA","CARYLON","BETTYANN","ASLEY","ASHLEA","AMIRA","AI","AGUEDA","AGNUS","YUETTE","VINITA","VICTORINA","TYNISHA","TREENA","TOCCARA","TISH","THOMASENA","TEGAN","SOILA","SHILOH","SHENNA","SHARMAINE","SHANTAE","SHANDI","SEPTEMBER","SARAN","SARAI","SANA","SAMUEL","SALLEY","ROSETTE","ROLANDE","REGINE","OTELIA","OSCAR","OLEVIA","NICHOLLE","NECOLE","NAIDA","MYRTA","MYESHA","MITSUE","MINTA","MERTIE","MARGY","MAHALIA","MADALENE","LOVE","LOURA","LOREAN","LEWIS","LESHA","LEONIDA","LENITA","LAVONE","LASHELL","LASHANDRA","LAMONICA","KIMBRA","KATHERINA","KARRY","KANESHA","JULIO","JONG","JENEVA","JAQUELYN","HWA","GILMA","GHISLAINE","GERTRUDIS","FRANSISCA","FERMINA","ETTIE","ETSUKO","ELLIS","ELLAN","ELIDIA","EDRA","DORETHEA","DOREATHA","DENYSE","DENNY","DEETTA","DAINE","CYRSTAL","CORRIN","CAYLA","CARLITA","CAMILA","BURMA","BULA","BUENA","BLAKE","BARABARA","AVRIL","AUSTIN","ALAINE","ZANA","WILHEMINA","WANETTA","VIRGIL","VI","VERONIKA","VERNON","VERLINE","VASILIKI","TONITA","TISA","TEOFILA","TAYNA","TAUNYA","TANDRA","TAKAKO","SUNNI","SUANNE","SIXTA","SHARELL","SEEMA","RUSSELL","ROSENDA","ROBENA","RAYMONDE","PEI","PAMILA","OZELL","NEIDA","NEELY","MISTIE","MICHA","MERISSA","MAURITA","MARYLN","MARYETTA","MARSHALL","MARCELL","MALENA","MAKEDA","MADDIE","LOVETTA","LOURIE","LORRINE","LORILEE","LESTER","LAURENA","LASHAY","LARRAINE","LAREE","LACRESHA","KRISTLE","KRISHNA","KEVA","KEIRA","KAROLE","JOIE","JINNY","JEANNETTA","JAMA","HEIDY","GILBERTE","GEMA","FAVIOLA","EVELYNN","ENDA","ELLI","ELLENA","DIVINA","DAGNY","COLLENE","CODI","CINDIE","CHASSIDY","CHASIDY","CATRICE","CATHERINA","CASSEY","CAROLL","CARLENA","CANDRA","CALISTA","BRYANNA","BRITTENY","BEULA","BARI","AUDRIE","AUDRIA","ARDELIA","ANNELLE","ANGILA","ALONA","ALLYN","DOUGLAS","ROGER","JONATHAN","RALPH","NICHOLAS","BENJAMIN","BRUCE","HARRY","WAYNE","STEVE","HOWARD","ERNEST","PHILLIP","TODD","CRAIG","ALAN","PHILIP","EARL","DANNY","BRYAN","STANLEY","LEONARD","NATHAN","MANUEL","RODNEY","MARVIN","VINCENT","JEFFERY","JEFF","CHAD","JACOB","ALFRED","BRADLEY","HERBERT","FREDERICK","EDWIN","DON","RICKY","RANDALL","BARRY","BERNARD","LEROY","MARCUS","THEODORE","CLIFFORD","MIGUEL","JIM","TOM","CALVIN","BILL","LLOYD","DEREK","WARREN","DARRELL","JEROME","FLOYD","ALVIN","TIM","GORDON","GREG","JORGE","DUSTIN","PEDRO","DERRICK","ZACHARY","HERMAN","GLEN","HECTOR","RICARDO","RICK","BRENT","RAMON","GILBERT","MARC","REGINALD","RUBEN","NATHANIEL","RAFAEL","EDGAR","MILTON","RAUL","BEN","CHESTER","DUANE","FRANKLIN","BRAD","RON","ROLAND","ARNOLD","HARVEY","JARED","ERIK","DARRYL","NEIL","JAVIER","FERNANDO","CLINTON","TED","MATHEW","TYRONE","DARREN","LANCE","KURT","ALLAN","NELSON","GUY","CLAYTON","HUGH","MAX","DWAYNE","DWIGHT","ARMANDO","FELIX","EVERETT","IAN","WALLACE","KEN","BOB","ALFREDO","ALBERTO","DAVE","IVAN","BYRON","ISAAC","MORRIS","CLIFTON","WILLARD","ROSS","ANDY","SALVADOR","KIRK","SERGIO","SETH","KENT","TERRANCE","EDUARDO","TERRENCE","ENRIQUE","WADE","STUART","FREDRICK","ARTURO","ALEJANDRO","NICK","LUTHER","WENDELL","JEREMIAH","JULIUS","OTIS","TREVOR","OLIVER","LUKE","HOMER","GERARD","DOUG","KENNY","HUBERT","LYLE","MATT","ALFONSO","ORLANDO","REX","CARLTON","ERNESTO","NEAL","PABLO","LORENZO","OMAR","WILBUR","GRANT","HORACE","RODERICK","ABRAHAM","WILLIS","RICKEY","ANDRES","CESAR","JOHNATHAN","MALCOLM","RUDOLPH","DAMON","KELVIN","PRESTON","ALTON","ARCHIE","MARCO","WM","PETE","RANDOLPH","GARRY","GEOFFREY","JONATHON","FELIPE","GERARDO","ED","DOMINIC","DELBERT","COLIN","GUILLERMO","EARNEST","LUCAS","BENNY","SPENCER","RODOLFO","MYRON","EDMUND","GARRETT","SALVATORE","CEDRIC","LOWELL","GREGG","SHERMAN","WILSON","SYLVESTER","ROOSEVELT","ISRAEL","JERMAINE","FORREST","WILBERT","LELAND","SIMON","CLARK","IRVING","BRYANT","OWEN","RUFUS","WOODROW","KRISTOPHER","MACK","LEVI","MARCOS","GUSTAVO","JAKE","LIONEL","GILBERTO","CLINT","NICOLAS","ISMAEL","ORVILLE","ERVIN","DEWEY","AL","WILFRED","JOSH","HUGO","IGNACIO","CALEB","TOMAS","SHELDON","ERICK","STEWART","DOYLE","DARREL","ROGELIO","TERENCE","SANTIAGO","ALONZO","ELIAS","BERT","ELBERT","RAMIRO","CONRAD","NOAH","GRADY","PHIL","CORNELIUS","LAMAR","ROLANDO","CLAY","PERCY","DEXTER","BRADFORD","DARIN","AMOS","MOSES","IRVIN","SAUL","ROMAN","RANDAL","TIMMY","DARRIN","WINSTON","BRENDAN","ABEL","DOMINICK","BOYD","EMILIO","ELIJAH","DOMINGO","EMMETT","MARLON","EMANUEL","JERALD","EDMOND","EMIL","DEWAYNE","WILL","OTTO","TEDDY","REYNALDO","BRET","JESS","TRENT","HUMBERTO","EMMANUEL","STEPHAN","VICENTE","LAMONT","GARLAND","MILES","EFRAIN","HEATH","RODGER","HARLEY","ETHAN","ELDON","ROCKY","PIERRE","JUNIOR","FREDDY","ELI","BRYCE","ANTOINE","STERLING","CHASE","GROVER","ELTON","CLEVELAND","DYLAN","CHUCK","DAMIAN","REUBEN","STAN","AUGUST","LEONARDO","JASPER","RUSSEL","ERWIN","BENITO","HANS","MONTE","BLAINE","ERNIE","CURT","QUENTIN","AGUSTIN","MURRAY","JAMAL","ADOLFO","HARRISON","TYSON","BURTON","BRADY","ELLIOTT","WILFREDO","BART","JARROD","VANCE","DENIS","DAMIEN","JOAQUIN","HARLAN","DESMOND","ELLIOT","DARWIN","GREGORIO","BUDDY","XAVIER","KERMIT","ROSCOE","ESTEBAN","ANTON","SOLOMON","SCOTTY","NORBERT","ELVIN","WILLIAMS","NOLAN","ROD","QUINTON","HAL","BRAIN","ROB","ELWOOD","KENDRICK","DARIUS","MOISES","FIDEL","THADDEUS","CLIFF","MARCEL","JACKSON","RAPHAEL","BRYON","ARMAND","ALVARO","JEFFRY","DANE","JOESPH","THURMAN","NED","RUSTY","MONTY","FABIAN","REGGIE","MASON","GRAHAM","ISAIAH","VAUGHN","GUS","LOYD","DIEGO","ADOLPH","NORRIS","MILLARD","ROCCO","GONZALO","DERICK","RODRIGO","WILEY","RIGOBERTO","ALPHONSO","TY","NOE","VERN","REED","JEFFERSON","ELVIS","BERNARDO","MAURICIO","HIRAM","DONOVAN","BASIL","RILEY","NICKOLAS","MAYNARD","SCOT","VINCE","QUINCY","EDDY","SEBASTIAN","FEDERICO","ULYSSES","HERIBERTO","DONNELL","COLE","DAVIS","GAVIN","EMERY","WARD","ROMEO","JAYSON","DANTE","CLEMENT","COY","MAXWELL","JARVIS","BRUNO","ISSAC","DUDLEY","BROCK","SANFORD","CARMELO","BARNEY","NESTOR","STEFAN","DONNY","ART","LINWOOD","BEAU","WELDON","GALEN","ISIDRO","TRUMAN","DELMAR","JOHNATHON","SILAS","FREDERIC","DICK","IRWIN","MERLIN","CHARLEY","MARCELINO","HARRIS","CARLO","TRENTON","KURTIS","HUNTER","AURELIO","WINFRED","VITO","COLLIN","DENVER","CARTER","LEONEL","EMORY","PASQUALE","MOHAMMAD","MARIANO","DANIAL","LANDON","DIRK","BRANDEN","ADAN","BUFORD","GERMAN","WILMER","EMERSON","ZACHERY","FLETCHER","JACQUES","ERROL","DALTON","MONROE","JOSUE","EDWARDO","BOOKER","WILFORD","SONNY","SHELTON","CARSON","THERON","RAYMUNDO","DAREN","HOUSTON","ROBBY","LINCOLN","GENARO","BENNETT","OCTAVIO","CORNELL","HUNG","ARRON","ANTONY","HERSCHEL","GIOVANNI","GARTH","CYRUS","CYRIL","RONNY","LON","FREEMAN","DUNCAN","KENNITH","CARMINE","ERICH","CHADWICK","WILBURN","RUSS","REID","MYLES","ANDERSON","MORTON","JONAS","FOREST","MITCHEL","MERVIN","ZANE","RICH","JAMEL","LAZARO","ALPHONSE","RANDELL","MAJOR","JARRETT","BROOKS","ABDUL","LUCIANO","SEYMOUR","EUGENIO","MOHAMMED","VALENTIN","CHANCE","ARNULFO","LUCIEN","FERDINAND","THAD","EZRA","ALDO","RUBIN","ROYAL","MITCH","EARLE","ABE","WYATT","MARQUIS","LANNY","KAREEM","JAMAR","BORIS","ISIAH","EMILE","ELMO","ARON","LEOPOLDO","EVERETTE","JOSEF","ELOY","RODRICK","REINALDO","LUCIO","JERROD","WESTON","HERSHEL","BARTON","PARKER","LEMUEL","BURT","JULES","GIL","ELISEO","AHMAD","NIGEL","EFREN","ANTWAN","ALDEN","MARGARITO","COLEMAN","DINO","OSVALDO","LES","DEANDRE","NORMAND","KIETH","TREY","NORBERTO","NAPOLEON","JEROLD","FRITZ","ROSENDO","MILFORD","CHRISTOPER","ALFONZO","LYMAN","JOSIAH","BRANT","WILTON","RICO","JAMAAL","DEWITT","BRENTON","OLIN","FOSTER","FAUSTINO","CLAUDIO","JUDSON","GINO","EDGARDO","ALEC","TANNER","JARRED","DONN","TAD","PRINCE","PORFIRIO","ODIS","LENARD","CHAUNCEY","TOD","MEL","MARCELO","KORY","AUGUSTUS","KEVEN","HILARIO","BUD","SAL","ORVAL","MAURO","ZACHARIAH","OLEN","ANIBAL","MILO","JED","DILLON","AMADO","NEWTON","LENNY","RICHIE","HORACIO","BRICE","MOHAMED","DELMER","DARIO","REYES","MAC","JONAH","JERROLD","ROBT","HANK","RUPERT","ROLLAND","KENTON","DAMION","ANTONE","WALDO","FREDRIC","BRADLY","KIP","BURL","WALKER","TYREE","JEFFEREY","AHMED","WILLY","STANFORD","OREN","NOBLE","MOSHE","MIKEL","ENOCH","BRENDON","QUINTIN","JAMISON","FLORENCIO","DARRICK","TOBIAS","HASSAN","GIUSEPPE","DEMARCUS","CLETUS","TYRELL","LYNDON","KEENAN","WERNER","GERALDO","COLUMBUS","CHET","BERTRAM","MARKUS","HUEY","HILTON","DWAIN","DONTE","TYRON","OMER","ISAIAS","HIPOLITO","FERMIN","ADALBERTO","BO","BARRETT","TEODORO","MCKINLEY","MAXIMO","GARFIELD","RALEIGH","LAWERENCE","ABRAM","RASHAD","KING","EMMITT","DARON","SAMUAL","MIQUEL","EUSEBIO","DOMENIC","DARRON","BUSTER","WILBER","RENATO","JC","HOYT","HAYWOOD","EZEKIEL","CHAS","FLORENTINO","ELROY","CLEMENTE","ARDEN","NEVILLE","EDISON","DESHAWN","NATHANIAL","JORDON","DANILO","CLAUD","SHERWOOD","RAYMON","RAYFORD","CRISTOBAL","AMBROSE","TITUS","HYMAN","FELTON","EZEQUIEL","ERASMO","STANTON","LONNY","LEN","IKE","MILAN","LINO","JAROD","HERB","ANDREAS","WALTON","RHETT","PALMER","DOUGLASS","CORDELL","OSWALDO","ELLSWORTH","VIRGILIO","TONEY","NATHANAEL","DEL","BENEDICT","MOSE","JOHNSON","ISREAL","GARRET","FAUSTO","ASA","ARLEN","ZACK","WARNER","MODESTO","FRANCESCO","MANUAL","GAYLORD","GASTON","FILIBERTO","DEANGELO","MICHALE","GRANVILLE","WES","MALIK","ZACKARY","TUAN","ELDRIDGE","CRISTOPHER","CORTEZ","ANTIONE","MALCOM","LONG","KOREY","JOSPEH","COLTON","WAYLON","VON","HOSEA","SHAD","SANTO","RUDOLF","ROLF","REY","RENALDO","MARCELLUS","LUCIUS","KRISTOFER","BOYCE","BENTON","HAYDEN","HARLAND","ARNOLDO","RUEBEN","LEANDRO","KRAIG","JERRELL","JEROMY","HOBERT","CEDRICK","ARLIE","WINFORD","WALLY","LUIGI","KENETH","JACINTO","GRAIG","FRANKLYN","EDMUNDO","SID","PORTER","LEIF","JERAMY","BUCK","WILLIAN","VINCENZO","SHON","LYNWOOD","JERE","HAI","ELDEN","DORSEY","DARELL","BRODERICK","ALONSO" 2 | -------------------------------------------------------------------------------- /0023_Non-abundant_sums/0023_Non-abundant_sums.py: -------------------------------------------------------------------------------- 1 | # A perfect number is a number for which the sum of its proper divisors is exactly equal to the number. 2 | # For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, 3 | # which means that 28 is a perfect number. 4 | 5 | # A number n is called deficient if the sum of its proper divisors is less than n 6 | # and it is called abundant if this sum exceeds n. 7 | 8 | # As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, 9 | # the smallest number that can be written as the sum of two abundant numbers is 24. 10 | # By mathematical analysis, it can be shown that 11 | # all integers greater than 28123 can be written as the sum of two abundant numbers. 12 | # However, this upper limit cannot be reduced any further by analysis even though 13 | # it is known that the greatest number that cannot be expressed as the sum of two abundant numbers 14 | # is less than this limit. 15 | 16 | # Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers. 17 | from itertools import compress 18 | 19 | 20 | def pr(n): # primes 21 | """Returns a list of primes < n for n > 2""" 22 | sieve = bytearray([True]) * (n // 2) 23 | for i in range(3, int(n**0.5) + 1, 2): 24 | if sieve[i // 2]: 25 | sieve[i * i // 2 :: i] = bytearray((n - i * i - 1) // (2 * i) + 1) 26 | return [2, *list(compress(range(3, n, 2), sieve[1:]))] 27 | 28 | 29 | def f(n): # factorization 30 | """Returns a list of the prime factorization of n""" 31 | pf = [] 32 | for p in pr(n): 33 | if p * p > n: 34 | break 35 | count = 0 36 | while not n % p: 37 | n //= p 38 | count += 1 39 | if count > 0: 40 | pf.append((p, count)) 41 | if n > 1: 42 | pf.append((n, 1)) 43 | return pf 44 | 45 | 46 | def d(n, exclude_n=False): # divisors 47 | """Returns an unsorted list of the divisors of n""" 48 | divs = set([1]) 49 | for p, e in f(n): 50 | divs |= set([x * p**k for k in range(1, e + 1) for x in divs]) 51 | if exclude_n and n in divs: 52 | divs.remove(n) 53 | return divs 54 | 55 | 56 | def is_abundant(n): 57 | """Returns if a number is abundant, its proper divisors""" 58 | return sum(d(n, True)) > n 59 | 60 | 61 | def get_all_abundant_numbers_below(n): 62 | """Returns all abundant numbers under n""" 63 | return set(filter(is_abundant, range(1, n))) 64 | 65 | 66 | def can_sum_two_abundant(n, abundant_numbers): 67 | """Returns if a number can be written as the sum of two abundant numbers""" 68 | return any(n - a in abundant_numbers for a in abundant_numbers) 69 | 70 | 71 | all_abundant_numbers = get_all_abundant_numbers_below(28123) 72 | sum_non_abundant = sum([x for x in range(1, 28123) if not can_sum_two_abundant(x, all_abundant_numbers)]) 73 | print(sum_non_abundant) 74 | -------------------------------------------------------------------------------- /0024_Lexicographic_permutations/0024_Lexicographic_permutations.py: -------------------------------------------------------------------------------- 1 | # A permutation is an ordered arrangement of objects. 2 | # For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. 3 | # If all of the permutations are listed numerically or alphabetically, 4 | # we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are: 5 | # 6 | # 012 021 102 120 201 210 7 | # 8 | # What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9? 9 | 10 | # Solution: 11 | def permutations(numbers: list): 12 | """ 13 | Generate all permutations of the given list of numbers. 14 | """ 15 | if len(numbers) == 1: 16 | yield str(*numbers) 17 | else: 18 | for i, n in enumerate(numbers): 19 | for perm in permutations(numbers[:i] + numbers[i + 1 :]): 20 | yield str(n) + perm 21 | 22 | 23 | print(list(permutations([0, 1, 2]))) 24 | print(list(permutations([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))[999999]) 25 | -------------------------------------------------------------------------------- /0025_1000-digit_Fibonacci_number/0025_1000-digit_Fibonacci_number.py: -------------------------------------------------------------------------------- 1 | number1 = 1 2 | number2 = 1 3 | index = 2 4 | while len(str(number2)) < 1000: 5 | number1, number2 = number2, number1 + number2 6 | index += 1 7 | print("len = {}, index = {}".format(len(str(number2)), index)) 8 | -------------------------------------------------------------------------------- /0026_Reciprocal_cycles/0026_Reciprocal_cycles.py: -------------------------------------------------------------------------------- 1 | # A unit fraction contains 1 in the numerator. 2 | # The decimal representation of the unit fractions with denominators 2 to 10 are given: 3 | # 4 | # 1/2 = 0.5 5 | # 1/3 = 0.(3) 6 | # 1/4 = 0.25 7 | # 1/5 = 0.2 8 | # 1/6 = 0.1(6) 9 | # 1/7 = 0.(142857) 10 | # 1/8 = 0.125 11 | # 1/9 = 0.(1) 12 | # 1/10 = 0.1 13 | # Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. 14 | # It can be seen that 1/7 has a 6-digit recurring cycle. 15 | # 16 | # Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part. 17 | 18 | 19 | def periodic_cycle(n): 20 | """ 21 | Find the length of the recurring cycle of 1/n. 22 | """ 23 | remainder = 1 24 | remainders = [] 25 | while remainder not in remainders: 26 | remainders.append(remainder) 27 | remainder = (remainder * 10) % n 28 | return len(remainders) - remainders.index(remainder) 29 | 30 | 31 | print("number =", 3, "periodic cycle =", periodic_cycle(3)) 32 | print("number =", 6, "periodic cycle =", periodic_cycle(6)) 33 | print("number =", 7, "periodic cycle =", periodic_cycle(7)) 34 | print("number =", 9, "periodic cycle =", periodic_cycle(9)) 35 | 36 | max_peiodic_cycle = 0 37 | number = 1 38 | for d in range(1, 1000): 39 | if periodic_cycle(d) > max_peiodic_cycle: 40 | max_peiodic_cycle = periodic_cycle(d) 41 | number = d 42 | print("number =", number, "periodic cycle =", max_peiodic_cycle) 43 | -------------------------------------------------------------------------------- /0027_Quadratic_primes/0027_Quadratic_primes.py: -------------------------------------------------------------------------------- 1 | # Euler discovered the remarkable quadratic formula: 2 | # 3 | # n² + n + 41 4 | # 5 | # It turns out that the formula will produce 40 primes for the consecutive integer values 0 <= n <=39. 6 | # However, when n = 40, 40² + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, 7 | # and certainly when n = 41, 41² + 41 + 41 is clearly divisible by 41. 8 | # 9 | # The incredible formula n² − 79n + 1601 was discovered, 10 | # which produces 80 primes for the consecutive values 0 <= n <= 79. 11 | # The product of the coefficients, −79 and 1601, is −126479. 12 | # 13 | # Considering quadratics of the form: 14 | # n² + an + b, where |a| < 1000 and |b| < 1000 15 | # 16 | # where |n| is the modulus/absolute value of n 17 | # e.g. |11| = 11 and |−4| = 4 18 | # Find the product of the coefficients, a and b, for the quadratic expression that produces 19 | # the maximum number of primes for consecutive values of n, starting with n = 0. 20 | 21 | 22 | def is_prime(n): 23 | if n == 2: 24 | return True 25 | if n % 2 == 0 or n <= 1: 26 | return False 27 | for i in range(3, int(n**0.5) + 1, 2): 28 | if n % i == 0: 29 | return False 30 | return True 31 | 32 | 33 | def quadratic_primes(a, b): 34 | n = 0 35 | while is_prime(n**2 + a * n + b): 36 | n += 1 37 | return n - 1 38 | 39 | 40 | a = -999 41 | b = -999 42 | max_n = 0 43 | a_for_max_n = -999 44 | b_for_max_n = -999 45 | while a <= 999: 46 | while b <= 999: 47 | n = quadratic_primes(a, b) 48 | if n > max_n: 49 | max_n = n 50 | a_for_max_n = a 51 | b_for_max_n = b 52 | print(a_for_max_n, b_for_max_n, max_n, n**2 + a * n + b) 53 | b += 1 54 | a += 1 55 | b = -999 56 | print("max_n =", max_n) 57 | print("a * b =", a_for_max_n * b_for_max_n) 58 | -------------------------------------------------------------------------------- /0028_Number_spiral_diagonals/0028_Number_spiral_diagonals.py: -------------------------------------------------------------------------------- 1 | # Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: 2 | 3 | # 21 22 23 24 25 4 | # 20 7 8 9 10 5 | # 19 6 1 2 11 6 | # 18 5 4 3 12 7 | # 17 16 15 14 13 8 | 9 | # It can be verified that the sum of the numbers on the diagonals is 101. 10 | 11 | # What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way? 12 | 13 | 14 | def spiral_diagonals_iterative(n): 15 | """ 16 | Returns the sum of the diagonals in a n by n spiral. 17 | """ 18 | res = 0 19 | i = 1 20 | c = 1 21 | while i <= n**2: 22 | # print("i =", i) 23 | # print("c =", c) 24 | # print("res =", res) 25 | res += i 26 | i += 2 * c 27 | if i == (2 * c + 1) ** 2: 28 | c += 1 29 | return res 30 | 31 | 32 | print(spiral_diagonals_iterative(1)) 33 | print(spiral_diagonals_iterative(2)) 34 | print(spiral_diagonals_iterative(3)) 35 | print(spiral_diagonals_iterative(4)) 36 | print(spiral_diagonals_iterative(5)) 37 | print(spiral_diagonals_iterative(1001)) 38 | -------------------------------------------------------------------------------- /0029_Distinct_powers/0029_Distinct_powers.py: -------------------------------------------------------------------------------- 1 | # Consider all integer combinations of a^b for 2 <= a <= 5 and 2 <= b <= 5: 2 | 3 | # 2^2 = 4, 2^3 = 8, 2^4 = 16, 2^5 = 32 4 | # 3^2 = 9, 3^3 = 27, 3^4 = 81, 3^5 = 243 5 | # 4^2 = 16, 4^3 = 64, 4^4 = 256, 4^5 = 1024 6 | # 5^2 = 25, 5^3 = 125, 5^4 = 625, 5^5 = 3125 7 | 8 | # If they are then placed in numerical order, with any repeats removed, 9 | # we get the following sequence of 15 distinct terms: 10 | 11 | # 4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125 12 | 13 | # How many distinct terms are in the sequence generated by a^b for 2 <= a <= 100 and 2 <= b <= 100? 14 | 15 | 16 | def distinct_terms(n): 17 | """ 18 | Returns the number of distinct terms in the sequence generated by a^b for 2 <= a <= n and 2 <= b <= n. 19 | """ 20 | powers = set() 21 | for a in range(2, n + 1): 22 | for b in range(2, n + 1): 23 | if a**b not in powers: 24 | powers.add(a**b) 25 | return len(powers) 26 | 27 | 28 | print(distinct_terms(100)) 29 | -------------------------------------------------------------------------------- /0030_Digit_fifth_powers/0030_Digit_fifth_powers.py: -------------------------------------------------------------------------------- 1 | # Surprisingly there are only three numbers that can be written 2 | # as the sum of fourth powers of their digits: 3 | 4 | # 1634 = 14 + 64 + 34 + 44 5 | # 8208 = 84 + 24 + 04 + 84 6 | # 9474 = 94 + 44 + 74 + 44 7 | # As 1 = 14 is not a sum it is not included. 8 | 9 | # The sum of these numbers is 1634 + 8208 + 9474 = 19316. 10 | 11 | # Find the sum of all the numbers that can be written as the sum of fifth powers of their digits. 12 | 13 | 14 | def pth_powers(n, p): 15 | """ 16 | Returns the sum of the p-th powers of the digits of n. 17 | """ 18 | return sum(map(lambda x: x**p, map(int, str(n)))) 19 | 20 | 21 | def max_pth_power_for_digits(d, p): 22 | """ 23 | Returns the maximum pth powers of a d digits number. 24 | """ 25 | return d * 9**p 26 | 27 | 28 | def max_number_greater_than_pth_power_for_digits(p): 29 | """ 30 | Returns the maximum number greater than the fourth power its length of digits. 31 | """ 32 | not_passing = 0 33 | max_number = 2 34 | while not_passing < 10: 35 | length_of_digits = len(str(max_number)) 36 | if max_pth_power_for_digits(length_of_digits, p) < max_number: 37 | not_passing += 1 38 | else: 39 | max_number *= 10 40 | return max_number 41 | 42 | 43 | def sum_pth_powers(p): 44 | """ 45 | Returns the sum of all numbers that can be written as the sum of pth powers of their digits. 46 | """ 47 | x = 2 48 | res = 0 49 | max_number = max_number_greater_than_pth_power_for_digits(p) 50 | print("max_number =", max_number) 51 | while x <= max_number: 52 | if x == pth_powers(x, p): 53 | print("x =", x) 54 | res += x 55 | x += 1 56 | return res 57 | 58 | 59 | print(sum_pth_powers(4)) 60 | print(sum_pth_powers(5)) 61 | -------------------------------------------------------------------------------- /0031_Coin_sums/0031_Coin_sums.py: -------------------------------------------------------------------------------- 1 | # In the United Kingdom the currency is made up of pound(£) and pence(p). 2 | # There are eight coins in general circulation: 3 | 4 | # 1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), and £2 (200p). 5 | # It is possible to make £2 in the following way: 6 | 7 | # 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p 8 | # How many different ways can £2 be made using any number of coins? 9 | 10 | 11 | def coin_sums(amount): 12 | coins = [1, 2, 5, 10, 20, 50, 100, 200] 13 | ways = [1] + [0] * amount 14 | for coin in coins: 15 | for i in range(coin, amount + 1): 16 | ways[i] += ways[i - coin] 17 | return ways[amount] 18 | 19 | 20 | print(coin_sums(200)) 21 | -------------------------------------------------------------------------------- /0032_Pandigital_products/0032_Pandigital_products.py: -------------------------------------------------------------------------------- 1 | # We shall say that an n-digit number is pandigital 2 | # if it makes use of all the digits 1 to n exactly once 3 | # for example, the 5-digit number, 15234, is 1 through 5 pandigital. 4 | 5 | # The product 7254 is unusual, as the identity, 39 * 186 = 7254, 6 | # containing multiplicand, multiplier, and product is 1 through 9 pandigital. 7 | 8 | # Find the sum of all products whose multiplicand/multiplier/product identity 9 | # can be written as a 1 through 9 pandigital. 10 | 11 | # HINT: Some products can be obtained in more than one way 12 | # so be sure to only include it once in your sum. 13 | 14 | from itertools import permutations 15 | 16 | 17 | def pandigital_products(ln): 18 | 19 | digits = list(range(1, ln + 1)) 20 | expressions = set() 21 | products = set() 22 | for i in range(1, len(digits) // 2 + 1): 23 | index_perms_for_multiplicand = list(permutations(digits, i)) 24 | for j in range(len(index_perms_for_multiplicand)): 25 | multiplicand = [] 26 | left_numbers = [] 27 | for k in range(len(index_perms_for_multiplicand[j])): 28 | multiplicand.append(index_perms_for_multiplicand[j][k]) 29 | for dig in digits: 30 | if dig not in multiplicand: 31 | left_numbers.append(dig) 32 | for m in range(1, len(digits) // 2 + 1): 33 | index_perms_for_multiplier = list(permutations(left_numbers, m)) 34 | for n in range(len(index_perms_for_multiplier)): 35 | multiplier = [] 36 | left_product = [] 37 | for o in range(len(index_perms_for_multiplier[n])): 38 | multiplier.append(index_perms_for_multiplier[n][o]) 39 | for other_dig in left_numbers: 40 | if other_dig not in multiplier: 41 | left_product.append(other_dig) 42 | product_perms = list(permutations(left_product, len(left_product))) 43 | for prod in product_perms: 44 | multiplicand_str_int = int("".join(str(x) for x in multiplicand)) 45 | multiplier_str_int = int("".join(str(y) for y in multiplier)) 46 | product_str_int = int("".join(str(z) for z in prod)) 47 | if multiplicand_str_int > product_str_int: 48 | continue 49 | if multiplier_str_int > product_str_int: 50 | continue 51 | if multiplicand_str_int * multiplier_str_int != product_str_int: 52 | continue 53 | expression = ( 54 | str(multiplicand_str_int) + " * " + str(multiplier_str_int) + " = " + str(product_str_int) 55 | ) 56 | expressions.add(expression) 57 | print(expression) 58 | if product_str_int in products: 59 | continue 60 | products.add(product_str_int) 61 | return products 62 | 63 | 64 | print(sum(pandigital_products(9))) 65 | -------------------------------------------------------------------------------- /0033_Digit_cancelling_fractions/0033_Digit_cancelling_fractions.py: -------------------------------------------------------------------------------- 1 | # The fraction 49/98 is a curious fraction, 2 | # as an inexperienced mathematician in attempting to simplify 3 | # it may incorrectly believe that 49/98 = 4/8, 4 | # which is correct, is obtained by cancelling the 9s. 5 | 6 | # We shall consider fractions like, 7 | # 30/50 = 3/5, to be trivial examples. 8 | 9 | # There are exactly four non-trivial examples of this type of fraction, 10 | # less than one in value, and containing two digits in the numerator and denominator. 11 | 12 | # If the product of these four fractions is given in its lowest common terms, 13 | # find the value of the denominator. 14 | 15 | 16 | def is_digit_cancelling_fraction(n, d): 17 | if n / d >= 1: 18 | return False 19 | n_digits = [int(x) for x in str(n)] 20 | d_digits = [int(x) for x in str(d)] 21 | if n_digits[1] == 0 and d_digits[1] == 0: 22 | # trivial 23 | return False 24 | if n_digits[0] == d_digits[0] and d_digits[1] != 0 and n / d == n_digits[1] / d_digits[1]: 25 | return True 26 | if n_digits[0] == d_digits[1] and n / d == n_digits[1] / d_digits[0]: 27 | return True 28 | if n_digits[1] == d_digits[0] and d_digits[1] != 0 and n / d == n_digits[0] / d_digits[1]: 29 | return True 30 | if n_digits[1] == d_digits[1] and n / d == n_digits[0] / d_digits[0]: 31 | return True 32 | return False 33 | 34 | 35 | def all_digit_cancelling_fractions(): 36 | for n in range(10, 100): 37 | for d in range(n + 1, 100): 38 | if is_digit_cancelling_fraction(n, d): 39 | yield n, d 40 | 41 | 42 | def simplify_fraction(n, d): 43 | for i in range(2, min(n, d) + 1): 44 | if n % i == 0 and d % i == 0: 45 | n = n // i 46 | d = d // i 47 | return simplify_fraction(n, d) 48 | return n, d 49 | 50 | 51 | digit_cancelling_fractions = all_digit_cancelling_fractions() 52 | product = (1, 1) 53 | for frac in digit_cancelling_fractions: 54 | product = (product[0] * frac[0], product[1] * frac[1]) 55 | print(frac) 56 | print("Product of digit cancelling fractions:", product) 57 | print("Simplified product:", simplify_fraction(product[0], product[1])) 58 | -------------------------------------------------------------------------------- /0034_Digit_factorials/0034_Digit_factorials.py: -------------------------------------------------------------------------------- 1 | # 145 is a curious number, 2 | # as 1! + 4! + 5! = 1 + 24 + 120 = 145. 3 | 4 | # Find the sum of all numbers which are equal to the sum of the factorial of their digits. 5 | 6 | # Note: As 1! = 1 and 2! = 2 are not sums they are not included. 7 | 8 | 9 | def is_curious_number(n, factorials): 10 | digits = [int(x) for x in str(n)] 11 | return n == sum(factorials[y] for y in digits) 12 | 13 | 14 | def get_max_ceiling_number(factorials): 15 | digits = len(str(factorials[9])) 16 | while True: 17 | if int("9" * digits) > factorials[9] * digits: 18 | break 19 | digits += 1 20 | return int("9" * digits) 21 | 22 | 23 | def main(): 24 | curious_numbers = [] 25 | factorials = {} 26 | factorials[0] = 1 27 | s = 1 28 | for i in range(1, 10): 29 | s *= i 30 | factorials[i] = s 31 | print("Factorials:", factorials) 32 | max_ceiling_number = get_max_ceiling_number(factorials) 33 | print("Max ceiling number:", max_ceiling_number) 34 | for n in range(10, max_ceiling_number): 35 | if is_curious_number(n, factorials): 36 | curious_numbers.append(n) 37 | if n % 1000000 == 0: 38 | print("Checked:", n) 39 | print("Total curious numbers:", len(curious_numbers)) 40 | print("Curious numbers:", curious_numbers) 41 | print("Sum of curious numbers:", sum(curious_numbers)) 42 | 43 | 44 | main() 45 | -------------------------------------------------------------------------------- /0035_Circular_primes/0035_Circular_primes.py: -------------------------------------------------------------------------------- 1 | # The number, 197, is called a circular prime because 2 | # all rotations of the digits: 197, 971, and 719, are themselves prime. 3 | 4 | # There are thirteen such primes below 100: 5 | # 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97. 6 | 7 | # How many circular primes are there below one million? 8 | 9 | 10 | def is_prime(n): 11 | if n == 2: 12 | return True 13 | if n < 2 or n % 2 == 0: 14 | return False 15 | for i in range(3, int(n**0.5) + 1, 2): 16 | if n % i == 0: 17 | return False 18 | return True 19 | 20 | 21 | def is_circular_prime(n): 22 | if len(str(n)) == 1: 23 | return is_prime(n) 24 | digits = [int(x) for x in str(n)] 25 | for i in range(len(digits)): 26 | if not is_prime(int("".join(str(x) for x in digits[i:] + digits[:i]))): 27 | return False 28 | return True 29 | 30 | 31 | def main(): 32 | circular_primes = [] 33 | for n in range(2, 1000000): 34 | if is_circular_prime(n): 35 | circular_primes.append(n) 36 | print("Circular primes:", circular_primes) 37 | print("Total circular primes:", len(circular_primes)) 38 | 39 | 40 | main() 41 | -------------------------------------------------------------------------------- /0036_Double-base_palindromes/0036_Double-base_palindromes.py: -------------------------------------------------------------------------------- 1 | def palindromicstring(numstr): 2 | return list(reversed(numstr)) == list(numstr) 3 | 4 | 5 | def palindromicdecimal(n): 6 | return palindromicstring(str(n)) 7 | 8 | 9 | def palindromicbinary(n): 10 | return palindromicstring(str(bin(n))[2:]) 11 | 12 | 13 | number = 1 14 | summation = 0 15 | while number < 1000000: 16 | if palindromicdecimal(number) and palindromicbinary(number): 17 | summation += number 18 | print("number decimal = {}, number binary = {}, sum = {}".format(number, str(bin(number))[2:], summation)) 19 | number += 2 20 | -------------------------------------------------------------------------------- /0037_Truncatable_primes/0037_Truncatable_primes.py: -------------------------------------------------------------------------------- 1 | # The number 3797 has an interesting property. 2 | # Being prime itself, it is possible to continuously remove digits from left to right, 3 | # and remain prime at each stage: 3797, 797, 97, and 7. 4 | # Similarly we can work from right to left: 3797, 379, 37, and 3. 5 | 6 | # Find the sum of the only eleven primes that are both truncatable from left to right and right to left. 7 | 8 | # NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. 9 | 10 | 11 | def is_prime(n): 12 | if n == 2: 13 | return True 14 | if n < 2 or n % 2 == 0: 15 | return False 16 | for i in range(3, int(n**0.5) + 1, 2): 17 | if n % i == 0: 18 | return False 19 | return True 20 | 21 | 22 | def is_truncatable_prime(n): 23 | if len(str(n)) == 1: 24 | return False 25 | digits = [int(x) for x in str(n)] 26 | for i in range(len(digits)): 27 | if len(digits[i:]) > 0 and not is_prime(int("".join(str(x) for x in digits[i:]))): 28 | return False 29 | if len(digits[:i]) > 0 and not is_prime(int("".join(str(x) for x in digits[:i]))): 30 | return False 31 | return True 32 | 33 | 34 | def main(): 35 | truncatable_primes = [] 36 | n = 11 37 | while len(truncatable_primes) < 11: 38 | if n % 100000 < 2: 39 | print("done", n) 40 | if is_truncatable_prime(n): 41 | truncatable_primes.append(n) 42 | n += 2 43 | print("Truncatable primes:", truncatable_primes) 44 | print("Total truncatable primes:", len(truncatable_primes)) 45 | print("Sum of truncatable primes:", sum(truncatable_primes)) 46 | 47 | 48 | main() 49 | -------------------------------------------------------------------------------- /0038_Pandigital_multiples/0038_Pandigital_multiples.py: -------------------------------------------------------------------------------- 1 | # Take the number 192 and multiply it by each of 1, 2, and 3: 2 | 3 | # 192 × 1 = 192 4 | # 192 × 2 = 384 5 | # 192 × 3 = 576 6 | # By concatenating each product we get the 1 to 9 pandigital, 7 | # 192384576. We will call 192384576 the concatenated product of 192 and (1,2,3) 8 | 9 | # The same can be achieved by starting with 9 10 | # and multiplying by 1, 2, 3, 4, and 5, 11 | # giving the pandigital, 918273645, 12 | # which is the concatenated product of 9 and (1,2,3,4,5). 13 | 14 | # What is the largest 1 to 9 pandigital 9-digit number 15 | # that can be formed as the concatenated product of an integer with (1,2, ... , n) where n > 1? 16 | 17 | 18 | def is_pandigital(num): 19 | num_str = str(num) 20 | return len(num_str) == 9 and len(set(num_str)) == 9 21 | 22 | 23 | def concatenated_product(m, n): 24 | result = "" 25 | for i in range(1, n + 1): 26 | result += str(i * m) 27 | return int(result) 28 | 29 | 30 | def main(): 31 | max_nine_digit_pandigital = 0 32 | mm = 1 33 | while len(str(mm)) < 5: 34 | if mm % 10 == 0: 35 | mm += 1 36 | continue 37 | nn = 2 38 | while nn < 10: 39 | if ( 40 | nn % 10 == 0 41 | or len(str(mm * nn)) > 9 42 | or len(str(mm)) * nn > 9 43 | or (mm % 2 == 0 and (nn % 5 == 0 or nn > 5)) 44 | ): 45 | nn += 1 46 | continue 47 | concatenated = concatenated_product(mm, nn) 48 | if "0" in set(str(concatenated)): 49 | nn += 1 50 | continue 51 | if len(str(concatenated)) > 9: 52 | break 53 | if is_pandigital(concatenated): 54 | max_nine_digit_pandigital = max(max_nine_digit_pandigital, concatenated) 55 | nn += 1 56 | # print("mm =", mm, "nn =", nn, 57 | # "max_nine_digit_pandigital =", max_nine_digit_pandigital) 58 | mm += 1 59 | print(max_nine_digit_pandigital) 60 | 61 | 62 | main() 63 | -------------------------------------------------------------------------------- /0039_Integer_right_triangles/0039_Integer_right_triangles.py: -------------------------------------------------------------------------------- 1 | # If p is the perimeter of a right angle triangle with integral length sides, 2 | # {a, b, c}, there are exactly three solutions for p = 120. 3 | 4 | # {20, 48, 52}, {24, 45, 51}, {30, 40, 50} 5 | 6 | # For which value of p ≤ 1000, is the number of solutions maximised? 7 | 8 | 9 | def perimeter(b, h): 10 | return b + h + (b**2 + h**2) ** 0.5 11 | 12 | 13 | def main(): 14 | count_sol = {} 15 | max_sol = 0 16 | a = 1 17 | while a <= 998: 18 | b = 1 19 | per = perimeter(a, b) 20 | while b <= 998 and per <= 1000: 21 | if a + b > 999: 22 | continue 23 | if per.is_integer(): 24 | per = int(per) 25 | count_sol[per] = count_sol.get(per, 0) + 1 26 | if count_sol[per] > max_sol: 27 | max_sol = count_sol[per] 28 | b += 1 29 | per = perimeter(a, b) 30 | a += 1 31 | print("perimeter, max solutions =", list(filter(lambda x: x[1] == max_sol, count_sol.items()))[0]) 32 | 33 | 34 | main() 35 | -------------------------------------------------------------------------------- /0040_Champernowne_s_constant/0040_Champernowne_s_constant.py: -------------------------------------------------------------------------------- 1 | # An irrational decimal fraction is created by concatenating the positive integers: 2 | 3 | # 0.123456789101112131415161718192021... 4 | 5 | # It can be seen that the 12th digit of the fractional part is 1. 6 | 7 | # If dn represents the nth digit of the fractional part, 8 | # find the value of the following expression. 9 | 10 | # d1 * d10 * d100 * d1000 * d10000 * d100000 * d1000000 11 | 12 | 13 | def main(): 14 | number_position = {} 15 | irrational_decimal_part = "" 16 | numb = 1 17 | while len(irrational_decimal_part) < 1000000: 18 | i = 0 19 | for c in str(numb): 20 | number_position[len(irrational_decimal_part) + 1] = int(c) 21 | irrational_decimal_part += c 22 | i += 1 23 | # print("numb =", numb, "number_position[", str(len(irrational_decimal_part)), "] =", 24 | # number_position[len(irrational_decimal_part)]) 25 | numb += 1 26 | print( 27 | number_position[1] 28 | * number_position[10] 29 | * number_position[100] 30 | * number_position[1000] 31 | * number_position[10000] 32 | * number_position[100000] 33 | * number_position[1000000] 34 | ) 35 | 36 | 37 | main() 38 | -------------------------------------------------------------------------------- /0041_Pandigital_prime/0041_Pandigital_prime.py: -------------------------------------------------------------------------------- 1 | # We shall say that an n-digit number is pandigital 2 | # if it makes use of all the digits 1 to n exactly once. 3 | # For example, 2143 is a 4-digit pandigital and is also prime. 4 | 5 | # What is the largest n-digit pandigital prime that exists? 6 | 7 | 8 | import primesieve 9 | 10 | 11 | def is_pandigital(num): 12 | num_str = str(num) 13 | if len(set(num_str)) != len(num_str): 14 | return False 15 | for i in range(1, len(num_str) + 1): 16 | if str(i) not in num_str: 17 | return False 18 | return True 19 | 20 | 21 | def main(): 22 | it = primesieve.Iterator() 23 | prime = 2143 24 | largest_pandigital_prime = prime 25 | while len(str(prime)) < 9: 26 | if is_pandigital(prime): 27 | largest_pandigital_prime = prime 28 | prime = it.next_prime() 29 | print(largest_pandigital_prime) 30 | 31 | 32 | main() 33 | -------------------------------------------------------------------------------- /0042_Coded_triangle_numbers/0042_Coded_triangle_numbers.py: -------------------------------------------------------------------------------- 1 | # The nth term of the sequence of triangle numbers is given by, 2 | # t_n = (1/2) * n * (n+1) so the first ten triangle numbers are: 3 | 4 | # 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... 5 | 6 | # By converting each letter in a word to a number corresponding to its 7 | # alphabetical position and adding these values we form a word value. 8 | # For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. 9 | # If the word value is a triangle number then 10 | # we shall call the word a triangle word. 11 | 12 | # Using words.txt (right click and 'Save Link/Target As...'), 13 | # a 16K text file containing nearly two-thousand common English words, 14 | # how many are triangle words? 15 | 16 | import numpy as np 17 | 18 | 19 | def read_words(filename): 20 | return np.genfromtxt(filename, dtype="str", delimiter=",") 21 | 22 | 23 | def is_triangle_number(t_n): 24 | # n^2 + n - 2 * t_n = 0 25 | n = (-1 + np.sqrt(1 + 8 * t_n)) / 2 26 | try: 27 | return n == int(n) 28 | except ValueError: 29 | return False 30 | 31 | 32 | def word_value(word): 33 | word_value = sum([ord(letter) - ord("A") + 1 for letter in word]) 34 | # print("word {} has {} value".format(word, word_value)) 35 | return word_value 36 | 37 | 38 | def is_triangle_word(word): 39 | is_triangle_word = is_triangle_number(word_value(word)) 40 | # print("Is {} a triangle word? {}".format(word, is_triangle_word)) 41 | return is_triangle_word 42 | 43 | 44 | def main(): 45 | words = read_words("p042_words.txt") 46 | stripped_words = [word.strip('"') for word in words] 47 | print("{} words are triangle words".format(sum([1 for word in stripped_words if is_triangle_word(word)]))) 48 | 49 | 50 | if __name__ == "__main__": 51 | main() 52 | -------------------------------------------------------------------------------- /0042_Coded_triangle_numbers/p042_words.txt: -------------------------------------------------------------------------------- 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" 2 | -------------------------------------------------------------------------------- /0043_Sub-string_divisibility/0043_Sub-string_divisibility.py: -------------------------------------------------------------------------------- 1 | # The number, 1406357289, is a 0 to 9 pandigital number 2 | # because it is made up of each of the digits 0 to 9 in some order, 3 | # but it also has a rather interesting sub-string divisibility property. 4 | 5 | # Let d_1 be the 1st digit, d_2 be the 2nd digit, and so on. In this way, we note the following: 6 | 7 | # d_2d_3d_4 = 406 is divisible by 2 8 | # d_3d_4d_5 = 063 is divisible by 3 9 | # d_4d_5d_6 = 635 is divisible by 5 10 | # d_5d_6d_7 = 357 is divisible by 7 11 | # d_6d_7d_8 = 572 is divisible by 11 12 | # d_7d_8d_9 = 728 is divisible by 13 13 | # d_8d_9d_10 = 289 is divisible by 17 14 | 15 | # Find the sum of all 0 to 9 pandigital numbers with this property. 16 | 17 | 18 | from itertools import permutations 19 | 20 | 21 | def count_satisfied_divisions(number: str) -> int: 22 | primes: list = [2, 3, 5, 7, 11, 13, 17] 23 | count_divisibles: int = 0 24 | for i in range(1, 8): 25 | if int(number[i : i + 3]) % primes[i - 1] == 0: 26 | count_divisibles += 1 27 | 28 | return count_divisibles 29 | 30 | 31 | def satisfy_divisibility_property(number: str) -> bool: 32 | return count_satisfied_divisions(number) == 7 33 | 34 | 35 | def main(): 36 | digits: str = "0123456789" 37 | pandigitals: list = list("".join(x) for x in permutations(digits)) 38 | pandigitals_satisfy_property = list(filter(satisfy_divisibility_property, pandigitals)) 39 | pandigitals_satisfy_property_int = list(map(int, pandigitals_satisfy_property)) 40 | print(pandigitals_satisfy_property_int) 41 | print(sum(pandigitals_satisfy_property_int)) 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /0044_Pentagon_numbers/0044_Pentagon_numbers.py: -------------------------------------------------------------------------------- 1 | # Pentagonal numbers are generated by the formula, 2 | # P_n=n(3n−1)/2. The first ten pentagonal numbers are: 3 | 4 | # 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ... 5 | 6 | # It can be seen that P_4 + P_7 = 22 + 70 = 92 = P_8. 7 | # However, their difference, 70 − 22 = 48, is not pentagonal. 8 | 9 | # Find the pair of pentagonal numbers, P_j and P_k, 10 | # for which their sum and difference are pentagonal 11 | # and D = |P_k − P_j| is minimised; what is the value of D? 12 | 13 | from __future__ import annotations 14 | 15 | import math 16 | 17 | 18 | class PentagonalNumber: 19 | def __init__(self, n: int = None, P_n=None) -> None: 20 | if n is None and P_n is None: 21 | raise ValueError("Either n or P_n must be specified") 22 | self.n = n if n is not None else PentagonalNumber.get_n_of_pentagonal_number(PentagonalNumber(P_n=P_n)) 23 | self.P_n = P_n if P_n is not None else n * (3 * n - 1) // 2 24 | 25 | @staticmethod 26 | def get_n_of_pentagonal_number(pentagonal_number: PentagonalNumber) -> int: 27 | if pentagonal_number.P_n < 0: 28 | raise ValueError("Pentagonal number must be positive") 29 | if PentagonalNumber.is_pentagonal(pentagonal_number.P_n): 30 | return 1 + math.sqrt(1 + 24 * pentagonal_number.P_n) // 6 31 | else: 32 | raise ValueError("Pentagonal number must be pentagonal") 33 | 34 | def next_number(self) -> PentagonalNumber: 35 | return PentagonalNumber(n=self.n + 1) 36 | 37 | def get_pentagonal_p_n(self) -> int: 38 | return self.P_n 39 | 40 | def get_pentagonal_n(self) -> int: 41 | return self.n 42 | 43 | @staticmethod 44 | def is_pentagonal(P_n: int) -> bool: 45 | return (1 + math.sqrt(1 + 24 * P_n)) % 6 == 0 46 | 47 | def __str__(self) -> str: 48 | return f"n: {self.n} -> P_n: {self.P_n}" 49 | 50 | def __repr__(self) -> str: 51 | return f"PentagonalNumber({self.n})" 52 | 53 | def __eq__(self, other_pentagonal_number: PentagonalNumber) -> bool: 54 | return self.P_n == other_pentagonal_number.P_n 55 | 56 | def __hash__(self) -> int: 57 | return hash(self.P_n) 58 | 59 | def __lt__(self, other_pentagonal_number: PentagonalNumber) -> bool: 60 | return self.P_n < other_pentagonal_number.P_n 61 | 62 | def __gt__(self, other_pentagonal_number: PentagonalNumber) -> bool: 63 | return self.P_n > other_pentagonal_number.P_n 64 | 65 | def __le__(self, other_pentagonal_number: PentagonalNumber) -> bool: 66 | return self.P_n <= other_pentagonal_number.P_n 67 | 68 | def __ge__(self, other_pentagonal_number: PentagonalNumber) -> bool: 69 | return self.P_n >= other_pentagonal_number.P_n 70 | 71 | def __ne__(self, other_pentagonal_number: PentagonalNumber) -> bool: 72 | return self.P_n != other_pentagonal_number.P_n 73 | 74 | def __add__(self, other_pentagonal_number: PentagonalNumber) -> int: 75 | return self.P_n + other_pentagonal_number.P_n 76 | 77 | def __sub__(self, other_pentagonal_number: PentagonalNumber) -> int: 78 | return abs(self.P_n - other_pentagonal_number.P_n) 79 | 80 | def __abs__(self) -> int: 81 | return abs(self.P_n) 82 | 83 | def __bool__(self) -> bool: 84 | return self.P_n > 0 85 | 86 | def __int__(self) -> int: 87 | return int(self.P_n) 88 | 89 | def __float__(self) -> float: 90 | return float(self.P_n) 91 | 92 | def __index__(self) -> int: 93 | return int(self.P_n) 94 | 95 | def __iter__(self): 96 | return iter([self.P_n]) 97 | 98 | 99 | class Solution: 100 | def __init__(self, P_j: PentagonalNumber, P_k: PentagonalNumber, D: int) -> None: 101 | self.P_j = P_j 102 | self.P_k = P_k 103 | self.D = D 104 | 105 | def __str__(self) -> str: 106 | return f"Solution:\n {self.P_j}\n {self.P_k}\n Distance: {self.D}" 107 | 108 | def __repr__(self) -> str: 109 | return f"Solution({self.P_j}, {self.P_k}, {self.D})" 110 | 111 | def __hash__(self) -> int: 112 | return hash((self.P_j, self.P_k, self.D)) 113 | 114 | def __eq__(self, other_solution: Solution) -> bool: 115 | return ( 116 | (self.P_j == other_solution.P_k and self.P_k == other_solution.P_j) 117 | or (self.P_j == other_solution.P_j and self.P_k == other_solution.P_k) 118 | ) and self.D == other_solution.D 119 | 120 | def __lt__(self, other_solution: Solution) -> bool: 121 | return self.D < other_solution.D 122 | 123 | def __gt__(self, other_solution: Solution) -> bool: 124 | return self.D > other_solution.D 125 | 126 | def __le__(self, other_solution: Solution) -> bool: 127 | return self.D <= other_solution.D 128 | 129 | def __ge__(self, other_solution: Solution) -> bool: 130 | return self.D >= other_solution.D 131 | 132 | def __ne__(self, other_solution: Solution) -> bool: 133 | return self.D != other_solution.D 134 | 135 | def __add__(self, other_solution: Solution) -> int: 136 | return self.D + other_solution.D 137 | 138 | def __sub__(self, other_solution: Solution) -> int: 139 | return self.D - other_solution.D 140 | 141 | def __abs__(self) -> int: 142 | return abs(self.D) 143 | 144 | def __bool__(self) -> bool: 145 | return self.D > 0 146 | 147 | def __int__(self) -> int: 148 | return int(self.D) 149 | 150 | def __float__(self) -> float: 151 | return float(self.D) 152 | 153 | 154 | def main(): 155 | pentagonal_number = PentagonalNumber(n=1) 156 | pentagonal_numbers = [pentagonal_number] 157 | for _ in range(5000): 158 | pentagonal_number = pentagonal_number.next_number() 159 | pentagonal_numbers.append(pentagonal_number) 160 | 161 | solutions = [] 162 | for j in range(len(pentagonal_numbers)): 163 | p_j = pentagonal_numbers[j] 164 | for k in range(j + 1, len(pentagonal_numbers)): 165 | p_k = pentagonal_numbers[k] 166 | difference: int = p_j - p_k 167 | summation: int = p_j + p_k 168 | if PentagonalNumber.is_pentagonal(difference) and PentagonalNumber.is_pentagonal(summation): 169 | solutions.append(Solution(p_j, p_k, difference)) 170 | 171 | min_solution = min(solutions if solutions else [Solution(PentagonalNumber(0), PentagonalNumber(0), 0)]) 172 | 173 | print("P_j:", min_solution.P_j) 174 | print("P_k:", min_solution.P_k) 175 | print("D:", min_solution.D) 176 | 177 | 178 | if __name__ == "__main__": 179 | main() 180 | -------------------------------------------------------------------------------- /0045_Triangular_Pentagonal_and_Hexagonal/0045_Triangular_Pentagonal_and_Hexagonal.py: -------------------------------------------------------------------------------- 1 | # Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: 2 | 3 | # Triangle Tn = n(n+1)/2 1, 3, 6, 10, 15, ... 4 | # Pentagonal Pn = n(3n−1)/2 1, 5, 12, 22, 35, ... 5 | # Hexagonal Hn = n(2n−1) 1, 6, 15, 28, 45, ... 6 | # It can be verified that T_285 = P_165 = H_143 = 40755. 7 | 8 | # Find the next triangle number that is also pentagonal and hexagonal. 9 | 10 | 11 | def is_triangle(T_n): 12 | return (1 + 8 * T_n) ** 0.5 % 2 == 1 13 | 14 | 15 | def is_pentagonal(P_n): 16 | return (1 + 24 * P_n) ** 0.5 % 6 == 5 17 | 18 | 19 | def is_hexagonal(H_n): 20 | return (1 + 8 * H_n) ** 0.5 % 4 == 3 21 | 22 | 23 | def get_n_triangle(T_n): 24 | return int((1 + 8 * T_n) ** 0.5 // 2) 25 | 26 | 27 | def next_triangle(current_triangle): 28 | current_n = get_n_triangle(current_triangle) 29 | return int((current_n + 1) * (current_n + 2) // 2) 30 | 31 | 32 | def main(): 33 | number = next_triangle(40755) 34 | print(number) 35 | while True: 36 | if is_triangle(number) and is_pentagonal(number) and is_hexagonal(number): 37 | print(number) 38 | break 39 | number = next_triangle(number) 40 | 41 | 42 | if __name__ == "__main__": 43 | main() 44 | -------------------------------------------------------------------------------- /0046_Goldbach_s_other_conjecture/0046_Goldbach_s_other_conjecture.py: -------------------------------------------------------------------------------- 1 | # It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square. 2 | 3 | # 9 = 7 + 2*1^2 4 | # 15 = 7 + 2*2^2 5 | # 21 = 3 + 2*3^2 6 | # 25 = 7 + 2*3^2 7 | # 27 = 19 + 2*2^2 8 | # 33 = 31 + 2*1^2 9 | 10 | # It turns out that the conjecture was false. 11 | 12 | # What is the smallest odd composite that cannot be written as the sum of a prime and twice a square? 13 | 14 | 15 | from math import ceil 16 | 17 | from primesieve import primes 18 | 19 | 20 | def is_prime(n): 21 | if n == 2: 22 | return True 23 | if n % 2 == 0: 24 | return False 25 | for i in range(3, int(ceil(n**0.5)) + 1, 2): 26 | if n % i == 0: 27 | return False 28 | return True 29 | 30 | 31 | def primes_list(n): 32 | return list(primes(n)) 33 | 34 | 35 | def is_written_as_prime_and_twice_a_square(n): 36 | primes = primes_list(n - 2) 37 | twice_squares = [2 * i * i for i in range(1, int(ceil((n / 2) ** 0.5) + 1))] 38 | for prime in primes: 39 | for two_square in twice_squares: 40 | if prime + two_square == n: 41 | print(n, "=", prime, "+ 2 *", int((two_square // 2) ** 0.5), "^2") 42 | return True 43 | return True 44 | elif prime + two_square > n: 45 | break 46 | return False 47 | 48 | 49 | def main(): 50 | num = 1 51 | while True: 52 | if is_prime(num): 53 | num += 2 54 | continue 55 | if not is_written_as_prime_and_twice_a_square(num): 56 | print(num, "is the smallest odd composite that cannot be written as the sum of a prime and twice a square") 57 | break 58 | num += 2 59 | 60 | 61 | main() 62 | -------------------------------------------------------------------------------- /0047_Distinct_primes_factors/0047_Distinct_primes_factors.py: -------------------------------------------------------------------------------- 1 | # The first two consecutive numbers to have two distinct prime factors are: 2 | 3 | # 14 = 2 * 7 4 | # 15 = 3 * 5 5 | 6 | # The first three consecutive numbers to have three distinct prime factors are: 7 | 8 | # 644 = 2^2 * 7 * 23 9 | # 645 = 3 * 5 * 43 10 | # 646 = 2 * 17 * 19. 11 | 12 | # Find the first four consecutive integers to have four distinct prime factors each. 13 | # What is the first of these numbers? 14 | 15 | import numpy as np 16 | import primesieve 17 | 18 | 19 | def check_has_prime_factors(n, distinct_count, primes): 20 | count = 0 21 | for prime in primes: 22 | if n % prime == 0: 23 | count += 1 24 | if count == distinct_count: 25 | return True 26 | return False 27 | 28 | 29 | def count_total_with_prime_factors(n, distinct_count, primes): 30 | count = 0 31 | for i in range(distinct_count): 32 | if check_has_prime_factors(n + i, distinct_count, primes): 33 | count += 1 34 | else: 35 | break 36 | return count 37 | 38 | 39 | def main(): 40 | it = primesieve.Iterator() 41 | number = 2 42 | # distinct_count = 2 43 | # distinct_count = 3 44 | distinct_count = 4 45 | 46 | primes = [] 47 | for i in range(distinct_count): 48 | primes.append(it.next_prime()) 49 | 50 | while True: 51 | if number > primes[-1]: 52 | primes.append(it.next_prime()) 53 | 54 | if count_total_with_prime_factors(number, distinct_count, primes) == distinct_count: 55 | print(number) 56 | break 57 | 58 | number += 1 59 | 60 | 61 | if __name__ == "__main__": 62 | main() 63 | -------------------------------------------------------------------------------- /0048_Self_powers/0048_Self_powers.py: -------------------------------------------------------------------------------- 1 | # The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317. 2 | 3 | # Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000. 4 | 5 | 6 | def main(): 7 | print(str(sum([i**i for i in range(1, 1001)]))[-10:]) 8 | 9 | 10 | if __name__ == "__main__": 11 | main() 12 | -------------------------------------------------------------------------------- /0049_Prime_permutations/0049_Prime_permutations.py: -------------------------------------------------------------------------------- 1 | # The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, 2 | # is unusual in two ways: 3 | # (i) each of the three terms are prime, and , 4 | # (ii) each of the 4-digit numbers are permutations of one another. 5 | 6 | # There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, 7 | # exhibiting this property, but there is one other 4-digit increasing sequence. 8 | 9 | # What 12-digit number do you form by concatenating the three terms in this sequence? 10 | 11 | 12 | from itertools import permutations 13 | 14 | import primesieve 15 | 16 | 17 | def prime_permutations(primes_list, min_digits, max_digits): 18 | primes_set = set(primes_list) 19 | prime_perms = {} 20 | for prime in primes_list: 21 | perms_int = sorted( 22 | list(set([int("".join(x)) for x in permutations(str(prime)) if int("".join(x)) in primes_set])) 23 | ) 24 | if len(perms_int) <= 2: 25 | continue 26 | prime_perms[prime] = perms_int 27 | return prime_perms 28 | 29 | 30 | def equidistant_prime_perms(prime_perms): 31 | results = set() 32 | for prime, perms in prime_perms.items(): 33 | for i in range(len(perms)): 34 | for j in range(i + 1, len(perms)): 35 | for k in range(j + 1, len(perms)): 36 | if perms[j] - perms[i] == perms[k] - perms[j]: 37 | results.add(str(perms[i]) + str(perms[j]) + str(perms[k])) 38 | return results 39 | 40 | 41 | def main(): 42 | primes = list(primesieve.primes(10000)) 43 | primes_list = list(filter(lambda x: x > 1000, primes)) 44 | 45 | prime_perms = prime_permutations(primes_list, 3, 4) 46 | results = equidistant_prime_perms(prime_perms) 47 | 48 | print(*results, sep="\n") 49 | 50 | 51 | if __name__ == "__main__": 52 | main() 53 | -------------------------------------------------------------------------------- /0050_Consecutive_prime_sum/0050_Consecutive_prime_sum.py: -------------------------------------------------------------------------------- 1 | # The prime 41, can be written as the sum of six consecutive primes: 2 | 3 | # 41 = 2 + 3 + 5 + 7 + 11 + 13 4 | # This is the longest sum of consecutive primes that adds to a prime below one-hundred. 5 | 6 | # The longest sum of consecutive primes below one-thousand that adds to a prime, 7 | # contains 21 terms, and is equal to 953. 8 | 9 | # Which prime, below one-million, can be written as the sum of the most consecutive primes? 10 | 11 | 12 | import primesieve 13 | 14 | 15 | def get_primes_smaller_than(n): 16 | result = [] 17 | it = primesieve.Iterator() 18 | prime = it.next_prime() 19 | while prime < n: 20 | result.append(prime) 21 | prime = it.next_prime() 22 | return result 23 | 24 | 25 | def prime_witten_most_consecutive_prime_sum(primes, primes_set, ceiling): 26 | arg_max_sum_primes = 0 27 | max_length = -1 28 | for i in range(len(primes)): 29 | max_sum = 0 30 | for j in range(i, len(primes)): 31 | max_sum += primes[j] 32 | if max_sum > ceiling: 33 | break 34 | if max_sum in primes_set and max_sum > arg_max_sum_primes and j - i > max_length: 35 | max_length = j - i 36 | arg_max_sum_primes = max_sum 37 | return arg_max_sum_primes, max_length 38 | 39 | 40 | def main(): 41 | primes = get_primes_smaller_than(1000000) 42 | primes_set = set(primes) 43 | arg_max_sum_primes, max_length = prime_witten_most_consecutive_prime_sum(primes, primes_set, 1000000) 44 | print( 45 | "{} can be written as the sum of the most consecutive primes, with {} consecutive primes".format( 46 | arg_max_sum_primes, max_length 47 | ) 48 | ) 49 | 50 | 51 | if __name__ == "__main__": 52 | main() 53 | -------------------------------------------------------------------------------- /0055_Lychrel_numbers/0055_Lychrel_numbers.py: -------------------------------------------------------------------------------- 1 | # If we take 47, reverse and add, 2 | # 47 + 74 = 121, which is palindromic. 3 | 4 | # Not all numbers produce palindromes so quickly. For example, 5 | 6 | # 349 + 943 = 1292, 7 | # 1292 + 2921 = 4213 8 | # 4213 + 3124 = 7337 9 | 10 | # That is, 349 took three iterations to arrive at a palindrome. 11 | 12 | # Although no one has proved it yet, it is thought that some numbers, 13 | # like 196, never produce a palindrome. 14 | # A number that never forms a palindrome through the reverse 15 | # and add process is called a Lychrel number. 16 | # Due to the theoretical nature of these numbers, 17 | # and for the purpose of this problem, 18 | # we shall assume that a number is Lychrel until proven otherwise. 19 | # In addition you are given that for every number below ten-thousand, 20 | # it will either 21 | # (i) become a palindrome in less than fifty iterations, or, 22 | # (ii) no one, with all the computing power that exists, 23 | # has managed so far to map it to a palindrome. 24 | # In fact, 10677 is the first number to be shown to require 25 | # over fifty iterations before producing a palindrome: 26 | # 4668731596684224866951378664 (53 iterations, 28-digits). 27 | 28 | # Surprisingly, there are palindromic numbers that are themselves Lychrel numbers 29 | # the first example is 4994. 30 | 31 | # How many Lychrel numbers are there below ten-thousand? 32 | 33 | # NOTE: Wording was modified slightly on 24 April 2007 to emphasise 34 | # the theoretical nature of Lychrel numbers. 35 | 36 | 37 | def is_palindrome(n): 38 | return str(n) == str(n)[::-1] 39 | 40 | 41 | def reverse_and_add(n): 42 | return n + int(str(n)[::-1]) 43 | 44 | 45 | def is_lychrel(n): 46 | for i in range(50): 47 | n = reverse_and_add(n) 48 | if is_palindrome(n): 49 | return False 50 | return True 51 | 52 | 53 | def main(): 54 | lychrel_numbers = [n for n in range(1, 10000) if is_lychrel(n)] 55 | print(len(lychrel_numbers)) 56 | 57 | 58 | main() 59 | -------------------------------------------------------------------------------- /0065_Convergents_of_e/0065_Convergents_of_e.py: -------------------------------------------------------------------------------- 1 | # The square root of 2 can be written as an infinite continued fraction. 2 | # 3 | # √2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) 4 | # 5 | # The infinite continued fraction can be written, 6 | # √2 = [1;(2)], (2) indicates that 2 repeats ad infinitum. 7 | # In a similar way, √23 = [4;(1,3,1,8)]. 8 | # 9 | # It turns out that the sequence of partial values of continued 10 | # fractions for square roots provide the best rational approximations. 11 | # Let us consider the convergents for √2. 12 | # 13 | # 1 + 1/2 = 3/2 14 | # 15 | # 1 + 1/(2 + 1/2) = 7/5 16 | # 17 | # 1 + 1/(2 + 1/(2 + 1/2)) = 17/12 18 | # 19 | # 1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 20 | # 21 | # Hence the sequence of the first ten convergents for √2 are: 22 | # 23 | # 1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ... 24 | # 25 | # What is most surprising is that the important mathematical constant, 26 | # e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...]. 27 | # 28 | # The first ten terms in the sequence of convergents for e are: 29 | # 2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ... 30 | # 31 | # The sum of digits in the numerator of the 10th convergent is 1+4+5+7=17. 32 | # 33 | # Find the sum of digits in the numerator of the 34 | # 100th convergent of the continued fraction for e. 35 | 36 | import math 37 | 38 | 39 | def infinite_continued_fraction_for_two(nth) -> list: 40 | """ 41 | Returns list of the first n (numerator, denominator) 42 | of the square root partial fractions of number 2. 43 | 44 | nth = 1, return [(1, 1)] 45 | nth = 2, return [(1, 1), (3, 2)] 46 | nth = 3, return [(1, 1), (3, 2), (7, 5)] 47 | nth = 4, return [(1, 1), (3, 2), (7, 5), (17, 12)] 48 | """ 49 | res = [(1, 1), (3, 2), (7, 5)] 50 | for i in range(3, nth): 51 | n_i = res[i - 1][0] + 2 * res[i - 1][1] 52 | d_i = 2 * res[i - 1][1] + res[i - 2][1] 53 | res.append((n_i, d_i)) 54 | return res 55 | 56 | 57 | def infinite_continued_fraction_for_e(nth) -> list: 58 | """ 59 | Returns list of the first n (numerator, denominator) 60 | of the square root partial fractions of number e. 61 | 62 | nth = 1, return [(2, 1)] 63 | nth = 2, return [(2, 1), (3, 2)] 64 | nth = 3, return [(2, 1), (3, 2), (8, 3)] 65 | nth = 4, return [(2, 1), (3, 2), (8, 3), (11, 4)] 66 | """ 67 | res = [(2, 1), (3, 2), (8, 3), (11, 4)] 68 | for i in range(4, nth): 69 | if (i + 1) % 3 == 0: 70 | n_i = 2 * ((i + 1) // 3) * res[i - 1][0] + res[i - 2][0] 71 | d_i = 2 * ((i + 1) // 3) * res[i - 1][1] + res[i - 2][1] 72 | else: 73 | n_i = res[i - 1][0] + res[i - 2][0] 74 | d_i = res[i - 1][1] + res[i - 2][1] 75 | res.append((n_i, d_i)) 76 | return res 77 | 78 | 79 | def main(): 80 | fractions_for_two = infinite_continued_fraction_for_two(10) 81 | fractions_for_e_ten = infinite_continued_fraction_for_e(10) 82 | fractions_for_e_hundred = infinite_continued_fraction_for_e(100) 83 | print(fractions_for_two) 84 | print(fractions_for_e_ten) 85 | print("The 100th convergent of the continued fraction for e:", fractions_for_e_hundred[99]) 86 | print( 87 | "Sum of digits in numerator of the 100th convergent", 88 | "of the continued fraction for e:", 89 | sum(int(i) for i in str(fractions_for_e_hundred[99][0])), 90 | ) 91 | 92 | 93 | main() 94 | -------------------------------------------------------------------------------- /0081_Path_sum_two_ways/0081_Path_sum_two_ways.py: -------------------------------------------------------------------------------- 1 | # In the 5 by 5 matrix below, the minimal path sum 2 | # from the top left to the bottom right, 3 | # by only moving to the right and down, 4 | # is indicated in bold red and is equal to 2427. 5 | # 6 | # 131 673 234 103 18 7 | # 201 96 342 965 150 8 | # 630 803 746 422 111 9 | # 537 699 497 121 956 10 | # 805 732 524 37 331 11 | # 12 | # Find the minimal path sum from the top left to the bottom right 13 | # by only moving right and down in matrix.txt 14 | # (right click and "Save Link/Target As..."), 15 | # a 31K text file containing an 80 by 80 matrix. 16 | 17 | import numpy as np 18 | 19 | 20 | class BinaryTree: 21 | def __init__(self, pos: tuple = None, cost: int = None): 22 | self.position = pos 23 | self.cost = cost 24 | self.right_child = None 25 | self.down_child = None 26 | self.parent = None 27 | 28 | def get_right_child(self): 29 | return self.right_child 30 | 31 | def get_down_child(self): 32 | return self.down_child 33 | 34 | def get_parent(self): 35 | return self.parent 36 | 37 | def set_parent(self, tree): 38 | self.parent = tree 39 | 40 | def get_pos(self): 41 | return self.position 42 | 43 | def set_pos(self, pos): 44 | self.position = pos 45 | 46 | def get_cost(self): 47 | return self.cost 48 | 49 | def set_cost(self, cost): 50 | self.cost = cost 51 | 52 | def insert_right(self, pos, cost): 53 | if self.right_child is None: 54 | self.right_child = BinaryTree(pos, cost) 55 | self.right_child.parent = self 56 | else: 57 | t = BinaryTree(pos, cost) 58 | t.right_child = self.right_child 59 | if self.down_child is not None: 60 | t.down_child = self.down_child 61 | t.down_child.parent = t 62 | self.right_child = t 63 | t.parent = self 64 | t.right_child.parent = t 65 | 66 | def insert_down(self, pos, cost): 67 | if self.down_child is None: 68 | self.down_child = BinaryTree(pos, cost) 69 | self.down_child.parent = self 70 | else: 71 | t = BinaryTree(pos, cost) 72 | t.down_child = self.down_child 73 | if self.right_child is not None: 74 | t.right_child = self.right_child 75 | t.right_child.parent = t 76 | self.down_child = t 77 | t.parent = self 78 | t.down_child.parent = t 79 | 80 | def remove_right_child(self): 81 | self.right_child = None 82 | 83 | def remove_down_child(self): 84 | self.down_child = None 85 | 86 | def node_to_string(self): 87 | return "Pos: " + str(self.position) + " Cost: " + str(self.cost) 88 | 89 | def to_string(self, came_from=None): 90 | if came_from is None: 91 | res = " + " + self.node_to_string() + "\n" 92 | elif came_from == "Up": 93 | res = " v " + self.node_to_string() + "\n" 94 | elif came_from == "Left": 95 | res = " > " + self.node_to_string() + "\n" 96 | if self.down_child is not None: 97 | res += self.down_child.to_string(came_from="Up") 98 | if self.right_child is not None: 99 | res += self.right_child.to_string(came_from="Left") 100 | return res 101 | 102 | 103 | def read_matrix(filename): 104 | return np.loadtxt(filename, dtype=int, delimiter=",") 105 | 106 | 107 | def min_path_dp_recursive(matrix): 108 | """ 109 | Find the minimal path sum from the top left to the bottom right 110 | by only moving right and down in the matrix 111 | """ 112 | dynamic_programing_matrix = matrix.copy() 113 | ln = len(dynamic_programing_matrix) 114 | lm = len(dynamic_programing_matrix[0]) 115 | for i in range(ln): 116 | for j in range(lm): 117 | if i > 0 and j > 0: 118 | dynamic_programing_matrix[i][j] += min( 119 | dynamic_programing_matrix[i][j - 1], dynamic_programing_matrix[i - 1][j] 120 | ) 121 | elif i > 0: 122 | dynamic_programing_matrix[i][j] += dynamic_programing_matrix[i - 1][j] 123 | elif j > 0: 124 | dynamic_programing_matrix[i][j] += dynamic_programing_matrix[i][j - 1] 125 | return dynamic_programing_matrix[-1][-1] 126 | 127 | 128 | def main(): 129 | example_matrix = np.array( 130 | [ 131 | [131, 673, 234, 103, 18], 132 | [201, 96, 342, 965, 150], 133 | [630, 803, 746, 422, 111], 134 | [537, 699, 497, 121, 956], 135 | [805, 732, 524, 37, 331], 136 | ] 137 | ) 138 | 139 | min_path_sum = min_path_dp_recursive(example_matrix) 140 | print("Example min_path_sum", min_path_sum) 141 | matrix = read_matrix("p081_matrix.txt") 142 | min_path_sum = min_path_dp_recursive(matrix) 143 | print("p081_matrix min_path_sum", min_path_sum) 144 | 145 | 146 | main() 147 | -------------------------------------------------------------------------------- /0081_Path_sum_two_ways/p081_matrix.txt: -------------------------------------------------------------------------------- 1 | 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 2 | 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 3 | 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 4 | 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 5 | 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 6 | 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 7 | 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 8 | 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 9 | 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 10 | 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 11 | 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 12 | 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 13 | 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 14 | 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 15 | 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 16 | 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 17 | 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 18 | 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 19 | 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 20 | 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 21 | 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 22 | 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 23 | 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 24 | 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 25 | 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 26 | 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 27 | 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 28 | 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 29 | 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 30 | 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 31 | 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 32 | 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 33 | 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 34 | 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 35 | 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 36 | 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 37 | 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 38 | 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 39 | 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 40 | 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 41 | 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 42 | 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 43 | 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 44 | 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 45 | 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 46 | 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 47 | 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 48 | 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 49 | 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 50 | 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 51 | 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 52 | 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 53 | 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 54 | 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 55 | 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 56 | 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 57 | 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 58 | 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 59 | 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 60 | 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 61 | 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 62 | 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 63 | 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 64 | 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 65 | 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 66 | 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 67 | 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 68 | 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 69 | 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 70 | 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 71 | 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 72 | 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 73 | 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 74 | 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 75 | 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 76 | 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 77 | 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 78 | 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 79 | 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 80 | 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 81 | -------------------------------------------------------------------------------- /0089_Roman_numerals/0089_Roman_numerals.py: -------------------------------------------------------------------------------- 1 | # For a number written in Roman numerals to be considered valid 2 | # there are basic rules which must be followed. 3 | # Even though the rules allow some numbers to be expressed in more than one way 4 | # there is always a "best" way of writing a particular number. 5 | 6 | # For example, it would appear that there are at least six ways of writing the number sixteen: 7 | 8 | # IIIIIIIIIIIIIIII 9 | # VIIIIIIIIIII 10 | # VVIIIIII 11 | # XIIIIII 12 | # VVVI 13 | # XVI 14 | 15 | # However, according to the rules only XIIIIII and XVI are valid, 16 | # and the last example is considered to be the most efficient, 17 | # as it uses the least number of numerals. 18 | 19 | # The 11K text file, roman.txt (right click and 'Save Link/Target As...'), 20 | # contains one thousand numbers written in valid, 21 | # but not necessarily minimal, Roman numerals 22 | # see About... Roman Numerals for the definitive rules for this problem. 23 | 24 | # Find the number of characters saved by writing each of these in their minimal form. 25 | 26 | # Note: You can assume that all the Roman numerals in the file 27 | # contain no more than four consecutive identical units. 28 | 29 | 30 | def read_roman_numerals(filename): 31 | numerals = [] 32 | with open(filename) as f: 33 | for line in f: 34 | numerals.append(line.strip()) 35 | return numerals 36 | 37 | 38 | def roman_numeral_to_int(numeral): 39 | # convert roman numeral to integer 40 | values = {"M": 1000, "D": 500, "C": 100, "L": 50, "X": 10, "V": 5, "I": 1} 41 | result = 0 42 | for i in range(0, len(numeral)): 43 | if i > 0 and values[numeral[i]] > values[numeral[i - 1]]: 44 | result += values[numeral[i]] - 2 * values[numeral[i - 1]] 45 | else: 46 | result += values[numeral[i]] 47 | return result 48 | 49 | 50 | def int_to_roman_numeral(integer): 51 | # convert integer to roman numeral, efficiently 52 | values = { 53 | 1000: "M", 54 | 900: "CM", 55 | 500: "D", 56 | 400: "CD", 57 | 100: "C", 58 | 90: "XC", 59 | 50: "L", 60 | 40: "XL", 61 | 10: "X", 62 | 9: "IX", 63 | 5: "V", 64 | 4: "IV", 65 | 1: "I", 66 | } 67 | result = "" 68 | for i in sorted(values.keys(), reverse=True): 69 | while integer >= i: 70 | result += values[i] 71 | integer -= i 72 | return result 73 | 74 | 75 | def main(): 76 | roman_numerals = read_roman_numerals("p089_roman.txt") 77 | saved_chars = 0 78 | for roman_numeral in roman_numerals: 79 | saved_chars += len(roman_numeral) - len(int_to_roman_numeral(roman_numeral_to_int(roman_numeral))) 80 | print(saved_chars) 81 | 82 | 83 | main() 84 | -------------------------------------------------------------------------------- /0089_Roman_numerals/p089_roman.txt: -------------------------------------------------------------------------------- 1 | MMMMDCLXXII 2 | MMDCCCLXXXIII 3 | MMMDLXVIIII 4 | MMMMDXCV 5 | DCCCLXXII 6 | MMCCCVI 7 | MMMCDLXXXVII 8 | MMMMCCXXI 9 | MMMCCXX 10 | MMMMDCCCLXXIII 11 | MMMCCXXXVII 12 | MMCCCLXXXXIX 13 | MDCCCXXIIII 14 | MMCXCVI 15 | CCXCVIII 16 | MMMCCCXXXII 17 | MDCCXXX 18 | MMMDCCCL 19 | MMMMCCLXXXVI 20 | MMDCCCXCVI 21 | MMMDCII 22 | MMMCCXII 23 | MMMMDCCCCI 24 | MMDCCCXCII 25 | MDCXX 26 | CMLXXXVII 27 | MMMXXI 28 | MMMMCCCXIV 29 | MLXXII 30 | MCCLXXVIIII 31 | MMMMCCXXXXI 32 | MMDCCCLXXII 33 | MMMMXXXI 34 | MMMDCCLXXX 35 | MMDCCCLXXIX 36 | MMMMLXXXV 37 | MCXXI 38 | MDCCCXXXVII 39 | MMCCCLXVII 40 | MCDXXXV 41 | CCXXXIII 42 | CMXX 43 | MMMCLXIV 44 | MCCCLXXXVI 45 | DCCCXCVIII 46 | MMMDCCCCXXXIV 47 | CDXVIIII 48 | MMCCXXXV 49 | MDCCCXXXII 50 | MMMMD 51 | MMDCCLXIX 52 | MMMMCCCLXXXXVI 53 | MMDCCXLII 54 | MMMDCCCVIIII 55 | DCCLXXXIIII 56 | MDCCCCXXXII 57 | MMCXXVII 58 | DCCCXXX 59 | CCLXIX 60 | MMMXI 61 | MMMMCMLXXXXVIII 62 | MMMMDLXXXVII 63 | MMMMDCCCLX 64 | MMCCLIV 65 | CMIX 66 | MMDCCCLXXXIIII 67 | CLXXXII 68 | MMCCCCXXXXV 69 | MMMMDLXXXVIIII 70 | MMMDCCCXXI 71 | MMDCCCCLXXVI 72 | MCCCCLXX 73 | MMCDLVIIII 74 | MMMDCCCLIX 75 | MMMMCCCCXIX 76 | MMMDCCCLXXV 77 | XXXI 78 | CDLXXXIII 79 | MMMCXV 80 | MMDCCLXIII 81 | MMDXXX 82 | MMMMCCCLVII 83 | MMMDCI 84 | MMMMCDLXXXIIII 85 | MMMMCCCXVI 86 | CCCLXXXVIII 87 | MMMMCML 88 | MMMMXXIV 89 | MMMCCCCXXX 90 | DCCX 91 | MMMCCLX 92 | MMDXXXIII 93 | CCCLXIII 94 | MMDCCXIII 95 | MMMCCCXLIV 96 | CLXXXXI 97 | CXVI 98 | MMMMCXXXIII 99 | CLXX 100 | DCCCXVIII 101 | MLXVII 102 | DLXXXX 103 | MMDXXI 104 | MMMMDLXXXXVIII 105 | MXXII 106 | LXI 107 | DCCCCXLIII 108 | MMMMDV 109 | MMMMXXXIV 110 | MDCCCLVIII 111 | MMMCCLXXII 112 | MMMMDCCXXXVI 113 | MMMMLXXXIX 114 | MDCCCLXXXI 115 | MMMMDCCCXV 116 | MMMMCCCCXI 117 | MMMMCCCLIII 118 | MDCCCLXXI 119 | MMCCCCXI 120 | MLXV 121 | MMCDLXII 122 | MMMMDXXXXII 123 | MMMMDCCCXL 124 | MMMMCMLVI 125 | CCLXXXIV 126 | MMMDCCLXXXVI 127 | MMCLII 128 | MMMCCCCXV 129 | MMLXXXIII 130 | MMMV 131 | MMMV 132 | DCCLXII 133 | MMDCCCCXVI 134 | MMDCXLVIII 135 | CCLIIII 136 | CCCXXV 137 | MMDCCLXXXVIIII 138 | MMMMDCLXXVIII 139 | MMMMDCCCXCI 140 | MMMMCCCXX 141 | MMCCXLV 142 | MMMDCCCLXIX 143 | MMCCLXIIII 144 | MMMDCCCXLIX 145 | MMMMCCCLXIX 146 | CMLXXXXI 147 | MCMLXXXIX 148 | MMCDLXI 149 | MMDCLXXVIII 150 | MMMMDCCLXI 151 | MCDXXV 152 | DL 153 | CCCLXXII 154 | MXVIIII 155 | MCCCCLXVIII 156 | CIII 157 | MMMDCCLXXIIII 158 | MMMDVIII 159 | MMMMCCCLXXXXVII 160 | MMDXXVII 161 | MMDCCLXXXXV 162 | MMMMCXLVI 163 | MMMDCCLXXXII 164 | MMMDXXXVI 165 | MCXXII 166 | CLI 167 | DCLXXXIX 168 | MMMCLI 169 | MDCLXIII 170 | MMMMDCCXCVII 171 | MMCCCLXXXV 172 | MMMDCXXVIII 173 | MMMCDLX 174 | MMMCMLII 175 | MMMIV 176 | MMMMDCCCLVIII 177 | MMMDLXXXVIII 178 | MCXXIV 179 | MMMMLXXVI 180 | CLXXIX 181 | MMMCCCCXXVIIII 182 | DCCLXXXV 183 | MMMDCCCVI 184 | LI 185 | CLXXXVI 186 | MMMMCCCLXXVI 187 | MCCCLXVI 188 | CCXXXIX 189 | MMDXXXXI 190 | MMDCCCXLI 191 | DCCCLXXXVIII 192 | MMMMDCCCIV 193 | MDCCCCXV 194 | MMCMVI 195 | MMMMCMLXXXXV 196 | MMDCCLVI 197 | MMMMCCXLVIII 198 | DCCCCIIII 199 | MMCCCCIII 200 | MMMDCCLXXXVIIII 201 | MDCCCLXXXXV 202 | DVII 203 | MMMV 204 | DCXXV 205 | MMDCCCXCV 206 | DCVIII 207 | MMCDLXVI 208 | MCXXVIII 209 | MDCCXCVIII 210 | MMDCLX 211 | MMMDCCLXIV 212 | MMCDLXXVII 213 | MMDLXXXIIII 214 | MMMMCCCXXII 215 | MMMDCCCXLIIII 216 | DCCCCLXVII 217 | MMMCLXXXXIII 218 | MCCXV 219 | MMMMDCXI 220 | MMMMDCLXXXXV 221 | MMMCCCLII 222 | MMCMIX 223 | MMDCCXXV 224 | MMDLXXXVI 225 | MMMMDCXXVIIII 226 | DCCCCXXXVIIII 227 | MMCCXXXIIII 228 | MMDCCLXXVIII 229 | MDCCLXVIIII 230 | MMCCLXXXV 231 | MMMMDCCCLXXXVIII 232 | MMCMXCI 233 | MDXLII 234 | MMMMDCCXIV 235 | MMMMLI 236 | DXXXXIII 237 | MMDCCXI 238 | MMMMCCLXXXIII 239 | MMMDCCCLXXIII 240 | MDCLVII 241 | MMCD 242 | MCCCXXVII 243 | MMMMDCCIIII 244 | MMMDCCXLVI 245 | MMMCLXXXVII 246 | MMMCCVIIII 247 | MCCCCLXXIX 248 | DL 249 | DCCCLXXVI 250 | MMDXCI 251 | MMMMDCCCCXXXVI 252 | MMCII 253 | MMMDCCCXXXXV 254 | MMMCDXLV 255 | MMDCXXXXIV 256 | MMD 257 | MDCCCLXXXX 258 | MMDCXLIII 259 | MMCCXXXII 260 | MMDCXXXXVIIII 261 | DCCCLXXI 262 | MDXCVIIII 263 | MMMMCCLXXVIII 264 | MDCLVIIII 265 | MMMCCCLXXXIX 266 | MDCLXXXV 267 | MDLVIII 268 | MMMMCCVII 269 | MMMMDCXIV 270 | MMMCCCLXIIII 271 | MMIIII 272 | MMMMCCCLXXIII 273 | CCIII 274 | MMMCCLV 275 | MMMDXIII 276 | MMMCCCXC 277 | MMMDCCCXXI 278 | MMMMCCCCXXXII 279 | CCCLVI 280 | MMMCCCLXXXVI 281 | MXVIIII 282 | MMMCCCCXIIII 283 | CLXVII 284 | MMMCCLXX 285 | CCCCLXIV 286 | MMXXXXII 287 | MMMMCCLXXXX 288 | MXL 289 | CCXVI 290 | CCCCLVIIII 291 | MMCCCII 292 | MCCCLVIII 293 | MMMMCCCX 294 | MCDLXXXXIV 295 | MDCCCXIII 296 | MMDCCCXL 297 | MMMMCCCXXIII 298 | DXXXIV 299 | CVI 300 | MMMMDCLXXX 301 | DCCCVII 302 | MMCMLXIIII 303 | MMMDCCCXXXIII 304 | DCCC 305 | MDIII 306 | MMCCCLXVI 307 | MMMCCCCLXXI 308 | MMDCCCCXVIII 309 | CCXXXVII 310 | CCCXXV 311 | MDCCCXII 312 | MMMCMV 313 | MMMMCMXV 314 | MMMMDCXCI 315 | DXXI 316 | MMCCXLVIIII 317 | MMMMCMLII 318 | MDLXXX 319 | MMDCLXVI 320 | CXXI 321 | MMMDCCCLIIII 322 | MMMCXXI 323 | MCCIII 324 | MMDCXXXXI 325 | CCXCII 326 | MMMMDXXXV 327 | MMMCCCLXV 328 | MMMMDLXV 329 | MMMCCCCXXXII 330 | MMMCCCVIII 331 | DCCCCLXXXXII 332 | MMCLXIV 333 | MMMMCXI 334 | MLXXXXVII 335 | MMMCDXXXVIII 336 | MDXXII 337 | MLV 338 | MMMMDLXVI 339 | MMMCXII 340 | XXXIII 341 | MMMMDCCCXXVI 342 | MMMLXVIIII 343 | MMMLX 344 | MMMCDLXVII 345 | MDCCCLVII 346 | MMCXXXVII 347 | MDCCCCXXX 348 | MMDCCCLXIII 349 | MMMMDCXLIX 350 | MMMMCMXLVIII 351 | DCCCLXXVIIII 352 | MDCCCLIII 353 | MMMCMLXI 354 | MMMMCCLXI 355 | MMDCCCLIII 356 | MMMDCCCVI 357 | MMDXXXXIX 358 | MMCLXXXXV 359 | MMDXXX 360 | MMMXIII 361 | DCLXXIX 362 | DCCLXII 363 | MMMMDCCLXVIII 364 | MDCCXXXXIII 365 | CCXXXII 366 | MMMMDCXXV 367 | MMMCCCXXVIII 368 | MDCVIII 369 | MMMCLXXXXIIII 370 | CLXXXI 371 | MDCCCCXXXIII 372 | MMMMDCXXX 373 | MMMDCXXIV 374 | MMMCCXXXVII 375 | MCCCXXXXIIII 376 | CXVIII 377 | MMDCCCCIV 378 | MMMMCDLXXV 379 | MMMDLXIV 380 | MDXCIII 381 | MCCLXXXI 382 | MMMDCCCXXIV 383 | MCXLIII 384 | MMMDCCCI 385 | MCCLXXX 386 | CCXV 387 | MMDCCLXXI 388 | MMDLXXXIII 389 | MMMMDCXVII 390 | MMMCMLXV 391 | MCLXVIII 392 | MMMMCCLXXVI 393 | MMMDCCLXVIIII 394 | MMMMDCCCIX 395 | DLXXXXIX 396 | DCCCXXII 397 | MMMMIII 398 | MMMMCCCLXXVI 399 | DCCCXCIII 400 | DXXXI 401 | MXXXIIII 402 | CCXII 403 | MMMDCCLXXXIIII 404 | MMMCXX 405 | MMMCMXXVII 406 | DCCCXXXX 407 | MMCDXXXVIIII 408 | MMMMDCCXVIII 409 | LV 410 | MMMDCCCCVI 411 | MCCCII 412 | MMCMLXVIIII 413 | MDCCXI 414 | MMMMDLXVII 415 | MMCCCCLXI 416 | MMDCCV 417 | MMMCCCXXXIIII 418 | MMMMDI 419 | MMMDCCCXCV 420 | MMDCCLXXXXI 421 | MMMDXXVI 422 | MMMDCCCLVI 423 | MMDCXXX 424 | MCCCVII 425 | MMMMCCCLXII 426 | MMMMXXV 427 | MMCMXXV 428 | MMLVI 429 | MMDXXX 430 | MMMMCVII 431 | MDC 432 | MCCIII 433 | MMMMDCC 434 | MMCCLXXV 435 | MMDCCCXXXXVI 436 | MMMMCCCLXV 437 | CDXIIII 438 | MLXIIII 439 | CCV 440 | MMMCMXXXI 441 | CCCCLXVI 442 | MDXXXII 443 | MMMMCCCLVIII 444 | MMV 445 | MMMCLII 446 | MCMLI 447 | MMDCCXX 448 | MMMMCCCCXXXVI 449 | MCCLXXXI 450 | MMMCMVI 451 | DCCXXX 452 | MMMMCCCLXV 453 | DCCCXI 454 | MMMMDCCCXIV 455 | CCCXXI 456 | MMDLXXV 457 | CCCCLXXXX 458 | MCCCLXXXXII 459 | MMDCIX 460 | DCCXLIIII 461 | DXIV 462 | MMMMCLII 463 | CDLXI 464 | MMMCXXVII 465 | MMMMDCCCCLXIII 466 | MMMDCLIIII 467 | MCCCCXXXXII 468 | MMCCCLX 469 | CCCCLIII 470 | MDCCLXXVI 471 | MCMXXIII 472 | MMMMDLXXVIII 473 | MMDCCCCLX 474 | MMMCCCLXXXX 475 | MMMCDXXVI 476 | MMMDLVIII 477 | CCCLXI 478 | MMMMDCXXII 479 | MMDCCCXXI 480 | MMDCCXIII 481 | MMMMCLXXXVI 482 | MDCCCCXXVI 483 | MDV 484 | MMDCCCCLXXVI 485 | MMMMCCXXXVII 486 | MMMDCCLXXVIIII 487 | MMMCCCCLXVII 488 | DCCXLI 489 | MMCLXXXVIII 490 | MCCXXXVI 491 | MMDCXLVIII 492 | MMMMCXXXII 493 | MMMMDCCLXVI 494 | MMMMCMLI 495 | MMMMCLXV 496 | MMMMDCCCXCIV 497 | MCCLXXVII 498 | LXXVIIII 499 | DCCLII 500 | MMMCCCXCVI 501 | MMMCLV 502 | MMDCCCXXXXVIII 503 | DCCCXV 504 | MXC 505 | MMDCCLXXXXVII 506 | MMMMCML 507 | MMDCCCLXXVIII 508 | DXXI 509 | MCCCXLI 510 | DCLXXXXI 511 | MMCCCLXXXXVIII 512 | MDCCCCLXXVIII 513 | MMMMDXXV 514 | MMMDCXXXVI 515 | MMMCMXCVII 516 | MMXVIIII 517 | MMMDCCLXXIV 518 | MMMCXXV 519 | DXXXVIII 520 | MMMMCLXVI 521 | MDXII 522 | MMCCCLXX 523 | CCLXXI 524 | DXIV 525 | MMMCLIII 526 | DLII 527 | MMMCCCXLIX 528 | MMCCCCXXVI 529 | MMDCXLIII 530 | MXXXXII 531 | CCCLXXXV 532 | MDCLXXVI 533 | MDCXII 534 | MMMCCCLXXXIII 535 | MMDCCCCLXXXII 536 | MMMMCCCLXXXV 537 | MMDCXXI 538 | DCCCXXX 539 | MMMDCCCCLII 540 | MMMDCCXXII 541 | MMMMCDXCVIII 542 | MMMCCLXVIIII 543 | MMXXV 544 | MMMMCDXIX 545 | MMMMCCCX 546 | MMMCCCCLXVI 547 | MMMMDCLXXVIIII 548 | MMMMDCXXXXIV 549 | MMMCMXII 550 | MMMMXXXIII 551 | MMMMDLXXXII 552 | DCCCLIV 553 | MDXVIIII 554 | MMMCLXXXXV 555 | CCCCXX 556 | MMDIX 557 | MMCMLXXXVIII 558 | DCCXLIII 559 | DCCLX 560 | D 561 | MCCCVII 562 | MMMMCCCLXXXIII 563 | MDCCCLXXIIII 564 | MMMDCCCCLXXXVII 565 | MMMMCCCVII 566 | MMMDCCLXXXXVI 567 | CDXXXIV 568 | MCCLXVIII 569 | MMMMDLX 570 | MMMMDXII 571 | MMMMCCCCLIIII 572 | MCMLXXXXIII 573 | MMMMDCCCIII 574 | MMDCLXXXIII 575 | MDCCCXXXXIV 576 | XXXXVII 577 | MMMDCCCXXXII 578 | MMMDCCCXLII 579 | MCXXXV 580 | MDCXXVIIII 581 | MMMCXXXXIIII 582 | MMMMCDXVII 583 | MMMDXXIII 584 | MMMMCCCCLXI 585 | DCLXXXXVIIII 586 | LXXXXI 587 | CXXXIII 588 | MCDX 589 | MCCLVII 590 | MDCXXXXII 591 | MMMCXXIV 592 | MMMMLXXXX 593 | MMDCCCCXLV 594 | MLXXX 595 | MMDCCCCLX 596 | MCDLIII 597 | MMMCCCLXVII 598 | MMMMCCCLXXIV 599 | MMMDCVIII 600 | DCCCCXXIII 601 | MMXCI 602 | MMDCCIV 603 | MMMMDCCCXXXIV 604 | CCCLXXI 605 | MCCLXXXII 606 | MCMIII 607 | CCXXXI 608 | DCCXXXVIII 609 | MMMMDCCXLVIIII 610 | MMMMCMXXXV 611 | DCCCLXXV 612 | DCCXCI 613 | MMMMDVII 614 | MMMMDCCCLXVIIII 615 | CCCXCV 616 | MMMMDCCXX 617 | MCCCCII 618 | MMMCCCXC 619 | MMMCCCII 620 | MMDCCLXXVII 621 | MMDCLIIII 622 | CCXLIII 623 | MMMDCXVIII 624 | MMMCCCIX 625 | MCXV 626 | MMCCXXV 627 | MLXXIIII 628 | MDCCXXVI 629 | MMMCCCXX 630 | MMDLXX 631 | MMCCCCVI 632 | MMDCCXX 633 | MMMMDCCCCXCV 634 | MDCCCXXXII 635 | MMMMDCCCCXXXX 636 | XCIV 637 | MMCCCCLX 638 | MMXVII 639 | MLXXI 640 | MMMDXXVIII 641 | MDCCCCII 642 | MMMCMLVII 643 | MMCLXXXXVIII 644 | MDCCCCLV 645 | MCCCCLXXIIII 646 | MCCCLII 647 | MCDXLVI 648 | MMMMDXVIII 649 | DCCLXXXIX 650 | MMMDCCLXIV 651 | MDCCCCXLIII 652 | CLXXXXV 653 | MMMMCCXXXVI 654 | MMMDCCCXXI 655 | MMMMCDLXXVII 656 | MCDLIII 657 | MMCCXLVI 658 | DCCCLV 659 | MCDLXX 660 | DCLXXVIII 661 | MMDCXXXIX 662 | MMMMDCLX 663 | MMDCCLI 664 | MMCXXXV 665 | MMMCCXII 666 | MMMMCMLXII 667 | MMMMCCV 668 | MCCCCLXIX 669 | MMMMCCIII 670 | CLXVII 671 | MCCCLXXXXIIII 672 | MMMMDCVIII 673 | MMDCCCLXI 674 | MMLXXIX 675 | CMLXIX 676 | MMDCCCXLVIIII 677 | DCLXII 678 | MMMCCCXLVII 679 | MDCCCXXXV 680 | MMMMDCCXCVI 681 | DCXXX 682 | XXVI 683 | MMLXIX 684 | MMCXI 685 | DCXXXVII 686 | MMMMCCCXXXXVIII 687 | MMMMDCLXI 688 | MMMMDCLXXIIII 689 | MMMMVIII 690 | MMMMDCCCLXII 691 | MDCXCI 692 | MMCCCXXIIII 693 | CCCCXXXXV 694 | MMDCCCXXI 695 | MCVI 696 | MMDCCLXVIII 697 | MMMMCXL 698 | MLXVIII 699 | CMXXVII 700 | CCCLV 701 | MDCCLXXXIX 702 | MMMCCCCLXV 703 | MMDCCLXII 704 | MDLXVI 705 | MMMCCCXVIII 706 | MMMMCCLXXXI 707 | MMCXXVII 708 | MMDCCCLXVIII 709 | MMMCXCII 710 | MMMMDCLVIII 711 | MMMMDCCCXXXXII 712 | MMDCCCCLXXXXVI 713 | MDCCXL 714 | MDCCLVII 715 | MMMMDCCCLXXXVI 716 | DCCXXXIII 717 | MMMMDCCCCLXXXV 718 | MMCCXXXXVIII 719 | MMMCCLXXVIII 720 | MMMDCLXXVIII 721 | DCCCI 722 | MMMMLXXXXVIIII 723 | MMMCCCCLXXII 724 | MMCLXXXVII 725 | CCLXVI 726 | MCDXLIII 727 | MMCXXVIII 728 | MDXIV 729 | CCCXCVIII 730 | CLXXVIII 731 | MMCXXXXVIIII 732 | MMMDCLXXXIV 733 | CMLVIII 734 | MCDLIX 735 | MMMMDCCCXXXII 736 | MMMMDCXXXIIII 737 | MDCXXI 738 | MMMDCXLV 739 | MCLXXVIII 740 | MCDXXII 741 | IV 742 | MCDLXXXXIII 743 | MMMMDCCLXV 744 | CCLI 745 | MMMMDCCCXXXVIII 746 | DCLXII 747 | MCCCLXVII 748 | MMMMDCCCXXXVI 749 | MMDCCXLI 750 | MLXI 751 | MMMCDLXVIII 752 | MCCCCXCIII 753 | XXXIII 754 | MMMDCLXIII 755 | MMMMDCL 756 | DCCCXXXXIIII 757 | MMDLVII 758 | DXXXVII 759 | MCCCCXXIIII 760 | MCVII 761 | MMMMDCCXL 762 | MMMMCXXXXIIII 763 | MCCCCXXIV 764 | MMCLXVIII 765 | MMXCIII 766 | MDCCLXXX 767 | MCCCLIIII 768 | MMDCLXXI 769 | MXI 770 | MCMLIV 771 | MMMCCIIII 772 | DCCLXXXVIIII 773 | MDCLIV 774 | MMMDCXIX 775 | CMLXXXI 776 | DCCLXXXVII 777 | XXV 778 | MMMXXXVI 779 | MDVIIII 780 | CLXIII 781 | MMMCDLVIIII 782 | MMCCCCVII 783 | MMMLXX 784 | MXXXXII 785 | MMMMCCCLXVIII 786 | MMDCCCXXVIII 787 | MMMMDCXXXXI 788 | MMMMDCCCXXXXV 789 | MMMXV 790 | MMMMCCXVIIII 791 | MMDCCXIIII 792 | MMMXXVII 793 | MDCCLVIIII 794 | MMCXXIIII 795 | MCCCLXXIV 796 | DCLVIII 797 | MMMLVII 798 | MMMCXLV 799 | MMXCVII 800 | MMMCCCLXXXVII 801 | MMMMCCXXII 802 | DXII 803 | MMMDLV 804 | MCCCLXXVIII 805 | MMMCLIIII 806 | MMMMCLXXXX 807 | MMMCLXXXIIII 808 | MDCXXIII 809 | MMMMCCXVI 810 | MMMMDLXXXIII 811 | MMMDXXXXIII 812 | MMMMCCCCLV 813 | MMMDLXXXI 814 | MMMCCLXXVI 815 | MMMMXX 816 | MMMMDLVI 817 | MCCCCLXXX 818 | MMMXXII 819 | MMXXII 820 | MMDCCCCXXXI 821 | MMMDXXV 822 | MMMDCLXXXVIIII 823 | MMMDLXXXXVII 824 | MDLXIIII 825 | CMXC 826 | MMMXXXVIII 827 | MDLXXXVIII 828 | MCCCLXXVI 829 | MMCDLIX 830 | MMDCCCXVIII 831 | MDCCCXXXXVI 832 | MMMMCMIV 833 | MMMMDCIIII 834 | MMCCXXXV 835 | XXXXVI 836 | MMMMCCXVII 837 | MMCCXXIV 838 | MCMLVIIII 839 | MLXXXIX 840 | MMMMLXXXIX 841 | CLXXXXIX 842 | MMMDCCCCLVIII 843 | MMMMCCLXXIII 844 | MCCCC 845 | DCCCLIX 846 | MMMCCCLXXXII 847 | MMMCCLXVIIII 848 | MCLXXXV 849 | CDLXXXVII 850 | DCVI 851 | MMX 852 | MMCCXIII 853 | MMMMDCXX 854 | MMMMXXVIII 855 | DCCCLXII 856 | MMMMCCCXLIII 857 | MMMMCLXV 858 | DXCI 859 | MMMMCLXXX 860 | MMMDCCXXXXI 861 | MMMMXXXXVI 862 | DCLX 863 | MMMCCCXI 864 | MCCLXXX 865 | MMCDLXXII 866 | DCCLXXI 867 | MMMCCCXXXVI 868 | MCCCCLXXXVIIII 869 | CDLVIII 870 | DCCLVI 871 | MMMMDCXXXVIII 872 | MMCCCLXXXIII 873 | MMMMDCCLXXV 874 | MMMXXXVI 875 | CCCLXXXXIX 876 | CV 877 | CCCCXIII 878 | CCCCXVI 879 | MDCCCLXXXIIII 880 | MMDCCLXXXII 881 | MMMMCCCCLXXXI 882 | MXXV 883 | MMCCCLXXVIIII 884 | MMMCCXII 885 | MMMMCCXXXIII 886 | MMCCCLXXXVI 887 | MMMDCCCLVIIII 888 | MCCXXXVII 889 | MDCLXXV 890 | XXXV 891 | MMDLI 892 | MMMCCXXX 893 | MMMMCXXXXV 894 | CCCCLIX 895 | MMMMDCCCLXXIII 896 | MMCCCXVII 897 | DCCCXVI 898 | MMMCCCXXXXV 899 | MDCCCCXCV 900 | CLXXXI 901 | MMMMDCCLXX 902 | MMMDCCCIII 903 | MMCLXXVII 904 | MMMDCCXXIX 905 | MMDCCCXCIIII 906 | MMMCDXXIIII 907 | MMMMXXVIII 908 | MMMMDCCCCLXVIII 909 | MDCCCXX 910 | MMMMCDXXI 911 | MMMMDLXXXIX 912 | CCXVI 913 | MDVIII 914 | MMCCLXXI 915 | MMMDCCCLXXI 916 | MMMCCCLXXVI 917 | MMCCLXI 918 | MMMMDCCCXXXIV 919 | DLXXXVI 920 | MMMMDXXXII 921 | MMMXXIIII 922 | MMMMCDIV 923 | MMMMCCCXLVIII 924 | MMMMCXXXVIII 925 | MMMCCCLXVI 926 | MDCCXVIII 927 | MMCXX 928 | CCCLIX 929 | MMMMDCCLXXII 930 | MDCCCLXXV 931 | MMMMDCCCXXIV 932 | DCCCXXXXVIII 933 | MMMDCCCCXXXVIIII 934 | MMMMCCXXXV 935 | MDCLXXXIII 936 | MMCCLXXXIV 937 | MCLXXXXIIII 938 | DXXXXIII 939 | MCCCXXXXVIII 940 | MMCLXXIX 941 | MMMMCCLXIV 942 | MXXII 943 | MMMCXIX 944 | MDCXXXVII 945 | MMDCCVI 946 | MCLXXXXVIII 947 | MMMCXVI 948 | MCCCLX 949 | MMMCDX 950 | CCLXVIIII 951 | MMMCCLX 952 | MCXXVIII 953 | LXXXII 954 | MCCCCLXXXI 955 | MMMI 956 | MMMCCCLXIV 957 | MMMCCCXXVIIII 958 | CXXXVIII 959 | MMCCCXX 960 | MMMCCXXVIIII 961 | MCCLXVI 962 | MMMCCCCXXXXVI 963 | MMDCCXCIX 964 | MCMLXXI 965 | MMCCLXVIII 966 | CDLXXXXIII 967 | MMMMDCCXXII 968 | MMMMDCCLXXXVII 969 | MMMDCCLIV 970 | MMCCLXIII 971 | MDXXXVII 972 | DCCXXXIIII 973 | MCII 974 | MMMDCCCLXXI 975 | MMMLXXIII 976 | MDCCCLIII 977 | MMXXXVIII 978 | MDCCXVIIII 979 | MDCCCCXXXVII 980 | MMCCCXVI 981 | MCMXXII 982 | MMMCCCLVIII 983 | MMMMDCCCXX 984 | MCXXIII 985 | MMMDLXI 986 | MMMMDXXII 987 | MDCCCX 988 | MMDXCVIIII 989 | MMMDCCCCVIII 990 | MMMMDCCCCXXXXVI 991 | MMDCCCXXXV 992 | MMCXCIV 993 | MCMLXXXXIII 994 | MMMCCCLXXVI 995 | MMMMDCLXXXV 996 | CMLXIX 997 | DCXCII 998 | MMXXVIII 999 | MMMMCCCXXX 1000 | XXXXVIIII 1001 | -------------------------------------------------------------------------------- /0092_Square_digit_chains/0092_Square_digit_chains.py: -------------------------------------------------------------------------------- 1 | # A number chain is created by continuously adding the square of the digits 2 | # in a number to form a new number until it has been seen before. 3 | 4 | # For example, 5 | 6 | # 44 → 32 → 13 → 10 → 1 → 1 7 | # 85 → 89 → 145 → 42 → 20 → 4 → 16 → 37 → 58 → 89 8 | 9 | # Therefore any chain that arrives at 1 or 89 will become stuck in an endless loop. 10 | # What is most amazing is that EVERY starting number will eventually arrive at 1 or 89. 11 | 12 | # How many starting numbers below ten million will arrive at 89? 13 | 14 | 15 | def arrives_at_89(n): 16 | if n == 0: 17 | return False 18 | while True: 19 | if n == 1: 20 | return False 21 | if n == 89: 22 | return True 23 | n = sum([int(i) ** 2 for i in str(n)]) 24 | 25 | 26 | def count_89_chains(m): 27 | count = 0 28 | for i in range(m): 29 | if arrives_at_89(i): 30 | count += 1 31 | return count 32 | 33 | 34 | def main(): 35 | print(count_89_chains(10000000)) 36 | 37 | 38 | main() 39 | -------------------------------------------------------------------------------- /0142_Perfect_Square_Collection/0142_Perfect_Square_Collection.py: -------------------------------------------------------------------------------- 1 | # Find the smallest x + y + z with integers x > y > z > 0 2 | # such that x + y, x − y, x + z, x − z, y + z, y − z are all perfect squares. 3 | 4 | 5 | def is_square(x): 6 | return x == int(x**0.5) ** 2 7 | 8 | 9 | def solve(): 10 | solution = {} 11 | i = 4 12 | while not solution: 13 | a = i**2 14 | 15 | for j in range(3, i): 16 | c = j**2 17 | f = a - c 18 | if not is_square(f): 19 | continue 20 | 21 | k_initial = 2 if j % 2 == 0 else 1 22 | 23 | for k in range(k_initial, j, 2): 24 | d = k**2 25 | e = a - d 26 | b = c - e 27 | 28 | if b <= 0 or not is_square(e) or not is_square(b): 29 | continue 30 | 31 | x = int((a + b) / 2) 32 | y = int((e + f) / 2) 33 | z = int((c - d) / 2) 34 | 35 | solution = {"x": x, "y": y, "z": z, "x + y + z": x + y + z} 36 | break 37 | 38 | if solution: 39 | break 40 | i = i + 1 41 | 42 | return solution 43 | 44 | 45 | print("\n".join([f"{k} = {v}" for k, v in solve().items()])) 46 | -------------------------------------------------------------------------------- /0243_Resilience/0243_Resilience.py: -------------------------------------------------------------------------------- 1 | # A positive fraction whose numerator is less than its denominator is called a proper fraction. 2 | # For any denominator, d, there will be d-1 proper fractions 3 | # for example, with d = 12: 4 | # 1/12, 2/12, 3/12, 4/12, 5/12, 6/12, 7/12, 8/12, 9/12, 10/12, 11/12. 5 | 6 | # We shall call a fraction that cannot be cancelled down a resilient fraction. 7 | # Furthermore we shall define the resilience of a denominator, R(d), to be the ratio of its proper fractions that are resilient 8 | # for example, R(12) = 4/11 . 9 | # In fact, d = 12 is the smallest denominator having a resilience R(d) < 4/10 . 10 | 11 | # Find the smallest denominator d, having a resilience R(d) < 15499/94744 . 12 | 13 | 14 | from primesieve import primes 15 | 16 | 17 | def main(): 18 | target = 15499 / 94744 19 | min_resilience = 1 20 | primes_arr = primes(30) 21 | n = 1 22 | d = 1 23 | count = 1 24 | for i in range(len(primes_arr)): 25 | n *= primes_arr[i] - 1 26 | d *= primes_arr[i] 27 | for j in range(2, primes_arr[i]): 28 | num = n * j 29 | den = d * j 30 | resilience = num / (den - 1) 31 | min_resilience = min(resilience, min_resilience) 32 | if resilience < target: 33 | print("\nnumber:", den) 34 | print("final resilience:", resilience) 35 | print("target:", target) 36 | exit(0) 37 | if count % 10 == 0: 38 | print("\nDone:", count) 39 | print("min resilience obtained:", min_resilience) 40 | count += 1 41 | 42 | 43 | main() 44 | -------------------------------------------------------------------------------- /0277_A_Modified_Collatz_sequence/0277_A_Modified_Collatz_sequence.py: -------------------------------------------------------------------------------- 1 | def process(n): 2 | print("Running. n = {}".format(n)) 3 | s = "" 4 | while n > 1: 5 | if n % 3 == 0: 6 | n //= 3 7 | s += "D" 8 | elif n % 3 == 1: 9 | n = (4*n+2)//3 10 | s += "U" 11 | else: 12 | n = (2*n-1)//3 13 | s += "d" 14 | return s 15 | 16 | s = "UDDDUdddDDUDDddDdDddDDUDDdUUDd" 17 | n = 2 18 | i = 1 19 | d = 1 20 | 21 | while process(n)[:30] != s[:30]: 22 | while True: 23 | if process(n)[:i] == s[:i]: 24 | n1 = n 25 | break 26 | n += d 27 | n += d 28 | while True: 29 | if process(n)[:i] == s[:i]: 30 | n2 = n 31 | break 32 | n += d 33 | d = n2 - n1 34 | i += 1 35 | 36 | while n < 10 ** 15: 37 | n += d 38 | 39 | print("Complete n = {}, sequnce = {}".format(n, process(n))) 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project_Euler 2 | Solutions to computational problems of the Project Euler. 3 | [projecteuler.net](https://projecteuler.net/) 4 | --------------------------------------------------------------------------------