Skip to content

Added a gray_code_sequence.py file to the bit_manipulation folder #5038

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 2, 2021
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions bit_manipulation/gray_code_sequence.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
def gray_code(bit_count: int) -> list:
"""
Takes in an integer n and returns a n-bit
gray code sequence
An n-bit gray code sequence is a sequence of 2^n
integers where:

a) Every integer is between [0,2^n -1] inclusive
b) The sequence begins with 0
c) An integer appears at most one times in the sequence
d)The binary representation of every pair of integers differ
by exactly one bit
e) The binary representation of first and last bit also
differ by exactly one bit

>>> gray_code(2)
[0, 1, 3, 2]

>>> gray_code(1)
[0, 1]

>>> gray_code(3)
[0, 1, 3, 2, 6, 7, 5, 4]

>>> gray_code(-1)
Traceback (most recent call last):
...
ValueError: The given input must be positive

>>> gray_code(10.6)
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for <<: 'int' and 'float'
"""

# bit count represents no. of bits in the gray code
if bit_count < 0:
raise ValueError("The given input must be positive")

# get the generated string sequence
sequence = gray_code_sequence_string(bit_count)
#
# convert them to integers
for i in range(len(sequence)):
sequence[i] = int(sequence[i], 2)

return sequence


def gray_code_sequence_string(bit_count: int) -> list:
"""
Will output the n-bit grey sequence as a
string of bits

>>> gray_code_sequence_string(2)
['00', '01', '11', '10']

>> gray_code_sequence_string(1)
['0', '1']
"""

# The approach is a recursive one
# Base case achieved when either n = 0 or n=1
if bit_count == 0:
return ["0"]

if bit_count == 1:
return ["0", "1"]

seq_len = 1 << bit_count # defines the length of the sequence
# 1<< n is equivalent to 2^n

# recursive answer will generate answer for n-1 bits
smaller_sequence = gray_code_sequence_string(bit_count - 1)

sequence = []

# append 0 to first half of the smaller sequence generated
for i in range(seq_len // 2):
generated_no = "0" + smaller_sequence[i]
sequence.append(generated_no)

# append 1 to second half ... start from the end of the list
for i in reversed(range(seq_len // 2)):
generated_no = "1" + smaller_sequence[i]
sequence.append(generated_no)

return sequence


if __name__ == "__main__":
import doctest

doctest.testmod()