Quanto: el precio justo en versión Wordle

A principios de año diseñé Quanto, un juego que sigue la fórmula Wordle —una partida global cada día con estadísticas— y consiste en averiguar el precio de seis productos de supermercados españoles.

Quanto • Seis productos diarios

El juego ha tenido más impacto del que me esperaba y ya ha alcanzado las 50,000 partidas, una cantidad que me ha hecho plantearme si mi humilde servidor doméstico iba a dar abasto. De momento funciona sin problemas (la carga no llega al 0.01% en el pico de por la noche) y puedo seguir dejándolo disponible sin publicidad de ningún tipo.

Los productos son escogidos aleatoriamente todos los domingos de las webs de Carrefour, Lidl, Alcampo y Mercadona. Además de la foto, todos van acompañados de su nombre e información adicional como el peso o el volumen. Por cada producto tenemos dos intentos para averiguar el precio, con una pista para intentar acercarse más en el segundo:

MensajeDesviación
¡A la primera!0%
Casi, un poco másMenos del 15% por abajo
Casi, un poco menosMenos del 15% por arriba
Demasiado altoAl menos un 15% por abajo
Demasiado bajoAl menos un 15% por arriba

Al terminar la partida, se muestran ciertas estadísticas como el porcentaje de desviación medio y el típico mensaje de "estás por encima del 60% de los jugadores". Para calcular este mensaje es necesario almacenar las puntuaciones de todas las partidas y usarlas para calcular los percentiles; algo así como ordenarlas puntuaciones de menos a más y cortarlas en 100 trocitos de longitud parecida.

Captura de resultados de Quanto

Observar estos percentiles y hacer estadísticas por producto es muy curioso, y la única conclusión que puedo sacar es que la mayoría no tenemos ni idea de los precios de lo que compramos. En productos poco habituales las desviaciones suelen ser muy grandes.

Por ejemplo, la mitad de los usuarios pagarían 7€ por un tinte de 2.50€. Seguramente si en el supermercado hay más variedad de tintes y marcas podamos hacernos una idea del verdadero precio del producto, pero muchas cadenas cuentan con un único producto para muchas necesidades concretas.

Si me animo algún día usaré todas las estadísticas de juego para poner por aquí un análisis más detallado de nuestra percepción de los precios, pero de momento quiero usar este post para pediros sugerencias. Si habéis leído hasta aquí, ¿qué más os gustaría añadir a Quanto?

No hay comentarios

Github Copilot: 6 meses después

Llevo un tiempo usando a diario Github Copilot: una IA de autocompletado de código que parece tener vida propia.

Un caso real buscando una API de conversión de moneda.

GitHub Copilot está disponible como una extensión para Visual Studio Code, Neovim y JetBrains. Va mandando el código y el contexto del entorno (lenguaje de programación usado, todo el código del proyecto y los nombres de los archivos) a los servidores de OpenAI, donde es completado y enviado de vuelta como una sugerencia. Al pulsar Tab, la sugerencia se añade al código, y al pulsar Esc se descarta.

Está basado en una IA llamada Codex, un descendiente de GPT-3 ajustado para su aplicación sobre lenguajes de programación y entrenado sobre todos los repositorios de dominio público de Github. Esto incluye código, comentarios y documentación en todos los lenguajes de programación imaginables.

Usarlo por primera vez es emocionante. Poner el nombre de una función y que genere no sólo su código sino también un enlace válido a una API de conversión de moneda parece sacado de una novela de ciencia ficción. Pero pasado el hype inicial es fácil ver que la herramienta no es perfecta. Necesita ser guiada para llegar al resultado esperado y hay que entender qué está escribiendo para no perder el control.

Por ejemplo, en el segundo 0:30 del vídeo anterior intenta usar un servicio de pago, así que defino una URL del Banco Central Europeo para darle una pista de qué herramientas usar. Y aun así, el código generado no es perfecto y hay que corregir a mano la expresión regular para parsear los datos.

Las pirámides de la muerte son uno de sus errores más típicos.

Aun así, decidí dejar el plugin activado durante los últimos 5 meses, y entre trabajar y programar por hobby lo he probado con muchos lenguajes distintos: Python, JS, CSS, C++, PHP, SQL, Arduino, VBS, OpenScad, GLSL… y ha sido un cambio radical en mi forma habitual de programar. Uno de esos saltos que se producen pocas veces.

Cuando era pequeño, mi padre compraba la Computer Hoy todos los meses y yo me la leía de arriba a abajo. En una edición, había una guía que rezaba algo así como "aprenda a optimizar sus tareas con Visual Basic" y por algún motivo me dio por seguirla. Cuando vi la magia que había en pensar una idea, describírsela a un ordenador y verla hecha realidad, sentí el primero de esos saltos.

Desde entonces, empecé a programar en VBS sin mucho más que aquella guía y unas fotocopias que alguien me consiguió. Mi forma de resolver mis necesidades era mirar esos 20 folios fotocopiados una y otra vez hasta que daba con una respuesta. Cuando los folios ya estaban ajados y amarillentos, llegó internet a casa y se produjo el siguiente salto.

Programar se volvió muy distinto. Ahora mi conocimiento no se limitaba a unos pocos folios, sino a la referencia completa de Visual Basic o cualquier otro lenguaje que quisiera aprender. Y entre referencias online, foros e hilos de correo seguí programando hasta empezar la Universidad, que fue cuando aprendí lo que era un IDE con debugger.

Ese salto también fue muy grande. Ahora podía escribir en un editor de texto que le ponía colores a mi código, me autocompletaba algunos métodos, me permitía navegar por la referencia del lenguaje con solo pulsar Ctrl+Space y ver línea a línea cómo cambiaba el estado de mi aplicación. Y por si fuera poco ahora el foro era Stack Overflow.

En la actualidad sigo programando así, pero cuento con otro as en la manga: la habilidad de no mirar una API si no recuerdo algo, de dejar al IDE terminar mi código siguiendo el mismo estilo de mi codebase, y en general de dedicarme a la parte divertida de la programación en vez de pelearme con la API de Matplotlib, Puppeteer o PyTorch.

Programando reconocimiento de imagen con una webcam en una Raspberry con sólo pedírselo por favor en un comentario.

Cuando salió Copilot todas las opiniones con una semana de uso eran que iba a reemplazar a los programadores y que era una herramienta mágica, por eso me quise esperar a haberlo probado un buen tiempo para entender cuál era su sitio en la caja de herramientas del programador. Y mi conclusión es que es muy, muy útil si se usa con algo de filosofía.

Es fácil dejarse llevar por las soluciones que propone Copilot (al fin y al cabo no hay Oscar al mejor código). Pero como no es perfecto, sin saber qué está haciendo es fácil hacer código poco funcional. O lo que es peor: funcional pero con vulnerabilidades difíciles de detectar. Algo parecido a hacer copy-paste indiscriminado de Stack Overflow.

Está claro que hay una tendencia hacia una programación cada vez más asistida. Y si el futuro está en herramientas como Copilot, tendremos que atajar retos como evitar la distracción de las recomendaciones o favorecer el pensamiento crítico ante sugerencias que impliquen malas prácticas y aproximaciones anticuadas; algo parecido a lo que ocurre con las IAs entrenadas en datasets reales y sus prejuicios adquiridos.

Por el momento podemos probarlo para entender mejor sus implicaciones. Si has leído hasta aquí y estás interesado, te gustará saber que la telemetría sólo se usa para ver qué soluciones son aceptadas, pero el código que se escribe no alimenta al modelo. Siendo un producto de Windows es probable que estén tirando la caña para pescarnos luego con un servicio de suscripción, así que podéis apuntaros a la beta antes de que sea demasiado tarde.

Todos los vídeos de este post han sido generados así, sin tener que mirar la referencia de FFMPEG por enésima vez.

No hay comentarios

Thüring: un roguelike programable

Este fin de semana he estado en la Global Game Jam (GGJ) haciendo un juego en 48 horas junto a @pabletos y @j_coronel. El resultado ha quedado bastante guay así que lo dejo por aquí.

Banner de Thüring

Una game jam es un evento en el que los participantes tienen que desarrollar un juego en torno a un tema con un límite de tiempo. La GGJ es un evento anual a nivel mundial con sedes físicas por todo el mundo, como la que ofreció espacio_RES en esta ocasión. El límite eran 48 horas y el tema era Duality.

Ya habíamos participado en otras jams anteriormente como la Familiar Game Jam, Ludum Dare o GM48; pero este es uno de los juegos que más cerrados han quedado en tan poco tiempo. La mecánica consiste en superar niveles de un roguelike (un juego de exploración por turnos) añadiendo fichas a un tablero.

Captura in-game de Thüring

El comportamiento del tablero es bastante sencillo: va leyendo las instrucciones de arriba hacia abajo (como una máquina de Turing) y aplicándolas sobre el jugador. La mecánica es bastante emergente y con muy pocos elementos se pueden encontrar muchas estrategias distintas, así que seguiremos puliéndolo para subirlo a la App Store.

Pese a haber participado en muchas jams, esta ha sido la primera en la que no hemos ido a la modalidad remota. Y aunque eso de estar en una casa 48 horas en modo cueva haciendo un juego no está nada mal, conocer a tantos desarrolladores, diseñadores y artistas tan buenos no tiene comparación, así que definitivamente repetiremos.

No hay comentarios

La llegada de los transformers

Las siguientes conversaciones han sido completamente generadas por una inteligencia artificial a la que sólo le he suministrado las tres primeras frases en negrita:

-/-<>

La magia que hay detrás de este autocompletar hipervitaminado es GPT-3, un algoritmo entrenado para continuar textos de forma convincente. En algunos casos logra captar rasgos tan sutiles y humanos como el humor mientras mantiene conversaciones complejas alrededor de un tema.

GPT-3 pertenece a la familia de algoritmos conocidos como transformers, que han demostrado ser muy efectivos reconociendo patrones complejos en secuencias de elementos. Tratando el lenguaje como una secuencia de palabras se pueden entrenar para que, dado un texto de entrada (contexto), lo complete de la forma más creíble.

Gracias al Information Sciences Institute de Los Ángeles he recibido una invitación para probar esta herramienta, una de las más avanzadas en la actualidad, el Optimus Prime del lenguaje natural. Ya ha cosechado muchos éxitos resolviendo retos basados en texto como mantener conversaciones indistinguibles de las de un humano, ayudar a escribir novelas o incluso programar software a petición.

Un robot transformer arrasando una ciudad

Un grado tan profundo de entendimiento del lenguaje natural puede mejorar enormemente nuestra forma de comunicarnos con interfaces conversacionales como Google Assistant o Alexa. Y como un gran poder conlleva una gran responsabilidad, la empresa que hay detrás de esta herramienta la está abriendo al público de forma gradual y con cautela. Actualmente, sólo es posible usarla por invitación o pagando una suscripción con una tarifa por número de palabras generadas.

Pero lo que está inventado ya no se puede desinventar y han surgido una infinidad de proyectos que intentan replicar los éxitos recientes de GPT-3 en abierto. De hecho, cualquier persona sin ningún conocimiento de machine learning ya se puede instalar la versión open source GPT-Neo y probarla con un solo click (y una buena tarjeta gráfica).

Estas alternativas son bastante recientes -tienen menos de 6 meses- por lo que el tsunami de bots indistinguibles de un humano aun está por llegar, aunque ya se han visto algunos casos de mal uso, principalmente destinados a manipular la opinión pública para hacer bulto en los seguidores de un partido político o alterar la valoración de criptomonedas.

Clip del test de Voight-Kampff en Blade Runner

Hay estudios recientes que dicen que un 15% de las cuentas de Twitter podrían ser bots, y nuestros mecanismos para detectarlos aun son bastante poco efectivos. Y al igual que las fake news, han venido para quedarse, así que habrá que ir pensando soluciones escalables para distinguir humanos y bots. Al menos hasta que tengamos un test de Voight-Kampff.

No hay comentarios

El color de los videojuegos

En este proyecto he analizado la evolución de color en los videojuegos. He ido descargando longplays —vídeos de alguien pasándose un juego entero— y convirtiendo el color predominante de cada fotograma en una línea vertical, creando una línea de tiempo.

Al analizar los videojuegos desde este punto de vista he encontrado muchos patrones que se repiten. Aquí hablo de los que me han parecido más curiosos pero podéis verlos todos en el link al proyecto:

Game Colors

Algunos juegos usan el espectro para dar sensación de progreso al jugador. En Journey empezamos en un desierto y conforme resolvemos ciertos puzzles vamos descubriendo otras partes del mundo y el color va cambiando.

Otros juegos también usan el color para dar sensación de progreso, aunque de forma más directa: dividen el juego en mundos y cada uno de ellos tiene una paleta distinta. En algunos juegos con dinámicas poco cambiantes como Bit Trip Runner este recurso da más sensación de variedad. Es curioso cómo suelen empezar con tonos verdes y luminosos y van cambiando hacia tonos rojos y oscuros.

También hay juegos que no limitan la evolución del color al propio juego, sino que va cambiando a lo largo de una saga completa. Es el caso de Diablo, Elder Scrolls o BioShock. En todos ellos el color se va volviendo más vivo de un juego al siguiente. El caso de Diablo III fue bastante sonado y todo el mundo se quejaba de lo colorido que era.

La mayoría de juegos también usan el color para dar identidad al juego y muchos se pueden identificar fácilmente con solo ver la paleta de color. Algunos juegos como GRIS y Celeste no hacen honor a sus nombres, pero tienen una paleta que cualquiera que haya jugado podrá identificar.

Además de los juegos de este post he subido otros bastante curiosos, como la saga completa de Zelda, GTA o Final Fantasy. Pero no quería dejar de poner aquí otros juegos cuya paleta es simplemente espectacular y no se me ocurría ninguna otra excusa.

Empecé este post como una continuación del que escribí sobre el nombre de los colores, e inicialmente sólo pretendía sacar una paleta de color, no una línea temporal. Pero cuando vi lo que hizo el artista Dillon Baker con películas pensé que sería más interesante emularlo con videojuegos.

Para obtener los longplays, he usado la librería de descarga de vídeos online youtube-dl que hace poco retiró Github tras una denuncia de la SGAE estadounidense. La denuncia ha catapultado la popularidad de esta librería produciendo un efecto Streisand en toda regla y ya ha sido restaurada.

Lo más complicado tal vez ha sido identificar el color predominante de cada fotograma, que sigue siendo un campo de investigación activo. Probé a usar la media de todos los colores en pantalla, pero pasaba lo mismo que al mezclar todas las plastilinas y sale una masa de color gris y marrón. Así que terminé haciendo un clustering de los colores de la imagen y quedándome con el color que representa el cluster más grande.

Espectro de Papers, Please

El Papers, Please es gris de todas formas.

He pensado en subir a RedBubble versiones en alta resolución de estas líneas temporales en forma de cuadros, pero crear un producto por cada juego es un trabajo de chinos, así que si estáis interesados en alguno en particular podéis dejar un comentario y lo subiré de forma individual.

5 comentarios

🍪 ¿Cookies?

Esta web usa cookies para identificar qué contenido es interesante y mejorar su calidad. Más información aquí.

4d8cd43bbbfbbd2b7aed08d9a2b0ef251cebfd3e2603b74b710a2d38b7f8ec39