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!


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.


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

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


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)));}}

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'))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.