Dos baldes (solución)

(Continuación de Dos baldes)

A primera vista casi todos pensamos que el balde B será el que quede con más “impurezas”, ya que recibe una cucharada de arena blanca pura mientras que A recibe una cucharada de arena negra mezclada con algo de arena blanca. Sin embargo, esta transferencia de arena blanca también tenderá a disminuir la cantidad de impurezas en B, con lo que no queda inmediatamente claro el signo del efecto.

Cuánto es la diferencia? Bueno, como la cucharada transferida en el segundo movimiento estará compuesta por arena blanca y negra, es claro que la disminución en la cantidad de arena negra transferida respecto a la cucharada entera será igual a la cantidad de arena blanca extraída del balde B. Como el balde B tiene en total una sola cucharada de arena blanca, la cantidad de arena negra transferida en el segundo movimiento será igual a la de arena blanca remanente en el balde B. Por lo tanto, las cantidades de impurezas serán iguales.

Una forma más simple de resolverlo (que es la que utilicé originalmente) es limitarse a hacer la cuentas (o sea, hacer que los símbolos piensen por nosotros :-D).

Si suponemos que cada balde tiene N cucharitas de arena, después del primer movimiento el balde A tendrá N-1 cucharitas de arena blanca y el balde B tendrá N cucharitas de arena negra y una cucharita de arena blanca. Como se postula que la mezcla es homogénea, el segundo movimiento llevará 1/(N+1) cucharitas de arena blanca y N/(N+1) cucharitas de arena negra al balde blanco.

En resumen, al final tendremos N/(N+1) cucharitas de arena negra en el balde A y 1 – 1/(N+1) cucharitas de arena blanca en B, o sea exactamente la misma cantidad.

Dos baldes

Un problema de mezclas (via Terry Tao):

Se tienen dos baldes, que podemos llamar A y B, conteniendo la misma cantidad de arena. En el caso del balde A es arena blanca, mientras que en el balde B es arena negra. Se lleva una cucharita llena de arena del balde A y se la mezcla con la arena del balde B; seguidamente se toma una cucharita llena de arena del balde B y se incorpora al contenido del balde A.

Al finalizar este proceso, ¿cuál de los baldes tiene más arena proveniente del otro?

Agregando texto a imágenes con PIL

Este es un post netamente técnico (o sea aburrido :-D).

En ocasiones puede ser útil agregar texto a una serie de imágenes en forma automatizada, evitando el tedioso proceso de agregarlo a mano (y el aún más tedioso de agregarlo de vuelta cuando descubrimos que nos equivocamos). Sabía (a través de John Walker) que pueden utilizarse para este fin las herramientas para línea de comandos Netpbm pero, si estamos trabajando en un script, estas herramientas pueden ser algo inflexibles e incómodas de llamar.

Mientras armaba uno de los posts anteriores descubrí a PIL (Python Imaging Library) que permite realizar estas operaciones en forma relativamente natural desde Python. Por ejemplo, dibujar texto centrado en un rectángulo puede hacerse mediante la siguiente función:

import ImageFont

def draw_centered_text(im_draw, text, r, font_name, color):
    font = ImageFont.truetype(font_name + '.ttf',
                              r[3] - r[1])
    text_size = font.getsize(text)
    if text_size[0] > r[2] - r[0]:
        new_font_height = (r[3] - r[1]) * (r[2] - r[0]) /\
                          text_size[0]
        font = ImageFont.truetype(font_name + '.ttf',
                                  new_font_height)
        text_size = font.getsize(text)
    im_draw.text(((r[2] + r[0]) / 2 - text_size[0] / 2,
                  (r[3] + r[1]) / 2 - text_size[1] / 2),
                 text, font=font, fill=color)

donde im_draw es un objeto del tipo ImageDraw, representando a la imagen sobre la que trabajamos, text es el texto a dibujar, r es una tupla de 4 puntos representando al rectángulo donde irá encerrado el texto (izquierda, arriba, derecha, abajo), font_name es el nombre del archivo TTF con la fuente a utilizar y color es un tupla representando el color del texto a dibujar (RGB).

Un ejemplo de llamada a la función anterior sería:

import Image, ImageDraw

im = Image.open('banner_start.png')
draw = ImageDraw.Draw(im)
draw_centered_text(draw, 'Text', (0, 0, 150, 150),
                   'arial', (0, 0, 0))
draw_centered_text(draw, 'Text', (250, 50, 500, 100),
                   'arial', (255, 0, 0))
im.save('banner_end.png')

Si tomamos a la siguiente imagen como entrada:

Esta imagen, correspondiendo a 'banner_start.png' en el ejemplo, consiste en un cuadrado amarillo en (0, 0) - (150, 150) y un rectángulo celeste en (250, 50) - (500, 100).

Esta imagen, correspondiendo a 'banner_start.png' en el ejemplo, consiste en un cuadrado amarillo en (0, 0) - (150, 150) y un rectángulo celeste en (250, 50) - (500, 100).

obtendremos a la siguiente imagen como salida:

Esta imagen corresponde a 'banner_end.png' en el ejemplo y muestra como el texto se expande lo máximo posible sin perder su relación de aspecto.

Esta imagen corresponde a 'banner_end.png' en el ejemplo y muestra como el texto se expande lo máximo posible sin perder su relación de aspecto.

Espero que pueda serle útil a alguno de los lectores 😉