Alfabet flagi Międzynarodowego Kodeksu Sygnałów jest wykorzystywany przez statki do komunikacji, szczególnie w przypadku sygnałów statycznych.
Wyzwaniem jest napisanie programu lub funkcji, która pobierze ciąg znaków ze STDIN lub jako argument i wyświetli odpowiedni tekst w alfabecie flagi ICS. Jeśli Twój język nie wyświetla się na ekranie, zapisywanie do pliku jest dopuszczalne.
Twój program lub funkcja obsługuje litery AZ pisane wielkimi i małymi literami oraz spację i znak nowej linii . Zachowanie z innymi postaciami jest niezdefiniowane.
Wyświetlacz musi być wystarczająco duży, aby wyświetlać co najmniej 8 flag w poziomie i 6 flag w pionie. Zachowanie jest niezdefiniowane, jeśli prawy brzeg zostanie osiągnięty przed otrzymaniem nowej linii lub jeśli wiadomość jest zbyt długa, aby zmieścić wyświetlacz pionowo.
Alfabet flagi jest pokazany poniżej (litery rzymskie służą wyłącznie jako odniesienie, nie są wymagane na wyjściu).
Wymiary
Nie ma uniwersalnie uzgodnionej normy dotyczącej wymiarów tych flag, dlatego do celów tego wyzwania obowiązują następujące zasady:
Flagi powinny mieć wymiary 60 x 60 pikseli, z odstępem 30 pikseli między nimi zarówno w poziomie, jak i w pionie.
Głębokie cięcie na A i B powinno mieć 15 pikseli głębokości.
Wszystkie pozostałe linie muszą być poziome, pionowe lub pod kątem 45 stopni.
Obiekty należy zlokalizować, dzieląc flagę na wyobrażoną siatkę NxN o boku 3,4,5 lub 6 kwadratów. Zobacz powyższy obraz, ale dla dalszego wyjaśnienia:
A, E, H, K, L i U są oparte na siatce 2x2: szerokość każdej strefy kolorów wynosi 30 pikseli. Również punkty diamentu w F powinny znajdować się w połowie długości po każdej stronie flagi.
J i T oparte są na siatce 3x3: każde pasmo ma 20 pikseli.
P, N i S oparte są na siatce 4x4. Również ukośne linie Y podzielą krawędzie flagi na 4.
C, D, R i X będą oparte na siatce 5x5. Pasma i ramiona krzyży powinny mieć szerokość 12 pikseli.
G, W, M, V oparte są na siatce 6x6. Pasma G i granice W mają szerokość 10 pikseli. Ramiona krzyżyków na M i V powinny obejmować pierwsze i ostatnie 10 pikseli każdej krawędzi flagi, pozostawiając strefy trójkąta o długości 40 pikseli wzdłuż długiej krawędzi.
Okrąg I powinien znajdować się na środku flagi i mieć średnicę 30 pikseli.
Dozwolony jest błąd +/- 1 piksela w powyższym tekście. Jeśli Twój język obsługuje tylko skalowalną grafikę, możesz interpretować „piksele” jako „jednostki”.
Zabarwienie
Kolory powinny być czerwony, biały, niebieski, żółty i czarny, zgodnie z językiem lub dokumentacją. Jeśli twój język nie definiuje kolorów, możesz użyć następujących elementów: Czerwony FF0000, Biały FFFFFF, Niebieski 0000FF, Żółty FFFF00, Czarny 0000000.
Tło powinno być szare (kanały r, gib są równe, intensywność między 25% a 75%).
Punktacja / Luki
To jest codegolf. Najkrótszy kod w bajtach wygrywa.
Standardowe luki są niedozwolone.
Nie można używać żadnych wbudowanych funkcji bibliotecznych do wyświetlania flag. Dane wyjściowe powinny być nietekstowe (w szczególności do ułożenia flagi nie należy używać znaków Unicode).
Przykład
JFK got
my VHS
PC
and XLR
web quiz
powinien produkować następujące
źródło
Odpowiedzi:
CJam, 464 bajty
Myślałeś, że CJam nie ma funkcji manipulacji obrazem? Cóż, pomyślałeś dobrze! Ale nie chciałem, żeby to mnie powstrzymało.
Ten program wysyła obraz w najlepszy sposób, w jaki CJam może: jako tekst reprezentujący obraz, gdy jest zapisany jako plik PPM . Nawiasem mówiąc, nawet nie próbuj uruchamiać go z tłumaczem online; zdmuchniesz stos. Uruchom go za pomocą interpretera Java i potokuj dane wyjściowe do pliku za pomocą polecenia podobnego do
java -jar cjam-0.6.4.jar flags.cjam > flags.ppm
. Po wprowadzeniu danych wyślij EOF (może być konieczne natychmiast po nowej linii) z ctrl + D w systemie Unix lub ctrl + Z w systemie Windows.Próba
Jeśli jest to naprawdę pożądane, mogę spróbować gdzieś wkleić oryginalne źródło ~ 3 MB obrazu. Ale oto wynik otwarty w GIMP i przekazany do PNG:
Wyjaśnienie
Nagłówek obrazu, łatwo identyfikowalny w źródle, składa się z magicznej liczby, szerokości, wysokości i maksymalnej wartości kanału. Tak więc obrazem wyjściowym jest obraz 690 * 690 (wystarczający dla flag 8 * 8 60px z odstępami 30px) z każdą wartością R, G i B w zakresie od 0 do 4.
Dane obrazu są inicjowane jako tablica 690 * 690 * 3 wypełniona trójkami, dzięki czemu cały obraz jest jasnoszary. Następnie dane wejściowe są odczytywane, konwertowane na wielkie litery i dzielone na linie. Linie są przetwarzane w pętli, zwiększając współrzędną flagi Y o 90 w każdej iteracji, aw każdym wierszu każdy znak jest przetwarzany w pętli, zwiększając współrzędną flagi X o 90 w każdej iteracji. Teraz zaczyna się magia.
Każdy znak jest odwzorowany na funkcję piksela flagi, która po wywołaniu zwraca kolor piksela w pozycji (X, Y) na fladze. Właśnie tam poszła większość ciężkiej pracy: zwięzłe opisanie 26 obrazów jako funkcji matematycznych. Każda z tych funkcji zwraca wartość koloru od 8-15. Ten zakres wykorzystuje fakt, że po przekonwertowaniu na bazę 2 wynikową tablicę bitów można interpretować jako [1, R, G, B]. Pierwszy element można usunąć, a resztę pomnożyć przez 4, aby łatwo podać wartość piksela w żądanym formacie, który obejmuje wszystkie możliwe kolory flag (a także zielony, cyjan i magenta). Ładnie działa również to, że zmienne jednoznakowe są inicjowane na 10-15, a ponieważ zmienne nie potrzebują spacji do ich syntaktycznego rozdzielenia,
Po pobraniu funkcji wystarczy powtórzyć X i Y od 0 do 60, wywołać funkcję na każdym kroku i zapisać wynik z powrotem do tablicy danych obrazu. Bystry obserwator może zauważyć, że wartości kolorów zwracane przez każdą funkcję flagi nie zezwalają na kolor szary. Jest więc trochę dodatkowej logiki do pomijania spacji. Ale nadal istnieją cięcia typu „swallowtail” na „A” i „B”. Jest też trochę dodatkowej logiki. Jeśli wartość znaku jest mniejsza niż „C”, wartość jest ustawiana w taki sposób, że górna granica na pętli X zmienia się poprawnie w odniesieniu do Y, a obszary wycięcia nigdy nie są rysowane.
Ogólnie jestem bardzo zadowolony z tego, jak to wyszło. Zajęło to dużo pracy, ale było fajnie. Niektóre flagi nie pasują idealnie do obrazu odniesienia, ale myślę, że wszystkie kształty znajdują się w odległości 1 piksela od celu (jeśli jakieś są wyłączone o więcej niż to, daj mi znać, a ja je naprawię). I zdecydowanie istnieje potencjał do optymalizacji, ponieważ istnieje znaczna nadmiarowość między 26 funkcjami flagi.
Niepokojąca pierwsza próba, 559 bajtów
Chociaż nigdy tego nie skończyłem, opublikuję to, ponieważ jest dość interesujące. Zamiast modelować każdą flagę za pomocą funkcji (X, Y) → kolor, flagi są rysowane jako kompozycja prostych kształtów. Martwiłem się jednak o konieczność napisania znacznej ilości kodu renderującego dla każdego innego kształtu. Po wielu rozmyślaniach zdałem sobie sprawę, że mogę je wszystkie renderować, z pewnym sprytnym nakładaniem się i nakładaniem, za pomocą tylko jednego pseudo-kształtu: wszystkie punkty w określonej odległości od określonego punktu, gdzie definicja „odległości” jest zmienna. Odległość od szachownicy daje kwadrat, odległość Manhattan daje diament, a odległość euklidesowa daje okrąg. Oznaczało to, że każdy kształt miał te same pięć parametrów (kolor, tryb odległości, x, y,
źródło
PHP, 811 bajtów
Skompresowany obiekt blob zawiera kod SVG dla każdej z 26 flag. Prosta pętla następnie wyodrębnia i wysyła obraz SVG odpowiadający każdemu znakowi wejścia.
Przykładowe dane wyjściowe dla „To jest
\n
test”:( Możesz to wypróbować na ideone , chociaż nie wyrenderuje strony za ciebie).
źródło