Escriba un programa / función que tome dos enteros en el rango de a inclusive, y devuelva si las formas binarias de los números son exactamente un bit diferentes.
Por ejemplo, y tienen formas binarias 00000001y 00000000, que están un poco separadas. Del mismo modo, y son 010011000y 000011000, por lo que devuelven verdadero.
Sin embargo , su código debe ser impecable , de modo que si se voltea un bit de su programa, debería arrojar un error. Por ejemplo, si su programa era el byte únicoa(01100001), entonces los 8 programas modificados posibles:
á ! A q i e c `
Debe arrojar un error. Asegúrese de que está modificando por bytes (p. Ej. á, Allí arriba está representando el byte , no el carácter real de dos bytes á).
Casos de prueba:
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 esté correctamente prístino, ya que habrá muchos programas posibles (número de bytes * 8), o una prueba completa de impecabilidad.
- Por favor asegúrese de que su programa es válido antes de publicarlo.
- La salida debe ser verdadero / falso (de cualquier manera está bien), o bien dos valores distintos sin error
- Los errores pueden ser tiempo de ejecución, compilador, intérprete, etc.

+1de la mayoría de mis soluciones recientes! : \Respuestas:
Python 2 , 35 bytes
Pruébalo en línea!
Utiliza la verificación de potencia de dos
n&-n==n, eliminando eln==0falso positivo.Como referencia, estos son los pares de operadores binarios one-char que están separados un poco, lo que los hace difíciles de usar:
Afortunadamente,
&y^no están entre estos.También tenga en cuenta que
==puede convertirse<=, y+puede convertirse en el personaje de comentario#.Python 2 , 41 bytes
Pruébalo en línea!
Tomando TFeld's
lambda a,b:bin(a^b).count('1')==1y haciéndolo prístino cambiando los 1's a+Truey==parais. Gracias a Jo King por 1 byte.fuente
Python 2 ,
726750 bytesPruébalo en línea!
-5 bytes, gracias a Jo King
Devoluciones
True/Falsepara veracidad / falsey.El programa es básicamente el mismo que
lambda a,b:bin(a^b).count('1')==1, pero sin números y otros caracteres que funcionan cuando se invierte el bit.Funciona asegurándose de que casi todo sea una función con nombre (que son bastante inmaculadas)
La prueba prístina al final voltea un solo bit (para cada bit) y prueba la función en una entrada. Si eso funciona (correcto o no), se imprime esa variación. Sin programas impresos = función prístina.
fuente
Java 8,
68615645 bytes-11 bytes gracias a @EmbodimentOfIgnorance , reemplazando constante
java.awt.Font.BOLDcon-~(a^a).Pruébalo en línea.
Explicación:
La función base más corta sería:
Pruébalo en línea.
Esto se modifica para que no haya un dígito,
=ni uno de los+/*operandos en él para cálculos numéricos (entonces el+concatenación de cadenas está bien):Los
+""y.equalsson para comparar enString.equals(String)lugar deint==int.NOTA:
Integer.equals(int)se podría utilizar aquí, pero sería más bytes, ya que tanto el.bitCountyjava.awt.Font.BOLDson primitivosinten lugar deInteger-Objetos, por lo que un adicionalnew Integer(...)sería necesaria para transformar uno de los dos para unInteger-objeto, antes de poder utilizar el.equals.fuente
java.awt.Font.BOLD, pero tuObjects.equalses un buen golf, ¡gracias!Objectses parte de lajava.util.importación, así que tengo que agregarlo al recuento de bytes, me temo, lo que hace 69 bytes .. :(-~(a^a)Funcionaría para 1?C (gcc) , 56 bytes
Pruébalo en línea!
Devuelve
0si el par difiere en 1, de lo contrario no es cero. Ligeramente inusual para C, a menos que considere volverEXIT_SUCCESSsi el par difiere en 1, cualquier otro valor de lo contrario.Se utiliza
sizeof((char)d))para producir la constante1de una manera prístina y al mismo tiempo obliga al nombre de la función a ser impecable.Luego XORs 1 con el popcount de XOR de los argumentos. Afortunadamente, el
^símbolo es fácil de mantener prístino, al igual que el identificador muy largo__builtin_popcount.Mientras tanto, aquí está el script utilizado para probar la solución:
Que usa la
./flipbitherramienta que escribí cuya fuente es simplemente:Las partes difíciles fueron:
=no funciona bien, ya que puede ser una comparación en todos los casos que pueda aparecer. Del mismo modo-no funciona bien. Así^lo se utiliza para afirmar la igualdad con 1.fuente
^operador impecable? Si los bits en eso fueron cambiados, ¿qué puede evitar que se convierta en un operador diferente? Esto aún se compilaría, pero solo le daría la respuesta incorrecta. ¿Estoy malinterpretando algo sobre el significado de la palabra "prístino" aquí?^solo se puede cambiar a cualquiera de_\ZVN~Þlos caracteres no imprimibles en el punto de código 30.~es el único de los que es un operador, pero es solo un operador unario.__LINE__lugar desizeof(char). Creo que está bien suponer que su función estará en la línea 1 de su archivo .c. O inclusounixse define como 1 en TIO, y probablemente en la mayoría de los demás Linux.dcuece en la fuente en la menor cantidad de bytes posible. Dedlo contrario (o como se le llame a la función) simplemente se puede cambiar y el código seguirá funcionando. Incluso(__LINE__)cond();no funcionará porqued();se puede cambiar a cualquier otra letra y aún se compilará ya que la función nunca tiene que llamarse, por lo tanto, no está vinculada.R ,
3837 bytes-1 byte gracias a Nick Kennedy.
Pruébalo en línea! (Gracias a Giuseppe por configurar el TIO correctamente).
Prueba de que es impecable (usando el corrector de Nick Kennedy ).
Salidas 0 para falsey, y un valor positivo para la verdad, que entiendo es aceptable ya que R interpretará esto como Falso y Verdadero.
Explicación:
bitwXor(a,b)da (como un entero) el XOR bit a bit entreayb. Para verificar si es una potencia de 2, verifique si su registro en la base 2 es un entero. La funcióndpoisproporciona la función de densidad de probabilidad de la distribución de Poisson: su valor es 0 para valores no enteros y algo positivo para enteros no negativos. ElTestá allí porquedpoisrequiere un segundo argumento (cualquier trabajo real positivo, yTse interpreta como 1).Si insistimos en generar valores distintos, la siguiente versión genera FALSO o VERDADERO en 42 bytes (gracias a Giuseppe por -8 bytes):
y también es prístina . Pruébalo en línea!
fuente
piconTpara guardar un byte (aún prístino). Además, su TIO no corresponde a su respuesta en este momento.scan(); ¿Tienes una idea? (El código funciona bien en una computadora.)Flugar deexp(-Inf), en la misma línea que NickT:-)R , 83 bytes
Pruébalo en línea!
Prueba de que esto es prístino
Eludir el hecho de que
as.integer,as.doubleetc. , están solo un poco lejosis.integer,is.doubleetc. fue lo más difícil. Al final, usarsum(T^el(.[-T])como una forma de generar uno y verificar queas.doubleha devuelto un vector de longitud> 1 fue lo mejor que pude hacer. La envolturates manejar el hecho de que de lo contrarioidenticalpuede convertirseide~tical.fuente
Julia 0.7 , 20 bytes
Pruébalo en línea!
Aquí hay un validador prístino que intenta ejecutar cada función anónima modificada contra alguna entrada, y ninguna de las dos pasa con éxito. Tenga en cuenta que el código tiene un carácter unicode de varios bytes, y algunas posibles salidas del cambio de bits ni siquiera están incluidas, ya que producen cadenas UTF-8 no válidas.
fuente
xyyestán un poco separados, así que creo que este es un contraejemplo.yyxtambién están a 1 bit9y6respectivamente.C # (compilador interactivo de Visual C #) , 37 bytes
La
a=>b=>parte no se puede cambiar o la función no es válida.En
a!=b,=no se puede cambiar yaintque no se puede convertir abool.Pruébalo en línea!
fuente
C # (Visual C # interactivo Compilador) ,
12810177706174 bytes-27 bytes gracias a Ascii-Only
Pruébalo en línea!
Tienes que ser bastante creativo para obtener números en C # sin usar literales. Solo usa el operador ^. Las variables a, b están a más de 1 bit de distancia entre sí y todo lo demás es una palabra clave / nombre.
fuente
+/*=para operaciones matemáticas o de validación. ;)+JavaScript (ES6 en modo estricto), 61 bytes
Pruébalo en línea! o asegúrese de que todos los programas modificados sean incorrectos
fuente
Maravilloso ,
4736 bytesPruébalo en línea!
Versión adaptada de Kevin Cruijssen la respuesta Java .
fuente
MATLAB, 37 bytes
Lo sentimos, no hay enlace TIO, porque no puedo hacer que el conjunto de pruebas funcione bajo Octave. Gracias @ExpiredData por algunos comentarios útiles.
Banco de pruebas:
fuente
numel, porque mi suite de pruebas no parece estar funcionando en Octave.eye!Perl 6 ,
7743 bytesGracias a Jo King por -33 bytes.
Esto es equivalente a
1fue reescrito comoelems([""]).2fue reescrito comosum(elems([""]),elems([""]));elems(["",""])puede parecer que funciona peroelems([""-""])también es válido y parece colgar el probador.Pruébalo en línea!
fuente
JavaScript (Node.js) , 20 bytes
Pruébalo en línea!
validador por Arnauld, modificado (no uso estricto)
fuente