mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-07-19 19:03:02 +08:00
Added doctest and more explanation about Dijkstra execution. (#1014)
* Added doctest and more explanation about Dijkstra execution. * tests were not passing with python2 due to missing __init__.py file at number_theory folder * Removed the dot at the beginning of the imported modules names because 'python3 -m doctest -v data_structures/hashing/*.py' and 'python3 -m doctest -v data_structures/stacks/*.py' were failing not finding hash_table.py and stack.py modules. * Moved global code to main scope and added doctest for project euler problems 1 to 14. * Added test case for negative input. * Changed N variable to do not use end of line scape because in case there is a space after it the script will break making it much more error prone. * Added problems description and doctests to the ones that were missing. Limited line length to 79 and executed python black over all scripts. * Changed the way files are loaded to support pytest call. * Added __init__.py to problems to make them modules and allow pytest execution. * Added project_euler folder to test units execution * Changed 'os.path.split(os.path.realpath(__file__))' to 'os.path.dirname()'
This commit is contained in:

committed by
cclauss

parent
2fb3beeaf1
commit
267b5eff40
0
project_euler/problem_17/__init__.py
Normal file
0
project_euler/problem_17/__init__.py
Normal file
@ -1,35 +1,63 @@
|
||||
from __future__ import print_function
|
||||
'''
|
||||
"""
|
||||
Number letter counts
|
||||
Problem 17
|
||||
|
||||
If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
|
||||
If the numbers 1 to 5 are written out in words: one, two, three, four, five,
|
||||
then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
|
||||
|
||||
If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
|
||||
If all the numbers from 1 to 1000 (one thousand) inclusive were written out in
|
||||
words, how many letters would be used?
|
||||
|
||||
|
||||
NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen)
|
||||
contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
|
||||
'''
|
||||
NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and
|
||||
forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20
|
||||
letters. The use of "and" when writing out numbers is in compliance withBritish
|
||||
usage.
|
||||
"""
|
||||
|
||||
ones_counts = [0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8] #number of letters in zero, one, two, ..., nineteen (0 for zero since it's never said aloud)
|
||||
tens_counts = [0, 0, 6, 6, 5, 5, 5, 7, 6, 6] #number of letters in twenty, thirty, ..., ninety (0 for numbers less than 20 due to inconsistency in teens)
|
||||
|
||||
count = 0
|
||||
def solution(n):
|
||||
"""Returns the number of letters used to write all numbers from 1 to n.
|
||||
where n is lower or equals to 1000.
|
||||
>>> solution(1000)
|
||||
21124
|
||||
>>> solution(5)
|
||||
19
|
||||
"""
|
||||
# number of letters in zero, one, two, ..., nineteen (0 for zero since it's
|
||||
# never said aloud)
|
||||
ones_counts = [0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8]
|
||||
# number of letters in twenty, thirty, ..., ninety (0 for numbers less than
|
||||
# 20 due to inconsistency in teens)
|
||||
tens_counts = [0, 0, 6, 6, 5, 5, 5, 7, 6, 6]
|
||||
|
||||
for i in range(1, 1001):
|
||||
if i < 1000:
|
||||
if i >= 100:
|
||||
count += ones_counts[i/100] + 7 #add number of letters for "n hundred"
|
||||
count = 0
|
||||
|
||||
if i%100 != 0:
|
||||
count += 3 #add number of letters for "and" if number is not multiple of 100
|
||||
for i in range(1, n + 1):
|
||||
if i < 1000:
|
||||
if i >= 100:
|
||||
# add number of letters for "n hundred"
|
||||
count += ones_counts[i // 100] + 7
|
||||
|
||||
if 0 < i%100 < 20:
|
||||
count += ones_counts[i%100] #add number of letters for one, two, three, ..., nineteen (could be combined with below if not for inconsistency in teens)
|
||||
else:
|
||||
count += ones_counts[i%10] + tens_counts[(i%100-i%10)/10] #add number of letters for twenty, twenty one, ..., ninety nine
|
||||
else:
|
||||
count += ones_counts[i/1000] + 8
|
||||
if i % 100 != 0:
|
||||
# add number of letters for "and" if number is not multiple
|
||||
# of 100
|
||||
count += 3
|
||||
|
||||
print(count)
|
||||
if 0 < i % 100 < 20:
|
||||
# add number of letters for one, two, three, ..., nineteen
|
||||
# (could be combined with below if not for inconsistency in
|
||||
# teens)
|
||||
count += ones_counts[i % 100]
|
||||
else:
|
||||
# add number of letters for twenty, twenty one, ..., ninety
|
||||
# nine
|
||||
count += ones_counts[i % 10]
|
||||
count += tens_counts[(i % 100 - i % 10) // 10]
|
||||
else:
|
||||
count += ones_counts[i // 1000] + 8
|
||||
return count
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(solution(int(input().strip())))
|
||||
|
Reference in New Issue
Block a user