At the end of a “short” challenge, I came up with my shortest code… Part of it was :
ord©-96for c in input().lower()
Praveend came up with a shorter solution that I don’t understand :
ord©&31for c in input()
Anyone can explains it to me ?
Swann
At the end of a “short” challenge, I came up with my shortest code… Part of it was :
ord©-96for c in input().lower()
Praveend came up with a shorter solution that I don’t understand :
ord©&31for c in input()
Anyone can explains it to me ?
Swann
In Python (and other languages) the operators &
(and), |
(or), ^
(xor), ~
(not) act bitwise on integers. For example,
ord('D') & 31 -> 68 & 31 -> 100100 (binary) & 11111 (binary) -> 00100 (binary) -> 4
ord('d') & 31 -> 100 & 31 -> 1100100 (binary) & 11111 (binary) -> 00100 (binary) -> 4
In this case, &31
is equivalent to %32
which may be a more readable alternative. Of course, this works because of the positions of ‘a’, ‘b’, … and ‘A’, ‘B’, … in the ASCII table.
Another useful trick: x ^ 1
is equivalent to 2 * (x // 2) + (x % 2)
. For example, 5 ^ 1 == 4
and 4 ^ 1 == 5
.
For more about bitwise operators in Python see here.