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.


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.

Debe haber más espacios de golf. Pero estoy cansado de esperar al validador ...
— tsh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.