Скажи мені місячну фазу!


10

Виклик

Давши зображення Місяця як вхідного, виведіть фазу Місяця.

Фази Місяця

Вашій програмі буде поставлено одне із цих зображень у форматі png, і ви повинні вивести фазу точно так, як задано:

new moon

шестикутник

waxing crescent

шестикутник

first quarter

шестикутник

waxing gibbous

шестикутник

full moon

шестикутник

waning gibbous

шестикутник

third quarter

шестикутник

waning crescent

шестикутник

Вхідні дані

Введенням буде шлях до файлу png на 240 px на 240 px і буде одним із зображень, наведених вище.

Байти зображень гарантовано однакові.

Перемога

Найкоротший код виграє


1
Як бонус, перегляньте цей класний gif: upload.wikimedia.org/wikipedia/commons/b/ba/…
бета-версія занепаду

Відповіді:


9

Node.js , 145 байт

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]

Спробуйте в Інтернеті! (створює фіктивні файли однакових розмірів)

Як?

Ми просто дивимося на розмір файлу і перетворюємо його в індекси у двох таблицях пошуку.

Перша частина:

 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

Друга частина:

 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

Пітон 2 , 223 222 байти

-1 байт завдяки 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))- поверне піксель RGBA у x,y
getpixel((n*48,99))[2]for n in[1,2,3,4]- поверне синій канал середньої лінії, де n*48 ... for n in 1,2,3,4буде 4 точки, де сонячне світло може охоплювати
n*getpixel(...)- генеруватиме різне значення для кожного стовпця
sum(...)%13- ці значення додаються разом і %13використовуються для отримання унікального значення для кожної фази, яке буде використовуватись як індекс для списку фаз
Пікселі приблизно знаходяться всередині червоних кіл:
зображення місяця з виділеними пікселями


5

Рубін, 131 байт

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

Зміщення байтів, знайдене грубою силою - наприклад, взявши 699-й байт файлу по модулю 7, вказує індекс в першу таблицю пошуку.



1

PHP (> = 5,4), 199 197 байт

(-2 байти більше гольфу)

<?$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],'_',' ');

Щоб запустити його:

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

Приклад:

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

Примітки:

  • Ця -d error_reporting=0опція використовується для виведення сповіщень / попереджень.
  • -d short_open_tag=1Потрібно , щоб короткі теги.
  • Якщо ви використовуєте httpsURL-адресу, як у наведеному вище прикладі, OpenSSL також повинен бути включений.

Як?

Отримує розмір файлу (байти) і створює унікальне число для нього за цією формулою:

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

Ця формула генерує числа від 0 до 8, лише 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 │
└─────────────────┴───────┴─────────┴─────┴────────────────────────┘

Попередні підходи:

PHP (> = 5,4), 251 байт

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

Щоб запустити його:

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

Приклад:

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

Примітки:

  • Ця -d error_reporting=0опція використовується для виведення сповіщень / попереджень.
  • -d short_open_tag=1Потрібно , щоб короткі теги.
  • PHP повинен мати GD, і він повинен бути включений.
  • Якщо ви використовуєте httpsURL-адресу, як у наведеному вище прикладі, OpenSSL також повинен бути включений.

Як?

Перевірки кольору 4 пікселя в зображенні на 40,120, 80,120, 160,120і 200,120та приймають рішення про фазі Місяця від цих квітів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.