Estou fazendo duas suposições aqui:
- Cada número da linha é exclusivo (ou seja, você não duplica um número na mesma linha)
- Os números estão dentro de um intervalo definido (por exemplo, 1 a MaxNum) e esse MaxNum é um tamanho razoável (por exemplo, < 96)
Para cada linha, você pode armazenar os números como valores verdadeiros em uma sequência de bits (por exemplo, para sua primeira linha (1,16,13,43), os bits 1, 16, 13 e 43 seriam definidos como "1" e os elementos restantes na cadeia de bits seriam definidos como "0" .Para cada linha, a cadeia de bits teria exatamente o mesmo comprimento (daí a suposição de um MaxNum conhecido) .Se a suposição (1) for falsificada, a solução que descrevo aqui não vai funcionar (pelo menos não sem alguma modificação importante).
Você pode então percorrer cada string para fazer uma comparação e armazenar essa comparação de alguma forma
For I = 1 to numString - 1
for J = I+1 to numString
' Do something
Next J
Next I
A parte 'do something
está usando operadores bit a bit (simplesmente and
e você deseja contar o número de true
para ver se obtém três ou mais). Se seus números fossem pequenos (ou seja, < 32), você poderia usar funções incorporadas, mas os números em seus exemplos são muito maiores. Isso abre duas opções - dividir a cadeia de bits geral em vários valores menores (por exemplo, 32 bits) e iterar sobre eles, ou criar sua própria função simples para um resultado and
(pois essa é a única função booleana que você precisa).
Na minha opinião, a maneira mais simples de obter resultados é criar uma coleção de strings de bits válidas (por exemplo, para cada linha você obteria um conjunto de strings (*) contendo três true/'1'
bits ou uma única string que é tudo '0'
), ordene estas cadeias de caracteres para que você possa agrupar como strings e depois contar o número de strings em cada grupo junto com um título decodificado para os três números em cada string.
(*) se você tiver (por exemplo) 4 números que correspondem em uma linha, há várias maneiras de obter três números desses quatro números. Isso significa que, para algumas linhas, você terá vários resultados.
A vantagem do método que descrevi acima é que agora ele é escalável. Você pode ter três colunas, quatro colunas, cinco colunas, etc. Você também pode alterar a regra de validade para selecionar três números correspondentes, quatro números correspondentes etc. facilmente.
Eu não forneci nenhum exemplo de codificação real aqui. Embora existam vários conceitos interessantes envolvidos (manipulação de strings se você realmente usar uma string para armazenar os 'bits', operações booleanas, ordenação e agrupamento), cada um deles é representado por tutoriais adequados na web. Além disso, tenho certeza de que esses conceitos foram abordados individualmente no Stack Exchange.