Eu texto a combinação correta de uns e zeros

9

Recentemente, listei a música que sou especialista em mensagens de texto enquanto dirigia e uma linha específica da música inspirou esse desafio.

Nunca desço tão baixo a ponto de enviar fotos de texto / Em vez disso, escrevo a combinação correta de zeros e zeros

Agora, obviamente, isso seria algo quase impossível de se fazer na cabeça e, portanto, você deve ajudar os especialistas em texto em todo o mundo codificando um programa para fazer a mesma coisa.

Seu trabalho é pegar o nome de um arquivo de imagem com as dimensões de 500x500pixels e gerar o arquivo como binário. Você também pode capturar uma imagem como entrada, se o idioma suportar.

Você pode usar arquivos de imagem com as extensões

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

Permita-me demonstrar como converter uma imagem em binária, para quem não entende o que quero dizer.

Passo 1

Pegue o primeiro pixel no arquivo e recupere seu valor RGB como 3 números decimais: R, G e B. Vamos supor, por exemplo, que o primeiro pixel seja 255,0,0 (vermelho).

Passo 2

Converta cada número em sua representação binária de 8 bits e concatene em um único número de 24 bits. Por exemplo, isso gera111111110000000000000000

etapa 3

Adicione esse número de 24 bits à saída final. Portanto, a saída final deve ter 6000000dígitos longos e deve consistir inteiramente de1 e0

Este é um então o código mais curto vence!

caird coinheringaahing
fonte
11
Você pode especificar a entrada. O nome do arquivo funciona na única entrada possível ou os idiomas que permitem imagens como entrada podem ser usados?
Ian Miller
Que tipo de formato de imagem precisa ser suportado? Posso escolher (ou inventar) um formato de imagem?
L3viathan
Além disso, para saída, você deseja que os zeros e zeros sejam enviados para a saída padrão (isso precisa ser uma string ou pode ser uma matriz de números inteiros) ou criar um novo arquivo com os dados?
Ian Miller
A saída do @IanMiller pode ser qualquer método aceito aqui e a entrada pode ser um nome de arquivo ou uma imagem, se você aceitar isso.
caird coinheringaahing
Você tem algum caso de teste?
Erik the Outgolfer

Respostas:

4

Pitão , 14 13 bytes

-1 byte graças a Erik the Outgolfer ( zpode ser removido para entrada implícita).

sm.[\08.Bd.n'

Explicações

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

Infelizmente, por motivos de segurança, isso não pode ser testado com o intérprete on - line ; você precisará clonar Pyth para testá-lo em seu próprio computador.

Jim
fonte
11
Você pode assumir a entrada citada e remover z.
Erik the Outgolfer
4

MATL , 13 12 bytes

YiH&!8&YB!1e

Aceita um nome de arquivo como uma string como entrada. Os números de 24 bits de saída são exibidos na ordem principal das linhas.

Infelizmente, isso não funciona nos intérpretes online por razões de segurança. Aqui está uma captura de tela dele trabalhando na minha máquina local

insira a descrição da imagem aqui

Aqui está uma versão ligeiramente modificada na qual eu crio manualmente uma imagem 2 x 2 x 3 e depois uso (quase) o mesmo código para processá-la.

Explicação

        % 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
fonte
2

Mathematica, 103 bytes

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


pega uma imagem x.bmp (ou qualquer outra) e a converte em arquivo x.txt

J42161217
fonte
Em vez de PadLeft, você poderia usar o terceiro argumento de IntegerDigits(ieIntegerDigits[#,2,8]&
JungHwan Min
você está absolutamente certo! Eu tinha esquecido que poderia usar isso!
J42161217
O único erro foi o "Import []" ausente porque eu estava testando-o com uma imagem. Tudo funciona bem agora. Você está testando o código atualizado (?) Porque eu não uso o PadLeft
J42161217
Opa, eu não tinha atualizado, então estava olhando para uma versão antiga.
Ian Miller
Com base nas regras, você pode salvar um monte de bytes, escrevendo-a como uma função que insere uma imagem e gera a saída padrão em vez de usar Import`Exportar '.
Ian Miller
2

C #, 309 bytes

Meu segundo código de golfe, se você não sabe. Tira uma imagem 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
fonte
Boa tentativa e bem-vindo ao site! Eu não sei C #, então não posso dar-lhe nenhum golfe, mas tenho certeza que outros o farão!
caird coinheringaahing
1

Oitava, 46 bytes

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

Cria uma função anônima chamada ansque pode ser chamada com um nome de arquivo ( ans('file.png')) ou uma URL ( ans('http://image.png'))

Suever
fonte