5

#PlatziCodingChallenge ¿Te conviene esta apuesta?

¿Te conviene esta apuesta?

Imagina que una persona te dice que debes adivinar un número al azar entre 0 y 100. Si lo adivinas en la primera oportunidad te da 4 usd, en la segunda 3 usd, en la tercera 2 usd, en la cuarta 1 usd, en la quinta 0 usd y a partir de la sexta tú le pagas 1 usd, en la séptima 2 usd, etc.

¿Debería jugar este juego?

Tip: piensa en búsqueda binaria y cuánto te tardarías en promedio en encontrar el número aleatorio.

Escribe tu comentario
+ 2
Ordenar por:
1
19943Puntos

Reto 40 en JavaScript, hice como un simulador donde ingreso el número y me dice si falle o gane y cuales eran los números buenos en cada intento:

// ¿Te conviene esta apuesta? en JavaScript

class Apuesta {
    constructor(numero, limiteInferior, limiteSuperior) {
        this.numero = numero
        this.limInf = limiteInferior
        this.limSup = limiteSuperior
        this.opciones = newArray()
        for (let i = this.limInf; i <= this.limSup; i++) {
            this.opciones.push(i)
        }
        this.dinero = 4this.adivinar() // Esto hace la búsqueda binariathis.resultadoJuego()
    }
    adivinar() {
        console.log(`Escogiste el número ${this.numero}`)
        let adivino = falselet intento = 1while (!adivino) {
            let resultados = this.XIntento(intento) // resultados de la búsqueda 'x'if (resultados.numerosBuenos.indexOf(this.numero) !== -1) {
                console.log(`Intento #${intento} - Ganaste: los números buenos eran ${resultados.numerosBuenos}`)
                adivino = true
            } else {
                console.log(`Intento #${intento} - Fallaste: los números buenos eran ${resultados.numerosBuenos}`)
                this.dinero--
                intento++
            }
        }
    }
    resultadoJuego() {
        if (this.dinero > 0) {
            console.log(`Ganaste $${this.dinero}`)
        } elseif (this.dinero == 0) {
            console.log(`No ganaste ni perdiste nada`)
        } else {
            console.log(`Perdiste $${this.dinero * -1}`)
        }
    }
    XIntento(x) {
        if (x === 1) {
            return {
                numerosBuenos: [this.elementoMedio(this.opciones)],
                antiguosGrupos: [this.opciones],
                nuevosGrupos: [
                    this.opciones.slice(0, this.indiceElementoMedio(this.opciones)),
                    this.opciones.slice(this.indiceElementoMedio(this.opciones) + 1),
                ]
            }
        } else {
            const intentoAnterior = this.XIntento(x - 1)
            return {
                numerosBuenos: intentoAnterior.nuevosGrupos.map(grupo => this.elementoMedio(grupo)),
                antiguosGrupos: intentoAnterior.nuevosGrupos,
                nuevosGrupos: intentoAnterior.nuevosGrupos.map(grupo => [
                    grupo.slice(0, this.indiceElementoMedio(grupo)),
                    grupo.slice(this.indiceElementoMedio(grupo) + 1)
                ]).flat()
            }
        }
    }
    elementoMedio(arreglo) {
        const indiceElementoMedio = this.indiceElementoMedio(arreglo)
        return arreglo[indiceElementoMedio]
    }
    indiceElementoMedio(arreglo) {
        returnMath.floor((arreglo.length / 2))
    }
}

// Voy a adivinar el 12 entre el 0 y el 100const apuesta1 = new Apuesta(12, 0, 100)
// Escogiste el número 12// Intento #1 - Fallaste: los números buenos eran 50// Intento #2 - Fallaste: los números buenos eran 25,76// Intento #3 - Ganaste: los números buenos eran 12,38,63,89// Ganaste $2// Voy a adivinar el 46 entre el 0 y el 100const apuesta2 = new Apuesta(46, 0, 100)
// Escogiste el número 46// Intento #1 - Fallaste: los números buenos eran 50// Intento #2 - Fallaste: los números buenos eran 25,76// Intento #3 - Fallaste: los números buenos eran 12,38,63,89// Intento #4 - Fallaste: los números buenos eran 6,19,32,44,57,70,83,95// Intento #5 - Fallaste: los números buenos eran 3,9,16,22,29,35,41,47,54,60,67,73,80,86,92,98// Intento #6 - Ganaste: los números buenos eran 1,5,8,11,14,18,21,24,27,31,34,37,40,43,46,49,52,56,59,62,65,69,72,75,78,82,85,88,91,94,97,100// Perdiste $1
1
4334Puntos

Acá mi primera parte del simulador de ‘cuantos intentos se requiere para adivinar el numero de la PC’; la idea es repetir el experimento 100 ó 1000 veces ^^! y sacar una probabilidad con datos reales.
En teoría no deberías necesitar más de 8 intentos, pero con el simulador he llegado a 11 intentos antes de adivinar el numero.
https://repl.it/@alvarohrv/retoPlatzi
De momento, en cualquier caso… no jugaría ya que gana en 4/11
XD

1
7689Puntos

Este reto estuvo entretenido, aquí mi resolución en un archivo html

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>¿Debería jugar?</title></head><style>
  * {
    margin: 0;
  }

  .contenedor {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
  }

  .contenedorh1 {
    text-align: center;
  }

  .inputs {
    display: inherit;
    flex-direction: row;
    justify-content: center;
    align-items: center;
  }

  .btn {
    margin: 8px;
    border-radius: 15px;
    outline: none;
    font-size: 24px;
    border: solid 1px black;
    color: #000504;
    text-align: center;
    padding: 16px;
    margin-bottom: 36px;
    cursor: pointer;
  }

  .btn:hover {
    cursor: pointer;
    background-color: rgba(0, 0, 0, 0.397);
    color: white;
  }

</style><body><divid='contenedor'class="contenedor"><h1>¿Deseas jugar?</h1><pstyle="padding: 10px 25%; text-align: justify;">Imagina que una persona te dice que debes adivinar un número al azar entre 0 y 100. Si lo adivinas en la primera oportunidad te da 4 usd, en la segunda 3 usd, en la tercera 2 usd, en la cuarta 1 usd, en la quinta 0 usd y a partir de la sexta tú le pagas 1 usd, en la séptima 2 usd, etc. ¿Deberías jugar este juego?</p><divclass="inputs"><buttononclick="jugar()"class="btn">Jugar...</button><buttononclick="noJugar()"class="btn">No me conviene...</button></div></div><script>let decisión = falselet array = []
    let ganancia = 4functionjugar(){
      if (!decisión){
        document.getElementById('contenedor').innerHTML = `
          <h1>Te mostraré que no vale la pena, veamos dependiendo del número que se genera en el juego, cuanto ganarías o perderías, para esto ingresa el número que supuestamente deberías adivinar entre 0 y 100: </h1>
          <input style="margin: 36px; width: 40px; font-size: 32px; text-align: center;" id="num"/>
          <button onclick="jugar()" class="btn">Jugar...</button>
        `

        decisión = truefor (let i = 0; i <= 100; i++){
          array.push(i)
        }
      } else {
        const valor = parseInt(document.getElementById('num').value)
        if (valor <= 0 || valor >= 100){
          return alert('Porfavor, selecciona un número entre 0 y 100')
        }
        let mitad = array[Math.floor((array.length - 1) / 2)]
        alert(`Como conoces la busqueda binaria, tu valor a adivinar será ${mitad}, ya que es la mitad del rango ${array.join(',')}`)
        if (valor === mitad){
          if (ganancia > 0){
            alert(`En este caso, tu guess es el correcto, y por ende tu ganancia será de $${ganancia}`)
          } elseif (ganancia === 0) {
            alert(`En este caso, no ganaste ni perdiste`)
          } else {
            alert(`En este caso, aunque tu guess es el correcto, perdiste $${ganancia * (- 1)}`)
          }
          array = []
          ganancia = 4for (let i = 0; i <= 100; i++){
            array.push(i)
          }
          alertas()
        } else {
          if (valor > mitad){
            array = array.slice(Math.floor((array.length - 1) / 2), array.length)
            alert(`Tu nuevo rango en adivinar será ${array}`)
          } else {
            array = array.slice(0, Math.floor((array.length - 1) / 2) + 1)
            alert(`Tu nuevo rango en adivinar será ${array}`)
          }
          ganancia--
          console.log(ganancia)
          jugar()
        }
      }
    }

    functionalertas(){
      alert('Para ganar 4$, el número a adivinar debería ser 50; para ganar 3$, el número a adivinar debería ser 25 o 75; para ganar 2$, el número a adivinar debería ser 12, 37, 62 o 87; para ganar 1$, el número a adivinar debería ser 6, 18, 31, 43, 56, 68, 81, o 93; para no ganar ni perder, el número a adivinar debería ser 3, 9, 15, 21, 28, 34, 40, 46, 53, 59, 65, 71, 78, 84, 90 o 96; el resto de posibilidades siempre perderas.')
      alert('Por eso no te sale rentable apostar, ya que de las 99 posibles respuestas, solo 15 de ellas te harán ganar, 16 de ellas no ganarás ni perderás, y las demás 68 posibilidades, siempre perderás. En otras palabras, solo tienes 15.15% de posibilidades de ganar.')
      alert('Si deseas verlo por ti mismo, inténtalo con todas las opciones y verás que tengo razón 😉')
    }

    functionnoJugar(){
      alert('Pues si, aunque por juego solo tienes por perder 2$... a la larga no te sale rentable jugar')
      alertas()
    }
  </script></body></html>
1

En Python 😃

import random
mensaje='''Ingresa el número que creas adivinar entre el 0 y 100, ten cuidado si adivinas enla
primera recibiras 4  usd, enla segunda 3 usd, enla tercera 2 usd,
enla cuarta 1 usd, enla quinta 0 usd y a partir dela sexta
tú le pagas 1 usd, enla séptima 2 usd, enla octava 3 usd y enla novena tu
pagaras 9 usd. '''
print(mensaje)
aleatorio=random.randint(0,100)
print(aleatorio)

ganado=4
for i inrange(5):
    n=int(input('Ingresa el número que creas haber adivinado: '))
    ifn==aleatorio:
        print(f'Felicidades adivinaste el número te ganaste {ganado} usd')
        breakelse:
        print('Lo siento intentalo nuevamente')
        ganado=ganado-1
ifn!=aleatorio:
    perdido=1
    for i inrange(5):
        n=int(input('Ingresa el número que creas haber adivinado: '))
        ifn==aleatorio:
            print(f'Felicidades adivinast el número pero perdiste {perdido} usd')
            breakelse:
            print('Lo siento intentalo nuevamente')
            perdido=perdido+1
else:
    pass```
0
13595Puntos

Este es mi condigo en JS, segun entendi era calcular cuantos intentos se podria tardar en promedio aun usando busqueda binaria, llegue a la conclusion despues de simularlo varias veces y la media fue de 6 intentos, lo cual quiere decir que no deberiamos jugar este juego jaja o te vas a quedar pobre.

function binarySearch(element, array, left, right, cont = 0) {
  constmid = Math.floor((right - left) / 2) + left;
  cont++;

  if (right <= left && array[mid] !== element) {
    return "Element not in the array";
  } elseif (element === array[mid]) {
    return {nummber: mid, attempts: cont};
  } elseif (element < array[mid]) {
    return binarySearch(element, array, left, mid - 1, cont);
  } else {
    return binarySearch(element, array, mid + 1, right, cont);
  }
}

const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
  69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
  86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100];

const randomNumber = Math.floor(Math.random() * (100 - 0 + 1));
console.log(binarySearch(randomNumber,numbers, 0, numbers.length-1, 0));