Desafio
Dada uma imagem do céu, você deve exibir a cobertura de nuvens em octas. A imagem fornecida será um arquivo de imagem (o tipo é seu) e a saída deve ser STDOUT.
Oktas
Na meteorologia, um okta é uma unidade de medida usada para descrever a quantidade de nuvens em qualquer local, como uma estação meteorológica. As condições do céu são estimadas em termos de quantos oitavos do céu estão cobertos de nuvens, variando de 0 octas (céu completamente limpo) a 8 octas (completamente nublado).
O céu sempre será uma imagem por volta do meio-dia (portanto, céu azul, não vermelho / céu noturno).
A cor de uma nuvem sempre será uma cor que segue o seguinte padrão:
#ABCDEF
Onde AB >= C0
, CD >= C0
eEF >= C0
.
Ou, em RGB:
(A, B, C)
Onde A >= 192
, B >= 192
eC >= 192
.
Aqui estão as porcentagens de cobertura relacionadas aos 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
As porcentagens são a porcentagem da imagem que é nuvem.
Se a nuvem percentual da sua imagem não for um múltiplo de 12,5, você deve arredondar para o mais próximo.
Saída
A saída deve ser apenas o número okta (você não precisa dizer a unidade).
Exemplos
1 octa (18,030743615677714% de nuvem)
0 octas (nuvem de 0,0%)
3 octas (42.66319444444445% de nuvem)
1 octa (12.000401814778645% de nuvem)
Código Python usado para calcular números
Ganhando
O menor código em bytes vence.
fonte
Respostas:
Python 2 ,
11411098 bytes-4 bytes graças ao TheLethalCoder
-12 bytes graças ao Ruud
Experimente online!
fonte
191
vez disso?x&y&z&192>191
, mas a versão atualizada é tão curta.import PIL.Image as P
comfrom PIL.Image import*
e salvar 1 byte quando mudari=P.open
parai=open
? Não sei se isso causaria problemas, pois abrir já é uma função definida, mas não posso testar, pois não tenho a capacidade de instalar o módulo.MATL ,
1817 bytesO exemplo é executado com as quatro imagens fornecidas (desculpe pela qualidade da visualização; clique para obter a resolução máxima):
Ou remova os quatro últimos caracteres para ver os resultados sem arredondar:
Explicação
fonte
Java (OpenJDK 8) , 204 bytes
Experimente online! Eu sempre esqueço que o TIO envia STDERR para a guia debug. Talvez ele possa destacar o vermelho em caso de erro?
fonte
x
ouy
. Você atribuiuy=0
duas vezes para remover a primeira atribuição. A classeColor
deve ser totalmente qualificada (java.awt.Color
) ou você deve incluir a importação na sua contagem de bytes. E seu código falha no quarto caso de teste (retorna 0 em vez de 1).&&
que&
e,y=0
para,y
: Experimente online.C #,
150146 bytesGuardado 4 bytes graças a @Ian H.
Versão completa / formatada:
fonte
for(h=0 h<b.Height;++t)
Eu acho que você perdeu um ponto e vírgula lá/0.125
por*8
no final para salvar alguns bytes.C #, 313 bytes
Obviamente, mais do que minha outra resposta, mas essa usa
LockBits
eunsafe
codifica para acessar diretamente a imagem na memória; como tal, é incrivelmente rápido. Provavelmente eu poderia remover a chamada paraUnlockBits
mas é mais correto com ela lá.Versão completa / formatada:
fonte
PowerShell , 200 bytes
Obtém entrada
$args[0]
como o caminho completo do arquivo da imagem, constrói umNew
Bitmap
objeto$a
. Este é apenas o nome do objeto interno; suporta JPG, PNG, etc.Em seguida, fazemos um loop duplo na imagem
.height
e depois.width
na imagem, tocando cada uma delaspixel
. Retiramos osR,G,B
valores e, em seguida, selecionamos aqueles que são-g
realmente qualificadose
para192
e certifique-se de quecount
é3
(ou seja, todos eles são branco-ish). Esse resultado booleano é adicionado ao nosso acumulador$i
.Em seguida, dividimos para obter a porcentagem, multiplicamos por
8
para obter o número de octas e, em seguida,[int]
para obter apenas uma saída inteira. (Observe que isso executa o arredondamento do banqueiro - se isso não for permitido, serão necessários mais alguns bytes para alterar o método de arredondamento.)fonte
dc, 74 bytes
A entrada é tomada como um arquivo P3 ppm, com todos os espaços em branco como novas linhas. A saída é para STDOUT.
Experimente online!
fonte
JavaScript,
8377 bytes-6 bytes por ETHproductions
Entradas
Imagem 1
Imagem # 2
Imagem # 3
Imagem 4
Demo
Mostrar snippet de código
fonte
a=>(b,c,d)
) em vez de fazera=>{b;c;return d}
oua=>eval("b;c;d")
. Isso funciona, a menos que você tenha algum tipo de loop; nesse caso, provavelmente será melhor usar oeval
métodoC (POSIX), 103 bytes
Assume a entrada como arquivo BMP no stdin.
fonte
Código de máquina x86, 34 bytes
Esses bytes de código definem uma função que recebe uma entrada de bitmap e retorna um valor inteiro indicando seus oktas. Como em C , matrizes (como bitmaps) são representadas como um ponteiro para o primeiro elemento e um tamanho / comprimento. Portanto, essa função usa dois parâmetros: o número total de pixels no bitmap (linhas × colunas) e um ponteiro para o próprio bitmap.
Esse código usa uma convenção de chamada personalizada baseada em registro, em que o ponteiro de bitmap é passado no
ESI
registro e o tamanho do bitmap é passado noECX
registro. O resultado (octas) é, normalmente, retornado emEAX
.Como já mencionado acima, a entrada é tomada como um bitmap. Especificamente, um formato de 32 bpp é usado, em um formato little endian, mas o canal alfa (byte de ordem mais alta) é ignorado. Isso simplifica muitas coisas, permitindo simplesmente percorrer cada pixel e verificar seu valor de cor RGB de 32 bits. Uma otimização inteligente também é usada aqui. Em vez de isolar cada componente de cor e verificar se é> = 192, apenas mascaramos o valor inteiro de 32 bits por 0xC0C0C0 e testamos se o resultado é> = 0xC0C0C0. Isso será avaliado como verdadeiro para todas as cores "nuvem" e falso para todas as cores "céu" (sem nuvem). Bem, eu pensei que era inteligente! :-) Certamente salva um grande número de bytes.
Portanto, para testar esse código, você precisará converter as imagens de entrada em bitmaps de 32 bpp. Você não pode usar o Windows Paint para isso, porque ele suporta no máximo 24 bits por pixel. No entanto, existem várias outras soluções de software que podem fazer isso, como o Adobe Photoshop. Usei essa ferramenta gratuita , que converte um PNG em um BMP de 32 bpp no Windows, o que significa que você só precisa converter de JPEG para PNG (o que o Paint pode fazer).
Outras suposições que afirmo são eminentemente razoáveis:
DF
) é assumido como claro, para que iteremos corretamente pelo bitmap usando oLODSD
instrução Essa é a mesma suposição feita pela maioria das convenções de chamada x86, portanto parece justo. Se você não gostar, adicione 1 byte à contagem para obter umaCLD
instrução.Mnemônicos de montagem não destruídos:
Certamente você não chegou até aqui e ainda está se perguntando como o código funciona? :-)
Bem, é bem simples. Apenas iteramos o bitmap de um valor de 32 bits por vez, verificando se o valor RGB do pixel está "nublado" ou "não nublado". Se estiver nublado, incrementamos nosso contador pré-zerado. No final, calculamos: pixels nublados ⁄ pixels totais × 8
(o que é equivalente a: pixels nublados ⁄ pixels totais ÷ 0,125).
Não posso incluir um link TIO para isso devido à necessidade de imagens de entrada. No entanto, posso fornecer o chicote que usei para testar isso no Windows:
Tenha cuidado com isso, no entanto! Conforme definido acima,
ComputeOktas
usa uma convenção de chamada personalizada, que um compilador C não respeitará. Você precisa adicionar código na parte superior do procedimento da linguagem assembly para carregar valores da pilha nos registros esperados, por exemplo :fonte
JavaScript (ES6), 218 bytes
Pega um
Image
objeto como entrada, que pode ser criado a partir de um<image>
elemento.Teste aqui no CodePen!
Alternativo
Se a entrada puder ser tomada como uma matriz plana de valores RGBA, com dimensões: 82 bytes
Esse formato de entrada é muito semelhante ao que esta resposta na meta sugere.
fonte
Mathematica 89 bytes
A seguir, binariza a imagem e determina a fração de nuvens, ou seja, pixels brancos. Em seguida, determina quantas vezes .125 se encaixa no resultado. Retorna o piso desse valor.
fonte