摘要:由于我們得到摩斯密碼沒(méi)有空格隔開(kāi),所以解密后有可能不止一種。完整的代碼得到結(jié)果如下,根據(jù)圖片中的提示,該單詞與面試有關(guān),那么應(yīng)該是無(wú)疑。上面的代碼我們用了層嵌套循環(huán),確實(shí)有點(diǎn)多,但是只有條件成立,才會(huì)進(jìn)入深層的循環(huán)。
殘缺的地圖
今天在微信群里面看到一張招聘圖片,如下
尋找鑰匙被玷污的殘缺的婀娜多汁姿的二維碼,蘊(yùn)藏著通往神秘國(guó)度大門的鑰匙。利用微信自帶截圖工具,憑借著我手繪天賦,很快就還原了二維碼。
然后查看圖片,長(zhǎng)按。居然是可以識(shí)別的二維碼,掃一掃,得到下面的摩斯密碼
.--..-......找到答案
于是,百度摩斯密碼對(duì)照表。
由于我們得到摩斯密碼沒(méi)有空格隔開(kāi),所以解密后有可能不止一種。這個(gè)時(shí)候,身為攻城虱當(dāng)然想到是用程序解決了。
既然,圖片中說(shuō)到是4個(gè)字的單詞,等于這段密碼可以分為4段。
[part1][part2][part3][part4]
如果4段密碼分別都能匹配上,那么連起來(lái)整個(gè)密碼也能匹配上(廢話)。最先想到是用4層循環(huán)窮舉法
for(){ for(){ for(){ for(){ } } } }
可是如何把這段密碼分成四段呢?很簡(jiǎn)單,如果電碼符號(hào)與密碼前幾個(gè)字符能完全匹配,這里就分一段,然后繼續(xù)匹配下一段。
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);
得到結(jié)果如下,根據(jù)圖片中的提示,該單詞與面試有關(guān),那么應(yīng)該是pass無(wú)疑。
上面的代碼我們用了4層for嵌套循環(huán),確實(shí)有點(diǎn)多,但是只有if條件成立,才會(huì)進(jìn)入深層的循環(huán)。因?yàn)橐笏薪?,是避免不了?
延伸假如,我們得到的密碼可能不是4段,不確定是幾段,這個(gè)時(shí)候就不能用嵌套for循環(huán)了,可以用遞歸。
核心代碼邏輯
function deCodeMorse(mission[j]){ for (var i = 0; i < morseCodeNum; i++) { if( morseCode.indexOf(morseCodeMap[i]) === 0 ){ if( morseCode === morseCodeMap[i]){ // 輸出匹配結(jié)果 }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);
我們還可以傳一個(gè)數(shù)字參數(shù)給函數(shù)deCodeMorse,表示密碼由幾段組成,不傳則沒(méi)有限制。那么deCodeMorse函數(shù)可以這樣寫
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);
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98005.html
摘要:如何考察一個(gè)人是不是經(jīng)驗(yàn)豐富我們需要在問(wèn)答式的面試中,對(duì)其項(xiàng)目經(jīng)驗(yàn)進(jìn)行挖掘。如何設(shè)置筆試題現(xiàn)在網(wǎng)上有大量的面經(jīng)的存在,對(duì)于我們面試是一個(gè)巨大的挑戰(zhàn)。尊重應(yīng)聘者我們要尊重每一個(gè)來(lái)應(yīng)聘的人,不要輕視別人,或者故意刁難別人。 時(shí)光荏苒,2個(gè)月前,我才剛總結(jié)了如何應(yīng)對(duì)面試官,現(xiàn)在的我開(kāi)始總結(jié)如何面試別人了。笑哭.png 1.我們需要什么樣的人 招聘肯定要有標(biāo)準(zhǔn),這樣我們才能更快的找到我們需要的...
摘要:在歷時(shí)半個(gè)月,面試失敗了次以后,我拿到了滿意的,薪資同比增長(zhǎng)不止。一定要明確目標(biāo)公司的類型,目的為導(dǎo)向。合適的著裝,對(duì)面試官保持尊敬。所在的公司真的是面過(guò)的公司中規(guī)模待遇最好的。不要因?yàn)楸痪芙^而懷疑自己,最好的在后面。在歷時(shí)半個(gè)月,面試失敗了9次以后,我拿到了滿意的Offer,薪資同比增長(zhǎng)50%不止。 來(lái)北京已經(jīng)一年多了,因?yàn)樵诶蠔|家沒(méi)有太重的開(kāi)發(fā)壓力,讓我有更多的時(shí)間去學(xué)習(xí)Android的...
閱讀 783·2021-11-23 09:51
閱讀 848·2021-11-23 09:51
閱讀 2517·2021-11-15 18:01
閱讀 3876·2021-10-11 11:07
閱讀 2415·2021-09-22 15:30
閱讀 1085·2021-09-22 14:59
閱讀 1567·2019-08-30 15:55
閱讀 1763·2019-08-30 15:52