摘要:由于我們得到摩斯密碼沒有空格隔開,所以解密后有可能不止一種。完整的代碼得到結果如下,根據圖片中的提示,該單詞與面試有關,那么應該是無疑。上面的代碼我們用了層嵌套循環,確實有點多,但是只有條件成立,才會進入深層的循環。
殘缺的地圖
今天在微信群里面看到一張招聘圖片,如下
尋找鑰匙被玷污的殘缺的婀娜多汁姿的二維碼,蘊藏著通往神秘國度大門的鑰匙。利用微信自帶截圖工具,憑借著我手繪天賦,很快就還原了二維碼。
然后查看圖片,長按。居然是可以識別的二維碼,掃一掃,得到下面的摩斯密碼
.--..-......找到答案
于是,百度摩斯密碼對照表。
由于我們得到摩斯密碼沒有空格隔開,所以解密后有可能不止一種。這個時候,身為攻城虱當然想到是用程序解決了。
既然,圖片中說到是4個字的單詞,等于這段密碼可以分為4段。
[part1][part2][part3][part4]
如果4段密碼分別都能匹配上,那么連起來整個密碼也能匹配上(廢話)。最先想到是用4層循環窮舉法
for(){ for(){ for(){ for(){ } } } }
可是如何把這段密碼分成四段呢?很簡單,如果電碼符號與密碼前幾個字符能完全匹配,這里就分一段,然后繼續匹配下一段。
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);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98005.html
摘要:如何考察一個人是不是經驗豐富我們需要在問答式的面試中,對其項目經驗進行挖掘。如何設置筆試題現在網上有大量的面經的存在,對于我們面試是一個巨大的挑戰。尊重應聘者我們要尊重每一個來應聘的人,不要輕視別人,或者故意刁難別人。 時光荏苒,2個月前,我才剛總結了如何應對面試官,現在的我開始總結如何面試別人了。笑哭.png 1.我們需要什么樣的人 招聘肯定要有標準,這樣我們才能更快的找到我們需要的...
摘要:在歷時半個月,面試失敗了次以后,我拿到了滿意的,薪資同比增長不止。一定要明確目標公司的類型,目的為導向。合適的著裝,對面試官保持尊敬。所在的公司真的是面過的公司中規模待遇最好的。不要因為被拒絕而懷疑自己,最好的在后面。在歷時半個月,面試失敗了9次以后,我拿到了滿意的Offer,薪資同比增長50%不止。 來北京已經一年多了,因為在老東家沒有太重的開發壓力,讓我有更多的時間去學習Android的...
閱讀 777·2021-11-23 09:51
閱讀 841·2021-11-23 09:51
閱讀 2511·2021-11-15 18:01
閱讀 3870·2021-10-11 11:07
閱讀 2406·2021-09-22 15:30
閱讀 1080·2021-09-22 14:59
閱讀 1562·2019-08-30 15:55
閱讀 1759·2019-08-30 15:52