Kiểm tra bit phóng xạ


9

Lưu ý: Đây là phiên bản trong thử thách trước đó của tôi Kiểm tra bit nguyên sơ . Điều này nên được nhiều khó khăn hơn một đó.

Viết chương trình / hàm có hai số nguyên trong phạm vi từ đến , và trả về việc dạng nhị phân của các số có khác nhau một bit hay không.0255

Ví dụ, và có dạng nhị phân và cách nhau một bit. Tương tự, và là và , vì vậy chúng trả về đúng.10000000010000000015224010011000000011000

Tuy nhiên , mã của bạn phải được làm cứng bằng phóng xạ , sao cho nếu bất kỳ một bit nào trong chương trình của bạn bị lật, thì nó vẫn hoạt động chính xác. Ví dụ: nếu chương trình của bạn là byte đơna(01100001), thì tất cả 8 chương trình được sửa đổi có thể:

á ! A q i e c `

vẫn phải hoạt động chính xác. Hãy chắc chắn rằng bạn đang sửa đổi theo byte (ví dụ: trên áthực tế có đại diện cho byte , không phải là ký tự hai byte thực tế ).225á

Các trường hợp thử nghiệm:

Với Truthy có nghĩa là họ khác nhau bởi một chút.

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

Quy tắc:

  • Cung cấp một khung kiểm tra có thể xác minh rằng chương trình của bạn được làm cứng bằng bức xạ, vì sẽ có rất nhiều chương trình có thể (số byte * 8), hoặc bằng chứng khác về tính hợp lệ.
    • Vui lòng đảm bảo kiểm tra kỹ chương trình của bạn trước khi đăng.
  • Đầu ra có thể là sự thật / falsey (dù cách nào cũng tốt), hoặc cách khác là một giá trị riêng biệt cho sự thật và phần còn lại là falsey

Đây là một chương trình trợ giúp có thể được sử dụng để tạo ra tất cả các biến thể của một chương trình được nhập.


4
"nên khó khăn hơn nhiều so với cái đó" - đây là vấn đề nhẹ nhàng
Jonah

Đối với bản ghi, bỏ qua các chương trình trống, điều này là không thể đối với bất kỳ ngôn ngữ nào có mã phải là UTF-8 hợp lệ.
Ørjan Johansen

Câu trả lời:


6

HTML + JavaScript, 210 byte

<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>

Mở trang với các thông số tìm kiếm index.html?a=1&b=2.

Xác thực (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()

Sử dụng:

  • chắc chắn rằng bạn có python3firefoxcài đặt.
  • lưu mã python này vào miền địa phương của bạn.
  • pip install selenium
  • tải về trình điều khiển web firefox và đặt nó vào cùng thư mục của nguồn python này.
  • thực hiện xác nhận này và chờ đợi nó kết thúc.

Làm sao

Nếu sửa đổi là lần đầu tiên của kịch bản. Kịch bản lệnh sẽ đưa ra một số lỗi (lỗi cú pháp, biến không xác định, v.v.). Và lần thứ hai của tập lệnh sẽ chạy chính xác và ghi đè lên đầu ra.

Nếu sửa đổi không phải là lần đầu tiên của kịch bản. Đầu ra tập lệnh

Tìm hiểu một số kiến ​​thức HTML (vô dụng)

  • document.write chèn HTML vào vị trí hiện tại. Bạn không nên xuất HTML không cân bằng thông thường. Khi HTML không cân bằng được in. Nó chèn như là. Và HTML sau đây được phân tích lại. Bạn thậm chí có thể chèn một cái gì đó như <! - để mở một bình luận.
  • Khi cố gắng phân tích <head>, nếu trình phân tích cú pháp HTML có bất kỳ thứ gì không nên tồn tại ở đây, thẻ <head> sẽ bị đóng ngay lập tức và <body> được tạo.
  • Khi thẻ được tạo, document.body có thể truy cập được.
  • Thẻ <script> được đóng bởi </ script>. Bất cứ điều gì giữa chúng là kịch bản. Tập lệnh có thể không hợp lệ và điều đó không thành vấn đề (không phá vỡ HTML).
  • Ngoại lệ trong thẻ <script> trước đó không ngăn chặn việc thực thi sau.

Phải có thêm một số không gian chơi gôn. Nhưng tôi mệt mỏi chờ người xác nhận ...
tsh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.