#-------------------------------------------------------------------------- # Name: liars_bingo # Purpose: Implementation of algorithm for generating cards used in # Liar's Bingo. # # Author: Nicholas Bennett # # Last modified: 2017-01-29 # Copyright: (c) Nicholas Bennett 2017 # Licence: Creative Commons Attribution-ShareAlike 4.0 International # License http://creativecommons.org/licenses/by-sa/4.0/ #-------------------------------------------------------------------------- DEFAULT_BITS_PER_DIGIT = 3 DEFAULT_DIGITS_PER_CARD = 2 DEFAULT_BITS_PER_CARD = DEFAULT_BITS_PER_DIGIT * DEFAULT_DIGITS_PER_CARD DEFAULT_DIGIT_CHARS = '0123456789abcdef' def str_radix(value, radix_bits=DEFAULT_BITS_PER_DIGIT, digit_chars=DEFAULT_DIGIT_CHARS, least_significant=True): if (value == 0): if (least_significant): return '0' else: return '' return ( str_radix(value >> radix_bits, radix_bits, digit_chars, False) + digit_chars[value & ((1 << radix_bits) - 1)] ) def generate(bits_per_card=DEFAULT_BITS_PER_CARD): return [ [ card_index ^ (1 << col_index) for col_index in range(bits_per_card - 1, -1, -1) ] for card_index in range(1 << bits_per_card) ] def stringify(cards, bits_per_card=DEFAULT_BITS_PER_CARD, bits_per_digit=DEFAULT_BITS_PER_DIGIT, digit_chars=DEFAULT_DIGIT_CHARS): return "\n".join( " ".join( "{0:>2}{1}".format( str_radix(cards[i][j], bits_per_digit, digit_chars), "R" if (i & (1 << (bits_per_card - j - 1))) else "B" ) for j in range(bits_per_card) ) for i in range(1 << bits_per_card) ) if __name__ == '__main__': print(stringify(generate()))