Mi compañero de trabajo y yo trabajamos en un software heredado que a veces odiamos. Cada vez que lo ejecutas, las afirmaciones de depuración vienen volando por todas partes, y nunca es una garantía de que algo funcione. La motivación para esta ronda de golf de código vino de mi compañero de trabajo diciendo lo siguiente sobre nuestro software .
"Es como si cada vez que ejecutas este programa, aceptas algunos términos de servicio que dicen que cada bit 17 en tu disco duro se convertirá en un 1".
Objetivo: escribir un programa que haga una copia exacta de un archivo y convierta cada bit 17 de un archivo de texto en un 1
- NO puede convertir CADA bit del archivo a 1. es decir, su programa debe mostrar cierta inteligencia de que solo se dirige a cada bit 17
- NO puede escribir en el archivo original de ninguna forma o forma
- El ganador es la presentación de programa más pequeña a fin de mes
Diviértete con este! ¡Vamos!
code-golf
, es decir, el código más corto en bytes gana. Acode-challenge
necesita un sistema de puntuación bien especificado. 2. Convertir cada 18 bits de un disco duro en 1 solo es posible escribiendo directamente en el disco. Esto no se puede lograr creando y / o modificando archivos. 3. Hacer esto hará que toda la unidad quede inutilizable, por lo que una solución compatible será destructiva. No sé qué tan bien la comunidad recibirá una solicitud para escribir malware ...:/
Respuestas:
CJam, 22 bytes
Pruébalo en línea.
Toca cada bit 17, contando desde el último.
He usado STDIN y STDOUT ya que CJam no tiene E / S de archivo. Si eso no está permitido, el programa se puede incluir en un script Bash a un costo de 24 bytes adicionales:
Cómo funciona
fuente
Perl 59
sustitución de expresiones regulares en cadenas de bits:
uso:
fuente
b
yB
en laspack
plantillasC, 125
Asume enteros big-endian y de 16 bits .
Funciona aplicando un bit-OR en cada dos bytes.
El archivo de entrada es
y
, la salida esz
.Sin golf
fuente
00000000 00000001 00000000 00000000 10000000 00000000
pora
lo tanto, debería ser cero en ciertos puntos. La máquina debe usar big endian (o de lo contrario lo tendría en00000000 10000000
lugar de10000000 00000000
, lo que daría un valor incorrecto).c = __builtin_bswap16(c);
corrigió.Python 2, 112 bytes
Esto establece cada 17 bit big-endian, comenzando 17 desde el principio. No usa bibliotecas. Funciona convirtiendo el archivo de entrada en un
n
entero de bits gigantesco y ORing bit a bit2**n/(2**17 - 1) == 0b10000000000000000100000000000000001…
.fuente
C - 139
Lee desde un archivo llamado "i", da salida a un archivo llamado "o".
Con saltos de línea:
Cuenta los bits de entrada y luego usa una máscara de bits flotante para establecer cada decimoséptimo bit.
fuente
Java - 247
Utiliza ay un
BitSet
bucle simple en lugar de manejar / enmascarar los bytes manualmente. Por supuesto, esto es java, el repetitivo es la mitad del programa, por lo que no es exactamente corto.Aún así, no dura. :RE
Versión sin desplazamiento:
fuente
Python - 98 bytes
Leer de i, escribir a o. Utiliza la biblioteca bitarray https://pypi.python.org/pypi/bitarray
sin golf
fuente
a[::17]=1
?from bitarray import*
ya=bitarray()
.Cobra - 308
Cada vez que hago uno de estos desafíos de "manipular los bits individuales de algo", deseo que Cobra o la biblioteca estándar .NET tengan un
binary string => integer
convertidor.fuente
Javascript (+ HTML5), 282
Probablemente no sea el más corto, pero es fácil de usar: D
Es un navegador cruzado, pero parece que Chrome es el único que lo permite cuando el archivo html es un archivo local (= acceso con
file://...
). Para los otros navegadores, debe colocarlo en un servidor web.El archivo de salida debe guardarse en el directorio de descarga predeterminado, tal vez con una solicitud de archivo (según su configuración).
Versión sin golf:
fuente
Python 3 - 187 bytes
Lee
i
y escribe desdeo
.Código:
Sin golf:
fuente
Python 3 - 103 caracteres
Cambie
f
a la ruta del archivo que desea leer yo
a la ruta del archivo en el que desea escribir.fuente