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 00000001
y 00000000
, que están un poco separadas. Del mismo modo, y son 010011000
y 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.
+1
de 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==0
falso 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')==1
y haciéndolo prístino cambiando los 1's a+True
y==
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
/False
para 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.BOLD
con-~(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.equals
son 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.bitCount
yjava.awt.Font.BOLD
son primitivosint
en 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.equals
es un buen golf, ¡gracias!Objects
es 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
0
si el par difiere en 1, de lo contrario no es cero. Ligeramente inusual para C, a menos que considere volverEXIT_SUCCESS
si el par difiere en 1, cualquier otro valor de lo contrario.Se utiliza
sizeof((char)d))
para producir la constante1
de 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
./flipbit
herramienta 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 inclusounix
se define como 1 en TIO, y probablemente en la mayoría de los demás Linux.d
cuece en la fuente en la menor cantidad de bytes posible. Ded
lo 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 entrea
yb
. Para verificar si es una potencia de 2, verifique si su registro en la base 2 es un entero. La funcióndpois
proporciona 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. ElT
está allí porquedpois
requiere un segundo argumento (cualquier trabajo real positivo, yT
se 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
pi
conT
para 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.)F
lugar 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.double
etc. , están solo un poco lejosis.integer
,is.double
etc. fue lo más difícil. Al final, usarsum(T^el(.[-T])
como una forma de generar uno y verificar queas.double
ha devuelto un vector de longitud> 1 fue lo mejor que pude hacer. La envolturat
es manejar el hecho de que de lo contrarioidentical
puede 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
x
yy
están un poco separados, así que creo que este es un contraejemplo.y
yx
también están a 1 bit9
y6
respectivamente.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 yaint
que 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
1
fue reescrito comoelems([""])
.2
fue 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