Défi
Étant donné une image du ciel, vous devez afficher la couverture nuageuse en octas. L'image fournie sera un fichier image (le type dépend de vous) et la sortie devrait être vers STDOUT.
Oktas
En météorologie, un okta est une unité de mesure utilisée pour décrire la quantité de couverture nuageuse à un endroit donné, comme une station météorologique. Les conditions du ciel sont estimées en termes de combien de huitièmes du ciel sont couverts de nuages, allant de 0 octas (ciel complètement clair) à 8 octas (complètement couvert).
Le ciel sera toujours une image d'environ midi (donc, ciel bleu, pas rouge / ciel nocturne).
La couleur d'un nuage sera toujours une couleur qui suit le motif suivant:
#ABCDEF
Où AB >= C0
, CD >= C0
et EF >= C0
.
Ou, en RVB:
(A, B, C)
Où A >= 192
, B >= 192
et C >= 192
.
Voici les pourcentages de couverture liés aux octas:
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
Les pourcentages sont le pourcentage de l'image qui est un nuage.
Si le pourcentage de nuage de votre image n'est pas un multiple de 12,5, vous devez arrondir au plus proche.
Sortie
La sortie doit simplement être le nombre okta (vous n'avez pas besoin de dire l'unité).
Exemples
1 okta (18.030743615677714% cloud)
0 octas (0,0% nuage)
3 octas (42.66319444444445% cloud)
1 okta (12.000401814778645% cloud)
Code Python utilisé pour calculer les nombres
Gagnant
Le code le plus court en octets gagne.
la source
Réponses:
Python 2 ,
11411098 octets-4 octets grâce à TheLethalCoder
-12 octets grâce à Ruud
Essayez-le en ligne!
la source
191
place?x&y&z&192>191
, mais la version mise à jour est tout aussi courte.import PIL.Image as P
avecfrom PIL.Image import*
et enregistrer 1 octet lors d'un changementi=P.open
dei=open
? Je ne sais pas si cela causerait des problèmes car open est déjà une fonction définie, mais je ne peux pas tester car je n'ai pas la possibilité d'installer le module.MATL ,
1817 octetsL'exemple fonctionne avec les quatre images fournies (désolé pour la qualité de l'aperçu; cliquez pour la pleine résolution):
Ou supprimez les quatre derniers caractères pour voir les résultats sans arrondir:
Explication
la source
Java (OpenJDK 8) , 204 octets
Essayez-le en ligne! J'oublie toujours que TIO sort STDERR dans l'onglet de débogage. Peut-être qu'il pourrait aimer surligner en rouge en cas d'erreur?
la source
x
ouy
. Vous avez attribuéy=0
deux fois, vous pouvez donc supprimer la première affectation. La classeColor
doit être entièrement qualifiée (java.awt.Color
) ou vous devez inclure l'importation dans votre nombre d'octets. Et votre code échoue pour le 4ème cas de test (retourne 0 au lieu de 1).&&
to&
et,y=0
le,y
: Essayez-le en ligne.C #,
150146 octets4 octets enregistrés grâce à @Ian H.
Version complète / formatée:
la source
for(h=0 h<b.Height;++t)
Je pense que vous avez manqué un point-virgule là-bas/0.125
par*8
à la fin pour économiser quelques octets.C #, 313 octets
Évidemment plus long que mon autre réponse mais celui-ci utilise
LockBits
etunsafe
code pour accéder directement à l'image en mémoire; en tant que tel, il est incroyablement rapide. Je pourrais probablement supprimer l'appel àUnlockBits
mais c'est plus correct avec ça là.Version complète / formatée:
la source
PowerShell , 200 octets
Obtient l'entrée en
$args[0]
tant que chemin de fichier d'image complet, construit unNew
Bitmap
objet dans$a
. Ce n'est que le nom de l'objet interne; il prend en charge JPG, PNG, etc.Nous faisons ensuite une double boucle à travers le
.height
puis.width
l'image, en les touchantpixel
. Nous retirons lesR,G,B
valeurs et choisir celles qui sont-g
reaterthanore
qual à192
et assurez - vous quecount
est3
(c. -à- tous sont-ish blanc). Ce résultat booléen est ajouté dans notre accumulateur$i
.Nous divisons ensuite pour obtenir le pourcentage, le multiplions par
8
pour obtenir le nombre d'octas, puis[int]
pour obtenir uniquement une sortie entière. (Notez que cela effectue l'arrondi bancaire - si ce n'est pas autorisé, il faudra plusieurs octets supplémentaires pour changer la méthode d'arrondi.)la source
dc, 74 octets
L'entrée est considérée comme un fichier P3 ppm, avec tous les espaces comme des retours à la ligne. La sortie est vers STDOUT.
Essayez-le en ligne!
la source
JavaScript,
8377 octets-6 octets par ETHproductions
Contributions
Image 1
Image n ° 2
Image n ° 3
Image # 4
Démo
Afficher l'extrait de code
la source
a=>(b,c,d)
) au lieu de fairea=>{b;c;return d}
oua=>eval("b;c;d")
. Cela fonctionne à moins que vous n'ayez une boucle quelconque, auquel cas vous feriez probablement mieux d'utiliser laeval
méthode.C (POSIX), 103 octets
Suppose l'entrée en tant que fichier BMP sur stdin.
la source
Code machine x86, 34 octets
Ces octets de code définissent une fonction qui prend une entrée bitmap et renvoie une valeur entière indiquant ses octas. Comme en C , les tableaux (comme les bitmaps) sont représentés comme un pointeur vers le premier élément et une taille / longueur. Ainsi, cette fonction prend deux paramètres: le nombre total de pixels dans le bitmap (lignes × colonnes) et un pointeur sur le bitmap lui-même.
Ce code utilise une convention d'appel basée sur un registre personnalisé, où le pointeur bitmap est passé dans le
ESI
registre et la taille bitmap est passée dans leECX
registre. Le résultat (octas) est, comme d'habitude, retournéEAX
.Comme déjà indiqué ci-dessus, l'entrée est considérée comme un bitmap. Plus précisément, un format 32 bpp est utilisé, dans un format petit-boutien, mais le canal alpha (octet de poids fort) est ignoré. Cela simplifie beaucoup de choses, nous permettant simplement de parcourir chaque pixel et de vérifier sa valeur de couleur RVB 32 bits. Une optimisation intelligente est également utilisée ici. Au lieu d'isoler chaque composante de couleur et de vérifier si elle est> = 192, nous masquons simplement la valeur entière de 32 bits par 0xC0C0C0 et testons si le résultat est> = 0xC0C0C0. Ceci sera évalué à vrai pour toutes les couleurs "nuage" et faux à toutes les couleurs "ciel" (hors nuage). Eh bien, je pensais que c'était intelligent! :-) Il enregistre certainement un grand nombre d'octets.
Par conséquent, afin de tester ce code, vous devrez convertir les images d'entrée en bitmaps 32 bpp. Vous ne pouvez pas utiliser Windows Paint pour cela, car il prend en charge un maximum de 24 bits par pixel. Cependant, il existe un certain nombre d'autres solutions logicielles qui peuvent le faire, comme Adobe Photoshop. j'ai utilisé cet outil gratuit , qui convertit un PNG en BMP 32 bpp sous Windows, ce qui signifie que vous n'avez besoin que de convertir du JPEG au PNG (ce que Paint peut faire).
Les autres hypothèses que je pose sont éminemment raisonnables:
DF
) est supposé être clair afin que nous puissions itérer correctement à travers le bitmap en utilisant leLODSD
instruction. C'est la même hypothèse faite par la plupart des conventions d'appel x86, donc cela semble juste. Si vous ne l'aimez pas, ajoutez 1 octet au nombre d'uneCLD
instruction.Mnémoniques d'assemblage non golfés:
Vous n'avez sûrement pas fait tout ce chemin et vous vous demandez toujours comment fonctionne le code? :-)
Eh bien, c'est assez simple. Nous parcourons simplement le bitmap une valeur 32 bits à la fois, en vérifiant si cette valeur RVB de pixel est "nuageuse" ou "non nuageuse". S'il fait nuageux, nous incrémentons notre compteur pré-mis à zéro. À la fin, nous calculons: pixels nuageux ⁄ pixels totaux × 8
(ce qui équivaut à: pixels nuageux ⁄ pixels totaux ÷ 0,125).
Je ne peux pas inclure de lien TIO pour cela en raison du besoin d'images d'entrée. Je peux cependant vous fournir le harnais que j'ai utilisé pour tester cela sur Windows:
Soyez prudent avec cela, cependant! Comme défini ci-dessus,
ComputeOktas
utilise une convention d'appel personnalisée, qu'un compilateur C ne respectera pas. Vous devez ajouter du code en haut de la procédure du langage assembleur pour charger les valeurs de la pile dans les registres attendus, par exemple :la source
JavaScript (ES6), 218 octets
Prend un
Image
objet en entrée, qui peut être créé à partir d'un<image>
élément.Testez-le ici sur CodePen!
Alternative
Si l'entrée peut être considérée comme un tableau plat de valeurs RGBA, avec des dimensions: 82 octets
Ce format d'entrée est très similaire à ce que cette réponse sur meta suggère.
la source
Mathematica 89 octets
Ce qui suit binarise l'image et détermine la fraction des nuages, c'est-à-dire les pixels blancs. Ensuite, il détermine combien de fois 0,125 s'inscrit dans le résultat. Il renvoie le plancher de cette valeur.
la source