Herausforderung
Bei einem bestimmten Bild des Himmels müssen Sie die Wolkendecke in Oktas ausgeben. Das gelieferte Bild ist eine Bilddatei (der Typ liegt bei Ihnen) und die Ausgabe sollte auf STDOUT erfolgen.
Oktas
In der Meteorologie ist eine Okta eine Maßeinheit, mit der die Menge der Wolkendecke an einem bestimmten Ort, z. B. einer Wetterstation, beschrieben wird. Die Himmelverhältnisse werden anhand der Anzahl der bewölkten Achtel des Himmels geschätzt, die von 0 Oktas (vollständig klarer Himmel) bis zu 8 Oktas (vollständig bedeckt) reichen.
Der Himmel wird immer ein Bild von ungefähr Mittag sein (also blauer Himmel, nicht Rot / Nachthimmel).
Die Farbe einer Wolke ist immer eine Farbe, die dem folgenden Muster folgt:
#ABCDEF
Wo AB >= C0
, CD >= C0
und EF >= C0
.
Oder in RGB:
(A, B, C)
Wo A >= 192
, B >= 192
und C >= 192
.
Hier sind die prozentualen Bedeckungen in Bezug auf die Oktas:
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
Die Prozentsätze sind der Prozentsatz des Bildes, bei dem es sich um eine Wolke handelt.
Wenn die prozentuale Wolke Ihres Bildes nicht ein Vielfaches von 12,5 ist, sollten Sie auf die nächste runden.
Ausgabe
Die Ausgabe sollte nur die Oktanummer sein (Sie müssen die Einheit nicht sagen).
Beispiele
1 Okta (18.030743615677714% Wolke)
0 Oktas (0,0% Wolke)
3 Oktas (42.66319444444445% Wolke)
1 Okta (12.000401814778645% Wolke)
Python-Code zur Berechnung von Zahlen
Gewinnen
Kürzester Code in Bytes gewinnt.
quelle
Antworten:
Python 2 ,
11411098 Bytes-4 Bytes dank TheLethalCoder
-12 Bytes dank Ruud
Probieren Sie es online!
quelle
191
stattdessen?x&y&z&192>191
, aber die aktualisierte Version ist genauso kurz.import PIL.Image as P
mitfrom PIL.Image import*
1 Byte und sparen beim Wechseli=P.open
zui=open
? Ich weiß nicht, ob dies zu Problemen führen würde, da open bereits eine definierte Funktion ist, aber ich kann es nicht testen, da ich nicht in der Lage bin, das Modul zu installieren.MATL ,
1817 BytesDas Beispiel wird mit den vier bereitgestellten Bildern ausgeführt.
Oder entfernen Sie die letzten vier Zeichen, um die Ergebnisse ohne Rundung anzuzeigen:
Erläuterung
quelle
Java (OpenJDK 8) , 204 Byte
Probieren Sie es online! Ich vergesse immer, dass TIO STDERR an die Debug-Registerkarte ausgibt. Vielleicht könnte es im Fehlerfall rot hervorgehoben werden?
quelle
x
oder nie erhöheny
. Sie habeny=0
zweimal zugewiesen , sodass Sie die erste Zuweisung entfernen können. Die KlasseColor
muss entweder vollständig qualifiziert sein (java.awt.Color
) oder Sie müssen den Import in Ihre Byteanzahl aufnehmen. Und Ihr Code schlägt für den 4. Testfall fehl (gibt 0 statt 1 zurück).&&
to&
und,y=0
to ändern,y
: Versuchen Sie es online.C #,
150146 Bytes4 Bytes gespart dank @Ian H.
Voll / Formatierte Version:
quelle
for(h=0 h<b.Height;++t)
Ich glaube, Sie haben dort ein/0.125
mit*8
am Ende ein paar Bytes zu speichern.C #, 313 Bytes
Offensichtlich länger als meine andere Antwort, aber diese verwendet
LockBits
undunsafe
Code, um direkt auf das Bild im Speicher zuzugreifen. als solches ist es unglaublich schnell. Ich könnte den Anruf wahrscheinlich entfernen,UnlockBits
aber es ist damit dort korrekter.Voll / Formatierte Version:
quelle
PowerShell , 200 Byte
Ruft die Eingabe
$args[0]
als vollständiger Bilddateipfad ab und erstellt einNew
Bitmap
Objekt in$a
. Dies ist nur der interne Objektname. es unterstützt JPG, PNG, etc.Wir durchlaufen dann das
.height
und dann.width
das Bild in einer Doppelschleife und berühren jedes Bildpixel
. Wir ziehen dieR,G,B
Werte heraus und wählen dann diejenigen aus, die-g
wiederhergestellt werden als oder qualifiziert sinde
,192
und stellen sicher, dass dies der Fallcount
ist3
(dh alle sind weißlich). Dieses boolesche Ergebnis wird in unseren Akkumulator addiert$i
.Wir teilen dann auf, um den Prozentsatz zu erhalten, multiplizieren ihn mit
8
, um die Anzahl der Oktas zu erhalten, und erhalten dann[int]
nur eine ganzzahlige Ausgabe. (Beachten Sie, dass hierdurch die Bankerrundung ausgeführt wird. Wenn dies nicht zulässig ist, müssen Sie die Rundungsmethode um einige Bytes verlängern.)quelle
Gleichstrom, 74 Bytes
Die Eingabe erfolgt als P3-ppm-Datei, wobei alle Leerzeichen als Zeilenumbrüche verwendet werden. Die Ausgabe erfolgt nach STDOUT.
Probieren Sie es online!
quelle
JavaScript,
83Bytes-6 Bytes von ETHproductions
Eingänge
Bild 1
Bild 2
Bild 3
Bild 4
Demo
Code-Snippet anzeigen
quelle
a=>(b,c,d)
) getrennt sind, anstatta=>{b;c;return d}
oder zu tuna=>eval("b;c;d")
. Dies funktioniert nur, wenn Sie eine Schleife haben. In diesem Fall sollten Sie dieeval
Methode am besten anwenden.C (POSIX), 103 Bytes
Übernimmt die Eingabe als BMP-Datei auf stdin.
quelle
x86-Maschinencode, 34 Byte
Diese Codebytes definieren eine Funktion, die eine Bitmap-Eingabe annimmt und einen ganzzahligen Wert zurückgibt, der die Oktas angibt. Wie in C werden Arrays (wie Bitmaps) als Zeiger auf das erste Element und als Größe / Länge dargestellt. Daher akzeptiert diese Funktion zwei Parameter: die Gesamtzahl der Pixel in der Bitmap (Zeilen × Spalten) und einen Zeiger auf die Bitmap selbst.
Dieser Code verwendet eine benutzerdefinierte, auf Registern basierende Aufrufkonvention, bei der der Bitmap-Zeiger im
ESI
Register und die Bitmap-Größe imECX
Register übergeben werden. Das Ergebnis (Oktas) wird wie üblich in zurückgegebenEAX
.Wie oben bereits erwähnt, wird die Eingabe als Bitmap verwendet. Insbesondere wird ein 32-bpp-Format in einem Little-Endian-Format verwendet, aber der Alphakanal (Byte höchster Ordnung) wird ignoriert. Dies vereinfacht eine Menge Dinge und ermöglicht es uns, einfach durch jedes Pixel zu iterieren und seinen 32-Bit-RGB-Farbwert zu überprüfen. Auch hier kommt eine clevere Optimierung zum Einsatz. Anstatt jede Farbkomponente zu isolieren und zu prüfen, ob sie> = 192 ist, maskieren wir einfach den gesamten 32-Bit-Wert mit 0xC0C0C0 und testen, ob das Ergebnis> = 0xC0C0C0 ist. Dies wird für alle "Wolken" -Farben als wahr und für alle "Himmel" -Farben (keine Wolken) als falsch bewertet. Nun, ich fand es klug! :-) Es spart sicherlich eine große Anzahl von Bytes.
Um diesen Code zu testen, müssen Sie die Eingabebilder daher in Bitmaps mit 32 Bit / s konvertieren. Sie können Windows Paint hierfür nicht verwenden, da es maximal 24 Bit pro Pixel unterstützt. Es gibt jedoch eine Reihe anderer Softwarelösungen, die dies unterstützen, beispielsweise Adobe Photoshop. Ich habe dieses kostenlose Tool verwendet , das ein PNG in ein 32-bpp-BMP unter Windows konvertiert, was bedeutet, dass Sie nur von JPEG in PNG konvertieren müssen (was Paint kann).
Andere Annahmen, die ich setze, sind ausgesprochen vernünftig:
DF
wird angenommen, dass das Richtungsflag ( ) klar ist, damit wir die Bitmap unter Verwendung derLODSD
Anweisung korrekt durchlaufen . Dies ist die gleiche Annahme wie bei den meisten x86-Aufrufkonventionen. Wenn es Ihnen nicht gefällt, addieren Sie 1 Byte zur Anzahl für eineCLD
Anweisung.Ungolfed Assembler-Mnemonik:
Sicherlich haben Sie es nicht so weit gebracht und fragen sich immer noch, wie der Code funktioniert? :-)
Nun, es ist ziemlich einfach. Wir durchlaufen die Bitmap nur jeweils um einen 32-Bit-Wert und prüfen, ob dieser Pixel-RGB-Wert "wolkig" oder "nicht wolkig" ist. Wenn es bewölkt ist, erhöhen wir unseren Zähler vor dem Nullsetzen. Am Ende berechnen wir: Bewölkte Pixel ⁄ Gesamtpixel × 8
(was äquivalent ist zu: Bewölkte Pixel ⁄ Gesamtpixel ÷ 0,125).
Ich kann hierfür keinen TIO-Link einfügen, da Eingabebilder erforderlich sind. Ich kann Ihnen jedoch das Kabel zur Verfügung stellen, mit dem ich dies unter Windows getestet habe:
Aber sei vorsichtig damit!
ComputeOktas
Verwendet wie oben definiert eine benutzerdefinierte Aufrufkonvention, die von einem C-Compiler nicht beachtet wird. Sie müssen Code oben in der Assemblersprachenprozedur hinzufügen, um Werte aus dem Stapel in die erwarteten Register zu laden, z .quelle
JavaScript (ES6), 218 Byte
Nimmt ein
Image
Objekt als Eingabe, das aus einem<image>
Element erstellt werden kann.Testen Sie es hier auf CodePen!
Alternative
Wenn die Eingabe als ein flaches Array von RGBA-Werten mit folgenden Abmessungen erfolgen kann: 82 Byte verwendet werden kann
Dieses Eingabeformat ist dem sehr ähnlich, was diese Antwort auf Meta vorschlägt.
quelle
Mathematica 89 Bytes
Das folgende Beispiel digitalisiert das Bild und bestimmt den Anteil der Wolken, dh der weißen Pixel. Dann wird bestimmt, wie oft .125 in das Ergebnis passt. Es wird der Floor dieses Wertes zurückgegeben.
quelle