Piszę poprawną kombinację zer i jedynek

9

Niedawno wspomniałem o utworze „ Textpert” na temat pisania SMS-ów podczas jazdy, a jedna konkretna linijka tego utworu zainspirowała to wyzwanie.

Nigdy nie pochylałem się tak nisko, by pisać zdjęcia / Zamiast tego piszę poprawną kombinację zer i jedynek

Oczywiście, byłoby to prawie niemożliwe do zrobienia w głowie, więc powinieneś pomóc programistom na całym świecie, kodując program, który robi to samo.

Twoim zadaniem jest przyjęcie nazwy pliku obrazu o wymiarach 500x500pikseli i wysłanie pliku jako pliku binarnego. Możesz również wziąć obraz jako dane wejściowe, jeśli Twój język go obsługuje.

Możesz używać plików graficznych z rozszerzeniami

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

Pozwól, że zademonstruję, jak przekonwertować obraz na plik binarny dla tych, którzy nie rozumieją, o co mi chodzi.

Krok 1

Weź pierwszy piksel z pliku i pobierz jego wartość RGB jako 3 liczby dziesiętne: R, G i B. Załóżmy na przykład, że pierwszy piksel to 255,0,0(czerwony).

Krok 2

Przekształć każdą liczbę w 8-bitową reprezentację binarną i połącz w jedną 24-bitową liczbę. Na przykład daje to111111110000000000000000

Krok 3

Dodaj ten 24-bitowy numer do końcowego wyniku. Dlatego końcowy wynik powinien składać się z 6000000cyfr i powinien składać się całkowicie 1i0

To jest więc najkrótszy kod wygrywa!

Cairney Coheringaahing
źródło
1
Czy możesz podać dane wejściowe. Czy nazwa pliku może działać tylko z możliwym wejściem, czy też języki, które zezwalają na wprowadzanie obrazów, używają tego?
Ian Miller
Jakie formaty obrazów muszą być obsługiwane? Czy mogę wybrać (lub wymyślić) format obrazu?
L3viathan
Dodatkowo, czy chcesz, aby wyprowadzał jedynki i zera na standardowe wyjście (czy to musi być ciąg znaków, czy może być tablicą liczb całkowitych), czy faktycznie tworzy nowy plik z danymi w nim zawartymi?
Ian Miller
Dane wyjściowe @IanMiller mogą być dowolną akceptowaną metodą tutaj, a dane wejściowe mogą być nazwą pliku lub obrazem, jeśli obsługujesz tę funkcję.
caird coinheringaahing
Czy masz jakieś testcases?
Erik the Outgolfer,

Odpowiedzi:

4

Pyth , 14 13 bajtów

-1 bajt dzięki Erikowi Outgolferowi ( zmożna go usunąć dla niejawnego wejścia).

sm.[\08.Bd.n'

Objaśnienia

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

Niestety, ze względów bezpieczeństwa nie można tego sprawdzić przy pomocy tłumacza online ; będziesz musiał sklonować Pytha, aby przetestować go na swoim komputerze.

Jim
źródło
1
Możesz założyć cytowane dane wejściowe i usunąć z.
Erik the Outgolfer,
4

MATL , 13 12 bajtów

YiH&!8&YB!1e

Akceptuje nazwę pliku jako ciąg znaków jako dane wejściowe. Wyjściowe liczby 24-bitowe są wyświetlane w kolejności rzędów głównych.

Niestety ze względów bezpieczeństwa nie działa to w tłumaczach internetowych. Oto zrzut ekranu z pracy na moim komputerze lokalnym

wprowadź opis zdjęcia tutaj

Oto nieco zmodyfikowana wersja, w której ręcznie tworzę obraz 2 x 2 x 3, a następnie używam (prawie) tego samego kodu, aby go przetworzyć.

Wyjaśnienie

        % 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
źródło
2

Mathematica, 103 bajty

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


pobiera obraz x.bmp (lub dowolny inny) i konwertuje go do pliku x.txt

J42161217
źródło
Zamiast tego PadLeftmożesz użyć trzeciego argumentu IntegerDigits(tj.IntegerDigits[#,2,8]&
JungHwan Min
masz absolutną rację! Zapomniałem, że mogę to wykorzystać!
J42161217,
Jedynym błędem był brakujący „Import []”, ponieważ testowałem go za pomocą obrazu. Wszystko działa teraz dobrze. Czy testujesz zaktualizowany kod (?), Ponieważ nie używam PadLeft
J42161217,
Ups, nie odświeżałem się, więc patrzyłem na starą wersję.
Ian Miller
W oparciu o reguły możesz zaoszczędzić kilka bajtów, pisząc je jako funkcję, która wprowadza obraz i wysyła na standardowe wyjście, zamiast używać opcji Import„Eksportuj”.
Ian Miller
2

C #, 309 bajtów

Mój drugi kod golfowy, jeśli nie możesz powiedzieć. Wykonuje zdjęcie 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
źródło
Niezła próba i witamy na stronie! Nie znam C #, więc nie mogę dać ci golfa, ale jestem pewien, że inni to zrobią!
caird coinheringaahing
1

Oktawa, 46 bajtów

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

Tworzy anonimową funkcję o nazwie, ansktórą można wywołać za pomocą nazwy pliku ( ans('file.png')) lub adresu URL ( ans('http://image.png'))

Suever
źródło