Comprobación de bits radiactivos

9

Nota: Esta es la versión de la de mi desafío anterior Pristine Bit Checking . Esto debería ser mucho más difícil que ese.

Escriba un programa / función que tome dos enteros en el rango de a 255 inclusive, y devuelva si las formas binarias de los números son exactamente un bit diferentes.0255

Por ejemplo, 1 y 0 tienen formas binarias 00000001y 00000000, que están un poco separadas. Del mismo modo, 152 y 24 son 010011000y 000011000, por lo que devuelven verdadero.

Sin embargo , su código debe ser resistente a la radiación , de modo que si se invierte un bit de su programa, aún debería funcionar correctamente. Por ejemplo, si su programa era el byte únicoa(01100001), entonces los 8 programas modificados posibles:

á ! A q i e c `

aún debe funcionar correctamente. Asegúrese de que está modificando por bytes (p. Ej. á, Allí arriba está representando el byte 225 , no el carácter real de dos bytes á).

Casos de prueba:

Con Truthy significa que son diferentes en un bit.

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

Reglas:

  • Proporcione un marco de prueba que pueda verificar que su programa se haya endurecido adecuadamente con la radiación, ya que habrá muchos programas posibles (número de bytes * 8) o una prueba completa de validez.
    • Por favor asegúrese de que compruebe que su programa es válido antes de publicarlo.
  • La salida puede ser verdadero / falso (de cualquier manera está bien), o bien como un valor distinto para verdadero y el resto como falso

Aquí hay un programa auxiliar que puede usarse para producir todas las variaciones de un programa ingresado.

Jo King
fuente
44
"Debería ser mucho más difícil que ese" - esto está diciendo el asunto a la ligera
Jonás
Para el registro, ignorando los programas vacíos, esto sería imposible en cualquier idioma cuyo código debe ser UTF-8 válido.
Ørjan Johansen

Respuestas:

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>

Abrir página con parámetros de búsqueda index.html?a=1&b=2.

Validación (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()

Uso:

  • asegúrese de tenerlo python3e firefoxinstalarlo.
  • guarde este código de Python en su localidad.
  • pip install selenium
  • Descargue el controlador web de Firefox y colóquelo en la misma carpeta de esta fuente de Python.
  • ejecuta este validador y espera a que termine.

Cómo

Si la modificación es en la primera vez del script. El script arrojará algunos errores (error de sintaxis, variable indefinida, etc.). Y la segunda vez del script se ejecutará correctamente y sobrescribirá la salida.

Si la modificación no está en la primera vez del script. La salida del script

Aprenda algo de conocimiento HTML (inútil)

  • document.write inserta HTML en la posición actual. No debe generar HTML desequilibrado de la forma habitual. Cuando se imprime HTML no balanceado. Se inserta como está. Y siguiendo HTML se vuelven a analizar. Incluso puede insertar algo como <! - para abrir un comentario.
  • Al intentar analizar <head>, si el analizador HTML tiene algo que no debería existir aquí, la etiqueta <head> se cierra inmediatamente y se crea un <body>.
  • Cuando se crea la etiqueta, document.body es accesible.
  • La etiqueta <script> está cerrada por </script>. Cualquier cosa entre ellos es guión. El script puede no ser válido, y eso no importa (no rompe HTML).
  • La excepción en la etiqueta <script> anterior no impide la ejecución de lo siguiente.
tsh
fuente
Debe haber más espacios de golf. Pero estoy cansado de esperar al validador ...
tsh