Fall; or, Dodge in Hell
Review:Since this book is sort of the end of an informal series (not explaining, spoilers on lots of things) it deserves an actual review, I think. |
Review:Since this book is sort of the end of an informal series (not explaining, spoilers on lots of things) it deserves an actual review, I think. |
Note: This is based on an old (2018) Quora answer.
If I asked you "How much hard drive space would be required for a Database representing every possible position in chess?" what would you answer?
Well, most answers go like this:
"Claude Shannon estimated there are 1043 positions in chess, which can be stored in ~32 bytes each, so it's something like 1044 bytes, and the observable universe has only 1080 atoms so it's something pretty large!"
To that I say phooey Shannon! It takes around 700 bytes if you want the fancy version.
Let's start by defining what the requested artifact is.
"A database representing every possible position in chess"
So, what is such a database's behaviour? I propose:
My proposed implementation will do the first 2 which I consider actual requirements, the 3rd being just a "nice to have". While it's not impossible to add, even my willingness to do stupid things has a limit.
So, limiting myself to the first two requirements, if I fulfill those then it's done, right? Because if the deliverable is correct, the rest is implementation details?
Let's implement it!
Welcome to Forsyth-Edwards notation (FEN for short). It's a wonderful thing that provides all the necessary information to restart a game.
I will use a hacked subset since all I want is the position (not things like "has white castled?" or "who is moving next?") but it's a trivial exercise to expand this database to do just that.
So, how does this database describe a position? A position is a list of pieces and their positions in a 8x8 board.
In the original FEN white pawn is identified as P and black pawn as p. I consider that an insult to the IETF who has adopted UTF-8 in RFC2777 (and also slightly racist), therefore I will use the proper glyphs: ♙ and ♟.
In fact, I will use ♙♘♗♖♕♔♟♞♝♜♛♚.
As for positions, since my database is small enough that data compression is pointless, let's just use a 64-character fixed-size string where each position is either a piece of a space meaning the square is empty.
So, a position is a string of length 64 where these are the only valid values: "♙♘♗♖♕♔♟♞♝♜♛♚ "
It's obvious that each position is equivalent to a 64-digit number in base 13, which means there are 196 053 476 430 761 073 330 659 760 423 566 015 424 403 280 004 115 787 589 590 963 842 248 960 possible positions.
That 64-digit number is the index key for each position (it's an optimal key, it can't be made any smaller!)
So here's the database core code, offered with no comments since it's barely 12 lines of code doing nothing weird:
def get_position(index):
def digit_to_char(digit):
return "♙♘♗♖♕♔♟♞♝♜♛♚ "[digit]
def str_base(number, base=13):
(d, m) = divmod(number, base)
if d:
result = str_base(d, base) + digit_to_char(m)
else:
result = digit_to_char(m)
return result
position = str_base(index).rjust(64)
return position
For convenience, here is a pretty printer for your boards:
def print_board(position):
print(" ABCDEFGH ")
for i in range(8):
print("%d%s%d" % (i, position[8 * (i) : 8 * (i + 1)], i))
print(" ABCDEFGH ")
Here you can see it in action (sadly asciinema butchers the alignment, it works properly in real life):
And here is the full source code:
def get_position(index):
def digit_to_char(digit):
return "♙♘♗♖♕♔♟♞♝♜♛♚ "[digit]
def str_base(number, base=13):
(d, m) = divmod(number, base)
if d:
result = str_base(d, base) + digit_to_char(m)
else:
result = digit_to_char(m)
return result
position = str_base(index).rjust(64)
return position
def print_board(position):
print(" ABCDEFGH ")
for i in range(8):
print("%d%s%d" % (i, position[8 * (i) : 8 * (i + 1)], i))
print(" ABCDEFGH ")
if __name__ == "__main__":
import sys
print_board(get_position(int(sys.argv[1])))
Please notice that this database also covers all alternative chess variants where extra pieces are given or removed as handicap.
There is no step 3.
Me gustan los teclados y estoy grande. Eso significa que tengo una memoria probablemente injustificada de que me gustaban los teclados de mis primeras computadoras.
No, no el teclado de mi Timex Sinclair 1000, eso es literalmente un sticker, no hay cantidad de amnesia selectiva que me haga apreciarlo.
Pero ... la C64? Bueno, eso era un teclado mecánico, no?
Así que cuando me oí de KeyRah hace un tiempo que es una placa que te deja usar el teclado de C64 (y otros!) como dispositivo USB empecé a considerar usar una C64 mnuerta para algo útil?
Así que si bien no es mi querida "breadbin", cuando una C64-C sin motherboard apareció ... bueno, lo hice.
Es una "Drean Commodore 64 C" hecha en San Luis, probablemente en 1986 y estaba MUGRIENTA.
La abrí, saqué cada tecla y resorte.
Cada uno de los resortes tenía adentro una pelusa de mugre, y todas las teclas estaban cubiertas con algo pegajoso. Por lo menos los resortes no estaban oxidados y las keycaps se limpiaron con agua y jabón.
Parecen ser PBT double-shot y 1.65mm de grosor, y teniendo en cuenta que tienen 35 años supongo que son durables :-)
Las leyendas en el frente son dye-sub pero esa parte no la tocan los dedos así que no importa.
El mecanismo es inusual para un usuario moderno:
El PCB tenía unos tracks dudosos, pero andaba
Lo armé poniendo el KeyRah, le faltan un montón de tornillos que habrá que comprar, supongo.
Un poco de esfuerzo armándola ...
Y listo, funciona!
Está bueno?
La verdad que no
Así que perdí el tiempo?
Nooooo!
Una vez que tenga mi oficina propia (actualmente la comparto con mi señora por la pandemia) esto va a ser algo útil.
La idea es añadir una Pi4 (o algo) adentro de la carcaza, tal vez con un par de SSDs grandes (si, hay mucho lugar) y convertirla en una consola retro y nodo en mi cluster, así que útil va a ser.
Todas las imágenes están en la galería de la C64C
Review:Loved it. |
Bueno gente, poniendo el canal en el freezer por un tiempo porque:
1) Tengo proyectos que quiero hacer, pero ... 2) No tengo muchas ganas de hacer videos y ... 3) También tengo una serie de proyectos que no tienen nada que ver con tecnología (ni puedo mencionar)
En el video menciono que hice un tutorial de como bootear una Raspberry Pi Zero sin SD. Acá está: https://github.com/ralsina/zero-nfsroot
Si quieren enterarse de cuando sale un nuevo video una manera es suscribirse y apretar el botón de la campanita ;-)