diff --git a/content/lanzamientos-de-monedas.md b/content/lanzamientos-de-monedas.md new file mode 100644 index 0000000..1640f93 --- /dev/null +++ b/content/lanzamientos-de-monedas.md @@ -0,0 +1,179 @@ ++++ +title = "Lanzamientos de Monedas" +date = 2025-07-28 +draft = true +[taxonomies] +t = ["Probabilidades", "Monedas", "Distribución Geométrica", "Distribución Binomial"] +[extra] +author = "Felipe" +image = "img/placeholder.png" +image_webp = "img/placeholder.webp" +alt = "" ++++ + +Toda partida de cartas Pokémon inicia con un lanzamiento de moneda (o de dado en su +reemplazo). Probablemente, todos sabemos que la probabilidad de que salga cualquiera +de los resultado es $\frac{1}{2}$, suponiendo que la moneda o el dado no están +trucados. + +Un sólo lanzamiento de moneda entonces no resulta muy interesante, pero hay efectos +que requieren más de un lanzamiento, sobres los cuáles nos interesará preguntarnos +ciertas cosas. + +# Lanza una moneda hasta que salga cruz + +{{ ptcg_card(id="beartic-blk-la", display=true) }} + +El primer de estos efectos es el del tipo *"Lanza 1 moneda hasta que salga cruz. Por +cada cara, haz cierta cosa"*. En el caso del **Beartic** que se muestra arriba, se +hace cierta cantidad de daño por cierta cara. + +La primera pregunta que responderemos será ¿cuál es la probabilidad de sacar +exactamente $k$ caras? Como dejamos de lanzar monedas al obtener cruz, esto equivale +a ¿cuál es la probabilidad de sacar $k$ caras seguidas por una cruz? Como solo hay +una secuencia de resultados que nos interesa, solo debemos calcular cuántas +secuencias posibles de resultados hay al lanzar $k + 1$ monedas (para obtener $k$ +caras y $1$ cruz) y usar la fórmula básica de las probabilidades +$$\text{Probabilidad} = \frac{\text{Número de casos favorables}}{\text{Número de casos totales}}$$ +Para la primera moneda, tenemos dos opciones posibles. Para dos monedas, por cada una +de las opciones de la primera moneda, tenemos dos opciones para la segunda. Así, cada +vez que agregamos una moneda, se duplican la cantidad de secuencias. Por lo tanto, la +cantidad de secuencias de $k + 1$ lanzamientos de monedas es $2^{k+1}$ y en +consecuencia, la probabilidad de obtener $k$ caras es $\frac{1}{2^{k+1}}$. + +Ahora nos preguntamos, ¿cuál es el número promedio de caras que voy a obtener? Para +ello, llamaremos $p_k$ a la probabilidad de obtener exactamente $k$ caras y +calcularemos la siguiente suma +$$S = 0\cdot p_0 + 1\cdot p_1 + 2\cdot p_2 + \dots + k\cdot p_k + (k+1)\cdot p_{k+1} + \dots$$ +Con el cálculo que habíamos hecho antes, sabemos que $p_k = \frac{1}{2^{k+1}}$, por +lo que +$$S = \frac{0}{2} + \frac{1}{2^2} + \frac{2}{2^3} + \dots + \frac{k}{2^{k+1}} + \frac{k+1}{2^{k+2}} + \dots$$ +Si multiplicamos la por $2$, tenemos que +$$ +\begin{aligned} +2S &= 2\cdot\frac{1}{2^2} + 2\cdot\frac{2}{2^3} + \dots + 2\cdot\frac{k}{2^{k+1}} + 2\cdot\frac{k+1}{2^{k+2}} + \dots \\\\ + &= \frac{1}{2} + \frac{2}{2^2} + \frac{3}{2^3} + \dots + \frac{k}{2^k} + \frac{k+1}{2^{k+1}} + \dots +\end{aligned} +$$ +Ahora, si restamos la última ecuación con la primera, tenemos que +$$ +\begin{aligned} +2S - S &= \left(\frac{1}{2} - \frac{0}{2}\right) + \left(\frac{2}{2^2} - \frac{1}{2^2}\right) + \left(\frac{3}{2^3} - \frac{2}{2^3}\right) + \dots + \left(\frac{k+1}{2^{k+1}} - \frac{k}{2^{k+1}}\right) + \dots \\\\ +S &= \frac{1}{2} + \frac{1}{2^1} + \frac{1}{2^2} + \dots + \frac{1}{2^k} + \dots +\end{aligned} +$$ +De nuevo multiplicando por 2, tenemos que +$$2S = 1 + \frac{1}{2} + \frac{1}{2^2} + \dots + \frac{1}{2^{k-1}} + \frac{1}{2^k} + +\dots$$ +Y de nuevo, restando las últimas dos ecuaciones +$$ +\begin{aligned} +2S - S &= 1 + \left(\frac{1}{2} - \frac{1}{2}\right) + \left(\frac{1}{2^2} - \frac{1}{2^2}\right) + \dots + \left(\frac{1}{2^k} - \frac{1}{2^k}\right) + \dots \\\\ +S &= 1 +\end{aligned} +$$ +Por lo tanto, en promedio obtendremos una cara de este tipo de efectos. Volviendo al +ejemplo de **Beartic**, haremos en promedio $50$ de daño con su primer ataque. + +# Lanza $n$ monedas + +{{ ptcg_card(id="stoutland-wht-la", display=true) }}u + +El segundo tipo de efectos que estudiaremos es *"Lanza $n$ monedas. Haz cierta acción +por el número de caras"*. Al igual que antes, queremos saber cuál es la probabilidad +de obtener exactamente $k$ caras de entre las $n$. De la sección anterior, sabemos +que la cantidad total de posibilidades para $n$ lanzamientos de monedas es $2^n$. Por +lo tanto, solo nos falta calcular de cuántas formas podemos obtener $k$ caras de +entre $n$ lanzamientos. Esto es equivalente a elegir cuáles de los $n$ lanzamientos +queremos que sean cara y dejamos que el resto sean cruz, por lo que nos interesa +contar cuántos subconjuntos de tamaño $k$ de entre los $n$ lanzamientos existen. + +Antes de hacer ese conteo, primero resolveremos otro problema que nos ayudará en el +problema original. Dada una lista de $n$ elementos, queremos contar de cuántas formas +podemos ordenar esta lista. Para el primer elemento, tenemos $n$ opciones. Para el +segundo, solo tenemos $n-1$ opciones, pues no podemos repetir el elemento que +elegimos primero. Para el tercero, tenemos $n-2$ opciones, pues no podemos elegir +ninguno de los dos primeros elementos. Repitiendo el argumento, llegamos hasta el +último elemento de la lista, que solo tiene una opción, el elemento que no elegimos +en las $n-1$ posiciones anteriores. Así, el total de formas de ordenar la lista es +$$n \cdot (n-1) \cdot (n-2) \cdot\dots\cdot2\cdot1$$ +Esta multiplicación tiene nombre y se conoce como el factorial de $n$ y se denota por +$n!$. + +Volviendo a nuestro problema original, elijamos las $k$ posiciones en las cuales +queremos que la moneda sea una cara. Para la primera posición, tenemos $n$ opciones. +Para la segunda, $n-1$ opciones, y así, hasta la posición $k$, para la cual tenemos +$n - (k - 1) = n - k + 1$ opciones. Sin embargo, en esta lista de posiciones para las +caras, estamos considerando el orden, pero solo nos interesa el conjunto de +posiciones, por lo que estamos contando cada opción muchas veces. ¿Cuántas veces? +Precisamente, el número de formas de ordenar la lista de estas $k$ posiciones, que ya +sabemos es $k!$. Por lo tanto, la cantidad de formas de obtener $k$ caras entre $n$ +lanzamientos es +$$\frac{n\cdot(n-1)\cdot\dots\cdot(n-k+1)}{k!} = \frac{n!}{k!(n-k)!},$$ +donde la última igualdad se obtiene agregando los factores de $(n-k)!$ arriba y abajo +en la fracción. Este valor se conoce como coeficiente binomial[^1] y se denota por +$\binom{n}{k}$. + +Finalmente, la probabilidad de obtener $k$ caras entre $n$ monedas es +$$\frac{\binom{n}{k}}{2^k}$$ + +Hagamos el ejercicio de calcular cuál es la probabilidad de recuperar $2$ cartas con +el ataque de Stoutland. La probabilidad de sacar $2$ caras entre $3$ lanzamientos es +$$\frac{\binom{3}{2}}{2^3} = \frac{\frac{3\cdot2}{2\cdot1}}{2^3} = \frac{3}{8}$$ +Sin embargo, también nos interesa obtener $3$ lanzamientos, puesto que salvo +situaciones muy específicas, recuperar $3$ cartas también cubrirá los casos en los +que queríamos recuperar 2, así que en verdad la pregunta que nos interesaba es la +probabilidad de obtener *al menos* $2$ caras. La probabilidad de obtener las $3$ +caras es +$$\frac{\binom{3}{3}}{2^3}=\frac{\frac{3!}{3!}}{8}=\frac{1}{8}$$ +Y por lo tanto, la probabilidad de obtener al menos $2$ caras de entre $3$ es +$$\frac{3}{8} + \frac{1}{8} = \frac{4}{8} = \frac{1}{2}$$ + +En general, no hay una fórmula cerrada para estas sumas de coeficientes binomiales, +por lo que para resolver la pregunta de obtener al menos $k$ caras de entre $n$ +monedas se suelen usar calculadoras[^2]. + +# Digger? + +{{ ptcg_card(id="digger-es", display=true) }} + +Ahora estudiaremos una carta que definitivamente trata sobre lanzar monedas: **Digger +(Rocket's Secret Machine)**. La pregunta obvia es ¿cuál es la probabilidad de que los +$10$ de daño terminen en mi Pokémon activo si yo jugué la carta? Notemos que se +parece un poco al primer problema, pues se lanzan monedas hasta que salga cruz. Sin +embargo, solo si la cruz sale en los lanzamientos impares (el primer lanzamiento, el +tercer lanzamiento, etc) el daño se pondrá en mi Pokémon activo y solo si sale en los +lanzamientos pares el daño se pondrá en el Pokémon del rival. Que salga cruz en los +lanzamientos impares es equivalente a que salgan cantidades pares de caras ($0$ +caras, $2$ caras, etc), por lo que la probabilidad de que la carta haga daño al +Pokémon propio es +$$ +\begin{aligned} +P &= p_0 + p_2 + p_4 + \dots p_{2k} + \dots \\\\ + &= \frac{1}{2} + \frac{1}{2^3} + \frac{1}{2^5} + \dots \frac{1}{2^{2k+1}} \dots \\\\ + &= \frac{1}{2}\left(1 + \frac{1}{2^2} + \frac{1}{2^4} + \dots + \frac{1}{2^{2k}} + \dots \right) \\\\ + &= \frac{1}{2}\left(1 + \frac{1}{4} + \frac{1}{4^2} + \dots + \frac{1}{4^k} + \dots \right) \\\\ +\end{aligned} +$$ +Multiplicando por $4$ +$$ +\begin{aligned} +4P &= \frac{1}{2}\left(4 + 1 + \frac{1}{4} + \frac{1}{4^2} \dots + \frac{1}{4^{k-1}} + \dots \right) \\\\ +\end{aligned} +$$ +Restando las últimas dos ecuaciones +$$ +\begin{aligned} +4P - P &= \frac{1}{2}\left(4 + 1 - 1 + \frac{1}{4} - \frac{1}{4} + \dots + \frac{1}{4^k} - \frac{1}{4^k}+ \dots \right) \\\\ +3P &= \frac{1}{2}\cdot4 = 2\\\\ +\end{aligned} +$$ +Y por lo tanto +$$ P = \frac{2}{3} $$ +O sea, demostramos con números que no es una carta solo mala, sino que pésima. + + + +--- +[^1]: [Coeficiente binomial en Wikipedia](https://es.wikipedia.org/wiki/Coeficiente_binomial) +[^2]: [Binomial Distribution Probability Calculator (en inglés)](https://stattrek.com/online-calculator/binomial) diff --git a/content/ptcg/cards/beartic-blk-la.toml b/content/ptcg/cards/beartic-blk-la.toml new file mode 100644 index 0000000..0b7ac79 --- /dev/null +++ b/content/ptcg/cards/beartic-blk-la.toml @@ -0,0 +1,12 @@ +name = "Beartic" +kind = "pokemon" +type = "stage1" +hp = 150 +element = "[W]" +attacks = [ + { cost = "[C]", name = "Cabezazo Continuo", damage = "50×", effect = "Lanza 1 moneda hasta que salga cruz. Este ataque hace 50 puntos de daño por cada cara." }, + { cost = "[W][W][W][C]", name = "Frío Extremo", damage = 150, effect = "Durante el próximo turno de tu rival, el Pokémon Defensor no puede usar ataques." }, +] +weakness = "[M]×2" +resistance = "" +retreat = "[C][C][C]" diff --git a/content/ptcg/cards/digger-es.toml b/content/ptcg/cards/digger-es.toml new file mode 100644 index 0000000..29510a0 --- /dev/null +++ b/content/ptcg/cards/digger-es.toml @@ -0,0 +1,4 @@ +name = "Digger (Rocket's Secret Machine)" +kind = "trainer" +type = "item" +effect = "Lanza una moneda. Si sale cruz, haz 10 de daño a tu Pokémon Activo. Si sale cara, tu rival lanza una moneda. Si sale cruz, tu rival hace 10 de daño a su Pokémon Activo. Si sale cara, tú lanzas una moneda. Sigue haciendo esto hasta que un jugador obtenga cruz." diff --git a/content/ptcg/cards/stoutland-wht-la.toml b/content/ptcg/cards/stoutland-wht-la.toml new file mode 100644 index 0000000..1d32fde --- /dev/null +++ b/content/ptcg/cards/stoutland-wht-la.toml @@ -0,0 +1,12 @@ +name = "Stoutland" +kind = "pokemon" +type = "stage2" +hp = 160 +element = "[C]" +attacks = [ + { cost = "[C]", name = "Rastreo", effect = "Lanza 3 monedas. Toma de tu pila de descartes una cantidad de cartas igual o inferior al número de caras que salieron y ponlas en tu mano." }, + { cost = "[C][C][C][C]", name = "Colmillo Especial", damage = "100+", effect = "Si este Pokémon tiene alguna Energía Especial unida, este ataque hace 100 puntos de daño más." }, +] +weakness = "[F]×2" +resistance = "" +retreat = "[C][C][C]" diff --git a/static/ptcg/beartic-blk-la.png b/static/ptcg/beartic-blk-la.png new file mode 100644 index 0000000..d904b27 Binary files /dev/null and b/static/ptcg/beartic-blk-la.png differ diff --git a/static/ptcg/beartic-blk-la.webp b/static/ptcg/beartic-blk-la.webp new file mode 100644 index 0000000..260d087 Binary files /dev/null and b/static/ptcg/beartic-blk-la.webp differ diff --git a/static/ptcg/digger-es.png b/static/ptcg/digger-es.png new file mode 100644 index 0000000..5d78676 Binary files /dev/null and b/static/ptcg/digger-es.png differ diff --git a/static/ptcg/digger-es.webp b/static/ptcg/digger-es.webp new file mode 100644 index 0000000..64fb68d Binary files /dev/null and b/static/ptcg/digger-es.webp differ diff --git a/static/ptcg/stoutland-wht-la.png b/static/ptcg/stoutland-wht-la.png new file mode 100644 index 0000000..b19f990 Binary files /dev/null and b/static/ptcg/stoutland-wht-la.png differ diff --git a/static/ptcg/stoutland-wht-la.webp b/static/ptcg/stoutland-wht-la.webp new file mode 100644 index 0000000..2fbd614 Binary files /dev/null and b/static/ptcg/stoutland-wht-la.webp differ diff --git a/themes/lucky/sass/main.scss b/themes/lucky/sass/main.scss index 6a8a3a2..b02e5aa 100644 --- a/themes/lucky/sass/main.scss +++ b/themes/lucky/sass/main.scss @@ -867,3 +867,18 @@ code, .highlight { color: #00aeef; font-weight: 600; } + +.ptcg-deck .bottom, +.ptcg-card .bottom { + font-weight: 600; + font-size: 0.8em; + margin-top: 1em; + padding: 0.1em 0.6em; + border-style: solid; + border-width: 2px; + border-color: $border-color; + border-radius: 6px; + display: flex; + justify-content: space-between; + gap: 0.2em +} diff --git a/themes/lucky/scripts/ptcgIcons.ts b/themes/lucky/scripts/ptcgIcons.ts index 5bc845f..7f71b34 100644 --- a/themes/lucky/scripts/ptcgIcons.ts +++ b/themes/lucky/scripts/ptcgIcons.ts @@ -30,6 +30,12 @@ function ptcg_icons( const effects = deck.querySelectorAll('.effect') elements.push(...effects); + + const attack_effects = deck.querySelectorAll('.attack-effect') + elements.push(...attack_effects); + + const bottoms = deck.querySelectorAll('.bottom') + elements.push(...bottoms); }); const cards = document.querySelectorAll('.ptcg-card'); @@ -45,6 +51,13 @@ function ptcg_icons( const effects = card.querySelectorAll('.effect') elements.push(...effects); + + const attack_effects = card.querySelectorAll('.attack-effect') + elements.push(...attack_effects); + + const bottoms = card.querySelectorAll('.bottom') + elements.push(...bottoms); + }); elements.forEach(element => { element.innerHTML = element.innerHTML.replace(regex, energy); diff --git a/themes/lucky/static/ptcg-icons.js b/themes/lucky/static/ptcg-icons.js index 714f6f1..63f3c86 100644 --- a/themes/lucky/static/ptcg-icons.js +++ b/themes/lucky/static/ptcg-icons.js @@ -22,6 +22,12 @@ function init() { const effects = deck.querySelectorAll('.effect') elements.push(...effects); + + const attack_effects = deck.querySelectorAll('.attack-effect') + elements.push(...attack_effects); + + const bottoms = deck.querySelectorAll('.bottom') + elements.push(...bottoms); }); const cards = document.querySelectorAll('.ptcg-card'); @@ -37,6 +43,12 @@ function init() { const effects = card.querySelectorAll('.effect') elements.push(...effects); + + const attack_effects = card.querySelectorAll('.attack-effect') + elements.push(...attack_effects); + + const bottoms = card.querySelectorAll('.bottom') + elements.push(...bottoms); }); elements.forEach(element => { element.innerHTML = element.innerHTML.replace(regex, energy);