Определить сезон

11

Вступление:

В северном полушарии (т. Е. В Европе, Северной Америке и т. Д.) Времена года разделены следующим образом:
- весна: март, апрель, май
- лето: июнь, июль, август
- осень: сентябрь, октябрь, ноябрь
- зима: декабрь , Январь Февраль

Однако в южном полушарии (например, в Австралии, Южной Америке и т. Д.) Времена года разделены следующим образом:
- весна: сентябрь, октябрь, ноябрь
- лето: декабрь, январь, февраль
- осень: март, апрель, май
- зима: Июнь Июль Август

Это различие связано с положением солнца относительно экватора, где северное и южное полушария имеют противоположные времена года.

Входные данные:

В этой задаче мы возьмем два входа:

  • Один на месяц ( 1 <= m <= 12или 0 <= m <= 11) (примеры и контрольные примеры все 1-проиндексированы).
  • И одна из пяти «групп-позиций» на широтах Земли ( -2 <= p <= 2), где -2находится Антарктика, -1является южным полушарием, исключая Антарктику, 0находятся ли тропики вблизи экватора, 1является северным полушарием, исключая Арктику, и 2является Арктика.
    Хотя в Арктике, Антарктике и Тропиках, конечно, еще есть времена года, ради этого вызова мы скажем, что Арктика и Антарктика находятся в постоянном состоянии Winter, а Тропики - в постоянном состоянии Summer.

Здесь наглядное представление этих пяти групп, где -2находится Северный полярный круг; -1между тропиком Козерога и Южным полярным кругом; 0между тропиком козерога и тропиком рака; 1между Северным полярным кругом и тропиком Рака; и -2полярный круг.

введите описание изображения здесьвведите описание изображения здесь Источник: COSMOS - Энциклопедия САО по астрономии

Выход:

Один из Spring, Summer, Autumnили Winter, следуя этим правилам:

  • Является ли положение ввода 2или -2(Арктика или Антарктика), всегда вывод Winter.
  • Является ли положение входа 0(тропики), всегда вывод Summer.
  • Является ли входная позиция 1(северное полушарие) выходным значением одного из четырех сезонов на основе входных данных месяца: Spring( m = [3,5]); Summer( m = [6,8]); Autumn( m = [9,11]); Winter( m = 12 or m = [1,2]).
  • Является ли ввод позиции -1(южное полушарие) выводом одного из четырех сезонов на основе ввода месяца: Spring( m = [9,11]); Summer( m = 12 or m = [1,2]); Autumn( m = [3,5]); Winter( m = [6,8]).

Правила вызова:

  • Выход любые четыре различных значения по вашему выбору с указанием Spring, Summer, Autumnили Winter(пожалуйста , укажите , что вы использовали в своем ответе).
    -15 байты бонуса , если вы выводите Spring, Summer, Autumnили в Winterвиде текста (без учета регистра, поэтому можете быть полностью строчными или полностью в верхнем регистре , а также, вместо использованного титульного случае).
  • Месяц ввода может быть в любом разумном формате. Может быть целым числом с 0 или 1 индексом, Date-object, Month-String и т. Д.
  • Вход Позиции всегда будет один из этих возможных пяти входов -2, -1, 0, 1, 2.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.

Тестовые случаи:

Position    1-indexed Month    Output

-2          8  (August)        Winter
-2          12 (December)      Winter
-1          3  (March)         Autumn
-1          5  (May)           Autumn
-1          8  (August)        Winter
-1          12 (December)      Summer
0           1  (January)       Summer
0           7  (July)          Summer
1           1  (January)       Winter
1           4  (April)         Spring
1           7  (July)          Summer
1           12 (December)      Winter
2           2  (February)      Winter
2           9  (September)     Winter
Кевин Круйссен
источник
Почему мы не можем просто использовать четыре разных значения для сезонов?
Эрик Outgolfer
Я прочитал это правило, поэтому я и спросил. Кроме того, почему вы боитесь "магических целочисленных вычислений"?
Эрик Outgolfer
Я не вижу ничего плохого в том, чтобы видеть только вычисления, они, скорее всего, все равно будут использоваться для индексации. Это ваш вызов, но я бы сказал, что это ненужное осложнение. РЕДАКТИРОВАТЬ: о копировании, ну, это не совсем избежать.
Эрик Outgolfer
2
Я не думаю, что какие-либо бонусы необходимы, программа все еще работает, если она просто не конвертирует вывод в эти строки.
Эрик Outgolfer
1
Я думаю, что байтовые бонусы, чтобы компенсировать размер текста в байтах, вполне хороши. Это не один из тех «бонусных баллов X, если вы также выполняете эту другую задачу». Задача сосредоточена вокруг сезонов, поэтому имеет смысл стимулировать фактическую печать сезонов.
Натан Меррилл,

Ответы:

6

Python 2 , 29 байт

lambda p,m:[0,m+6,6,m][p]/3%4

Попробуйте онлайн!

Подход Ruby от GB , который оказался на несколько байт короче моего:

32 байта

lambda p,m:(p%2*(p+m/3+5)or p)%4

Попробуйте онлайн!

Анонимная функция, которая возвращает времена года в виде чисел от 0 до 3, где они представляют лето, осень, зиму и весну в указанном порядке.

Что касается печати фактических названий сезона:

63 - 15 = 48 байт

lambda p,m:"SAWSuuipmtnrmutiemenrnrg"[(p%2*(p+m/3+5)or p)%4::4]

Попробуйте онлайн!

Там есть объединенная строка, если кто-то хочет.

Джо Кинг
источник
3

C (gcc) , 78 75 (-15 бонус) = 60 байт

Использование 1-го месяца.

Редактировать: переставлены математические операторы и уменьшены.

f(m,a){puts("Summer\0Autumn\0Winter\0Spring"+7*(a*a&1?(++a+m/3)%4:2*!!a));}

Попробуйте онлайн!

ErikF
источник
1
Вы можете сохранить два байта с помощью (++a+m/3)%4++a+m/3&3. Кроме того, a*aстранно, когда именно a, так что проверка a&1должна быть в порядке, нет?
Линн