Haystack(強盗)の針を見つける

This is part of a challenge. Go here for
the cops’ part.

強盗の挑戦

Haystackプログラムから文字のサブセットを削除することで、あるコードの回答が壊れる可能性があるため、
Haystack の代わりに Needle
を出力します(同じ言語)。あなたが上記の制約によって有効である限り、あなたが意図したのとまったく同じ解決策を見つける必要はありません。

これを管理している場合は、解決策とともに回答を投稿し、警察の回答にリンクし、警察の回答をあなたのものに戻してコメントを残してください。

ほとんどの警官の解答を盗む強盗が勝つ。結びつきは、クラックされた警官の回答のサイズの合計(より長い提出をクラックする強盗に有利)で壊れます。

それぞれの警官の答えは一度しか分解されません。もちろん、あなた自身の答えを解読することは許されません。警官の答えがひび割れの前または後に無効と判明した場合、強盗のスコアにはカウントされません。

Here are a couple of simple 例 in different languages:

Ruby

Haystack: puts 1>0?"Haystack":"Needle"
Delete:        XXXXXXXXXXXXXXX
Needle:   puts "Needle"

Python 2

Haystack: print "kcatsyaHeldeeN"[-7::-1]
Delete:          XXXXXXXX        XX
Needle:   print "eldeeN"[::-1]

削除された文字のサブセットは連続している必要はないことに注意してください。

ベストアンサー

JavaScript、85バイト(ES6)

Cracks Arnauld’s
answer

f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

「針」デモ

<div class=”snippet” data-lang=”js” data-hide=”true”
data-console=”true” data-babel=”false”> <div
class=”snippet-code snippet-currently-hidden”>

f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

console.log(f())

</div> </div>

説明

元の機能は:

f=(k=b=x=35)=>x--?f(k*74837258394056219&268435455):k&2?'N'+(k^124038877).toString(b):'Haystack'

それはより読みやすい:

f = (k=b=x=35) => {
    if (x--) {
        return f(k*74837258394056219&268435455);
    } else {
        if (k&2) {
            return 'N'+(k^124038877).toString(b);
        } else {
            return 'Haystack';
        }
    }
}

n = 21625674 の場合、 n.toString(35)
'eedle' です。

The 35 in the input probably cannot be changed to a subset
(because we want a base large enough to contain all the letters
‘del’, so we need a base that’s at least 22). So the numbers to
change are 74837258394056219, 268435455,
and 124038877. We want to replace them with numbers a,
b, c, each formed with a subset of the digits of the original
numbers, such that the function g(k) = (k * a & b),
starting with k=35 and iterated 35 times, and then
XORed with c, gives 21625674.

a は長さが17、 bc
は長さが9です) 、私はちょうどブルートフォースを使いました:-)可能なすべての数字を生成するために C ++プログラムを書いた a
b を繰り返して、元の数字のサブセットとして形成された必要な c

がセットに含まれているかどうかを確認してください。約15秒で実行され、唯一の出力は a = 4853461
b = 268435455c = 12408877 です。 > b
は変更する必要はありません)。私はこの機能を反転させるより巧妙な方法があるかどうかはわかりません。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です