Dites-moi la phase lunaire!


10

Défi

Étant donné une image de la Lune en entrée, sortez la phase de la Lune.

Les phases de la lune

Votre programme recevra une de ces images au format png et vous devez sortir la phase exactement comme indiqué:

new moon

hexdump

waxing crescent

hexdump

first quarter

hexdump

waxing gibbous

hexdump

full moon

hexdump

waning gibbous

hexdump

third quarter

hexdump

waning crescent

hexdump

Contribution

L'entrée sera le chemin vers un fichier png de 240 px par 240 px et sera l'une des images ci-dessus.

Les octets d'image sont garantis identiques.

Gagnant

Victoires de code les plus courtes


1
En bonus, consultez ce gif cool: upload.wikimedia.org/wikipedia/commons/b/ba/…
Beta Decay

Réponses:


9

Node.js , 145 octets

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]

Essayez-le en ligne! (génère des fichiers factices avec les mêmes tailles)

Comment?

Nous regardons simplement la taille du fichier et le convertissons en index dans deux tables de recherche.

Première partie:

 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

Deuxième partie:

 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 , 223222 octets

-1 octet grâce à 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))- renverra le pixel RGBA à x,y
getpixel((n*48,99))[2]for n in[1,2,3,4]- renverra le canal bleu de la ligne médiane, où n*48 ... for n in 1,2,3,4seront 4 points où la lumière du soleil peut couvrir
n*getpixel(...)- générera une valeur différente pour chaque colonne
sum(...)%13- ces valeurs sont additionnées et %13sont utilisées pour obtenir une unique valeur à chaque phase, qui sera utilisée comme index pour la liste des phases
Les pixels sont approximativement à l'intérieur des cercles rouges:
image de la lune avec des pixels mis en évidence


5

Rubis, 131 octets

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

Décalages d'octets trouvés par la force brute - prendre le 699e octet du fichier modulo 7, par exemple, donne un index dans la première table de recherche.


2

Python 2 , 196 165 octets

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]

Essayez-le en ligne!


1

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

(-2 octets par plus de 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],'_',' ');

Pour l'exécuter:

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

Exemple:

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

Remarques:

  • L' -d error_reporting=0option est utilisée pour ne pas générer d'avis / avertissements.
  • Le -d short_open_tag=1est requis pour autoriser les balises courtes.
  • Si vous utilisez une httpsURL comme l'exemple ci-dessus, OpenSSL doit également être activé.

Comment?

Obtient la taille du fichier (octets) et crée un nombre unique pour lui par cette formule:

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

Cette formule génère des nombres de 0 à 8 avec seulement 3 manquants.

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

Approches précédentes:

PHP (> = 5,4), 251 octets

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

Pour l'exécuter:

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

Exemple:

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

Remarques:

  • L' -d error_reporting=0option est utilisée pour ne pas générer d'avis / avertissements.
  • Le -d short_open_tag=1est requis pour autoriser les balises courtes.
  • PHP doit avoir GD et il doit être activé.
  • Si vous utilisez une httpsURL comme l'exemple ci-dessus, OpenSSL doit également être activé.

Comment?

Les contrôles de la couleur de 4 pixels dans l'image à 40,120, 80,120, 160,120et 200,120et décide de la phase de lune à partir de ces couleurs.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.