I encountered the following:
r = random.randint(1,6)
C = "o "
s = '-----\n|' + C[r<1] + ' ' + C[r<3] + '|\n|' + C[r<5]
print(s + C[r&1] + s[::-1])
When executed in IDLE, this outputs an ASCII die with a random value.
How does it work,and more specifically, what do the compare symbols (< and &) accomplish inside the indices?
Someone is code-golfing here, and using hacky tricks to minimise the amount of code used.
< is a regular comparison operator; it returns True or False based on the two operands. The Python bool type is a subclass of int and True is 1, False is 0 when interpreted as integers. As such C[r<1] either picks C[0] or C[1].
& is a bit-wise operator, not a comparison operator; & 1 is masking the number to the last bit, effectively testing if a number is odd or even (the last bit is set or not). So if r is odd, C[1] is used, otherwise C[0] is.
Breaking this down:
C is a string with the o and space charactersC[r<1] picks either o or a space based on wether it is smaller than 1. It never is (random.randint(1,6) ensures this), so that is always an o. This appears to be a bug or oversight in the code.C[r<3] picks a space for 1 and 2, an o otherwise.C[r<5] picks an o for 5 or 6, a space otherwise.C[r&1] picks an o for 2, 4 and 6, a space otherwise.In all, it prints r plus one as a die. r = 1 gives you two pips, while r = 6 results in seven pips, perhaps as a stylised one?
Fixing the code for that requires incrementing all r tests and inverting the odd/even test:
s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6]
print(s + C[1-r&1] + s[::-1])
Demo (wrapping the string building in a function):
>>> import random
>>> def dice(r, C='o '):
... s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6]
... print(s + C[1-r&1] + s[::-1])
...
>>> for i in range(1, 7):
... dice(i)
...
-----
| |
| o |
| |
-----
-----
|o |
| |
| o|
-----
-----
|o |
| o |
| o|
-----
-----
|o o|
| |
|o o|
-----
-----
|o o|
| o |
|o o|
-----
-----
|o o|
|o o|
|o o|
-----
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With