Сколько дней в месяце?

25

Если задано текстовое представление (полное имя без учета регистра или трехбуквенное сокращение) месяца, укажите количество дней в месяце.

Так , например, december, DECи decвсе должны вернуться 31.

Февраль может иметь 28 или 29 дней.

Предположим, что ввод - это месяц в одной из правильных форм.

qw3n
источник
19
Вам, вероятно, следует перечислить все варианты названий месяцев, которые мы должны принять.
Джузеппе
1
Для любого, кто может его использовать, порядковые суммы ASCII первых трех символов, которые были опущены, являются уникальными.
полностью человек
19
Это было далеко, слишком рано, чтобы принять решение.
Лохматый
5
Я думаю, что было бы лучше, если бы ввод был только месяц в фиксированном формате, так как формат теперь в основном требует преобразования в фиксированный регистр и только смотреть на первые 3 буквы.
xnor
4
Поскольку это стоит, похоже , вы хотите получить ответы обрабатывать все из перечисленных форм - «Так , например, december, DECи decдолжны все возвращение 31» - Это намерение?
Джонатан Аллан

Ответы:

4

Пайк , 9 байт

l4C9@~%R@

Попробуй это здесь!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Или 15 байтов, если требуются все входные форматы

l43<C9 3L<@~%R@

Попробуй это здесь!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
синий
источник
6
Это возвращает 31 для FEB.
Лайкони
2
Я считаю , что @ точка Laikoni является действительной (он также возвращает 31 для Apr, Jun, Sepи Nov) , но и думать , что это требует немного уточнения в ОП (см моего вопроса ).
Джонатан Аллан
@JonathanAllan Хорошо, ОП принял этот ответ, так что я думаю, что он действителен?
Эрик Outgolfer
4
@EriktheOutgolfer Я бы не стал делать такой вывод лично.
Джонатан Аллан
У меня сложилось впечатление, что нужно было работать только для одной формы ввода
Blue
33

JavaScript (ES6),  48 47 44 43  42 байта

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

демонстрация

Как?

Эти операции приводят к поисковой таблице из 8 записей, что было бы не очень интересно, если бы значения были распределены случайным образом. Но любой результат больше 2 сопоставляется с 31 днем. Таким образом, только первые 3 записи должны быть сохранены явно.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31
Arnauld
источник
14
Честно говоря, как же вы продолжаете делать эти удивительные странные представления с помощью сумасшедших математических материалов D: у вас есть программа, чтобы найти их, или вы слишком хороши для остальных из нас
HyperNeutrino
1
@HyperNeutrino Первое, что я пытаюсь найти, - это всегда найти базовое преобразование, за которым следует необязательное умножение, за которым следует одна или несколько операций по модулю. Этот был найден быстро таким образом. Но я неправильно понял вызов и сначала подумал, что это .substr(0,3)не обязательно. Итак, если подумать, это может быть не лучшим подходом.
Арно
substr? slice!
Нил
Мой тривиальный подход - всего <s> 2 </ s> 3 байта длиннее, поэтому он может быть неоптимальным из-за этого, но все же очень впечатляющим :)
HyperNeutrino
1
Чье-то редактирование удалило эту часть, но одна из причин, по которой я изначально запретил это, я хотел видеть ответы, подобные этому. Мне нравится использование базы 34, чтобы обойти проблему заглавных букв и различные форматы.
qw3n
15

Javascript (ES6), 36 33 байта

-3 байта благодаря @JustinMariner и @Neil

m=>31-new Date(m+31).getDate()%31

Извините @Arnauld, злоупотребление странностью JavaScript короче, чем ваши модные базовые преобразования.

Как это работает

По какой-то причине JavaScript позволяет вводить даты за пределами указанного месяца. Код подсчитывает, сколько дней вне месяца, чтобы определить дату, сколько дней в месяце. Примеры:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Контрольные примеры

Герман Л
источник
MS Excel также делает это .. 0 января всегда последний декабрьский день, поэтому = ДЕНЬ ("00/01/2017") приведет к 31
DavChana
Похоже, Javascript разрешает только строки даты, где день до 31. Если вы попытаетесь ввести «feb 32», это преобразуется в 2032-02-01, и если вы попытаетесь принудительно установить его с «0-feb-32» (или аналогичная строка), он просто говорит «Неверная дата». Как ни странно, если вы установите день на 0 («февраль 0»), он переводится в 2000-02-01, а не в 2000-01-31.
TehPers
Возможно, вы сможете сэкономить байт, опустив пространство раньше 31. Похоже, работает в Chrome, как, new Date("feb31")например.
Джастин Маринер
На самом деле, вы можете использовать +31три байта. Ничего из этого не работает в Firefox.
Нил
7

Баш , 21 байт

cal $1|xargs|tail -c3

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

Принимает ввод в качестве аргумента командной строки и выводит завершающий символ новой строки. Количество дней в феврале зависит от текущего года

Требуется версия util-linux 2.29cal , доступная на TIO . Также зависит от локали, поэтому LC_TIME необходимо изменить в неанглийских системах (спасибо @Dennis за разъяснения).

Идея прокачки xargsдо calвыхода триммера исходит из этого SO ответа .

Джастин Маринер
источник
2
Это не просто удар. Обычно это sh, но, вероятно, почти каждая реализация оболочки, которая поддерживает поиск путей и каналы, в системе с cal, tail и xargs.
Кодзиро
5

Протон , 50 байт

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

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

-14 байтов благодаря Джонатану Фреху

Тридцать дней в сентябре, апреле, июне и ноябре. У всех остальных было арахисовое масло. Все, кроме моей бабушки; у нее был маленький красный велосипед, но я украла его. muahahahahaha

(Я ждал, чтобы рассказать эту шутку (источник: мой преподаватель математики) целую вечность на этом сайте: D: D: D)

HyperNeutrino
источник
@Riker ой ой, что не было там, когда я начал писать это: /
HyperNeutrino
1
Существует новое правило, которое вы должны проверить на недопустимый месяц и вернуть 0. Я надеюсь, что оно будет удалено
Level River St
1
Не
важно,
Я думаю, что вы можете использовать одну строку 'sepaprjunnov'вместо списка строк.
Джонатан Фрех
@JonathanFrech возможно; Я попробую это, спасибо
HyperNeutrino
4

C # (.NET Core) , 52 + 13 = 65 38 + 24 = 62 байта

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

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

+24 для using D=System.DateTime;

Подтверждения

-3 байта благодаря Гжегож Пулавски.

Ayb4btu
источник
Это работает без using System;? Или вы можете исключить это из числа байтов?
Мэтти
@ Мэтти Это хороший момент; сейчас добавлено.
Ayb4btu
Поздний совет, но -3 байта: using D=System.DateTime;и m=>D.DaysInMonth(1,D.Parse(1+m).Month)как здесь: tio.run/##jc5BSwMxEAXgs/…
Гжегож Пулавский
3

Python 3 , 60 байт

x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))

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

Портирование моего решения Proton

-10 байт благодаря полностью человеческому

HyperNeutrino
источник
Лучше, чем у меня хе
Томас Уорд
1
ит
полностью человек
: P встроенные иногда слишком длинные: P
HyperNeutrino
@totallyhuman Ух ты! +1 спасибо: P
HyperNeutrino
2
ммм
totallyhuman
2

Python 3 - 93 86 84 82 байта

Варианты ответа (показывающие прогрессию времени и байтов для каждого со ссылками TIO):

Оригинальный ответ (93 байта)

-7 байт благодаря Джонатану Фреху.(86 байт)

На 2 байта больше, благодаря моему собственному дальнейшему тестированию monthrangeрезультатов, причем второе значение всегда является более высоким значением. (84 байта) 1

-2 больше, используя import calendar as cи ссылаясь на него c.monthrange. (82 байта, текущая версия )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

Очевидно, не так хорошо, как ответ HyperNeutrino, который не использует встроенные модули, но это все еще работает.


Сноски

1 : Тестовые случаи через TIO.run, показывающие доказательство того, как я работаю с этими monthrangeзначениями, для различного числа тестовых случаев за месяц.

Томас Уорд
источник
86 байт .
Джонатан Фрех
@JonathanFrech Спасибо. Далее пересмотрел в сторону понижения, потому что я проверил больше того, как работает monthrange, а также использовал, import ...,calendar as cчтобы не нужно было набирать «calendar» дважды.
Томас Уорд
2

Perl 5 , 47 + 1 ( -p) = 48 байт

$_=substr$_,1,2;$_=31-("eprunov"=~/$_/i)-3*/b/i

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

Xcali
источник
-6 байт: ($_)=/.(..)/;вместо $_=substr$_,1,2;и ()вокруг "eprunov"=~/$_/iможно удалить.
Науэль Фуйе
2

Haskell , 65 63 62 байта

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

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

Подход сопоставления с образцом. Первая строка должна обрабатывать нечувствительность к регистру. Затем мы возвращаем, 28если третья буква меньше C (число 3), 30если вторая буква больше C, а третья больше M, или31 иначе.

Редактировать: -1 байт благодаря Лео


Альтернатива ( 65 64 байта)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

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

Laikoni
источник
1
Умный! Вы можете сохранить байт, отметив c<3вместо a==6(февраль - первый месяц, если вы заказываете их третьей буквой, а затем декабрь)
Лев
2

APL (Dyalog) , 32 байта *

Функция молчаливого префикса. Предполагается ⎕IO( я ndex O rigin) 0, который по умолчанию на многих системах.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

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

⍠1 без учета регистра

1 вернуть длину

⎕S PCRE S нить поиск для

'.p|un|no|f' any-char, "p" или "un" или "no" или "f"

⊃⍨∘⊃ и использовать первый элемент этого (0, если нет), чтобы выбрать из

31 28 30 этот список

Таким образом:

  • Ap r, S ep , J un и No v выберут число с индексом 2, а именно 30

  • F eb выберет номер по индексу 1, а именно 28

  • все остальное выберет число с индексом 0, а именно 31


* Использование классического и подсчет , как ⎕OPT.

Дьялог АПЛ
источник
2

Шаблон Mediawiki, 19 байт

{{#time:t|{{{1}}}}}
ТТГ
источник
1

MATL , 22 байта

14L22Y2c3:Z)Z{kj3:)km)

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

объяснение

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display
Луис Мендо
источник
1

Wolfram Language (Mathematica) , 46 30 байт

#~NextDate~"Month"~DayCount~#&

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

Даст либо 28или 29за февраль в зависимости от того, является ли текущий год является високосным.

Как это работает

Все команды даты в Mathematica будет интерпретировать ввод таких April, APR, ApRiLи так далее , как в первый день соответствующего месяца в текущем году. (В качестве бонуса ввод, такой как "February 2016"или {2016,2}также, работает как ожидалось.)

#~NextDate~"Month"дает первый день месяца после этого и DayCountчисло дней между двумя аргументами. Количество дней между 1 апреля и 1 мая - 30, количество дней в апреле.

Миша лавров
источник
1

Сетчатка , 32 31 28 байт

i`f
28
i`p|v|un
30
\D

^$
31

Попробуйте онлайн! Редактировать: 1 байт сохранен благодаря @RobertBenson. Сохранено 3 байта благодаря @ovs.

Нил
источник
Я считаю, что вы можете сохранить байт, используя «f» вместо «eb»
Роберт Бенсон,
28 байт
овс
1

q / kdb +, 36 байт

Решение:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

Примеры:

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

Объяснение:

Есть миллион способов снять кожу с кошки. Я думаю, что немного отличается от других. Возьмите 2-ю и 3-ю буквы ввода, строчные буквы, затем найдите их в строке "ebeprunov". Если они находятся в точке 0, то это февраль, если они находятся в точке> 0, они 30-дневные, если они не в строке, они 31-дневные.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31
streetster
источник
1

Excel VBA, 47 43 байта

Функция анонимного непосредственного окна VBE, которая принимает данные в виде названия месяца, сокращения или номера из диапазона [A1]и выводит длину этого месяца в 2001 году в функцию непосредственного окна VBE.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

Старая версия

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d
Тейлор Скотт
источник
1

PHP, 38 33 + 1 32 + 1 байт

Сохранено 5 байт благодаря Титу

<?=date(t,strtotime("$argn 1"));

Беги как труба с -nF

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

Джо.
источник
1
Эй, я не думаю, что вам нужно .' 1', похоже, работает на TIO без него!
Дом Гастингс
1
28 + 1 байт: <?=date(t,strtotime($argn));(запустить как трубу с -nF)
Тит
3
@DomHastings - поэтому, прежде чем я отправил сообщение, я проверил, будет ли он работать без .' 1', но он не работал. Увидев ваш комментарий, я попытался выяснить, что я сделал не так. Поскольку я запускал его 31-го числа месяца, он брал 31-й (текущий) день для любого месяца, который я вставил, что будет превышать текущий месяц. 31 февраля превращается в 3 марта, поэтому код возвращает 31 (количество дней в марте). Из-за этого каждый месяц возвращался 31. Таким образом, он работает без в .' 1'любой день <= 28 числа месяца.
Джо.
Аааа, я забыл о том, как PHP заполняет пробелы! Спасибо за объяснение!
Дом Гастингс
@ Titus Спасибо. Я такой новичок в гольф! Я не знаю, почему я не понял 't'-> t. Кроме того, мне пришлось провести кучу поисков, чтобы выяснить, как «работать как труба с -nF», но я понял это (я думаю). :)
Джо.
0

Java (OpenJDK 8) , 126 байт

s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}

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

Роберто Грэм
источник
1
Я думаю, что вы можете сократить falseдо логического выражения, например, 1<0чтобы сэкономить пару байтов.
Джастин Маринер
0

QBIC , 49 35 байт

?31-(instr(@aprjunsepnov feb`,;)%3)

Значительно короче с некоторыми хитростями.

объяснение

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)
steenbergh
источник
0

Рубин , 45 байт

->m{((Date.parse(m)>>1)-1).day}
require'date'

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

Ruby's Date.parseпринимает название месяца самостоятельно. То, что обычно было бы вправо shift ( >>) фактически добавляет к месяцу Dateобъекта. Вычитание влияет на день месяца, который будет перенесен на последний день предыдущего месяца.

Джастин Маринер
источник