放射性ビット検査


9

注:これは、以前のチャレンジであるPristine Bit Checkingバージョンです。これはそれよりもはるかに難しいはずです。

0から255の範囲の2つの整数を取り、数値のバイナリ形式が正確に1ビット異なるかどうかを返すプログラム/関数を記述します。

たとえば、10はバイナリ形式の0000000100000000があり、1ビット離れています。同様に、15224010011000and 000011000なので、trueを返します。

ただし、コードを耐放射線性にする必要があります。これにより、プログラムのいずれかのビットが反転しても、正しく機能するはずです。たとえば、プログラムが1バイトa01100001)の場合、8つの変更可能なプログラムすべて:

á ! A q i e c `

それでも正しく機能する必要があります。バイト単位で変更していることを確認してください(たとえば、á上の2バイト文字ではなく、実際にはバイト225表しているá)。

テストケース:

Truthyの意味で、それら 1ビット異なります。

0,1     => Truthy
1,0     => Truthy
152,24  => Truthy
10,10   => Falsey
10,11   => Truthy
11,12   => Falsey
255,0   => Falsey

ルール:

  • 多くの可能なプログラム(バイト数* 8)、または完全な有効性の証明があるため、プログラムが適切に耐放射線性であることを検証できるテストフレームワークを提供します。
    • 投稿する前に、プログラムが有効であることを再確認してください
  • 出力は、true / false(どちらの方法でもかまいません)、またはtrueの1つの異なる値として、残りはfalseのいずれかになります。

以下は、入力されたプログラムのすべてのバリエーションを生成するために使用できるヘルパープログラムです。


4
「それよりもはるかに難しいはずです」-これは問題を軽く述べています
ジョナ

記録として、空のプログラムを無視すると、これはコードが有効なUTF-8でなければならない言語では不可能です。
Ørjanヨハンセン

回答:


6

HTML + JavaScript、210バイト

<script>[d,b]=location.search.match(/[\d]([\d]*)?/g);1/b/d&&document.write([i=b^d][i--&i]+'<!-'+'-')</script></script>0<script>[d,b]=location.search.match(/\d+/g);document.body.innerHTML=[i=b^d][i&i-1]</script>

検索パラメータを含むページを開きますindex.html?a=1&b=2

検証(Python + Selenium + Firefox)

# -*- coding: utf-8 -*-
from selenium import webdriver
import os
source = "<script>[d,b]=location.search.match(/[\d]([\d]*)?/g);1/b/d&&document.write([i=b^d][i--&i]+'<!-'+'-')</script></script>0<script>[d,b]=location.search.match(/\d+/g);document.body.innerHTML=[i=b^d][i&i-1]</script>"
filename = os.path.abspath("temp1.html")

browser = webdriver.Firefox()

def test(html, input_values, expected):
    with open(filename, "w", encoding="latin-1") as html_file:
        html_file.write(html)
    [a, b] = input_values
    browser.get("file:///" + filename + "?a=" + str(a) + "&b=" + str(b))
    text = browser.find_element_by_tag_name("body").text
    if text == "true" and expected == True: return True
    if text == "false" and expected == False: return True
    if text == "undefined" and expected == False: return True
    try:
        if int(text) != 0 and expected == True: return True
        if int(text) == 0 and expected == False: return True
    except: pass
    print(html, input_values, expected, text)

testcases = [
    [[1, 1], False],
    [[1, 2], False],
    [[1, 3], True],
]

fullTestcases = [
    [[0, 1], True],
    [[1, 0], True],
    [[152, 24], True],
    [[10, 10], False],
    [[10, 11], True],
    [[11, 12], False],
    [[255, 0], False],
]

def runAllTestcases(html, testcases):
    for testcase in testcases:
        test(html, *testcase)

runAllTestcases(source, fullTestcases)

for pos in range(len(source)):
    for flip in range(8):
        flip_char = chr(ord(source[pos]) ^ (2 ** flip))
        flip_source = source[0:pos] + flip_char + source[pos+1:]
        runAllTestcases(flip_source, testcases)
    print(pos, "/", len(source))

browser.quit()

使用法:

  • あなたが持って作るpython3firefoxインストールされています。
  • このPythonコードをロケールに保存します。
  • pip install selenium
  • FirefoxのWebドライバーダウンロードして、このPythonソースの同じフォルダーに配置します。
  • このバリデータを実行して、完了するまで待ちます。

どうやって

変更がスクリプトの初回の場合。スクリプトはいくつかのエラー(構文エラー、未定義の変数など)をスローします。そして、2回目のスクリプトは正しく実行され、出力が上書きされます。

初めてのスクリプト変更ではない場合。スクリプト出力

(役に立たない)HTMLの知識を学ぶ

  • document.write現在の位置にHTMLを挿入します。通常はアンバランスなHTMLを出力しないでください。不均衡なHTMLが印刷される場合。そのまま挿入しました。そして、次のHTMLが再解析されます。コメントを開くには、<!-のようなものを挿入することもできます。
  • <head>を解析するときに、HTMLパーサーがここに存在すべきでないものを取得した場合、<head>タグはすぐに閉じられ、<body>が作成されます。
  • タグが作成されると、document.bodyにアクセスできます。
  • <script>タグは</ script>で閉じられています。それらの間のすべてはスクリプトです。スクリプトが有効でない可能性があり、それは問題ではありません(HTMLを壊しません)。
  • 前の<script>タグの例外は、次のの実行を妨げません。

もう少しゴルフ場があるに違いない。しかし、私はバリデーターを待つのに疲れています...
tsh '
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.