¡Dime la fase lunar!


10

Desafío

Dada una imagen de la Luna como entrada, salida de la fase de la Luna.

Fases de la luna

Su programa recibirá una de estas imágenes en formato png y debe generar la fase exactamente como se indica:

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

La entrada será la ruta a un archivo png de 240 px por 240 px y será una de las imágenes de arriba.

Se garantiza que los bytes de la imagen serán los mismos.

Victorioso

El código más corto gana


Respuestas:


9

Nodo.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]

Pruébalo en línea! (genera archivos ficticios con los mismos tamaños)

¿Cómo?

Simplemente miramos el tamaño del archivo y lo convertimos en índices en dos tablas de búsqueda.

Primera 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

7

Python 2 , 223 222 bytes

-1 byte gracias 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))- devolverá el píxel RGBA en x,y
getpixel((n*48,99))[2]for n in[1,2,3,4]- devolverá el canal azul de la línea media, donde n*48 ... for n in 1,2,3,4habrá 4 puntos donde la luz solar puede cubrir
n*getpixel(...)- generará un valor diferente para cada columna
sum(...)%13- estos valores se suman y %13se utilizan para obtener un valor único valor para cada fase, que se utilizará como índice para la lista de fases.
Los píxeles se encuentran aproximadamente dentro de los círculos rojos:
imagen de luna con píxeles resaltados


5

Rubí, 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]}

Desplazamientos de bytes encontrados por la fuerza bruta: tomar el 699º byte del archivo módulo 7, por ejemplo, proporciona un índice en la primera tabla de búsqueda.



1

PHP (> = 5.4), 199 197 bytes

(-2 bytes por más golf)

<?$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 ejecutarlo:

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

Ejemplo:

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:

  • La -d error_reporting=0opción se utiliza para no generar avisos / advertencias.
  • Se -d short_open_tag=1requiere para permitir etiquetas cortas.
  • Si está utilizando una httpsURL como en el ejemplo anterior, OpenSSL también debería estar habilitado.

¿Cómo?

Obtiene el tamaño del archivo (bytes) y crea un número único para él mediante esta fórmula:

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

Esta fórmula genera números del 0 al 8 y solo faltan 3.

┌─────────────────┬───────┬─────────┬─────┬────────────────────────┐
│      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 │
└─────────────────┴───────┴─────────┴─────┴────────────────────────┘

Enfoques previos:

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 ejecutarlo:

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

Ejemplo:

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:

  • La -d error_reporting=0opción se utiliza para no generar avisos / advertencias.
  • Se -d short_open_tag=1requiere para permitir etiquetas cortas.
  • PHP debe tener GD y debe estar habilitado.
  • Si está utilizando una httpsURL como en el ejemplo anterior, OpenSSL también debería estar habilitado.

¿Cómo?

Comprueba si el color de 4 píxeles en la imagen en 40,120, 80,120, 160,120y 200,120y decide sobre la fase de la luna de esos colores.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.