解決謎題獲取3個月Jetbrains全家桶正版使用權

最近,Jetbrains沒事搞事,搞了一個解謎活動,成功解答出謎題的同學可以獲得三個月Jetbrains全家桶的正版使用權。就算沒有這個獎勵,光是這個解謎過程就非常有意思,所以我就來給大家介紹一下。當然其實我也是看別人的文章介紹之後才發現有這個活動的,光憑我自己肯定是解不出來的,所以在此給出原作者的博客鏈接,這是一位外國小哥。

線索一:推特神祕代碼

早在3月9日,Jetbrains推特上就發了一條神祕代碼,當然不是我們開車的那個神祕代碼,它是一串不規律字符。

推特神祕代碼

如果你對反彙編之類的技術有所瞭解,或者你查看過某些軟件的原始代碼,又或者你注意力驚奇,發現這些代碼裏僅有數字以及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的網站源代碼嗎?

線索二:Jetbrains官網源代碼

瀏覽器打開Jetbrains官網,右鍵點擊查看網站源代碼。幸運的是,Jetbrains網站沒有使用什麼壓縮技術,網站源代碼格式化顯示,可以很輕鬆的查看網站代碼。在400行左右,我還真找到了相關信息。

文字大意就是歡迎來解開這些謎題,這些謎題不僅需要一定的思維能力,而且需要利用各種Jetbrains產品完成解謎。可見這些謎題不僅是爲了給大家發福利,最重要的是順便推廣一下自家產品。很有趣的一點就是Jetbrains還允許適當的作弊,可以說是非常貼心了。

最後一段話提醒了我們下一個謎題隱藏在Jetbrains的產品頁面裏,而且順帶提醒我們拿好鑰匙(Key既是鑰匙也是激活碼的意思)。這裏要注意密碼Good luck! == Jrrg#oxfn$,他可以說是整個解謎的關鍵所在。

神祕註釋信息

線索三:官網神祕工具

下面到Jetbrains產品頁面看一下有什麼神祕東西,如果你對Jetbrains的各項產品比較熟悉的話,應該很容易就可以發現多了一個奇怪的東西。沒錯,這個JK是幹什麼的?

神祕產品

點開看看,發現了一條新提示。它給了我們一個網頁地址,地址最後缺失了最後3個數字,答案就是下面的問題,500-5000之前有多少個素數?

神祕問題

這當然難不倒我們這些程序員,照例使用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/promo/quest/

兌換獎勵

訪問網頁,輸入獎勵代碼以及郵箱,Jetbrains就會將註冊鏈接發送到你的郵箱中。然後遵循郵件裏面的說明,即可兌換3個月的Jetbrains全家桶使用權。本次活動截止時間到明天位置,大家沒領取的趕快領取吧!

兌換獎勵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章