Verificação radioativa de bits

9

Nota: Esta é a versão de do meu desafio anterior, a Pristine Bit Checking . Isso deve ser muito mais difícil que esse.

Escreva um programa / função que use dois números inteiros no intervalo de a , inclusive, e retorne se as formas binárias dos números são exatamente um pouco diferentes.0255

Por exemplo, e têm formas binárias e , que estão um pouco separadas. Da mesma forma, e são e , portanto, eles retornam verdadeiros.10000000010000000015224010011000000011000

No entanto , seu código deve ser protegido contra radiação , de modo que, se algum bit do seu programa for invertido, ele ainda funcionará corretamente. Por exemplo, se o seu programa era o byte únicoa(01100001), todos os 8 programas modificados possíveis:

á ! A q i e c `

ainda deve funcionar corretamente. Verifique se você está modificando por bytes (por exemplo, o álá em cima realmente representa o byte , não o caractere real de dois bytes ).225á

Casos de teste:

Com o significado de Truthy, eles são diferentes em um pouco.

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

Regras:

  • Forneça uma estrutura de teste que possa verificar se o seu programa está adequadamente protegido contra radiação, pois haverá muitos programas possíveis (número de bytes * 8), ou então uma prova completa de validade.
    • Verifique se o seu programa é válido antes de publicá-lo.
  • A saída pode ser truthy / falsey (o caminho é bom), ou então como um valor distinto para truthy e o restante como falsey

Aqui está um programa auxiliar que pode ser usado para produzir todas as variações de um programa inserido.

Brincadeira
fonte
4
"deve ser muito mais difícil do que aquele" - isto é dizer o assunto de ânimo leve
Jonah
Para o registro, ignorando programas vazios, isso seria impossível em qualquer idioma cujo código deva ser UTF-8 válido.
Ørjan Johansen

Respostas:

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 com parâmetros de pesquisa index.html?a=1&b=2.

Validação (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:

  • verifique se você possui python3e firefoxinstalou.
  • salve esse código python no seu código do idioma.
  • pip install selenium
  • baixe o driver da web do firefox e coloque-o na mesma pasta desta fonte python.
  • execute esse validador e aguarde o término.

Quão

Se a modificação estiver na primeira vez do script. O script lançará alguns erros (erro de sintaxe, variável indefinida, etc.). E a segunda vez do script será executada corretamente e substituirá a saída.

Se a modificação não estiver na primeira vez do script. A saída do script

Aprenda um pouco de conhecimento HTML (inútil)

  • document.write insere HTML na posição atual. Você não deve produzir HTML desequilibrado normalmente. Quando HTML desbalanceado é impresso. É inserido como está. E o HTML a seguir é analisado novamente. Você pode até inserir algo como <! - para abrir um comentário.
  • Ao tentar analisar <head>, se o analisador HTML tiver algo que não deveria existir aqui, a tag <head> é fechada imediatamente e um <body> é criado.
  • Quando a tag é criada, document.body fica acessível.
  • A tag <script> é fechada por </script>. Qualquer coisa entre eles é script. O script pode não ser válido e isso não importa (não quebra o HTML).
  • A exceção na tag <script> anterior não impede a execução a seguir.
tsh
fonte
Deve haver mais alguns espaços de golfe. Mas estou cansado de esperar o validador ...
TSH