Escribo el combo correcto de unos y ceros

9

Recientemente mencioné la canción I'm Textpert sobre mensajes de texto mientras conduzco y una línea en particular de la canción inspiró este desafío.

Nunca me inclino tanto como para enviar mensajes de texto a las fotos / En cambio, escribo el combo correcto de unos y ceros

Obviamente, esto sería algo casi imposible de hacer en la cabeza, por lo que debería ayudar a los expertos en texto en todo el mundo codificando un programa para hacer lo mismo.

Su trabajo es tomar el nombre de un archivo de imagen con los 500x500píxeles de dimensiones y generar el archivo como binario. También puede tomar una imagen como entrada, si su idioma lo admite.

Puede usar archivos de imagen con las extensiones

  • .jpg
  • .png
  • .gif
  • .bmp
  • .svg

Permítanme demostrar cómo convertir una imagen en binario, para aquellos que no entienden lo que quiero decir.

Paso 1

Tome el primer píxel del archivo y recupere su valor RGB como 3 números decimales: R, G y B. Supongamos, por ejemplo, que el primer píxel es 255,0,0(rojo).

Paso 2

Convierta cada número en su representación binaria de 8 bits y concatene en un solo número de 24 bits. Por ejemplo, esto produce111111110000000000000000

Paso 3

Agregue este número de 24 bits a la salida final. Por lo tanto, la salida final debe ser 6000000dígitos de longitud y debe consistir en su totalidad 1y0

Este es un código más corto gana!

caird coinheringaahing
fuente
1
¿Puede por favor especificar la entrada? ¿El nombre de archivo debe funcionar en la única entrada posible o pueden usar los idiomas que permiten imágenes como entrada?
Ian Miller
¿Qué tipo de formatos de imagen deben ser compatibles? ¿Puedo elegir (o inventar) un formato de imagen?
L3viathan
Además, para la salida, ¿desea que produzca los unos y ceros a la salida estándar (¿esto debe ser una cadena o puede ser una matriz de enteros) o realmente crear un nuevo archivo con los datos?
Ian Miller
La salida de @IanMiller puede ser cualquier método aceptado aquí y la entrada puede ser un nombre de archivo o una imagen, si lo admite.
caird coinheringaahing
¿Tienes algún caso de prueba?
Erik the Outgolfer

Respuestas:

4

Pyth , 14 13 bytes

-1 byte gracias a Erik the Outgolfer ( zse puede eliminar para entrada implícita).

sm.[\08.Bd.n'

Explicaciones

sm.[\08.Bd.n'

            '    # Open the path/URL given as implicit input. Return list of color triples for color images: [(255, 125, 23), ...]
          .n     # Flatten the list
 m     .Bd       # For each element of the list, convert to binary
  .[\08          # Pad with zeros on the left up to 8 characters
s                # Concatenate the list of bytes

Desafortunadamente, por razones de seguridad, eso no se puede probar con el intérprete en línea ; Tendrá que clonar Pyth para probarlo en su propia computadora.

Jim
fuente
1
Puede asumir la entrada citada y eliminar z.
Erik the Outgolfer
4

MATL , 13 12 bytes

YiH&!8&YB!1e

Acepta un nombre de archivo como una cadena como entrada. Los números de salida de 24 bits se muestran en orden de fila mayor.

Lamentablemente, esto no funciona en los intérpretes en línea por razones de seguridad. Aquí hay una captura de pantalla que funciona en mi máquina local

ingrese la descripción de la imagen aquí

Aquí hay una versión ligeramente modificada en la que creo manualmente una imagen de 2 x 2 x 3 y luego uso (casi) el mismo código para procesarla.

Explicación

        % Implicitly grab input as a string
Yi      % Read in as an M x N x 3 image
H&!     % Permute the dimensions of the image to be 3 x N x M
8&YB    % Convert to a binary string using 8 bits for each element
!       % Transpose the result
1e      % Reshape to a row vector
        % Implicitly display the result
Suever
fuente
2

Mathematica, 103 bytes

F=Flatten;Export["x.txt",FromDigits@F[IntegerDigits[#,2,8]&/@F[ImageData[Import["x.bmp"],"Byte"],1],2]]


toma una imagen x.bmp (o cualquier otra) y la convierte en archivo x.txt

J42161217
fuente
En lugar de PadLeft, podría usar el tercer argumento de IntegerDigits(es decirIntegerDigits[#,2,8]&
JungHwan Min
¡tienes toda la razón! ¡Había olvidado que podía usar esto!
J42161217
El único error fue la falta "Importar []" porque lo estaba probando con una imagen. Todo funciona bien ahora. ¿Está probando el código actualizado (?) Porque no uso PadLeft
J42161217
Vaya, no me había refrescado, así que estaba viendo una versión antigua.
Ian Miller
Según las reglas, puede guardar un montón de bytes escribiéndolo como una función que ingresa una imagen y sale a la salida estándar en lugar de usar Import'Exportar'.
Ian Miller
2

C #, 309 bytes

Mi segundo código de golf, si no puedes decirlo. Toma una imagen x.jpg ...

using System;using System.Drawing;using System.Linq;class Program{static void Main(string[]a){Bitmap b=(Bitmap)Image.FromFile("x.jpg");Console.WriteLine(string.Join("",from i in Enumerable.Range(0,250000)select Convert.ToString(Convert.ToInt32(b.GetPixel((int)Math.Floor((double)i/500),i%500).Name,16),2)));}}
Harry Wilkins
fuente
Buen intento y bienvenido al sitio! No sé C #, así que no puedo darte ningún golf, ¡pero estoy seguro de que otros lo harán!
caird coinheringaahing
1

Octava, 46 bytes

@(x)dec2bin(permute(imread(x),[3,1,2]),8)'(:)'

Crea una función anónima llamada ansque se puede llamar con un nombre de archivo ( ans('file.png')) o una URL ( ans('http://image.png'))

Suever
fuente