Desafios matemáticos para encerrar 2024

De: Marcelo Viana, Diretor-geral do Instituto de Matemática Pura e Aplicada, ganhador do Prêmio Louis D., do Institut de France.

Endereço da página: https://www1.folha.uol.com.br/colunas/marceloviana/2024/12/desafios-matematicos-para-a-familia-encerrar-2024.shtml

Tentativa de resolução

  1. Nesta época festiva, Miguel prepara rabanadas de vinho, deliciosa especialidade de sua avó portuguesa. Começa por colocar meio litro de vinho e meio litro de água, separadamente, em copos idênticos. Logo retira uma colher de líquido do primeiro copo (vinho), coloca no segundo copo (água) e mistura bem. Em seguida, retira uma colher de líquido do segundo copo e coloca no primeiro. A essa altura, há mais vinho no copo da água ou água no copo do vinho?

    [ 0, 0, 100 ]
    a mesma proporção de impureza está em ambos os copos.
    const runs = 100;
    const winners = [0, 0, 0];
    for (let i = 0; i < runs; i++) {
      const wineGlass = new Array(500).fill(1);
      const waterGlass = new Array(500).fill(0);
      take(15, wineGlass, waterGlass);
      shuffle(waterGlass);
      take(15, waterGlass, wineGlass);
      winners[getWinner(wineGlass, waterGlass)]++;  
    }
    console.log(winners);
    console.log("a mesma proporção de impureza está em ambos os copos.");
    
    function getWinner(wineGlass, waterGlass) {
      const wineGlassWine = wineGlass.filter((x) => x === 1).length;
      const waterGlassWater = waterGlass.filter((x) => x === 0).length;
      return wineGlassWine === waterGlassWater
        ? 2
        : wineGlassWine > waterGlassWater
          ? 0
          : 1;
    }
    
    function take(n, fromArray, toArray) {
      toArray.push(...fromArray.splice(0, n));
    }
    
    function shuffle(array) {
      for (let i = 0; i < array.length; i++) {
        const iTemp = Math.trunc(Math.random() * array.length);
        const temp = array[iTemp];
        array[iTemp] = array[i];
        array[i] = temp;
      }
    }
  2. Dois navios saem ao mesmo tempo do Rio de Janeiro para Nova York, onde fazem escalas de uma semana antes de regressarem, sempre seguindo a mesma rota. A Santa Cruz navega a 40 km/h durante toda a viagem. Já a Flor do Mar vai a 30 km/h na ida, mas na volta acelera para 50 km/h. Qual chega primeiro ao Rio de Janeiro?

    A Santa Cruz sempre chega primeiro.
    t2 1 f1 169.5 f2 169.6
    t2 2 f1 171 f2 171.2
    t2 3 f1 172.5 f2 172.8
    t2 4 f1 174 f2 174.4
    t2 5 f1 175.5 f2 176
    t2 6 f1 177 f2 177.6
    t2 7 f1 178.5 f2 179.2
    t2 8 f1 180 f2 180.8
    t2 9 f1 181.5 f2 182.4
    t2 10 f1 183 f2 184
    t2 11 f1 184.5 f2 185.6
    t2 12 f1 186 f2 187.2
    t2 13 f1 187.5 f2 188.8
    t2 14 f1 189 f2 190.4
    t2 15 f1 190.5 f2 192
    t2 16 f1 192 f2 193.6
    t2 17 f1 193.5 f2 195.2
    t2 18 f1 195 f2 196.8
    t2 19 f1 196.5 f2 198.4
    t2 20 f1 198 f2 200
    t2 21 f1 199.5 f2 201.6
    t2 22 f1 201 f2 203.2
    t2 23 f1 202.5 f2 204.8
    t2 24 f1 204 f2 206.4
    t2 25 f1 205.5 f2 208
    t2 26 f1 207 f2 209.6
    t2 27 f1 208.5 f2 211.2
    t2 28 f1 210 f2 212.8
    t2 29 f1 211.5 f2 214.4
    t2 30 f1 213 f2 216
    t2 31 f1 214.5 f2 217.6
    t2 32 f1 216 f2 219.2
    t2 33 f1 217.5 f2 220.8
    t2 34 f1 219 f2 222.4
    t2 35 f1 220.5 f2 224
    t2 36 f1 222 f2 225.6
    t2 37 f1 223.5 f2 227.2
    t2 38 f1 225 f2 228.8
    t2 39 f1 226.5 f2 230.4
    t2 40 f1 228 f2 232
    t2 41 f1 229.5 f2 233.6
    t2 42 f1 231 f2 235.2
    t2 43 f1 232.5 f2 236.8
    t2 44 f1 234 f2 238.4
    t2 45 f1 235.5 f2 240
    t2 46 f1 237 f2 241.6
    t2 47 f1 238.5 f2 243.2
    t2 48 f1 240 f2 244.8
    t2 49 f1 241.5 f2 246.4
    t2 50 f1 243 f2 248
    t2 51 f1 244.5 f2 249.6
    t2 52 f1 246 f2 251.2
    t2 53 f1 247.5 f2 252.8
    t2 54 f1 249 f2 254.4
    t2 55 f1 250.5 f2 256
    t2 56 f1 252 f2 257.6
    t2 57 f1 253.5 f2 259.2
    t2 58 f1 255 f2 260.8
    t2 59 f1 256.5 f2 262.4
    t2 60 f1 258 f2 264
    t2 61 f1 259.5 f2 265.6
    t2 62 f1 261 f2 267.2
    t2 63 f1 262.5 f2 268.8
    t2 64 f1 264 f2 270.4
    t2 65 f1 265.5 f2 272
    t2 66 f1 267 f2 273.6
    t2 67 f1 268.5 f2 275.2
    t2 68 f1 270 f2 276.8
    t2 69 f1 271.5 f2 278.4
    t2 70 f1 273 f2 280
    t2 71 f1 274.5 f2 281.6
    t2 72 f1 276 f2 283.2
    t2 73 f1 277.5 f2 284.8
    t2 74 f1 279 f2 286.4
    t2 75 f1 280.5 f2 288
    t2 76 f1 282 f2 289.6
    t2 77 f1 283.5 f2 291.2
    t2 78 f1 285 f2 292.8
    t2 79 f1 286.5 f2 294.4
    t2 80 f1 288 f2 296
    t2 81 f1 289.5 f2 297.6
    t2 82 f1 291 f2 299.2
    t2 83 f1 292.5 f2 300.8
    t2 84 f1 294 f2 302.4
    t2 85 f1 295.5 f2 304
    t2 86 f1 297 f2 305.6
    t2 87 f1 298.5 f2 307.2
    t2 88 f1 300 f2 308.8
    t2 89 f1 301.5 f2 310.4
    t2 90 f1 303 f2 312
    t2 91 f1 304.5 f2 313.6
    t2 92 f1 306 f2 315.2
    t2 93 f1 307.5 f2 316.8
    t2 94 f1 309 f2 318.4
    t2 95 f1 310.5 f2 320
    t2 96 f1 312 f2 321.6
    t2 97 f1 313.5 f2 323.2
    t2 98 f1 315 f2 324.8
    t2 99 f1 316.5 f2 326.4
    /*
      x = v1*t1 = v2*t2 = v3*t3
      f1 = t1 + 7*24 + t1
      f2 = t2 + 7*24 + t3
    
      t1 = v2*t2/v1
      t3 = v2*t2/v3
    
      f1 = v2*t2/v1 + 7*24 + v2*t2/v1
      f2 = t2+ 7*24 +v2*t2/v3
    */
    
    const f1 = (v1, v2, t2) => (v2 * t2) / v1 + 7 * 24 + (v2 * t2) / v1;
    const f2 = (v3, v2, t2) => t2 + 7 * 24 + (v2 * t2) / v3;
    const v1 = 40;
    const v2 = 30;
    const v3 = 50;
    
    console.log("A Santa Cruz sempre chega primeiro.");
    for (let t2 = 1; t2 < 100; t2++) 
      console.log("t2 %d f1 %d f2 %d", t2, f1(v1, v2, t2), f2(v3, v2, t2));
  3. Há três candidatas à presidência do Glorioso Alguidares: Ana, Bia e Céu. Todos os 48 membros do clube votam, listando as três candidatas na sua ordem de preferência. Fica eleita a que for listada mais vezes em primeiro lugar, com as indicações em segundo lugar servindo para quebrar um eventual empate. A maioria coloca a Ana na frente da Céu e também há mais eleitores que colocam a Bia na frente da Céu do que ao contrário. Ainda assim, a Céu é eleita presidente. Como é possível?

    É possível porque a maioria escolheu a Céu em primeiro lugar de prioridade mas o restante escolheu a Céu em um grau de prioridade menor que Ana e Bia. Um exemplo desta configuração se encontra abaixo: 
    Eleitores votando em Céu em prioridade máxima 19
    Números de vezes que Ana está na frente da Céu 26
    Números de vezes que Bia está na frente da Céu 25
    [
      [ 'Céu', [ 19, 7, 22 ] ],
      [ 'Ana', [ 18, 20, 10 ] ],
      [ 'Bia', [ 11, 21, 16 ] ]
    ]
    [
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Céu' => { name: 'Céu', prior: 3 },
        'Bia' => { name: 'Bia', prior: 2 },
        'Ana' => { name: 'Ana', prior: 1 }
      },
      Map(3) {
        'Bia' => { name: 'Bia', prior: 3 },
        'Ana' => { name: 'Ana', prior: 2 },
        'Céu' => { name: 'Céu', prior: 1 }
      },
      Map(3) {
        'Ana' => { name: 'Ana', prior: 3 },
        'Céu' => { name: 'Céu', prior: 2 },
        'Bia' => { name: 'Bia', prior: 1 }
      }
    ]
    while (true) {
      const voters = new Array(48).fill(0).map((_) => new Map());
      let frontAna = 0;
      let frontBia = 0;
      let summary;
      for (let i = 0; i < voters.length; i++) {
        const candidates = ["Ana", "Bia", "Céu"];
        for (let j = 0; j < 3; j++) {
          const index = Math.trunc(Math.random() * candidates.length);
          voters[i].set(candidates[index], {
            name: candidates[index],
            prior: candidates.length,
          });
          candidates.splice(index, 1);
        }
        if (voters[i].get("Ana").prior < voters[i].get("Céu").prior) frontAna++;
        if (voters[i].get("Bia").prior < voters[i].get("Céu").prior) frontBia++;
      }
      summary = getSummary(voters);
      if (
        frontAna > voters.length / 2 &&
        frontBia > voters.length / 2 &&
        summary[0][0] === "Céu"
      ) {
        console.log(
          "É possível porque a maioria escolheu a Céu em primeiro lugar de prioridade mas o restante escolheu a Céu em um grau de prioridade menor que Ana e Bia. Um exemplo desta configuração se encontra abaixo: ",
        );
        console.log(
          "Eleitores votando em Céu em prioridade máxima",
          summary[0][1][0],
        );
        console.log("Números de vezes que Ana está na frente da Céu", frontAna);
        console.log("Números de vezes que Bia está na frente da Céu", frontBia);
        console.log(summary);
        console.log(voters);
        break;
      }
    }
    
    function getSummary(voters) {
      const candidates = new Map([
        ["Ana", [0, 0, 0]],
        ["Bia", [0, 0, 0]],
        ["Céu", [0, 0, 0]],
      ]);
      for (let i = 0; i < voters.length; i++)
        for ([key, value] of voters[i]) candidates.get(key)[value.prior - 1]++;
      return [...candidates.entries()].sort((a, b) =>
        b[1][0] === a[1][0] ? b[1][1] - a[1][1] : b[1][0] - a[1][0],
      );
    }
  4. Crise dramática na clínica: os frascos com as coletas de sangue de João e Maria foram misturados e enviados para análise sem identificação! São seis frascos, com capacidades de 7, 11, 15, 21, 25 e 28 centilitros. Um deles estava vazio (qual?), os demais completamente cheios. Sabemos que o volume de sangue recolhido do João é exatamente o dobro do volume de sangue coletado da Maria. A equipe do laboratório apela aos leitores desta coluna, com sua bem conhecida proficiência em matemática, para que ajudem a decifrar quais frascos são de sangue do João e quais da Maria!

    frascos do João [ 15, 21, 28, [length]: 3 ], total de sangue 64
    frascos da Maria [ 25, 7, [length]: 2 ], total de sangue 32
    o frasco vazio é o de 11 centilitros
    const bottles = [7, 11, 15, 21, 25, 28];
    while (true) {
      const joaoBottles = [];
      const mariaBottles = [];
      const auxBottles = [...bottles];
      const index = Math.trunc(Math.random() * auxBottles.length);
      const empty = auxBottles.splice(index, 1);
      const qMaria = Math.trunc(Math.random() * (auxBottles.length - 2)) + 1;
      let joaoBlood;
      let mariaBlood;
    
      while (qMaria !== mariaBottles.length) {
        const index = Math.trunc(Math.random() * auxBottles.length);
        const selected = auxBottles.splice(index, 1);
        mariaBottles.push(selected[0]);
      }
      joaoBottles.push(...auxBottles);
      joaoBlood = joaoBottles.reduce((a, b) => a + b);
      mariaBlood = mariaBottles.reduce((a, b) => a + b);
    
      if (joaoBlood === 2 * mariaBlood) {
        console.log(
          "frascos do João %o, total de sangue %d",
          joaoBottles,
          joaoBlood,
        );
        console.log(
          "frascos da Maria %o, total de sangue %d",
          mariaBottles,
          mariaBlood,
        );
        console.log("o frasco vazio é o de %d centilitros", empty[0]);
        break;
      }
    }
  5. Lara, aventureira contumaz e nossa leitora assídua, está em apuros na selva equatorial: foi picada por mosquitos venenosos e morrerá se não tomar rapidamente um comprimido do antídoto. Felizmente, ela viaja prevenida: tem um comprimido no acampamento 1 e dois no acampamento 2. Infelizmente, a farmácia misturou o antídoto com placebo, que é indistinguível mas não faz nada: cada comprimido que ela trouxe tem chance de 50% de ser inócuo! Aliás, o farmacêutico avisou que pelo menos um dos dois comprimidos que estão no acampamento 2 é de placebo. Nos poucos minutos que lhe restam de vida, Lara só consegue alcançar um dos acampamentos! O que ela deve fazer: correr para o acampamento 1 e tomar o comprimido que está lá, ou para o acampamento 2 e engolir os outros dois comprimidos? Ou será que dá no mesmo?

    É preferível Lara correr para o acampamento 2 já que possui uma maior probabilidade de sobrevivência (~= 0.67) do que se correr para o acampamento 1 (~= 0.50)
    const runs = 1000000;
    const getValue = () => Math.trunc(Math.random() * 2);
    let survive1 = 0;
    let survive2 = 0;
    let experiments = 0;
    for (let i = 0; i < runs; i++) {
      const camping1 = [getValue()];
      const camping2 = [getValue(), getValue()];
      if (camping2[0] && camping2[1]) continue;
      experiments++;
      if (camping1[0]) survive1++;
      if (camping2[0] || camping2[1]) survive2++;
    }
    console.log(
      "É preferível Lara correr para o acampamento 2 já que possui uma maior probabilidade de sobrevivência (~= %s) do que se correr para o acampamento 1 (~= %s)",
      (survive2 / experiments).toFixed(2),
      (survive1 / experiments).toFixed(2),
    );
  6. Um amigo me apontou que 2025 é um quadrado perfeito (2025=45²), o que não acontecia há muito tempo (quando foi a última vez?).

    A última vez foi em 1936
    console.log("A última vez foi em %d", 44 ** 2);