最近,Jetbrains沒事搞事,搞了一個解謎活動,成功解答出謎題的同窗能夠得到三個月Jetbrains全家桶的正版使用權。就算沒有這個獎勵,光是這個解謎過程就很是有意思,因此我就來給你們介紹一下。固然其實我也是看別人的文章介紹以後才發現有這個活動的,光憑我本身確定是解不出來的,因此在此給出原做者的博客連接,這是一位外國小哥。html
早在3月9日,Jetbrains推特上就發了一條神祕代碼,固然不是咱們開車的那個神祕代碼,它是一串不規律字符。git
若是你對反彙編之類的技術有所瞭解,或者你查看過某些軟件的原始代碼,又或者你注意力驚奇,發現這些代碼裏僅有數字以及A-F字母,應該就會明白這是十六進制的數字。固然其實早就有人發現了,並將答案寫在了這條推特下面。不過我以爲既然是解Jetbrains的謎,天然應該使用Jetbrains推出的語言Kotlin。下面就是將神祕代碼轉換成字符串的Kotlin代碼。程序員
fun clueOne(): String { val twitterCode = "48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f" return twitterCode.split(' ') .map { ch -> ch.toInt(16).toChar() } .joinToString(separator = "") } // 翻譯過來就是:Have you seen the source code of the JetBrains website?
翻譯過來剛好就是一段英文語句,你看過Jetbrains的網站源代碼嗎?web
瀏覽器打開Jetbrains官網,右鍵點擊查看網站源代碼。幸運的是,Jetbrains網站沒有使用什麼壓縮技術,網站源代碼格式化顯示,能夠很輕鬆的查看網站代碼。在400行左右,我還真找到了相關信息。編程
文字大意就是歡迎來解開這些謎題,這些謎題不只須要必定的思惟能力,並且須要利用各類Jetbrains產品完成解謎。可見這些謎題不只是爲了給你們發福利,最重要的是順便推廣一下自家產品。頗有趣的一點就是Jetbrains還容許適當的做弊,能夠說是很是貼心了。瀏覽器
最後一段話提醒了咱們下一個謎題隱藏在Jetbrains的產品頁面裏,並且順帶提醒咱們拿好鑰匙(Key既是鑰匙也是激活碼的意思)。這裏要注意密碼Good luck! == Jrrg#oxfn$
,他能夠說是整個解謎的關鍵所在。函數
下面到Jetbrains產品頁面看一下有什麼神祕東西,若是你對Jetbrains的各項產品比較熟悉的話,應該很容易就能夠發現多了一個奇怪的東西。沒錯,這個JK是幹什麼的?工具
點開看看,發現了一條新提示。它給了咱們一個網頁地址,地址最後缺失了最後3個數字,答案就是下面的問題,500-5000以前有多少個素數?gitlab
這固然難不倒咱們這些程序員,照例使用Kotlin計算一下問題答案。說實話這裏花了我很多時間,代碼卻是很簡單,可是Kotlin語法和標準庫我好久沒用了,忘得一乾二淨,花了一些時間從新學習了一下, 而後用篩法實現了素數計數程序。學習
fun countPrimes(lowerBound: Int, upperBound: Int): Int { // 假設下標就是數自己,元素表明是不是素數 val numbers = Array<Boolean>(upperBound + 1) { true } numbers[0] = false numbers[1] = false for (i in 2..(sqrt(upperBound.toDouble()).toInt() + 1)) { if (numbers[i]) { for (j in i * i..upperBound step i) { numbers[j] = false } } } return numbers.copyOfRange(lowerBound, upperBound) .count { it } }
而後就能夠獲得500-5000以前有多少個素數了,程序運行結果是574。
用574替換掉三個井號,就能夠獲得新的網址了,訪問可知這是PyCharm的在線幫助網站。注意網頁上有一個圖片,是一張檯球桌,上面有一張打印了神祕代碼的紙。
這個產品的圖標相信不少同窗不會陌生,這是Jetbrains旗下一款issue收集工具YouTrack的圖標。而神祕代碼就是某個issue的代號。因此咱們訪問Jetbrains的官方YouTrack網站看看這個issue到底說了啥。這裏其實很簡單,谷歌這串代碼便可,強大的谷歌會直接給出咱們這個issue的地址。
訪問地址發現這個網頁又給了一串神祕密碼,提示很簡單:回想一下剛開始的密碼。說實話這裏若是讓我解得話我確定解不出來,看到這個密碼樣式我可能會嘗試使用BASE64之類的去解謎,而後就進了死衚衕。可是有了先行者的提示,其實也不是很難。
關鍵就在前面的鑰匙裏。注意這個鑰匙看起來就是一個編程判斷語句,==
就是等於號,那麼是否是說先後兩串字符是相等的呢?
Good luck! == Jrrg#oxfn$
如何判斷字符相等呢?咱們首先想到的天然是判斷其字符的ASCII碼是否相等,因此天然而然,須要寫個函數測試一下兩個字符串的碼。果真,兩個字符串值相差了3,也就是說這是一個簡單的位移密碼。解密方法就是將密文向左移動三格。若是比較博學的同窗應該據說過這種密碼,古代羅馬的統治者凱撒就使用過這種密碼,雖然如今這種簡單密碼已經被淘汰了,可是做爲遊戲來講的話剛恰好,畢竟解謎方法弄得太難沒人解出來那就尷尬了。
fun printStringValue() { val string1 = "Good luck!" val string2 = "Jrrg#oxfn\$" println(string1.map { it.toInt().toString() }.joinToString(separator = " ")) println(string2.map { it.toInt().toString() }.joinToString(separator = " ")) } // 71 111 111 100 32 108 117 99 107 33 // 74 114 114 103 35 111 120 102 110 36
好了,已經確認瞭解密方法,能夠對密文進行解密了。在這裏再次吹一波Kotlin語言,lambda寫起來是真的爽,比Java、Python之流舒服多了。
fun decryptCipher() { val sss = "Qlfh\$#Li#|rx#duh#uhdglqj#wklv#|rx#pxvw#kdyh#zrunhg#rxw#krz#wr#ghfu|sw#lw1#Wklv#lv#rxu#lvvxh#wudfnhu#ghvljqhg#iru#djloh#whdpv1#Lw#lv#iuhh#iru#xs#wr#6#xvhuv#lq#Forxg#dqg#iru#43#xvhuv#lq#Vwdqgdorqh/#vr#li#|rx#zdqw#wr#jlyh#lw#d#jr#lq#|rxu#whdp#wkhq#zh#wrwdoo|#uhfrpphqg#lw1#|rx#kdyh#ilqlvkhg#wkh#iluvw#Txhvw/#qrz#lw「v#wlph#wr#uhghhp#|rxu#iluvw#sul}h1#Wkh#frgh#iru#wkh#iluvw#txhvw#lv#‟EhfdxvhFrgh†1#Jr#wr#wkh#Txhvw#Sdjh#dqg#xvh#wkh#frgh#wr#fodlp#|rxu#sul}h1#kwwsv=22zzz1mhweudlqv1frp2surpr2txhvw2" val cipher = sss.map { (it.toShort() - 3).toChar() }.joinToString(separator = "") println(cipher) }
解密結果以下,獎勵代碼我已經去掉了,你們最好仍是本身研究一下,享受一下解密的快感。
Nice! If you are reading this you must have worked out how to decrypt it. This is our issue tracker designed for agile teams. It is free for up to 3 users in Cloud and for 10 users in Standalone, so if you want to give it a go in your team then we totally recommend it. you have finished the first Quest, now it’s time to redeem your first prize. The code for the first quest is 「XXXX」. Go to the Quest Page and use the code to claim your prize. https://www.jetbrains.com/pro...
訪問網頁,輸入獎勵代碼以及郵箱,Jetbrains就會將註冊連接發送到你的郵箱中。而後遵循郵件裏面的說明,便可兌換3個月的Jetbrains全家桶使用權。本次活動截止時間到明天位置,你們沒領取的趕快領取吧!