Un bit de paridad es una de las formas más simples de suma de verificación. Primero, debes elegir la paridad, par o impar. Digamos que elegimos incluso. Ahora, necesitamos un mensaje para transmitir. Digamos que nuestro mensaje es "Foo". Esto está escrito en binario como:
01000110 01101111 01101111
Ahora, contamos el número total de 1
's allí, que es 15. Dado que 15 es un número impar, debemos agregar un bit extra al final de nuestro mensaje, y ahora tendremos un número par de bits' on ' . Este último bit agregado se conoce como el "bit de paridad". Si hubiéramos elegido una paridad impar para nuestra suma de verificación, tendríamos que agregar un '0' adicional para que el número de bits permanezca impar.
El reto:
Debe escribir un programa o función que determine cuál es el bit de paridad correcto para una cadena. Su programa debe tomar dos entradas:
Una cadena,
s
. Este es el mensaje sobre el que se calculará la suma de verificación. Esto estará restringido a los 95 caracteres ASCII imprimibles.Un carácter o cadena de un solo carácter
p
, que seráe
para paridad par oo
paridad impar.
y produce un valor verdadero-falso que representa el bit de paridad correcto. Verdad si es un 1
, y falsey si es un 0
.
No se permiten las unidades integradas que cuentan el número de bits "encendidos" en una cadena o carácter. Por ejemplo, una función f
que hace esto: f('a') == 3
o f('foo') == 16
está prohibida. Cualquier otra cosa, como la conversión de base, es un juego justo.
Prueba IO:
(without the quotes)
s: "0"
p: 'e'
output: 0
s: "Foo"
p: 'e'
output: 1
s: "Hello World!"
p: 'o'
output: 0
s: "Alex is right"
p: 'e'
output: 1
s: "Programming Puzzles and Code-Golf"
p: 'e'
output: 0
s: "Programming Puzzles and Code-Golf"
p: 'o'
output: 1
Esto es codegolf, por lo que se aplican las lagunas estándar y gana la respuesta más corta en bytes.
o
incluso tiene paridad.str(int(s, 2)).count('1')
:? No, no consideraría que se trata de una única función integrada que viola esa regla. ¿Mi edición lo hace más claro?char == single_char_string
. También lo edité en la publicación.Respuestas:
MATL ,
87 bytesPruébalo en línea! O verifique todos los casos de prueba a la vez .
fuente
Java, 97 bytes
Porque, ya sabes, Java.
Esta es una lambda para a
BiFunction<String, Character, Boolean>
.e
yo
parece estar invertido en la declaración de devolución porque aparentemente mi lógica era al revés.fuente
Python 2, 51 bytes
Esto se basa en una idea de Sp3000 para contar 1 en la representación de cadena de la lista de códigos de caracteres en binario en lugar de sumar para cada carácter.
El nuevo truco es manejar
e
yo
en esto también. Sie
fuera impar oo
par, podríamos anteponer el bit de paridad a la cadena antes de hacer el conteo (volteándolos porque '1' es Verdad). Lamentablemente, no lo son. Pero, si eliminamos todos menos sus dos últimos bits, ahora es cierto.Esto se hace eliminando el primer
9
carácter de la representación de cadena.fuente
eo
!Jalea,
98 bytesPruébalo en línea!
Gracias a Dennis por un byte!
fuente
V}
... ese fue realmente genial !!! (Dennis es un verdadero golfista) +1 Superó todos mis intentos.C, 62 bytes
XOR tiene la buena propiedad de que se puede usar para reducir las cadenas a un carácter, mientras se conserva la paridad.
Ideona
fuente
27030>>((p^p>>4)&15)&1
debería calcular la paridad de p y es incluso 1 byte más cortochar *s
es necesariof(s,p)char*s;{for(p/=8;*s;)p^=*s>>4^*s++;p^=p/4;return p%4%3;}
El%3
volverá siempre 0 para un 0, pero puede volver 1 o 2 para un 1. Esto es aceptable bajo las normas:truthy if it's a 1
27030>>((p^p>>4)&15)&1
. Bueno, err, obviamente. ;-)Python,
5857 bytesfuente
lambda s,p:`map(bin,map(ord,s))`.count('1')%2^(p>'e')
!=p>'e'
.lambda s,p:`map(bin,map(ord,p+s))`[8:].count('1')%2
Pyth, 12 bytes
Banco de pruebas.
fuente
JavaScript (ES6),
8472 bytesEl giro de bits resultó ser más corto que la conversión a base 2 y contando
1
s.fuente
Perl, 29 bytes
Incluye +2 para
-p
Ejecutar con la entrada en STDIN como cadena de espacio de caracteres de paridad, p. Ej.
parity.pl
fuente
J, 27 bytes
Uso
fuente
JavaScript (ES6), 69 bytes
fuente
PowerShell v2 +, 91 bytes
/ yo llora en un rincón
Sí ... entonces, la conversión de base no es una buena opción para PowerShell. La conversión de la cadena de entrada a la representación binaria
$a|%{[convert]::toString(+$_,2)}
es de 32 bytes en sí misma ...Toma entrada
$a
y$b
, explícitamente, convierte$a
como una matriz de caracteres en el proceso. Luego verificamos si$b
es-eq
ual ao
, y-xor
eso con la otra mitad del programa. Para esa parte, tomamos la cadena de entrada$a
, la canalizamos a través de un bucle para convertir cada letra en binario,-join
todas juntas para formar una cadena sólida y-replace
todas las0
s sin nada. Luego contamos el.length
de esa cadena y la tomamos mod-2 para determinar si es par o impar, lo que convenientemente será0
o1
, perfecto para el-xor
.Volveremos
True
o enFalse
consecuencia. Ver casos de prueba a continuación:fuente
Factor, 85 bytes
Por alguna razón, no pude entender esto hasta hace unos minutos, cuando simplifiqué (¿y quizás acorté?) El código.
?
es como un operador ternario: prueba la veracidad del tercer elemento de la pila y selecciona eltrue
valor o elfalse
valor.Es más o menos equivalente al siguiente pseduocode tipo C:
El resto del código es bastante simple:
fuente
Código de máquina IA-32, 15 bytes
Hexdump:
Código de montaje:
Esta es una función que recibe su primer argumento (cadena) en
ecx
y su segundo argumento (char) endl
. Devuelve el resultadoeax
, por lo que es compatible con lafastcall
convención de llamada.Este código dobla las reglas cuando usa la
setpo
instrucción:Esta instrucción establece
al
el bit de paridad calculado por la instrucción anterior, por lo que tengo estos dos detalles sobre las reglas:xor
) la que calcula el bit de paridad. Lasetpo
instrucción solo lo mueve alal
registro.Estos detalles semánticos fuera del camino, aquí está la explicación de lo que hace el código.
Las representaciones de los personajes son:
Si agregamos 1 a ellos, tienen la paridad correcta:
Entonces
XOR
todos los caracteres de la cadena, inicializandoal
a estos valores, lo que da la respuesta.La primera instrucción es en
movzx eax, dl
lugar de la más obvia (y más corta)mov al, dl
, porque quiero tener el número 0 en un registro (ah
en este caso) para poder compararlo en el orden correcto (en0, [ecx]
lugar de[ecx], 0
).fuente
Julia,
58474540 bytesEsta es una función que acepta una cadena y un carácter y devuelve un entero.
Para obtener el número de unos en la representación binaria, primero aplicamos la
bin
función a cada carácter en la cadena, lo que nos da una matriz de cadenas binarias. Luego, reduzca a uno usandoprod
(ya que*
es la concatenación de cadenas en Julia) y tome la intersección establecida de esa cadena y el código de caracteres para1
, lo que nos da una cadena de unos. El último índice de esa cadena es el número de unidades. XOR esto con 1 si el carácter proporcionado es o y 0 de lo contrario, entonces obtenemos la paridad usando bit a bit AND 1.Pruébalo en línea! (incluye todos los casos de prueba)
¡Ahorró 18 bytes gracias a Dennis!
fuente
05AB1E ,
15, 13 bytesCódigo:
Entrada de ejemplo:
Salida de ejemplo:
Explicación:
Gracias a Adnan por guardar 2 bytes.
fuente
²
comando. Esto empuja automáticamente la segunda entrada en la parte superior de la pila. Además, las cadenas de dos caracteres se pueden acortar usando„
. Entonces"oe"
es equivalente a„
. Para 13 bytes:€ÇbSOÈ„oe²k<^
:)Ruby, 57 bytes
Si
0
fue falsey en Ruby,==
probablemente podría cambiarse a solo-
, o podría haber otras optimizaciones, pero no lo es.fuente
Retina , 102 bytes
Toma la cadena en la primera línea y la letra en la segunda línea. Utiliza la codificación ISO 8859-1.
Pruébalo en línea
La clase de caracteres en la primera línea coincide con cualquier carácter con un número impar de unos en la representación binaria.
Descripción de cómo funciona la detección par / impar con expresiones regulares aquí .
fuente
Octava, 56 bytes
La
bitunpack
función, para caracteres ASCII, los devuelve en orden little-endian. Entonces, colocando la bandera de paridad al final de nuestra cadena, desempacando todo y soltando los últimos 5 bits, podemos resumir todo el mod 2 para nuestra respuesta final.Uso:
fuente
Lisp común, 87
s
.p
en la cadena"oe"
(0 o 1). Por ejemplo, si hay 4 unidades, el resto es cero. Si p eso
, entonces no se debe agregar ningún bit adicional y la prueba devuelve falso.Bonito estampado
fuente
Java, 91 bytes
Hice lo mismo que @ CAT97, pero eliminé algunos caracteres usando el módulo 8 y concatenado de @Luis Mendo y el uso de int en lugar de boolean.
Esta es una lambda para a
BiFunction<String, Character, Boolean>
.fuente
Matlab, 49 bytes
dónde:
Por ejemplo:
fuente
Herramientas Bash y Unix (72 bytes)
Excepciones
s
como el primer yp
el segundo argumento. Afortunadamente, los últimos 3 bits deo
ye
tiene paridad par e impar, respectivamente.El suministro de la entrada a través de
<<<
agrega un carácter de avance de línea, pero la paridad de\n
es par, por lo que no es un problema.fuente