var QUESTION_ID=97585,OVERRIDE_USER=42963;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Ответы:
Dyalog АПЗ с dfns «ы кал , версия 15.0: 22; Версия 16.0: 19 байт
Функция cal поставляется с установкой по умолчанию, просто введите
)copy dfns
.Версия 15.0:
∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12
∊
подключить⎕{
...}¨
числовой ввод в качестве левого аргумента для следующей анонимной функции, принимая каждое правое значение в качестве правого аргумента по очереди⍵/⍨
аргумент if (дает пустой список, если нет)2=
два (а именно воскресенье и понедельник) равно≢
подсчет⍎
числа в⊢⌿
самый нижний рядcal
календарь для⍺⍵
год левый аргумент, месяц правый аргумент, последний является⍳12
От 1 до 12Версия 16.0:
⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12
⍸
индексы где2=
два равных (а именно воскресенье и понедельник)⎕{
...}¨
числовой ввод в качестве левого аргумента для следующей анонимной функции, принимая каждое правое значение в качестве правого аргумента по очереди≢
подсчет⍎
числа в⊢⌿
самый нижний рядcal
календарь для⍺⍵
год левый аргумент, месяц правый аргумент, последний является⍳12
От 1 до 12источник
JavaScript (Firefox 30+),
11210910395 байтСмотри, мама, никаких встроенных модулей!
Вот 107-байтовая версия ES6:
И вот моя предыдущая попытка,
123113 байтов ES6:объяснение
День недели определенного года рассчитывается так:
Другими словами:
y
.y
(y>>2
).y
(y/100|0
).y
; это 1/4 отy/100|0
, поэтому мы используем*3/4|0
.Затем мы модулируем результат на 7. Если мы допустим
0
среднее воскресенье,1
средний понедельник и т. Д., Результат соответствует дню недели 31 декабря этого года. Поэтому за декабрь мы хотим проверить, есть ли результат1
. Это дает нам последний символ в строке.Последний день ноября - 31 день до последнего дня декабря. Это означает, что для последнего дня ноября, который будет понедельником, 31 декабря должно быть
(1 + 31) % 7 = 4
= четверг.Эта процедура повторяется, пока мы не вернемся к марту (а
3
). Независимо от того, существует ли високосный день, последний день февраля на 31 день раньше последнего дня марта, так что мы можем рассчитать это тоже(3 + 31) % 7 = 6
. Сложная часть находит правильное значение для января:(6 + 29) % 7 = 0
.(6 + 28) % 7 = 6
.Мы можем рассчитать, является ли это високосным годом, используя следующий фрагмент:
Это дает,
0
еслиy
не високосный год, и положительное целое число в противном случае. Это приводит нас кдля расчета дня января. Тем не менее, мы можем добиться большего, изменив условия:
Так как ложный результат всегда равен 0, мы можем уменьшить его до
сохранение еще одного драгоценного байта.
Собирая все это вместе, мы перебираем каждый символ в строке, проверяя, равен ли каждый день недели 31 декабря. Мы сохраняем индексы, которые совпадают, возвращая этот массив в конце. И именно так вы делаете расчеты високосного года без встроенных модулей.
источник
!(y%4)*y%100|!(y%400)
. каждый год делится на 4, кроме не делимых на 100 лет, если не делится также на 400y+(y>>2)+(z=y/25>>2)+(z>>2)
все еще экономит вам байт.(y*5/4-(y/100)*3/4)
.JavaScript (Firefox 30-57),
6765646361 байтСохранено
246 байт благодаря @ETHproductions.Сохраняет еще один байт, выводя месяцы в обратном порядке.источник
.keys()
:y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
Array(12)
всего:y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
MySQL,
183134129106 байтЗамените
2016
на нужный год. Запустить.Версия 2: Использовал
help_topics
таблицу в установке по умолчанию вместо создания временной таблицы.Откр.3
-
: принял трюк Аросса и заметил, что я также могу опустить кавычки"-1"
.Тем не менее,
-1
требуется в MySQL: мне нужна полная дата.Rev.4: ограничение
m BETWEEN 1 AND 12
может быть сделано какm>0 AND m<13
(-6), но не нужно вообще - недопустимые значения будут игнорироваться; предупреждения будут учтены, но не перечислены.источник
FROM help_topic
безmysql.
работы? Я не пробовалUSE mysql;
правильную базу данных.Perl, 64 байта
Включает +1 для
-n
Внесите свой вклад в STDIN:
mon.pl
:источник
Пакетное,
160152 байтаПорт @ ETHproduction ответа. С месячными сокращениями за
197189 байт:источник
J
483433 байтаСохранено 15 байт с помощью @ Adám .
Использует встроенный календарь для генерации массива строк, представляющих месяцы, а затем анализирует каждую строку, чтобы определить, является ли последний понедельник последним днем месяца. Он выводит каждый месяц как номер месяца каждого. То есть
Jan = 0
,Feb = 1
, ...,Dec = 11
.Выход
calendar
являетсяиспользование
объяснение
источник
calendar
представляет собой массив из 12 блоков, каждый из которых содержит двумерный массив символовI.7=;#&.>".&.>,&.>_2{.&.>calendar 2016
если вы объедините все «недостаточно открытые», вы сможете получить его довольно коротким.Mathematica,
6257 байтАнонимная функция. Принимает число в качестве ввода и возвращает список одноэлементных списков чисел в качестве вывода. Я, честно говоря, сам не уверен, как это работает.
источник
Perl + cal, 46 байт
Пример:
источник
Java 7,
186 182172 байтаСпасибо Кевину за сохранение 4 байта
Спасибо @cliffroot за сохранение 10 байтов
ungolfed
Эта версия предоставлена @cliffroot ( 168 байт )
выходной образец
источник
n%4==0
чтобыn%4<1
;n%400==0
кn%400<1
иint c=...;int[]b=...,a=...
кint c=...,b[]=...,a[]=...
.b
иa
может быть определено вint
части, как это:int ... ,b[]=...,a[]=...
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}
сохранено несколько байтовb
чтобыb[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}
иi+30
вi+28
течение более 2 байтаint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
Python 2, 100 байт
Тьфу. Математика с датами не так проста, как хотелось бы.
Попробуйте онлайн
Одинаковая длина:
источник
MATL , 21 байт
Месяцы отображаются в виде чисел.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Это использует встроенные функции преобразования даты. Для данного года он проверяет, какой из последних дней месяца - понедельник.
Вместо того, чтобы явно указывать последний день месяца
k
(который может быть 28, 29, 30 или 31), мы указываем0
-й день месяцаk+1
, который эквивалентен и не зависит от месяца или года.источник
Утилиты Bash + GNU, 56 байт
Похоже, требуется
date
версия 8.25. Версия 8.23 в Ideone не режет его.источник
Excel, 537 байт
Потому что - вы знаете - Excel!
Вводит год в А1. Возвращает шестнадцатеричный список месяцев; 1 = январь, C = декабрь. Поскольку каждый месяц представляет собой одну цифру, разделитель не требуется.
Пример: A1 содержит 2016. B1 содержит приведенную выше формулу и отображается как
2A
, означая февраль и октябрь.источник
PHP, 109
180159байтwhile
наfor
один год (спасибо Титу)Старый 2
Поддерживает все годы от точки до 10000, также избавился от неопределенного предупреждения о переменном токе, о котором я не знал ни на одном ПК. Да, он длиннее старой версии, но он более надежный.
Старый 1
При работе в Windows или 32-битной системе будет страшная ошибка 2038, но в 64-битной системе Linux это нормально.
Я пытался использовать,
date("t"...
который должен представлять последнюю дату данного месяца, но результаты не совпадали с ранее упомянутыми в этой теме.источник
$z
, кавычек нетN
) -1:for
вместоwhile
-43 : принимать ввод по запросу, а не проходить по годам -3:join
вместоimplode
-16: прямой вывод:for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
+9, если вы настаиваете на отсутствии запятой:echo$o=$o?",$m":$m;
PHP, 92 байта
проверка 12 раз 1 месяц после первого дня года - вторник. Если это так, то это день до того, как последний день месяца является понедельником.
источник
C 214 байта
Compile
Ungolfed
С кредитами соответствующих гуру.
Майкл Кит и Том Крейвер для C Program, чтобы найти день недели с заданной датой .
Collin Biedenkapp для Q & A: Как мне определить, какой последний день месяца?
источник
if
в другом направлении, чтобы получить своеelse
возвращение31
, и, следовательно, вы можете устранить большую==
цепь?C 119 байтов
При этом используется таблица, которая содержит смещение дней недели последнего дня каждого месяца для високосного года, закодированное в 32-разрядном слове со знаком с использованием базы 7. Если это не високосный год, мы добавляем 1 к смещению января (как видите
y&3||y%25<1&&y&15
, используется для проверки на годы без високосных дней). Затем мы просто перебираем каждый месяц и проверяем, является ли его последний день понедельником. На самом деле все просто, никаких уродливых хаков или уловок. Вот это немного разглажено:Я мог бы вернуться к этому, чтобы переписать его как функцию, чтобы сохранить несколько символов.
printf
Также занимает немного слишком много места ...источник
PHP,
96957671696461 байтПримечание: номера года должны быть дополнены до 4 символов, как
0070
.Запустите так:
объяснение
Итерирует от -1 до -12. Создайте дату, используя mktime, день
0
(последний день предыдущего месяца) и месяц2..13
. Отформатируйте дату как число дня , и если результат равен 1, напечатайте текущий номер. Отрицательный знак-
используется в качестве разделителя.«Тысячелетний жук» снова наносит удар!
Обратите внимание, что в этой версии диапазон
0..100
интерпретируется как1970..2069
. Это не проблема для диапазона0..69
, поскольку недели имеют схему, которая повторяется каждые 400 лет (146097 дней, ровно 20871 неделя), но для диапазона70..99
к номеру года добавляется 1900, который не кратен 400. Исправить эта проблема ТОЛЬКО для 30-летних чисел в диапазоне 10 КБ, самый простой способ - добавить 400 к номеру года, чтобы предотвратить двухзначную интерпретацию ( +4 байта ):Tweaks
!~-$i
для сравнения$i
с1
(-1
двоичным инвертированным является0
логически сведен на нет этоtrue
; любой другой номерfalse
), поэтому круглые скобки не нужныlast day ofYYYY-m
нотации для создания датыdate
иstrtotime
вместоdate_create
YYYY-m
части датыmktime
вместоstrtotime
. Вернулся к использованию дня0
(mktime
также поддерживает 13 месяцев, поэтому0-13
==31-12
)-R
чтобы сделать$argn
доступнымисточник
mktime
устраняет необходимость дополнять год, не так ли?mktime
это нелогично , потому что аргументы принимаются заINT
s. Это означает, что вы не можете определить год ... так что все в диапазоне0..100
интерпретируется как1970..2070
. Это не проблема для диапазона,0..70
потому что 400 лет имеют точное количество недель (поэтому календари повторяют шаблон каждые 400 лет), но70..99
добавляют 1900 (не кратно 400!). Поэтому новая версия есть ошибка$argv[1]+400
... если только не различаются будни по Юлиану и ГригорианскомуExcel,
4289796 байтВвод в А1. Вывести неразделенные шестнадцатеричные значения (январь = 0, декабрь = B)
Добавлены 10 байтов ("+2000") для обработки дат до 1990 года.
Сохранено 11 байт благодаря @ Engineer Toast .
Первая попытка (428 байт), в значительной степени заимствованная из решения @ Adám .
источник
297 -> May
возвращается6
с этой формулой. Разве это не должно быть 4?1776
дает7A
вместо только8
на сентябрь.Date(A1,3,0)
вместо этогоEOMONTH(DATE(A1,2,1),0)
Bash + cal, 58 байт
источник
cal
(например, OSX), но следите за пробелами в GNUcal
.Python 2, 94 байта
repl.it
Функция без имени, принимает целочисленный год, выводит список номеров месяцев
[1-12]
.Я также безуспешно пытался побить число байтов с помощью арифметики (110 байт). :
Безымянная функция, которая возвращает список логических значений, представляющих, если месяцы [январь-декабрь] заканчиваются в понедельник
источник
Java 7,
200249 байтВ Java
GregorianCalendar
это смесь григорианского и юлианского календаря. Из-за этого год1
дал неверные результаты. ИзменениеCalendar c=Calendar.getInstance();
вGregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));
это исправлено, заставляя использовать только по григорианскому календарю. Спасибо @JonSkeet на stackoverflow.com за объяснение этого мне.Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
C # 6C #,171167135 байтов-32 байта благодаря Шебангу
Печатать месяцы как числа; с пробелами; с замыкающим пространством. Теперь этот ответ также работает для более ранних версий C #.
Старый, 167 байт
-4 байта благодаря TimmyD
Выходные месяцы - это числа в возвращаемой строке, разделенные запятой
Ungolfed
источник
void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}}
) Кроме того, было бы короче разыгратьDayOfWeek
to,int
чем это было бы разыгратьint
toDayOfWeek
Action<int>
чтобы сохранить некоторые байтыРубин, 54 + 6 = 60 байт
6 байтов
-rdate
в командной строке для получения класса Date из стандартной библиотеки.Объяснение: довольно просто благодаря отличному
Date
классу Ruby stdlib . Мало того, что он имеет такие методы, какmonday?
,tuesday?
и т. Д., Конструктор будет принимать отрицательные числа для любого поля в прошлом году, что означает «считать это поле в обратном направлении от конца периода, представленного предыдущим полем».$*
это сокращение отARGV
, так$*[0]
что это быстрый способ получить первый аргумент командной строки.источник
PHP, 84 байта
Мой первый Код Гольф. Это самый короткий PHP на данный момент по этому вопросу.
РЕДАКТИРОВАТЬ: кажется, не работает в течение года. Я должен выяснить, почему, но сейчас я должен идти.
источник
for(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
R,
106999583787774 байтаПоследовательность последних дней каждого месяца определяется как
seq(as.Date(paste0(x,-2,-1)),,'m',12)-1
:paste0
принуждает -2 и -1 к символам. Еслиx
был, например, 2016, т. Д.,paste0(x,-2,-1)
Которые"2016-2-1"
затем конвертируются в 1 февраля 2016 годаas.Date
.seq
применяется к объекту POSIXct или Dateseq(from, to , by, length.out)
: здесьto
это не дано,by
дано как'm'
сопоставляемое'month'
благодаря частичному сопоставлению и,length.out
конечно, 12.-1
дает нам последний день из 12 месяцев, начиная с января соответствующего года.Тестовые случаи:
Старая версия на 95 байтов, выводящая названия месяцев, а не только их числа:
источник
seq
имел, что уDate
меня есть метод для -объектов, и это решает проблемуas.Date
отсутствия обработки годами выше10000
в моем удаленном ответе.seq.Date
иseq.POSIXt
впечатляют: они могут даже обрабатывать такие команды, какseq(time1, time2, by="10 min")
илиseq(date1, date2, by="quarter")
. Очень полезно при построении временных рядов.Japt, 24 байта
Проверьте это онлайн! Выводит массив чисел с
false
месяцами, которые не заканчиваются в понедельник.В интерпретаторе была ошибка, которая не позволяла мне использовать
Ð
тело функции£
. После исправления ошибки и добавления другой функции это составляет 18 байт в текущем коммите:источник
Java,
143129 байтЭто использует новый API времени Java 8.
Выход
Обратите внимание, что каждая строка имеет дополнительный пробел в конце.
Неуправляемый и тестирующий
Бритвы
DayOfWeek::ordinal
для сравнения с числовой константой вместо константы перечисления.Спасибо @TimmyD за общую идею, если не точное решение! ;-)
источник
getValue()
метод, который бы сэкономил несколько байтов.ordinal()
экономит на 1 байт больше по сравнению с темgetValue()
, что предлагается никогда не использовать.GNU awk, 80 байт
пример
источник