2012-01-08 62 views
0

我正在創建一個腳本來創建用戶名。它應該是四個字母長;傳統上我們使用姓氏的3個字母+ 1的名字。
如果它已經被使用,我們手動設想一個替代方案。替換文本中的字母(僞代碼)

所以如果我的名字是Fred Flinstones,我們應該試試FLIF。如果這不起作用;我們通過名稱循環:FLIA,FLIB,FLIC ... FLIZ,FLAA,FLAB,FLAC,... FLZZ,FAAA,FAAB,...

最簡單的方法是循環顯示最後一個字母;然後通過第二個最後一個字母再循環一組循環,並循環最後一個字母;然後通過倒數第三,倒數第二倒數的循環集;和第四+第三+第二+最後。 這使得大量的循環嵌套eachother +其他人無法讀取+很多打字。
我可以使用一個計數器每個字母,但這也看起來並不高雅 我可以嘗試一個計數器,然後使用mod 26看看有多少字母需要更換(但似乎很複雜)。

有沒有一些優雅/有效的方法來做到這一點? (f.e.保留Fred的最後一個字母爲F或跳過字母FLIF; FLNF,FLSF,FLTF,...),以保證字符串儘可能「符合邏輯地正確」。

回答

1

不知道這是不是你的意思,但是如果你用下面的方式構建你的用戶名腳本(我用PHP作爲語言),你可以通過添加更高模糊因子的選項來擴展它,同時保持代碼的可讀性:

echo findName('FLINTSTONE', 'FRED'); 

function findName($last, $first) { 
    for ($fuzzFactor = 0; ; $fuzzFactor++) { 
     $candidates = fuzzNames($last, $first, $fuzzFactor); 

     if (empty($candidates)) { 
      // exhausted 
      return "sorry, I'm out of options!"; 
     } 

     foreach ($candidates as $candidate) { 
      if (isUnique($candidate)) { 
       return $candidate; 
      } 
     } 
    } 
} 

function fuzzNames($last, $first, $fuzzFactor) { 
    switch ($fuzzFactor) { 
     case 0: 
      // no fuzz, return first choice 
      return array(substr($last, 0, 3) . $first[0]); 
     case 1: 
      // replace the third letter of the last name 
      // by the fourth/fifth/.../last letter (FLNF, FLTF, ... , FLEF) 
      $candidates = array(); 
      for ($i = 3; $i < strlen($last); $i++) { 
       $candidates[] = substr($last, 0, 2) . $last[$i] . $first[0]; 
      } 
      return $candidates; 
     case 2: 
      // replace the second and third letter of the last name 
      // by their follow-ups (FINF, FITF, ... , FNEF) 
      $candidates = array(); 
      for ($i = 2; $i < strlen($last) - 1; $i++) { 
       for ($j = $i + 1; $j < strlen($last); $j++) { 
        $candidates[] = $last[0] . $last[$i] . $last[$j] . $first[0]; 
       } 
      } 
      return $candidates; 
     default: 
      return array(); 
    } 
}