El escenario
Últimamente has notado un comportamiento extraño con tu editor de texto favorito. Al principio parecía que estaba ignorando caracteres aleatorios en su código al escribir en el disco. Después de un tiempo notó un patrón; Se ignoraron los caracteres con valores ASCII impares. Bajo una inspección adicional descubrió que solo puede escribir en archivos correctamente si cada octavo bit es cero. Ahora necesita saber si sus archivos valiosos se han visto afectados por este extraño error.
La tarea
Debe escribir un programa completo que determine si un archivo contiene bytes impares (lo que demuestra que no está dañado). Pero debido a su editor de texto, no puede escribir bytes impares en su código fuente. Puede asumir cualquier codificación preexistente para la entrada, sin embargo, aún debe verificar cada byte individual, no solo los caracteres.
Entrada
Su programa tomará el contenido o la ruta a un archivo desde stdin o línea de comando.
Salida
Su programa generará en stdout un valor verdadero si el archivo dado contiene un byte impar o falso si cada octavo bit es cero.
Criterios
Este es el código de golf, el programa más corto que completa la tarea gana. Para ser un envío válido cada octavo bit en el código fuente de los archivos debe ser un cero. Recomendaría incluir una copia de los binarios de su código fuente en su envío.
Se aplican lagunas estándar .
Casos de prueba
(En codificación ASCII) Entrada:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Consejos
Elija el idioma sabiamente, este desafío podría no ser posible en todos los idiomas
El comando Unix
xxd -b <file name>
imprimirá los binarios de un archivo en la consola (junto con algunas cosas de formato adicionales)Puede usar otras codificaciones que no sean ASCII, como UTF-8, siempre que se sigan todas las demás reglas
fuente
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
son los caracteres ASCII imprimibles prohibidos, para cualquier persona que se preocupe. Los caracteres ASCII imprimibles permitidos son" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
tiene un bit extraño. Esperaba que WhiteSpace estuviera a salvo, pero desgraciadamente[TAB]
. Si quieres ir a la vieja escuela, EBCDIC te da tres vocales.Respuestas:
GS2 , 4 bytes
Pruébalo en línea!
Hexdump
Cómo funciona
fuente
Befunge, 36 bytes
Sé que esta es una vieja pregunta, pero quería intentarlo porque pensé que sería un desafío interesante en Befunge.
Pruébalo en línea!
Sale
1
si la entrada está dañada (es decir, contiene un byte impar) y0
si está bien.Explicación
El problema es cómo determinar bytes impares sin tener acceso a los comandos
/
(dividir) o%
(módulo). La solución fue multiplicar el valor por 128 (la secuencia28*8**
), luego escribir ese resultado en el campo de juego. En un intérprete estrictamente estándar, las celdas del campo de juego son valores de 8 bits con signo, por lo que un número impar multiplicado por 128 se trunca a -1 mientras que un número par se convierte en 0.El otro truco fue leer el -1 o 0 desde el campo de juego sin tener acceso al
g
comando (get). La solución para esto era escribir el valor en el medio de una secuencia de cadena existente (" "
), luego ejecutar esa secuencia para empujar el valor encerrado en la pila. En ese punto, determinar la rareza del byte es una simple prueba de menos de cero.Un aspecto final que vale la pena discutir es el resultado. En el caso falso, alcanzamos la
>$.
secuencia con solo un valor en la pila, por lo que$
borra la pila haciendo que la.
salida sea cero. En el caso verdadero, seguimos el camino20`:>$.
. Como dos es mayor que cero, la comparación empuja un uno a la pila, y:
hace una copia duplicada para$
que no se caiga antes de que salga.fuente
CJam (11 bytes)
Demostración en línea
Eliminando los trucos para evitar bytes impares, esto se reduce a
que lee la entrada, asigna un AND bit a bit
1
y luego realiza una conversión de base, dando cero si todos los AND fueran cero.fuente
:(
Archivo .COM imprimible, 100 bytes
Hexdump:
Usando una definición muy flexible de la fuente como algo que puede ser escrito razonablemente por un humano e inspirado en el archivo de prueba de antivirus estándar EICAR (más información en "Diviértase con el archivo de prueba EICAR" en Bugtraq).
Usando solo bytes ASCII no impares imprimibles (nota al margen: los códigos de operación que afectan a las palabras tienden a ser extraños, el bit W es el lsb de algunos códigos de operación), construye un fragmento de código en SP (que convenientemente establecemos justo después de nuestro código de generación) , y la ejecución termina cayendo al código generado.
Utiliza el hecho de que la pila inicialmente contiene un puntero cercano al inicio de la PSP, y que el inicio de la PSP contiene la
INT 20h
instrucción (más información sobre esto en https://stackoverflow.com/questions/12591673/ ).Fuente real:
fuente
MATL , 7 bytes
El código fuente usa codificación UTF-8. Entonces los bytes de origen son (en decimal)
La entrada es un nombre de archivo, tomado como una cadena entre comillas simples. La salida es el número de bytes impares en el archivo, lo cual es cierto si no es cero.
Explicación
fuente
CJam,
181715 bytesAsume que la configuración regional está establecida en Latin-1. Pruébalo en línea!
Cómo funciona
La solución directa es la siguiente.
Lamentablemente, los caracteres
q
yi
no pueden aparecer en el código fuente. Para solucionar este problema, crearemos dinámicamente parte del código fuente anterior y luego evaluaremos la cadena.fuente
Pyth,
2013 bytesO en binario:
Pruébalo en línea
Cómo funciona
El entero resultante es verdadero (distinto de cero) si alguno de los bytes fuera impar.
fuente
Jalea , 13 bytes
Espera la entrada como un argumento de línea de comandos entre comillas. Pruébalo en línea!
Hexdump
fuente
O%2¬Ạ¬
.Retina , 106 bytes
Elimina todos los caracteres permitidos, luego coincide con los caracteres restantes. Los valores de verdad serán la cantidad de caracteres encontrados. Los valores de Falsey serán
0
.Pruébalo en línea
Como
.
no coincide con las nuevas líneas de forma predeterminada, no tengo que eliminarlas.fuente
Perl 5 +
-p0
, 136 bytesSimilar a otras respuestas, esto elimina todos los bytes pares y deja los bytes impares (lo cual es cierto).
Pruébalo en línea!
fuente
-0
no hace nada a las nuevas líneas. Solo determina cómo dividir la entrada, no elimina ningún carácter.-0
, quería hacer todo el bloque como un bulto, pero eso no debería importar, pero no puedo evitar esto ... ¡Lástima! Limpiaré estos comentarios. Gracias por el aviso!Japt , 10 bytes
Pruébalo en línea!
La página de códigos de Japt es ISO-8859-1. El código da
false
cuando se ingresa como una cadena, por lo tanto, un envío válido.Desempaquetado y cómo funciona
No tener
String.c
(obtener charcode o mapear sobre códigos de char) fue un dolor, pero afortunadamente lo hayNumber.d
(convertir número a char).Resulta que Japt gana a CJam, Pyth y Jelly :)
Sin la restricción, hay un par de formas de hacerlo en 6 bytes (a la par con CJam y Jelly nuevamente):
"000..000"
se convierte al número 0 (falso) independientemente de cuánto tiempo sea. Por otro lado, cualquier cosa que contenga 1 se convierte en un valor distinto de cerodouble
, oInfinity
si es demasiado grande (ambos de verdad).Enfoque más directo que rinde directamente
true
ofalse
.O incluso, la solución de 5 bytes es posible con la ayuda de
-d
flag:fuente