Diga-me a fase lunar!

10

Desafio

Dada uma imagem da Lua como entrada, produza a fase da Lua.

Fases da lua

Seu programa receberá uma dessas imagens no formato png e você deverá gerar a fase exatamente como indicado:

new moon

hexdump

waxing crescent

hexdump

first quarter

hexdump

waxing gibbous

hexdump

full moon

hexdump

waning gibbous

hexdump

third quarter

hexdump

waning crescent

hexdump

Entrada

A entrada será o caminho para um arquivo png de 240 x 240 px e será a imagem acima.

Os bytes da imagem são garantidos para serem os mesmos.

Ganhando

O código mais curto vence

Beta Decay
fonte
11
Como um bônus, confira este gif legal: upload.wikimedia.org/wikipedia/commons/b/ba/…
Beta Decay

Respostas:

9

Node.js , 145 bytes

p=>'third/waning/first/full/waxing/new'.split`/`[(s=require('fs').statSync(p).size)%418%6]+' '+'quarter/crescent/gibbous/moon'.split`/`[s%12%9%4]

Experimente online! (gera arquivos fictícios com os mesmos tamanhos)

Como?

Apenas analisamos o tamanho do arquivo e o convertemos em índices em duas tabelas de pesquisa.

Primeira parte:

 phase | file size | mod 418 | mod 6 | mapped to
-------+-----------+---------+-------+-----------
   0   |    3451   |    107  |    5  | new
   1   |    6430   |    160  |    4  | waxing
   2   |    5144   |    128  |    2  | first
   3   |    7070   |    382  |    4  | waxing
   4   |    5283   |    267  |    3  | full
   5   |    7067   |    379  |    1  | waning
   6   |    4976   |    378  |    0  | third
   7   |    6337   |     67  |    1  | waning

Segunda parte:

 phase | file size | mod 12 |  mod 9 |  mod 4 | mapped to
-------+-----------+--------+--------+--------+-----------
   0   |    3451   |     7  |     7  |    3   | moon
   1   |    6430   |    10  |     1  |    1   | crescent
   2   |    5144   |     8  |     8  |    0   | quarter
   3   |    7070   |     2  |     2  |    2   | gibbous
   4   |    5283   |     3  |     3  |    3   | moon
   5   |    7067   |    11  |     2  |    2   | gibbous
   6   |    4976   |     8  |     8  |    0   | quarter
   7   |    6337   |     1  |     1  |    1   | crescent
Arnauld
fonte
7

Python 2 , 223 222 bytes

-1 byte graças a OMᗺ

lambda p:'new moonzzfull moonzzfirst quarterzzwaxing crescentzzwaning gibbouszzwaxing gibbouszthird quarterzwaning crescent'.split('z')[sum(n*Image.open(p).getpixel((n*48,99))[2]for n in[1,2,3,4])%13]
from PIL import Image

getpixel((x,y))- retornará o pixel RGBA em x,y
getpixel((n*48,99))[2]for n in[1,2,3,4]- retornará o canal azul da linha do meio, onde n*48 ... for n in 1,2,3,4haverá 4 pontos onde a luz do sol poderá cobrir
n*getpixel(...)- gerará um valor diferente para cada coluna
sum(...)%13- esses valores serão somados e %13usados ​​para obter um valor único valor para cada fase, que será usado como índice para a lista de fases
Os pixels estão aproximadamente dentro dos círculos vermelhos:
imagem da lua com pixels destacados

Cajado
fonte
5

Ruby, 131 bytes

->f{f=open(f,'rb').read;%w[first third waxing new full waning][f[699].ord%7]+' '+%w[x moon gibbous quarter crescent][f[998].ord%5]}

Deslocamentos de bytes encontrados pela força bruta - pegar o 699º byte do arquivo módulo 7, por exemplo, fornece um índice na primeira tabela de pesquisa.

Maçaneta da porta
fonte
2

Python 2 , 196 165 bytes

lambda f:'first quarter|new moon|waning crescent|waxing gibbous|third quarter|full moon|waxing crescent|waning gibbous'.split('|')[sum(map(ord,open(f).read()))%41%9]

Experimente online!

ბიმო
fonte
1

PHP (> = 5,4), 199 197 bytes

(-2 bytes por mais golfe)

<?$s=strlen(file_get_contents($argv[1])).'';echo strtr([waning_crescent,waning_gibbous,new_moon,0,waxing_crescent,waxing_gibbous,full_moon,first_quarter,third_quarter][($s[0]+$s[3])%11-2],'_',' ');

Para executá-lo:

php -d error_reporting=0 -d short_open_tag=1 <filename> <image_path>

Exemplo:

php -d error_reporting=0 -d short_open_tag=1 lunar_phase.php https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Moon_phase_6.svg/240px-Moon_phase_6.svg.png

Notas:

  • A -d error_reporting=0opção é usada para não emitir avisos / avisos.
  • A -d short_open_tag=1é necessária para permitir tags curtas.
  • Se você estiver usando uma httpsURL como o exemplo acima, o OpenSSL também deverá estar ativado.

Como?

Obtém o tamanho do arquivo (bytes) e cria um número exclusivo para ele por esta fórmula:

((<first_bytes_digit> + <fourth_bytes_digit>) % 11) - 2

Essa fórmula gera números de 0 a 8 com apenas 3 faltando.

┌─────────────────┬───────┬─────────┬─────┬────────────────────────┐
│      Phase      │ Bytes │ 1st+4th │ %11 │ -2 (position in array) │
├─────────────────┼───────┼─────────┼─────┼────────────────────────┤
│ new moon        │  3451 │ 3+1=4   │   4 │                      2 │
│ waxing crescent │  6430 │ 6+0=6   │   6 │                      4 │
│ first quarter   │  5144 │ 5+4=9   │   9 │                      7 │
│ waxing gibbous  │  7070 │ 7+0=7   │   7 │                      5 │
│ full moon       │  5283 │ 5+3=8   │   8 │                      6 │
│ waning gibbous  │  7067 │ 7+7=14  │   3 │                      1 │
│ third quarter   │  4976 │ 4+6=10  │  10 │                      8 │
│ waning crescent │  6337 │ 6+7=13  │   2 │                      0 │
└─────────────────┴───────┴─────────┴─────┴────────────────────────┘

Abordagens anteriores:

PHP (> = 5,4), 251 bytes

<?foreach([4,8,16,20]as$w){$a+=imagecolorat(imagecreatefrompng($argv[1]),$w*10,120)>1e7;$a&&$w<5?$b=-2:0;}$x=explode('_','full moon_waning gibbous_third quarter_waning crescent_new moon_waxing crescent_first quarter_waxing gibbous');echo$x[$a*++$b+4];

Para executá-lo:

php -d error_reporting=0 -d short_open_tag=1 <filename> <image_path>

Exemplo:

php -d error_reporting=0 -d short_open_tag=1 lunar_phase.php https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Moon_phase_6.svg/240px-Moon_phase_6.svg.png

Notas:

  • A -d error_reporting=0opção é usada para não emitir avisos / avisos.
  • A -d short_open_tag=1é necessária para permitir tags curtas.
  • O PHP deve ter GD e deve estar ativado.
  • Se você estiver usando uma httpsURL como o exemplo acima, o OpenSSL também deverá estar ativado.

Como?

Verifica a cor de 4 pixels na imagem em 40,120, 80,120, 160,120e 200,120e decide sobre a fase da lua a partir dessas cores.

Night2
fonte