SANAKA
Mors e seus companheiros procuram relíquias e moedas em um sótão, em uma ilustração mangá.
← Voltar ao catálogo da Matrix

Matrix on-line · Laboratório 03

Os óbolos de Mors

Ajude Mors a encontrar uma moeda, organizar a caixa e descobrir quais nomes se repetem. Uma ação de cada vez.

Experimentar

Investigue a caixa com Mors

Esta caixa é uma simulação. Seus cliques não fazem ofertas reais.

Etapa 1 de 4

Encontrar uma moeda

Cada moeda tem uma posição. Clique em uma delas ou digite o número e consulte. Veja por que a primeira posição é 0.

Inventário sobre a bancada

A consulta mostra a moeda dessa posição. Um número fora da caixa não encontra nenhuma moeda.

O que aconteceu?

A caixa está pronta. Escolha uma ação desta etapa para observar o que acontece.

Ver explicação técnica e código desta passagem

O inventário é um Array: uma sequência que aceita nomes repetidos e usa índices desde 0.

TypeScriptobolo-inventory.ts
Consultar uma posição
export function readObolo(items: readonly string[], index: number): string | undefined {
  // Number.isInteger rejeita 1.5, NaN e Infinity. A conjunção && exige ambas as condições.
  if (!Number.isInteger(index) || index < 0 || index >= items.length) {
    return undefined;
  }
  // O operador [] consulta a posição, não procura um identificador por todo o array.
  return items[index];
}
Inspecionar os registros antes e depois

Estes registros mostram a simulação em cada momento. Rever uma passagem muda o estado observado; agir a partir dela substitui o caminho que vinha depois.

Estado anterior

{
  "items": [
    "samvit",
    "mors",
    "akasha",
    "mors",
    "nandini",
    "samvit"
  ],
  "activeIndex": null,
  "comparedIndex": null,
  "duplicates": [],
  "comparisons": 0,
  "lookups": 0,
  "seen": []
}

Estado observado

{
  "items": [
    "samvit",
    "mors",
    "akasha",
    "mors",
    "nandini",
    "samvit"
  ],
  "activeIndex": null,
  "comparedIndex": null,
  "duplicates": [],
  "comparisons": 0,
  "lookups": 0,
  "seen": []
}
Trocar o conteúdo da caixa (opcional)

Cada opção substitui a caixa inteira: vazia, só com mors, sem nomes repetidos ou com o conteúdo inicial.

Consulte uma posição para ver o que ela guarda.

Código em movimento

Se quiser ir além

Trecho 1 de 6
Consultar as funções e os arquivos

Funções completas deste laboratório, extraídas dos arquivos reais. A explicação da ação atual está junto do experimento.

TypeScriptobolo-inventory.ts
Consultar uma posição
export function readObolo(items: readonly string[], index: number): string | undefined {
  // Number.isInteger rejeita 1.5, NaN e Infinity. A conjunção && exige ambas as condições.
  if (!Number.isInteger(index) || index < 0 || index >= items.length) {
    return undefined;
  }
  // O operador [] consulta a posição, não procura um identificador por todo o array.
  return items[index];
}
Consultar uma posição

Uma guarda trata índices inválidos antes da leitura. Índice zero continua válido; undefined é um resultado que o chamador precisa tratar.

Onde estudar estes arquivos
Rever os conceitos
Array, Set e Map não são a mesma caixa

Em palavras simples

Uma prateleira numerada pode guardar duas moedas iguais. Uma lista de nomes únicos não repete nomes. Um cadastro associa um nome à quantidade de moedas.

O conceito técnico

Array é uma sequência indexada que admite repetição. Set armazena valores distintos. Map associa chaves únicas a valores. Aqui a igualdade compara strings de identificadores; objetos diferentes não se tornam iguais só porque têm propriedades iguais.

Procurar uma repetição é escolher uma estratégia

Em palavras simples

Você pode comparar cada moeda com todas as seguintes ou perguntar a uma lista de controle: este nome já passou por aqui? As respostas coincidem, mas o caminho muda.

O conceito técnico

Os loops comparam todos os pares distintos. A estratégia com Set faz uma consulta de existência para cada elemento. Ambas devolvem a lista de identificadores duplicados, não as moedas únicas nem a soma das repetições.

Big-O descreve crescimento, não um cronômetro

Em palavras simples

Quanto maior a caixa, mais trabalho. Conferir cada moeda uma vez cresce com a caixa; conferir todos os pares cresce muito mais rápido.

O conceito técnico

Percorrer n posições é O(n). Comparar todos os pares faz n(n−1)/2 comparações, O(n²). Em estruturas baseadas em hash, Set/Map costumam ter acesso médio esperado O(1); ECMAScript exige acesso sublinear médio, não tempo constante garantido. O padrão não obriga uma implementação por hash.

Testar exemplos

Confira o que aprendeu

Abrir exemplos de verificação

Este botão roda exemplos prontos e compara os resultados. Ele não altera sua experiência.

Explorar

Continue explorando

O que acontece se não houver moedas?

Use Caixa vazia. Os percursos têm somente o estado inicial, as contagens são zero e a consulta devolve undefined. A coleção vazia é um valor válido.

E se todas as moedas tiverem o mesmo nome?

Use Todos iguais. O resultado contém apenas mors, mas o Map registra quatro ocorrências. O loop continua examinando todos os pares; o Set continua fazendo uma consulta por elemento.

E se eu consultar −1, 1.5 ou uma posição distante?

Digite um desses índices. readObolo não acessa uma posição inválida e devolve undefined. Para remover, a mesma validação mantém o array anterior e a página explica o erro.

Qual arquivo mudar se “Mors” e “mors” precisarem significar a mesma coisa?

Defina a normalização na entrada, em addObolo de obolo-inventory.ts, e normalize os cenários iniciais pela mesma regra. Adicione um teste antes de mudar a comparação; hoje os identificadores são sensíveis a maiúsculas.