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>