In: Computer Science
The Python lookNsayNth(), given below, is a generator function that generates the digits (as characters) of the “n-th” “look-and-say number”. E.g., 1113… generates the characters ‘1’, ‘1’, ‘1’, ‘3’, etc. Use this generator to print out the 1,000,000-th to 1,000,019-th digits of the 200th “look-and-say” number. Check: your number will start with 211121… (Keep in mind that the 1st digit has index 0 if the digits were put in an array). Note that the 200th “look-and-say” number has somewhere around 10**23 digits. Extra credit for printing them all!
The python "look and say number"
def lookNsay(): '''Generate the "look and say" sequence: 1, 11, 21, 1211, 111221, 312211, 13112221, 1113213211, ... Note that strings are returned ''' s = '1' # s is the previous result, start with 1 while True: yield s c,n, result = s[0], 1, '' for t in s[1:]: if t==c: n += 1 else: result += str(n) + c c,n = t, 1 result += str(n) + c s = result def saythis(prev): # Supporting function '''Generate characters of a "look-and-say" number given a generator of characters for the previous number. ''' c,n = next(prev), 1 for t in prev: if t==c: n += 1 else: yield str(n) yield c c,n = t, 1 yield str(n) yield c def lookNsayNth(n = 1): '''Generate characters of the n-th value of the "look-and-say" sequence recursively ''' if n == 1: yield '1' else: yield from saythis(lookNsayNth(n-1))
# Python 3 program to find
# n'th term in look and
# say sequence
# Returns n'th term in
# look-and-say sequence
def countnndSay(n):
# Base cases
if (n == 1):
return "1"
if (n == 2):
return "11"
# Find n'th term by generating
# all terms from 3 to n-1.
# Every term is generated using
# previous term
# Initialize previous term
s = "11"
for i in range(3, n + 1):
# In below for loop,
# previous character is
# processed in current
# iteration. That is why
# a dummy character is
# added to make sure that
# loop runs one extra
iteration.
s += '$'
l = len(s)
cnt = 1 # Initialize count
# of matching chars
tmp = "" # Initialize i'th
# term in series
# Process previous term to
# find the next term
for j in range(1 , l):
# If current
character
# does't
match
if (s[j] != s[j
- 1]):
# Append count of
# str[j-1] to temp
tmp += str(cnt + 0)
# Append str[j-1]
tmp += s[j - 1]
# Reset count
cnt = 1
# If matches,
then increment
# count of
matching characters
else:
cnt += 1
# Update str
s = tmp
return s;
# Driver Code
N = 3
print(countnndSay(N))
# This code is contributed
# by ChitraNayal