Sum of the digits of n is substring of n: Difference between revisions
Content added Content deleted
(Add Factor) |
(→{{header|Python}}: Added a full-script variant, using filter and reduce) |
||
Line 162: | Line 162: | ||
912, 913, 914, 915, 916, 917, 918, 919 |
912, 913, 914, 915, 916, 917, 918, 919 |
||
>>> </lang> |
>>> </lang> |
||
or as a full script, taking an alternative route, and slightly reducing the number of str conversions required: |
|||
<lang python>'''Sum of the digits of n is substring of n''' |
|||
from functools import reduce |
|||
# digitSumIsSubString :: String -> Bool |
|||
def digitSumIsSubString(s): |
|||
'''True if the sum of the decimal digits in s |
|||
matches any contiguous substring of s. |
|||
''' |
|||
return str( |
|||
reduce(lambda a, c: a + int(c), s, 0) |
|||
) in s |
|||
# ------------------------- TEST ------------------------- |
|||
# main :: IO () |
|||
def main(): |
|||
'''Matches in [1..999]''' |
|||
xs = list( |
|||
filter( |
|||
digitSumIsSubString, |
|||
(str(n) for n in range(1, 1000)) |
|||
) |
|||
) |
|||
w = len(xs[-1]) |
|||
print(f'{len(xs)} matches < 1000:\n') |
|||
print( |
|||
'\n'.join( |
|||
' '.join(cell.rjust(w, ' ') for cell in row) |
|||
for row in chunksOf(10)(xs) |
|||
) |
|||
) |
|||
# ----------------------- GENERIC ------------------------ |
|||
# chunksOf :: Int -> [a] -> [[a]] |
|||
def chunksOf(n): |
|||
'''A series of lists of length n, subdividing the |
|||
contents of xs. Where the length of xs is not evenly |
|||
divible, the final list will be shorter than n. |
|||
''' |
|||
def go(xs): |
|||
return ( |
|||
xs[i:n + i] for i in range(0, len(xs), n) |
|||
) if 0 < n else None |
|||
return go |
|||
# MAIN --- |
|||
if __name__ == '__main__': |
|||
main() |
|||
</lang> |
|||
{{Out}} |
|||
<pre>47 matches < 1000: |
|||
1 2 3 4 5 6 7 8 9 10 |
|||
20 30 40 50 60 70 80 90 100 109 |
|||
119 129 139 149 159 169 179 189 199 200 |
|||
300 400 500 600 700 800 900 910 911 912 |
|||
913 914 915 916 917 918 919</pre> |