Скажи мне Лунную Фазу!


10

Вызов

Учитывая входное изображение Луны, выведите фазу Луны.

Фазы Луны

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

new moon

шестнадцатеричного

waxing crescent

шестнадцатеричного

first quarter

шестнадцатеричного

waxing gibbous

шестнадцатеричного

full moon

шестнадцатеричного

waning gibbous

шестнадцатеричного

third quarter

шестнадцатеричного

waning crescent

шестнадцатеричного

вход

Входными данными будет путь к png-файлу 240 на 240 пикселей и будет один из изображений выше.

Байты изображения гарантированно будут одинаковыми.

выигрыш

Самый короткий код выигрывает


1
В качестве бонуса, посмотрите этот классный подарок
Beta Decay

Ответы:


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

Python 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.