Dimmi la fase lunare!


10

Sfida

Data un'immagine della Luna come input, emette la fase della Luna.

Fasi della luna

Al tuo programma verrà fornita una di queste immagini in formato png e dovrai generare la fase esattamente come indicato:

new moon

hexdump

waxing crescent

hexdump

first quarter

hexdump

waxing gibbous

hexdump

full moon

hexdump

waning gibbous

hexdump

third quarter

hexdump

waning crescent

hexdump

Ingresso

L'input sarà il percorso di un file png di 240 px per 240 px e sarà quello delle immagini sopra.

I byte dell'immagine sono garantiti uguali.

vincente

Il codice più corto vince


1
Come bonus, dai un'occhiata a questa fantastica gif: upload.wikimedia.org/wikipedia/commons/b/ba/…
Decadimento beta

Risposte:


9

Node.js , 145 byte

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]

Provalo online! (genera file fittizi con le stesse dimensioni)

Come?

Osserviamo solo le dimensioni del file e lo convertiamo in indici in due tabelle di ricerca.

Prima 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

Seconda 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 byte

-1 byte grazie 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))- restituirà il pixel RGBA a x,y
getpixel((n*48,99))[2]for n in[1,2,3,4]- restituirà il canale blu della linea mediana, dove n*48 ... for n in 1,2,3,4saranno presenti 4 punti in cui potrebbe coprire la luce solare
n*getpixel(...)- genererà un valore diverso per ogni colonna
sum(...)%13- questi valori vengono sommati e %13vengono utilizzati per ottenere un valore univoco valore per ciascuna fase, che verrà utilizzata come indice per l'elenco fasi
I pixel si trovano approssimativamente all'interno dei cerchi rossi:
immagine della luna con pixel evidenziati


5

Rubino, 131 byte

->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]}

Offset di byte rilevati dalla forza bruta - prendendo il 699 ° byte del file modulo 7, ad esempio, si ottiene un indice nella prima tabella di ricerca.


2

Python 2 , 196 165 byte

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]

Provalo online!


1

PHP (> = 5.4), 199 197 byte

(-2 byte con più 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],'_',' ');

Per eseguirlo:

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

Esempio:

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

Appunti:

  • L' -d error_reporting=0opzione viene utilizzata per non generare avvisi / avvisi.
  • Il -d short_open_tag=1è necessario per consentire i tag brevi.
  • Se stai usando un httpsURL come nell'esempio sopra, anche OpenSSL dovrebbe essere abilitato.

Come?

Ottiene la dimensione del file (byte) e crea un numero univoco per esso con questa formula:

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

Questa formula genera numeri da 0 a 8 con solo 3 mancanti.

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

Approcci precedenti:

PHP (> = 5.4), 251 byte

<?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];

Per eseguirlo:

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

Esempio:

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

Appunti:

  • L' -d error_reporting=0opzione viene utilizzata per non generare avvisi / avvisi.
  • Il -d short_open_tag=1è necessario per consentire i tag brevi.
  • PHP deve avere GD e deve essere abilitato.
  • Se stai usando un httpsURL come nell'esempio sopra, anche OpenSSL dovrebbe essere abilitato.

Come?

Controlli per il colore di 4 pixel nell'immagine a 40,120, 80,120, 160,120e 200,120e decide sulla fase lunare da quei colori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.