Pergunta
Eu tenho uma matriz alfabética de 24 caracteres:"A B C D E F G H I J K L M N O P Q R S T U V W X"
Quero coletar todos os casos com:3 personagens únicos.
Primeiro caso:ABC, DEF, GHI, JKL, MNO, PQR, STU, VWX
Solução
Há uma relação de 1:1 entre as permutações das letras do alfabeto e suas listas de conjuntos.Basicamente, uma vez que você tenha uma permutação do alfabeto, basta ligar array_chunk
para obter os conjuntos.
Agora, 24!de qualquer coisa (isto é 620448401733239439360000) nunca caberá na memória (seja RAM ou disco), então o melhor que você pode fazer é gerar um número n
entre 1
e 24!
(o número de permutação) e então gerar tal permutação.Para esta última etapa, veja por exemplo Geração de permutações seguindo Lehmer e Howell e os artigos ali citados.
Outras dicas
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c = strlen($alphabet);
$result = array();
for ($i = 0; $i < $c; ++$i) {
$current0 = $i;
for ($j = 0; $j < $c; ++$j) {
if ($current0 == $j) continue;
$current1 = $j;
for ($k = 0; $k < $c; ++$k) {
if (isset($current0 == $k || $current1 == $k)) continue;
$result[] = $alphabet[$i].$alphabet[$j].$alphabet[$k];
}
}
}
Espero ter entendido sua pergunta corretamente.Este itera sobre o alfabeto em três loops e sempre pula os caracteres que já estão em uso.Então eu empurro o resultado para $resultado.
Mas é melhor tentar o script com apenas cinco letras;) Usar alls strlen($alphabet) (não quero contar agora...) precisará de muita memória.
(Tenho certeza de que existe alguma versão hacky que é mais rápida que isso, mas acho que é mais simples.)
Isso está um pouco atrasado, mas para qualquer outra pessoa que esteja lendo isso:Se você deseja dividir uma string em pedaços de 3 caracteres, experimente o PHP integrado str_split() função.Leva em um $string
e $split_length
argumento.Por exemplo:
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped = str_split($alphabet, 3);
var_export( $grouped );
Isso gera a seguinte matriz:
array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI',
3 => 'JKL', 4 => 'MNO', 5 => 'PQR',
6 => 'STU', 7 => 'VWX', )
Isso funciona para o exemplo dado na pergunta.Se você quiser ter todas as combinações possíveis dessas 24 letras, a resposta do Artefacto faz mais sentido.