bastidoresalgoritmo

Como funciona o algoritmo do Termo (e por que hoje a palavra é o que é)

Nada no Termo é aleatório. A palavra do dia é escolhida por um cálculo de modulo simples a partir de uma data-base em 2 de janeiro de 2022. Mostramos exatamente como.

Equipe Termojogo 6 min de leitura

Toda vez que você abre o Termo, a palavra já está escolhida. Não há sorteio, não há servidor decidindo na hora, não há variação por jogador. A palavra do dia é determinada por um cálculo matemático simples executado dentro do próprio navegador — e, se você souber a fórmula, consegue saber a palavra de qualquer dia passado ou futuro sem jogar nenhuma partida.

Neste artigo explicamos exatamente como esse cálculo funciona: a data de lançamento que serve de âncora, o papel do operador de módulo, e por que o Dueto "atrasou" 51 dias.

A arquitetura: estático, sem servidor

O Termo é um site estático. O código completo — incluindo o vetor de respostas — é carregado junto com a página e roda inteiramente no navegador. Isso tem uma consequência direta: o servidor não pode "enviar" a palavra do dia. Quem escolhe a palavra é o JavaScript do lado do cliente.

O mecanismo precisa, portanto, cumprir dois requisitos ao mesmo tempo: ser determinístico (a mesma data produz sempre a mesma palavra) e ser diferente a cada dia (datas distintas produzem palavras distintas, pelo menos enquanto o vetor de respostas não se esgota). A solução é clássica em design de jogos de puzzle diários: usar a diferença de dias entre hoje e uma data-base fixa como índice no vetor de respostas.

A data-base: 2 de janeiro de 2022

O Termo foi lançado em 2 de janeiro de 2022. Essa data é a âncora de tudo. Em código, ela é definida como um timestamp Unix fixo:

epoch = new Date("2022-01-02T03:00:00-03:00").getTime()

Usar o fuso horário de Brasília (-03:00) garante que a virada do dia ocorra à meia-noite no horário local — não às 21h do dia anterior, nem às 3h da manhã. É um detalhe de implementação que importa: sem fixar o fuso, jogadores em fusos diferentes veriam a palavra do dia mudar em horários diferentes, quebrando a promessa de "todos jogam a mesma palavra hoje".

O cálculo do índice diário

Com a âncora definida, o cálculo do índice — chamado dayId no código — é uma divisão inteira:

dayId = Math.floor((Date.now() − epoch) / 86 400 000)

O denominador é o número de milissegundos em um dia (24 × 60 × 60 × 1.000 = 86.400.000). O resultado é quantos dias completos se passaram desde o lançamento. No dia de lançamento, dayId = 0. No segundo dia, dayId = 1. E assim por diante — um contador que cresce um ponto por dia, sem exceção.

O operador de módulo e a palavra do dia

O vetor de respostas tem um tamanho finito. Para que o índice nunca estoure o vetor, o código usa o operador de módulo (%):

palavra = answers[dayId % answers.length]

O módulo garante que o índice sempre caia dentro dos limites do vetor. Quando dayId for igual a answers.length, o cálculo volta a zero e o ciclo recomeça do início. Na prática, com mais de 1.500 palavras no vetor e o jogo com pouco mais de três anos de existência, isso ainda não aconteceu — mas o mecanismo já está lá para quando ocorrer.

Consequência direta: como o vetor está no código e a fórmula é pública, é possível calcular a palavra de qualquer dia futuro com uma linha de JavaScript no console do navegador. Esse é o motivo pelo qual existem sites de "spoiler do Termo" — eles não estão "hackeando" nada, apenas executando o mesmo cálculo que o jogo faz.

Por que o Dueto "atrasou" 51 dias

O Dueto foi lançado em 22 de fevereiro de 2022 — exatamente 51 dias depois do Termo. Para manter a sincronia com o calendário a partir da data de estreia, o Dueto usa sua própria data-base no mesmo formato:

epoch_dueto = new Date("2022-02-22T03:00:00-03:00").getTime()

O dayId do Dueto é calculado com a mesma fórmula, mas ancorado nessa nova data. Então, na prática, o "dia 0" do Dueto corresponde ao "dia 51" do Termo. Se você abrir o código, verá que o Dueto não usa o mesmo dayId do Termo — ele tem o seu próprio contador, que nasceu 51 dias depois.

O Quarteto seguiu o mesmo modelo: lançado na mesma data do Dueto (22 de fevereiro de 2022), usa o mesmo epoch e o mesmo dayId, mas pega quatro palavras consecutivas por dia em vez de duas.

Como o Dueto e o Quarteto pegam múltiplas palavras

O Termo clássico pega exatamente uma palavra por dia:

answers[dayId % answers.length]

O Dueto e o Quarteto pegam mais de uma. A implementação usa um vetor separado de índices codificados que aponta de volta para o mesmo vetor de respostas principal. Para o Dueto, dois índices por linha; para o Quarteto, quatro. O dayId seleciona qual linha do vetor de índices usar, e cada elemento da linha aponta para uma palavra diferente no vetor principal.

O resultado é que todos os três modos compartilham o mesmo pool de palavras — mas acessam entradas diferentes a cada dia. É por isso que, em qualquer análise estatística que fizermos do arquivo, as distribuições de letras dos três modos são praticamente idênticas: todos estão amostrando do mesmo dicionário de cinco letras do português brasileiro, só com ritmos de consumo diferentes.

A tabela: datas de lançamento e parâmetros

Modo Data de lançamento Epoch (fuso Brasília) Palavras por dia Tentativas
Termo 02/01/2022 2022-01-02T03:00:00-03:00 1 6
Dueto 22/02/2022 2022-02-22T03:00:00-03:00 2 7
Quarteto 22/02/2022 2022-02-22T03:00:00-03:00 4 9

O que "determinístico" significa para o jogador

Para quem joga, a consequência mais importante é simples: não existe sorte no Termo. A palavra de hoje não foi escolhida porque "é uma palavra fácil" nem porque "alguém quis dificultar". Ela está na posição que está porque essa é a posição que o contador atingiu hoje. Nenhum curador humano decide a palavra diária — o algoritmo decide.

Isso também explica por que todos os jogadores ao redor do Brasil têm a mesma palavra ao mesmo tempo. A sincronia não é coordenada por nenhum servidor central: é uma consequência de todos os navegadores executarem o mesmo código com a mesma data de entrada.

Implicações para o arquivo histórico

O fato de o algoritmo ser determinístico e público permitiu que construíssemos o nosso arquivo completo de respostas — sem precisar "capturar" a palavra do dia manualmente. Sabendo a data-base e o vetor de respostas, dá para reconstruir toda a sequência histórica do primeiro ao último dia de jogo publicado. É exatamente esse arquivo que usamos nas análises de frequência de letras, ranking de aberturas e comparação de dificuldade entre os modos.

Uma nota de implementação: por que não usar a data diretamente?

Uma pergunta razoável: por que não simplesmente usar a data como chave de um mapa { "2022-01-02": "TERMO", ... }? Funcionaria igualmente para um número fixo de dias, mas tem dois problemas. Primeiro, o arquivo de mapeamento cresceria a cada dia e precisaria ser atualizado manualmente. Segundo, revelar explicitamente qual palavra corresponde a qual data no código seria uma engenharia inversa trivial — e esticaria o incentivo de spoiler. O vetor de índices codificados é uma camada leve de ofuscação que não impede a análise técnica, mas reduz a tentação do spoiler passivo para quem lê o código por cima sem querer ir fundo.

Curioso sobre o que esses dados revelam na prática? Publicamos a análise de frequência de letras usando o arquivo completo e o ranking das 20 melhores aberturas testadas contra todas as respostas históricas.