今天在微信羣裏面看到一張招聘圖片,以下面試
被玷污的殘缺的婀娜多汁姿的二維碼,蘊藏着通往神祕國度大門的鑰匙。利用微信自帶截圖工具,憑藉着我手繪天賦,很快就還原了二維碼。xcode
而後查看圖片,長按。竟然是能夠識別的二維碼,掃一掃,獲得下面的摩斯密碼微信
.--..-......
因而,百度摩斯密碼對照表。函數
因爲咱們獲得摩斯密碼沒有空格隔開,因此解密後有可能不止一種。這個時候,身爲攻城蝨固然想到是用程序解決了。工具
既然,圖片中說到是4個字的單詞,等於這段密碼能夠分爲4段。spa
[part1][part2][part3][part4]
若是4段密碼分別都能匹配上,那麼連起來整個密碼也能匹配上(廢話)。最早想到是用4層循環窮舉法code
for(){ for(){ for(){ for(){ } } } }
但是如何把這段密碼分紅四段呢?很簡單,若是電碼符號與密碼前幾個字符能徹底匹配,這裏就分一段,而後繼續匹配下一段。blog
for(){ // 匹配成功 if([part1][part2][part3][part4].indexOf(xcode[i]) === 0 ){ for(){ if([part2][part3][part4].indexOf(xcode[j]) === 0 ){ } } } }
第四段,也就是最後一段匹配不能再用[indexOf],而是用[===]。遞歸
核心匹配代碼圖片
for(i = 0; i < morseCodeNum; i ++){ if(mission1.indexOf(morseCodeMap[i]) === 0 ){ firstMatchPart = morseCodeMap[i]; mission2 = secretCode.slice(firstMatchPart.length); for(j = 0; j < morseCodeNum; j ++){ if(mission2.indexOf(morseCodeMap[j]) === 0 ){ secondMatchPart = morseCodeMap[j]; mission3 = secretCode.slice(firstMatchPart.length+secondMatchPart.length); for(k = 0; k < morseCodeNum; k ++){ if(mission3.indexOf(morseCodeMap[k]) === 0 ){ thirdMatchPart = morseCodeMap[k]; mission4 = secretCode.slice(firstMatchPart.length+secondMatchPart.length+thirdMatchPart.length); for(n = 0; n < morseCodeNum; n ++){ if(mission4 === morseCodeMap[n]){ fourthMatchPart = morseCodeMap[n]; console.log([firstMatchPart, secondMatchPart, thirdMatchPart, fourthMatchPart].join('')); result.push([letters[i], letters[j], letters[k], letters[n]].join('')); } } } } } } } }
注: mission1
表示處於匹配第一段密碼,以此類推。
完整的代碼
var morseCodeMap = [ '.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..' ], secretCode = '.--..-......', morseCodeNum = morseCodeMap.length, letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var result = [], firstMatchPart, secondMatchPart, thirdMatchPart, fourthMatchPart, mission1, mission2, mission3, mission4; function deCodeMorse(){ var i, j, k, n; mission1 = secretCode; for(i = 0; i < morseCodeNum; i ++){ if(mission1.indexOf(morseCodeMap[i]) === 0 ){ firstMatchPart = morseCodeMap[i]; mission2 = secretCode.slice(firstMatchPart.length); for(j = 0; j < morseCodeNum; j ++){ if(mission2.indexOf(morseCodeMap[j]) === 0 ){ secondMatchPart = morseCodeMap[j]; mission3 = secretCode.slice(firstMatchPart.length+secondMatchPart.length); for(k = 0; k < morseCodeNum; k ++){ if(mission3.indexOf(morseCodeMap[k]) === 0 ){ thirdMatchPart = morseCodeMap[k]; mission4 = secretCode.slice(firstMatchPart.length+secondMatchPart.length+thirdMatchPart.length); for(n = 0; n < morseCodeNum; n ++){ if(mission4 === morseCodeMap[n]){ fourthMatchPart = morseCodeMap[n]; console.log([firstMatchPart, secondMatchPart, thirdMatchPart, fourthMatchPart].join('')); result.push([letters[i], letters[j], letters[k], letters[n]].join('')); } } } } } } } } } deCodeMorse(); console.log(result);
獲得結果以下,根據圖片中的提示,該單詞與面試有關,那麼應該是pass
無疑。
上面的代碼咱們用了4層for嵌套循環,確實有點多,可是隻有if條件成立,纔會進入深層的循環。由於要求全部解,是避免不了的.
假如,咱們獲得的密碼可能不是4段,不肯定是幾段,這個時候就不能用嵌套for循環了,能夠用遞歸。
核心代碼邏輯
function deCodeMorse(mission[j]){ for (var i = 0; i < morseCodeNum; i++) { if( morseCode.indexOf(morseCodeMap[i]) === 0 ){ if( morseCode === morseCodeMap[i]){ // 輸出匹配結果 }else{ deCodeMorse(mission[j+1]); } } } }
使用遞歸的完整代碼
var morseCodeMap = [ '.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.', '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..' ], secretCode = '.--..-......', morseCodeNum = morseCodeMap.length, letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', result = [], function deCodeMorse(morseCode, deCodeResult, stack){ stack = stack || []; for (var i = 0; i < morseCodeNum; i++) { if( morseCode.indexOf(morseCodeMap[i]) === 0 ){ if( morseCode === morseCodeMap[i]){ deCodeResult.push(stack.concat(letters[i]).join('')); }else{ deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, stack.concat(letters[i])); } } } } deCodeMorse(secretCode, result); console.log(result);
咱們還能夠傳一個數字參數給函數deCodeMorse,表示密碼由幾段組成,不傳則沒有限制。那麼deCodeMorse
函數能夠這樣寫
function deCodeMorse(morseCode, deCodeResult, limit, stack){ stack = stack || []; for (var i = 0; i < morseCodeNum; i++) { if( morseCode.indexOf(morseCodeMap[i]) === 0 ){ if( morseCode === morseCodeMap[i]){ if(limit){ stack.length +1 === limit && deCodeResult.push(stack.concat(letters[i]).join('')); }else{ deCodeResult.push(stack.concat(letters[i]).join('')); } }else{ if(limit){ if(stack.length < limit){ deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, limit, stack.concat(letters[i])); } }else{ deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, limit, stack.concat(letters[i])); } } } } } deCodeMorse(secretCode, result, 4);