Wyzwanie
Biorąc pod uwagę obraz nieba, musisz wyprowadzić osłonę chmur w oktach. Dostarczony obraz będzie plikiem obrazu (typ zależy od Ciebie), a wyjście powinno mieć format STDOUT.
Oktas
W meteorologii okta jest jednostką miary używaną do opisywania wielkości zachmurzenia w dowolnym miejscu, takim jak stacja pogodowa. Warunki na niebie są szacowane na podstawie tego, ile ósmych nieba jest zachmurzonych, od 0 oktas (całkowicie czyste niebo) do 8 oktas (całkowicie zachmurzone).
Niebo zawsze będzie obrazem z około południa (czyli błękitne niebo, a nie czerwone / nocne niebo).
Kolor chmury zawsze będzie kolorem zgodnym z następującym wzorem:
#ABCDEF
Gdzie AB >= C0
, CD >= C0
iEF >= C0
.
Lub w RGB:
(A, B, C)
Gdzie A >= 192
, B >= 192
iC >= 192
.
Oto procent pokrycia związany z oktami:
0% - 0 oktas
12.5% - 1 okta
25% - 2 oktas
37.5% - 3 oktas
50% - 4 oktas
62.5% - 5 oktas
75% - 6 oktas
87.5% - 7 oktas
100% - 8 oktas
Procenty to procent obrazu, który jest chmurą.
Jeśli procent chmury twojego obrazu nie jest wielokrotnością 12,5, powinieneś zaokrąglić do najbliższego.
Wydajność
Wyjście powinno być po prostu liczbą okta (nie musisz podawać jednostki).
Przykłady
1 okta (18,030743615677714% chmury)
0 okt (0,0% chmury)
3 okty (42.66319444444445% chmury)
1 okta (12.000401814778645% chmury)
Kod Python używany do obliczania liczb
Zwycięski
Najkrótszy kod w bajtach wygrywa.
źródło
Odpowiedzi:
Python 2 ,
11411098 bajtów-4 bajty dzięki TheLethalCoder
-12 bajtów dzięki Ruud
Wypróbuj online!
źródło
191
zamiast tego?x&y&z&192>191
, ale zaktualizowana wersja jest równie krótka.import PIL.Image as P
zfrom PIL.Image import*
i zapisywać 1 bajt kiedy zmieniai=P.open
sięi=open
? Nie wiem, czy to spowodowałoby problemy, ponieważ open jest już zdefiniowaną funkcją, ale nie mogę przetestować, ponieważ nie mam możliwości zainstalowania modułu.MATL ,
1817 bajtówPrzykład działa z czterema dostarczonymi obrazami (przepraszam za jakość podglądu; kliknij, aby uzyskać pełną rozdzielczość):
Lub usuń cztery ostatnie znaki, aby zobaczyć wyniki bez zaokrąglania:
Wyjaśnienie
źródło
Java (OpenJDK 8) , 204 bajty
Wypróbuj online! Zawsze zapominam, że TIO wysyła STDERR do zakładki debugowania. Może w przypadku błędu może podświetlić się na czerwono?
źródło
x
aniy
. Przypisałeśy=0
dwa razy, więc możesz usunąć pierwsze zadanie. KlasaColor
musi być w pełni kwalifikowana (java.awt.Color
) lub musisz uwzględnić import w swojej liczbie bajtów. Twój kod kończy się niepowodzeniem dla 4. przypadku testowego (zwraca 0 zamiast 1).&&
celu&
i,y=0
do,y
: Spróbuj go online.C #,
150146 bajtówZaoszczędzono 4 bajty dzięki @Ian H.
Wersja pełna / sformatowana:
źródło
for(h=0 h<b.Height;++t)
Myślę, że przegapiłeś tam dwukropek/0.125
z*8
na końcu zaoszczędzić kilka bajtów.C #, 313 bajtów
Oczywiście dłuższa niż moja inna odpowiedź, ale ta wykorzystuje
LockBits
iunsafe
kod do bezpośredniego dostępu do obrazu w pamięci; jako taki jest niezwykle szybki. Prawdopodobnie mógłbym usunąć połączenie zUnlockBits
ale jest to bardziej poprawne.Wersja pełna / sformatowana:
źródło
PowerShell , 200 bajtów
Pobiera dane wejściowe
$args[0]
jako pełną ścieżkę pliku obrazu, konstruujeNew
Bitmap
obiekt$a
. To tylko wewnętrzna nazwa obiektu; obsługuje JPG, PNG itp.Następnie podwójnie zapętlamy obraz,
.height
a następnie.width
obraz, dotykając każdego z nichpixel
. Możemy wyciągnąćR,G,B
wartości, a następnie wybrać te, które są-g
reaterthanore
Wyn się192
i upewnij się, żecount
jest3
(czyli wszystkie z nich są biało-owski). Ten wynik logiczny jest dodawany do naszego akumulatora$i
.Następnie dzielimy się, aby uzyskać procent, pomnóż go,
8
aby uzyskać liczbę okt, a następnie,[int]
aby uzyskać tylko liczbę całkowitą. (Pamiętaj, że powoduje to zaokrąglanie za pomocą Bankera - jeśli nie jest to dozwolone, zmiana metody zaokrąglania będzie wymagała kilku kolejnych bajtów).źródło
dc, 74 bajty
Dane wejściowe są traktowane jako plik P3 ppm, a wszystkie białe znaki są znakami nowej linii. Dane wyjściowe to STDOUT.
Wypróbuj online!
źródło
JavaScript,
8377 bajtów-6 bajtów według ETHproductions
Wejścia
Obrazek 1
Zdjęcie nr 2
Zdjęcie nr 3
Zdjęcie nr 4
Próbny
Pokaż fragment kodu
źródło
a=>(b,c,d)
) zamiast wykonywaniaa=>{b;c;return d}
luba=>eval("b;c;d")
. Działa to, chyba że masz jakąś pętlę, w którym to przypadku prawdopodobnie najlepiej będzie użyć tejeval
metody.C (POSIX), 103 bajty
Zakłada wejście jako plik BMP na standardowym wejściu.
źródło
Kod maszynowy x86, 34 bajty
Te bajty kodu definiują funkcję, która pobiera dane bitmapy i zwraca wartość całkowitą wskazującą jej okty. Podobnie jak w C , tablice (podobnie jak mapy bitowe) są reprezentowane jako wskaźnik do pierwszego elementu oraz rozmiar / długość. Tak więc ta funkcja przyjmuje dwa parametry: całkowitą liczbę pikseli na mapie bitowej (wiersze x kolumny) i wskaźnik do samej mapy bitowej.
W tym kodzie zastosowano niestandardową konwencję wywoływania opartą na rejestrze, w której wskaźnik bitmapy jest przekazywany w pliku
ESI
rejestru, a rozmiar mapy bitowej jest przekazywany doECX
rejestru. Wynik (oktas) jest zwykle zwracanyEAX
.Jak już wspomniano powyżej, dane wejściowe są traktowane jako mapa bitowa. W szczególności używany jest format 32-bpp w formacie little-endian, ale kanał alfa (bajt najwyższego rzędu) jest ignorowany. Upraszcza to wiele rzeczy, pozwalając nam po prostu iterować każdy piksel i sprawdzać jego 32-bitową wartość koloru RGB. Zastosowano tu również sprytną optymalizację. Zamiast izolować każdy składnik koloru i sprawdzać, czy jest to> = 192, po prostu maskujemy całą 32-bitową wartość o 0xC0C0C0 i sprawdzamy, czy wynik to> = 0xC0C0C0. Spowoduje to ocenę wartości true dla wszystkich kolorów „chmurowych” i false dla wszystkich kolorów „niebiańskich” (niebędących chmurami). Dobrze, ja myślałem, że to mądry! :-) Z pewnością oszczędza dużą liczbę bajtów.
Dlatego, aby przetestować ten kod, musisz przekonwertować obrazy wejściowe na bitmapy o 32 bitach na sekundę. Nie można do tego użyć Windows Paint, ponieważ obsługuje on maksymalnie 24 bity na piksel. Istnieje jednak wiele innych rozwiązań programowych, takich jak Adobe Photoshop. Użyłem tego bezpłatnego narzędzia , które konwertuje PNG do BMP o 32 bitach na sekundę w systemie Windows, co oznacza, że potrzebujesz tylko konwersji z JPEG na PNG (co potrafi Paint).
Inne założenia, które moim zdaniem są wyjątkowo uzasadnione:
DF
Zakłada się, że flag kierunku ( ) jest czysty, dzięki czemu będziemy poprawnie iterować przez mapę bitową za pomocąLODSD
instrukcji. Jest to to samo założenie przyjęte przez większość konwencji wywoływania x86, więc wydaje się uczciwe. Jeśli ci się nie podoba, dodaj 1 bajt do liczby dlaCLD
instrukcji.Mnemoniki do montażu bez golfa:
Z pewnością nie udało ci się tak dobrze i nadal zastanawiasz się, jak działa kod? :-)
Cóż, to całkiem proste. Po prostu iterujemy bitmapę po jednej wartości 32-bitowej na raz, sprawdzając, czy wartość RGB tego piksela jest „zachmurzona”, czy „nieprzejrzysta”. Jeśli jest pochmurno, zwiększamy nasz wstępnie wyzerowany licznik. Na koniec obliczamy: piksele zachmurzone ⁄ piksele całkowite × 8
(co odpowiada: pikselom pochmurnym ⁄ pikselom całkowitym ÷ 0,125).
Nie mogę do tego dołączyć łącza TIO ze względu na potrzebę wprowadzenia obrazów wejściowych. Mogę jednak dostarczyć uprząż, której użyłem do przetestowania tego w systemie Windows:
Uważaj jednak na to! Jak zdefiniowano powyżej,
ComputeOktas
wykorzystuje niestandardową konwencję wywoływania, której kompilator C nie będzie przestrzegał. Musisz dodać kod u góry procedury języka asemblera, aby załadować wartości ze stosu do oczekiwanych rejestrów, np . :źródło
JavaScript (ES6), 218 bajtów
Pobiera
Image
obiekt jako dane wejściowe, które można utworzyć z<image>
elementu.Przetestuj to tutaj na CodePen!
Alternatywny
Jeśli dane wejściowe można przyjąć jako płaską tablicę wartości RGBA, o wymiarach: 82 bajty
Ten format wejściowy jest bardzo podobny do tego, co sugeruje ta odpowiedź w meta .
źródło
Matematyka 89 bajtów
Poniżej binaryzuje obraz i określa ułamek chmur, czyli białych pikseli. Następnie określa, ile razy .125 pasuje do wyniku. Zwraca dolną granicę tej wartości.
źródło