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.
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.