Reto
Dada una imagen del cielo, debe mostrar la capa de nubes en octas. La imagen suministrada será un archivo de imagen (el tipo depende de usted) y la salida debe ser STDOUT.
Oktas
En meteorología, un okta es una unidad de medida utilizada para describir la cantidad de cobertura de nubes en cualquier lugar dado, como una estación meteorológica. Las condiciones del cielo se estiman en términos de cuántos octavos del cielo están cubiertos de nubes, desde 0 octas (cielo completamente despejado) hasta 8 octas (completamente nublado).
El cielo siempre será una imagen de alrededor del mediodía (por lo tanto, cielo azul, no rojo / cielo nocturno).
El color de una nube siempre será un color que siga el siguiente patrón:
#ABCDEF
Donde AB >= C0
, CD >= C0
y EF >= C0
.
O, en RGB:
(A, B, C)
Donde A >= 192
, B >= 192
y C >= 192
.
Aquí están los porcentajes de cobertura relacionados con los 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
Los porcentajes son el porcentaje de la imagen que es nube.
Si el porcentaje de nube de su imagen no es múltiplo de 12.5, debe redondear al más cercano.
Salida
La salida solo debe ser el número okta (no tiene que decir la unidad).
Ejemplos
1 octa (18.030743615677714% nube)
0 octas (0.0% nube)
3 octas (42.66319444444445% nube)
1 octa (12.000401814778645% nube)
Código de Python usado para calcular números
Victorioso
El código más corto en bytes gana.
fuente
Respuestas:
Python 2 ,
11411098 bytes-4 bytes gracias a TheLethalCoder
-12 bytes gracias a Ruud
Pruébalo en línea!
fuente
191
lugar?x&y&z&192>191
, pero la versión actualizada es igual de breve.import PIL.Image as P
confrom PIL.Image import*
y guardar 1 byte cuando se cambiai=P.open
ai=open
? No sé si eso causaría problemas ya que abrir ya es una función definida, pero no puedo probarlo porque no tengo la capacidad de instalar el módulo.MATL ,
1817 bytesEl ejemplo se ejecuta con las cuatro imágenes proporcionadas (perdón por la calidad de la vista previa; haga clic para obtener la resolución completa):
O elimine los últimos cuatro caracteres para ver los resultados sin redondear:
Explicación
fuente
Java (OpenJDK 8) , 204 bytes
Pruébalo en línea! Siempre olvido que TIO envía STDERR a la pestaña de depuración. ¿Tal vez podría resaltar el rojo en caso de error?
fuente
x
oy
. Usted asignóy=0
dos veces, por lo que puede eliminar la primera asignación. La claseColor
debe estar completamente calificada (java.awt.Color
) o debe incluir la importación en su recuento de bytes. Y su código falla para el cuarto caso de prueba (devuelve 0 en lugar de 1).&&
a&
y,y=0
para,y
: Pruébalo en línea.C #,
150146 bytesGuardado 4 bytes gracias a @Ian H.
Versión completa / formateada:
fuente
for(h=0 h<b.Height;++t)
Creo que te perdiste un punto y coma allí/0.125
con*8
al final para guardar algunos bytes.C #, 313 bytes
Obviamente, ya que mi otra respuesta, pero éste usos
LockBits
yunsafe
código para acceder directamente a la imagen en la memoria; Como tal, es increíblemente rápido. Probablemente podría eliminar la llamada aUnlockBits
pero es más correcto allí.Versión completa / formateada:
fuente
PowerShell , 200 bytes
Obtiene entrada
$args[0]
como la ruta de archivo de imagen completa, construye unNew
Bitmap
objeto en$a
. Este es solo el nombre interno del objeto; Es compatible con JPG, PNG, etc.Luego hacemos un doble bucle a través de
.height
y luego el.width
de la imagen, tocando cada unopixel
. Extraemos losR,G,B
valores y luego seleccionamos aquellos que son-g
realese
o no192
y asegúrese de quecount
está3
(es decir, todos ellos son de color blanco-ish). Ese resultado booleano se agrega a nuestro acumulador$i
.Luego nos dividimos para obtener el porcentaje, lo multiplicamos por
8
para obtener el número de octas y luego[int]
para obtener solo una salida entera. (Tenga en cuenta que esto realiza el redondeo bancario; si no está permitido, habrá varios bytes más para cambiar el método de redondeo).fuente
cc, 74 bytes
La entrada se toma como un archivo P3 ppm, con todos los espacios en blanco como líneas nuevas. La salida es STDOUT.
Pruébalo en línea!
fuente
JavaScript,
8377 bytes-6 bytes por ETHproductions
Entradas
Foto 1
Imagen # 2
Imagen # 3
Imagen # 4
Manifestación
Mostrar fragmento de código
fuente
a=>(b,c,d)
) en lugar de hacera=>{b;c;return d}
oa=>eval("b;c;d")
. Esto funciona a menos que tenga un bucle de algún tipo, en cuyo caso probablemente sea mejor usar eleval
método.C (POSIX), 103 bytes
Asume la entrada como archivo BMP en stdin.
fuente
Código de máquina x86, 34 bytes
Estos bytes de código definen una función que toma una entrada de mapa de bits y devuelve un valor entero que indica sus octas. Como en C , las matrices (como los mapas de bits) se representan como un puntero al primer elemento y un tamaño / longitud. Por lo tanto, esta función toma dos parámetros: el número total de píxeles en el mapa de bits (filas × columnas) y un puntero al mapa de bits en sí.
Este código utiliza una convención de llamada personalizada basada en registros, donde el puntero de mapa de bits se pasa en el
ESI
registro y el tamaño del mapa de bits se pasa en elECX
registro. El resultado (oktas) es, como siempre, devueltoEAX
.Como ya se indicó anteriormente, la entrada se toma como un mapa de bits. Específicamente, se utiliza un formato de 32 bpp, en un formato little-endian, pero se ignora el canal alfa (byte de orden superior). Esto simplifica muchas cosas, permitiéndonos simplemente recorrer cada píxel y verificar su valor de color RGB de 32 bits. Aquí también se usa una optimización inteligente. En lugar de aislar cada componente de color y verificar si es> = 192, simplemente enmascaramos el valor completo de 32 bits por 0xC0C0C0 y probamos si el resultado es> = 0xC0C0C0. Esto se evaluará como verdadero para todos los colores "nubosos" y falso para todos los colores "celestes" (que no sean nubes). Bueno, ¡ pensé que era inteligente! :-) Ciertamente ahorra una gran cantidad de bytes.
Por lo tanto, para probar este código, deberá convertir las imágenes de entrada a mapas de bits de 32 bpp. No puede usar Windows Paint para esto, ya que admite un máximo de 24 bits por píxel. Sin embargo, hay varias otras soluciones de software que pueden hacerlo, como Adobe Photoshop. Utilicé esta herramienta gratuita , que convierte un PNG a un BMP de 32 bpp en Windows, lo que significa que solo necesita convertir de JPEG a PNG (que Paint puede hacer).
Otros supuestos que considero son eminentemente razonables:
DF
supone que la bandera de dirección ( ) es clara, de modo que iteraremos correctamente a través del mapa de bits utilizando laLODSD
instrucción. Esta es la misma suposición hecha por la mayoría de las convenciones de llamadas x86, por lo que parece justo. Si no le gusta, agregue 1 byte al conteo para unaCLD
instrucción.Mnemónicos de ensamblaje sin golf:
¿Seguramente no has llegado hasta aquí y todavía te preguntas cómo funciona el código? :-)
Bueno, es bastante simple. Simplemente iteramos a través del mapa de bits un valor de 32 bits a la vez, verificando si ese valor RGB de píxel está "nublado" o "no nublado". Si está nublado, incrementamos nuestro contador pre-cero. Al final, calculamos: píxeles nublados ⁄ píxeles totales × 8
(que es equivalente a: píxeles nublados ⁄ píxeles totales ÷ 0.125).
No puedo incluir un enlace TIO para esto debido a la necesidad de imágenes de entrada. Sin embargo, puedo proporcionarle el arnés que utilicé para probar esto en Windows:
¡Pero ten cuidado con esto! Como se definió anteriormente,
ComputeOktas
utiliza una convención de llamada personalizada, que un compilador de C no respetará. Debe agregar código en la parte superior del procedimiento del lenguaje ensamblador para cargar valores de la pila en los registros esperados, por ejemplo :fuente
JavaScript (ES6), 218 bytes
Toma un
Image
objeto como entrada, que se puede crear a partir de un<image>
elemento.¡Pruébalo aquí en CodePen!
Alternativa
Si la entrada se puede tomar como una matriz plana de valores RGBA, con dimensiones: 82 bytes
Este formato de entrada es muy similar a lo que sugiere esta respuesta en meta .
fuente
Mathematica 89 bytes
Lo siguiente binariza la imagen y determina la fracción de nubes, es decir, píxeles blancos. Luego determina cuántas veces .125 cabe en el resultado. Devuelve el piso de ese valor.
fuente