Memeriksa Bit Radioaktif

9

Catatan: Ini adalah versi dari tantangan saya sebelumnya Pristine Bit Memeriksa . Ini seharusnya jauh lebih sulit daripada yang itu.

Tulis sebuah program / fungsi yang mengambil dua bilangan bulat dalam kisaran 0 hingga 255 inklusif, dan mengembalikan apakah bentuk biner dari angka-angka itu persis berbeda satu bit.

Sebagai contoh, 1 dan 0 memiliki bentuk biner 00000001dan 00000000, yang terpisah satu bit. Demikian pula, 152 dan 24 adalah 010011000dan 000011000, jadi mereka mengembalikan true.

Namun , kode Anda harus dikeraskan dengan radiasi , sehingga jika ada satu bit dalam program Anda yang dibalik, itu harus tetap berfungsi dengan benar. Misalnya, jika program Anda adalah byte tunggala(01100001), maka semua 8 program yang mungkin dimodifikasi:

á ! A q i e c `

masih harus bekerja dengan benar. Pastikan Anda memodifikasi dengan byte (misalnya di ásana sebenarnya mewakili byte 225 , bukan karakter dua byte yang sebenarnya á).

Kasus uji:

Dengan truthy berarti mereka adalah berbeda dengan satu bit.

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

Aturan:

  • Berikan kerangka pengujian yang dapat memverifikasi bahwa program Anda sudah dikeraskan dengan benar, karena akan ada banyak program yang mungkin (jumlah byte * 8), atau bukti validitas lengkap.
    • Harap pastikan untuk memeriksa ulang program anda adalah valid sebelum Anda posting.
  • Keluaran bisa berupa kebenaran / falsey (baik itu baik-baik saja), atau sebagai satu nilai berbeda untuk kebenaran dan sisanya sebagai falsey

Berikut adalah program pembantu yang dapat digunakan untuk menghasilkan semua variasi dari program yang dimasukkan.

Jo King
sumber
4
"Seharusnya jauh lebih sulit daripada yang itu" - ini menyatakan hal itu dengan ringan
Jonah
Sebagai catatan, mengabaikan program kosong, ini tidak mungkin dilakukan dalam bahasa apa pun yang kodenya harus valid UTF-8.
Ørjan Johansen

Jawaban:

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>

Buka halaman dengan parameter pencarian index.html?a=1&b=2.

Validasi (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()

Pemakaian:

  • pastikan Anda memiliki python3dan firefoxdiinstal.
  • simpan kode python ini ke lokal Anda.
  • pip install selenium
  • unduh driver web firefox dan letakkan di folder yang sama dengan sumber python ini.
  • jalankan validator ini dan tunggu selesai.

Bagaimana

Jika modifikasi pada skrip pertama kali. Script akan membuang beberapa kesalahan (kesalahan sintaks, variabel yang tidak ditentukan, dll.). Dan skrip kedua kalinya akan berjalan dengan benar dan menimpa output.

Jika modifikasi bukan pada skrip pertama kali. Keluaran skrip

Pelajari beberapa pengetahuan HTML (tidak berguna)

  • document.write masukkan HTML ke posisi saat ini. Anda seharusnya tidak menghasilkan HTML yang tidak seimbang seperti biasanya. Ketika HTML tidak seimbang dicetak. Dimasukkan apa adanya. Dan HTML berikut diuraikan kembali. Anda bahkan dapat memasukkan sesuatu seperti <! - untuk membuka komentar.
  • Saat mencoba mem-parsing <head>, jika parser HTML mendapatkan sesuatu seharusnya tidak ada di sini, tag <head> segera ditutup dan <body> dibuat.
  • Ketika tag dibuat, document.body dapat diakses.
  • Tag <script> ditutup oleh </script>. Apa pun di antara mereka adalah naskah. Skrip mungkin tidak valid, dan itu tidak masalah (tidak merusak HTML).
  • Pengecualian dalam tag <script> sebelumnya tidak mencegah eksekusi berikut.
tsh
sumber
Harus ada lebih banyak ruang golf. Tapi saya lelah menunggu validator ...
tsh