Je texto le bon combo de uns et de zéros

9

J'ai récemment énuméré la chanson I'm a Textpert sur les textos en conduisant et une ligne particulière de la chanson a inspiré ce défi.

Je ne me baisse jamais aussi bas que pour envoyer des photos par texte

Maintenant, évidemment, ce serait une chose presque impossible à faire dans sa tête et vous devriez donc aider les experts du monde entier en codant un programme pour faire la même chose.

Votre travail consiste à prendre le nom d'un fichier image avec les dimensions 500x500pixels et à sortir le fichier en binaire. Vous pouvez également prendre une image en entrée, si votre langue la prend en charge.

Vous pouvez utiliser des fichiers image avec les extensions

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

Permettez-moi de montrer comment convertir une image en binaire, pour ceux qui ne comprennent pas ce que je veux dire.

Étape 1

Prenez le premier pixel du fichier et récupérez sa valeur RVB sous forme de 3 nombres décimaux: R, G et B. Supposons, par exemple, que le premier pixel soit 255,0,0(rouge).

Étape 2

Convertissez chaque nombre en sa représentation binaire 8 bits et concaténez en un seul nombre 24 bits. Pour l'exemple, cela donne111111110000000000000000

Étape 3

Ajoutez ce nombre de 24 bits à la sortie finale. Par conséquent, la sortie finale doit être 6000000longue de chiffres et doit être entièrement 1et0

C'est un donc le code le plus court gagne!

caird coinheringaahing
la source
1
Pouvez-vous s'il vous plaît spécifier l'entrée. Le nom de fichier doit-il fonctionner sur la seule entrée possible ou les langues qui autorisent les images en entrée peuvent-elles l'utiliser?
Ian Miller
Quels types de formats d'image doivent être pris en charge? Puis-je choisir (ou inventer) un format d'image?
L3viathan
De plus, pour la sortie, voulez-vous qu'il sorte les uns et les zéros vers la sortie standard (cela doit-il être une chaîne ou peut-il être un tableau d'entiers) ou réellement créer un nouveau fichier avec les données qu'il contient?
Ian Miller
La sortie @IanMiller peut être n'importe quelle méthode acceptée ici et l'entrée peut être un nom de fichier ou une image, si vous le supportez.
caird coinheringaahing
Avez-vous des testcases?
Erik the Outgolfer

Réponses:

4

Pyth , 14 13 octets

-1 octet grâce à Erik l'Outgolfer ( zpeut être supprimé pour une entrée implicite).

sm.[\08.Bd.n'

Explications

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

Malheureusement, pour des raisons de sécurité, cela ne peut pas être testé avec l' interprète en ligne ; vous devrez cloner Pyth pour le tester sur votre propre ordinateur.

Jim
la source
1
Vous pouvez assumer l'entrée supprimée et la supprimer z.
Erik the Outgolfer
4

MATL , 13 12 octets

YiH&!8&YB!1e

Accepte un nom de fichier sous forme de chaîne en entrée. Les nombres de 24 bits en sortie sont affichés dans l'ordre des lignes principales.

Malheureusement, cela ne fonctionne pas dans les interprètes en ligne pour des raisons de sécurité. Voici une capture d'écran du fonctionnement sur ma machine locale

entrez la description de l'image ici

Voici une version légèrement modifiée dans laquelle je crée manuellement une image 2 x 2 x 3 puis utilise (presque) le même code pour la traiter.

Explication

        % 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
la source
2

Mathematica, 103 octets

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


prend une image x.bmp (ou toute autre) et la convertit en fichier x.txt

J42161217
la source
Au lieu de PadLeft, vous pouvez utiliser le troisième argument de IntegerDigits(ieIntegerDigits[#,2,8]&
JungHwan Min
tu as tout à fait raison! J'avais oublié que je pouvais utiliser ça!
J42161217
La seule erreur était le "Import []" manquant parce que je le testais avec une image. Tout fonctionne bien maintenant. Testez-vous le code mis à jour (?) Car je n'utilise pas PadLeft
J42161217
Oups, je n'avais pas rafraîchi donc je regardais une ancienne version.
Ian Miller
Sur la base des règles, vous pouvez enregistrer un tas d'octets en l'écrivant en tant que fonction qui entre une image et sort en sortie standard plutôt qu'en utilisant Import«Exporter».
Ian Miller
2

C #, 309 octets

Mon deuxième code de golf, si vous ne pouvez pas le dire. Prend une image 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
la source
Belle tentative et bienvenue sur le site! Je ne connais pas C # donc je ne peux pas vous donner de golf mais je suis sûr que d'autres le feront!
caird coinheringaahing
1

Octave, 46 octets

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

Crée une fonction anonyme nommée ansqui peut être appelée avec un nom de fichier ( ans('file.png')) ou une URL ( ans('http://image.png'))

Suever
la source