Überprüfung der radioaktiven Bits

9

Hinweis: Dies ist die Version meiner vorherigen Herausforderung Pristine Bit Checking . Dies sollte viel schwieriger sein als dieser.

Schreiben Sie ein Programm / eine Funktion, die zwei Ganzzahlen im Bereich von 0 bis einschließlich akzeptiert und zurückgibt, ob die Binärformen der Zahlen genau ein Bit unterschiedlich sind.255

Zum Beispiel haben und binäre Formen und , die ein Bit voneinander entfernt sind. In ähnlicher Weise und sind und , so sie wahr zurück.10000000010000000015224010011000000011000

Allerdings müssen SieCode sein strahlungsgehärtet , so dasswenn jemand etwas in Ihrem Programm gekippt wird, soll es immer noch korrekt funktionieren. Wenn Ihr Programm beispielsweise das Einzelbytea(01100001) war, dann alle 8 möglichen geänderten Programme:

á ! A q i e c `

muss noch richtig funktionieren. Stellen Sie sicher, dass Sie nach Bytes ändern (z. B. árepräsentiert das oben stehende tatsächlich das Byte , nicht das tatsächliche Zwei-Byte-Zeichen ).225á

Testfälle:

Mit der Bedeutung der Wahrheit unterscheiden sie sich um ein Bit.

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

Regeln:

  • Stellen Sie ein Testframework bereit, mit dem überprüft werden kann, ob Ihr Programm ordnungsgemäß strahlungsgehärtet ist, da es viele mögliche Programme gibt (Anzahl der Bytes * 8), oder einen vollständigen Gültigkeitsnachweis.
    • Bitte überprüfen Sie , ob Ihr Programm gültig ist, bevor Sie es veröffentlichen.
  • Die Ausgabe kann entweder wahr / falsch sein (so oder so ist es in Ordnung) oder als ein eindeutiger Wert für wahr und der Rest als falsch

Hier ist ein Hilfsprogramm , mit dem alle Variationen eines eingegebenen Programms erstellt werden können.

Scherzen
quelle
4
"sollte viel schwieriger sein als das" - das ist eine leichte Aussage
Jonah
Wenn leere Programme ignoriert werden, ist dies in keiner Sprache möglich, deren Code UTF-8 sein muss.
Ørjan Johansen

Antworten:

6

HTML + JavaScript, 210 Bytes

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

Seite mit Suchparametern öffnen index.html?a=1&b=2.

Validierung (Python + Selen + 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()

Verwendungszweck:

  • stellen Sie sicher , Sie haben python3und firefoxinstalliert.
  • Speichern Sie diesen Python-Code in Ihrem Gebietsschema.
  • pip install selenium
  • Laden Sie den Firefox-Webtreiber herunter und legen Sie ihn im selben Ordner dieser Python-Quelle ab.
  • Führen Sie diesen Validator aus und warten Sie, bis er fertig ist.

Wie

Wenn die Änderung beim ersten Mal des Skripts erfolgt. Das Skript gibt einige Fehler aus (Syntaxfehler, undefinierte Variable usw.). Und das zweite Mal des Skripts wird korrekt ausgeführt und überschreibt die Ausgabe.

Wenn die Änderung nicht beim ersten Mal des Skripts erfolgt. Die Skriptausgabe

Lernen Sie einige (nutzlose) HTML-Kenntnisse

  • document.write HTML an der aktuellen Position einfügen. Sie sollten normalerweise kein unausgeglichenes HTML ausgeben. Wenn unausgeglichenes HTML gedruckt wird. Es wurde so eingefügt, wie es ist. Und folgendes HTML wird neu analysiert. Sie können sogar <! - einfügen, um einen Kommentar zu öffnen.
  • Wenn beim Versuch, <head> zu analysieren, hier kein HTML-Parser vorhanden sein sollte, wird das <head> -Tag sofort geschlossen und ein <body> erstellt.
  • Wenn das Tag erstellt wird, kann auf document.body zugegriffen werden.
  • Das <script> -Tag wird durch </ script> geschlossen. Alles zwischen ihnen ist Skript. Das Skript ist möglicherweise nicht gültig, und das spielt keine Rolle (bricht HTML nicht).
  • Eine Ausnahme im vorherigen <script> -Tag verhindert nicht die Ausführung des folgenden Tags.
tsh
quelle
Es muss mehr Golfplätze geben. Aber ich bin müde, auf den
Prüfer