Bir giriş dizesinin "homoglyph equivalents" çıktısını veren verimli bir işlevi nasıl yazabiliriz?Tüm "karakter-eşit" dizeleri bulmak için etkili algoritma?
Örnek 1 (sözde kodu):
homoglyphs_list = [
["o", "0"], // "o" and "0" are homoglyphs
["i", "l", "1"] // "i" and "l" and "1" are homoglyphs
]
input_string = "someinput"
output = [
"someinput", "s0meinput", "somelnput",
"s0melnput", "some1nput", "s0me1nput"
]
Örnek 2:
homoglyphs_list = [
["rn", "m", "nn"],
]
input_string = "rnn"
output = ["rnn", "rm", "mn", "rrn", "nnn", "nm", "nrn"]
Örnek 3:
homoglyphs_list = [
["d", "ci", "a"], // "o" and "0" are homoglyphs
["i", "l", "1"] // "i" and "l" and "1" are homoglyphs
]
/*
notice that with the two rules above,
we can infer "d" = "ci" = "a" = "cl" = "c1"
*/
input_string = "pacerier"
output = [
"pacerier", "pacerler", "pacer1er", "pcicerier",
"pcicerler", "pcicer1er", "pclcerier", "pc1cerier",
"pclcerler", "pc1cerler", "pclcer1er", "pc1cer1er",
"pdcerier", "pdcerler", "pdcer1er"
]
Not: Çıkış dizisindeki üyelerin sıralaması önemli değildir ve verilen homofly eşlemlerin uygun olduğu varsayılabilir (girişler bize bir "sonsuz döngü" vermez).
Güncel algoritmam işe yarıyor, ancak ham bruteforcing kullanıyor ve performansı çok kötü. Örneğin. homoglyphs ["rn", "m", "nn"]
ile "mmmmm"
bir giriş çalıştırmak için 38 saniye sürer:
// This is php code (non-pseudo just so we could test the running time),
// but the question remains language-agnostic
public function Func($in, Array $mappings){
$out_table = array();
$out_table[$in] = null;
while(true){
$number_of_entries_so_far = count($out_table);
foreach(array_keys($out_table) as $key){
foreach($mappings as $mapping){
foreach($mapping as $value){
for($a=0, $aa=strlen($key); $a<$aa; ++$a){
$pos = strpos($key, $value, $a);
if($pos === false){
continue;
}
foreach($mapping as $equal_value){
if($value === $equal_value){
continue;
}
$out_table[substr($key, 0, $pos) . $equal_value . substr($key, $pos + strlen($value))] = null;
}
}
}
}
}
if($number_of_entries_so_far === count($out_table)){
// it means we have tried bruteforcing but added no additional entries,
// so we can quit now
break;
}
}
return array_keys($out_table);
}
biz verimli (hızlı) homoglyph genişletme algoritmasını uygulamak nasıl
?
Ve eğer '$ homoglyph_mappings [0] = dizi ("n", "nn", "nnn"); gibi yazıyorsam ne yapar? – Rajan
@Rajan, Belirtildiği gibi, girdilerin uygun olduğunu varsayabiliriz (yani yanlış girdilere göre, tanımlanmamış davranışlara sahibiz). Örneğiniz, yanlış bir döngü olduğu için yanlış bir girdi olgusudur. Eğer n = nn ', sonra' nn = nnnn', sonra 'nnnn = nnnnnnnn', sonra' nnnnnnnn = nnnnnnnnnnnnnnnn', vb, *, sonsuz * ... – Pacerier
Tamam bir _exceptional case_. – Rajan