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.