Учитывая год и месяц, определите процент рабочих дней в указанном месяце. Рабочие дни - с понедельника по пятницу, независимо от праздников и других особых вещей. Григорианский календарь используется.
вход
Год и месяц в формате ISO 8601 (ГГГГ-ММ). Год всегда состоит из четырех цифр, месяц всегда состоит из двух цифр. Данный год не будет до 1582 года.
Вывод
Выходные данные - это процент рабочих дней (согласно приведенному выше определению) в данном месяце, округленный до целого числа. Знак процента или дробные цифры не следуют.
Образец 1
Input Output
2010-05 68
Образец 2
Input Output
2010-06 73
Образец 3
Input Output
1920-10 68
Образец 4
Input Output
2817-12 68
Прошла неделя, ответ принят. Для любопытных, размеры заявок, которые мы получили в нашем конкурсе:
129 - Z shell
174 - VB.NET
222 - C
233 - C
300 - C
А также наши собственные (без рейтинга) решения:
75 - PowerShell
93 - Ruby
112 - Оболочка Борна
echo 100
Ответы:
64-битный Perl, 67
68Perl 5.10 или более поздней версии, запустить с
perl -E 'code here'
илиperl -M5.010 filename
Уступки к размеру кода:
date
выходные данные которых не начинаются с заглавной буквы S. Запустите,LC_ALL=C
если есть сомнения.2> /dev/null
если расстроен.почему-то моя версияТребуется 64-битная сборкаdate
считает 2817-12 недействительным месяцем. Кто знал, GNU новый апокалипсис из-за!date
для дат после 2038 года. (Спасибо, Джои)источник
PHP - 135
Я сделал это на PHP, потому что у меня была похожая проблема, которую нужно было обработать несколько дней назад.
(Несколько) Более разборчиво и без уведомлений об использовании констант в качестве строк:
Это стало возможным благодаря очень простому алгоритму для подсчета количества рабочих дней в месяце: проверьте число дней недели 29-го, 30-го и 31-го (если эти даты существуют) и добавьте 20.
источник
-R
, этот подход может быть уменьшен до 86 байт (63,7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
см.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 персонажа
источник
Bash + coreutils, 82 байта
источник
Windows PowerShell, 80
источник
[int]
действительно раунды? Я склонен верить в это этажами.[int]1.5
и[int]2.5
выход2
. Такое точное поведение часто вызывает проблемы в задачах, где необходимо поэтапное деление (которое затем требует дополнительного[Math]::Floor()
), но в этом случае это не повредит, а «округление до четного» применяется только к числам, конец.5
которых не может произойти здесь.[int]
в PowerShell обычно является скорее преобразованием, чем приведением :-). Такие вещи, как[int[]][char[]]'abc'
также работа, которую вы не можете получить на многих других языках.$input
->$args
сохраняет байт.D: 186 символов
Более разборчиво:
источник
Питон - 142
Спасибо fR0DDY за бит календаря.
источник
Рубин,
124119111Требуется Ruby 1.9 из-за сплаттинга за год и месяц перед аргументом «день» -1 и
?-
для"-"
. Для Ruby 1.8 мы должны добавить 2 символа:Изменить : побрить пять символов на основе помощи @ Dogbert.
Изменить : побрить еще восемь символов на основе помощи @ steenslag.
источник
'-'
может быть написано как?-
в Ruby 1.9PHP 5.2, 88 байт
Хотя я уже использовал решение zneak до 85 байт (я только что нашел еще один), вот мое собственное:
я сомневаюсь, что смогу выжать еще три байта здесь.
принимает входные данные из STDIN: запустить с
echo <yyyy>-<mm> | php -nR '<code>'
.Строка
$a
отображает количество дней в месяце (date(t)
) и день недели первого дня месяца (date(N)
: понедельник = 1, воскресенье = 7) с процентом рабочих дней - 67;strtotime
преобразует ввод в метку времени UNIX; остальная часть кода выполняет хеширование.+1 байт для старого PHP 5: заменить
N
наw
и$a=_...;
на$a="..."
.еще +3 байта для PHP 4: вставить
.-1
после$argn
.-5 байт для PHP 5.5 или более поздней (задним числом):
удалите все до
echo
и замените$a
на"4444444255555236666304777411"
.источник
%7
вместо%28
.Реболь -
118113Ungolfed:
источник
C #, 158 байт
Анонимный метод, который возвращает необходимый процент.
Полная программа с ungolfed, комментируемым методом и контрольными примерами:
Альтернативная функция, которая добавляет отрицательные значения к числу рабочих дней, изменяя знак в возврате без дополнительных затрат в байтах:
источник
Oracle SQL, 110 байт
Он работает с предположением, что входные данные хранятся в таблице с использованием
date
типа данных, напримеристочник
APL (Dyalog Unicode) , 55 байтов SBCS
Функция анонимного молчаливого префикса.
⊂
приложить дату, чтобы рассматривать ее в целом(2 5)2{
…}¨
Примените к нему следующую функцию, но с левыми аргументами[2,5]
и2
:⎕CY'dfns'
скопировать библиотеку "dfns"⍵⊣
отменить отчет в пользу даты' '@5⊢
заменить 5-й символ (-
) пробелом⍎
выполнить это, чтобы получить список из двух элементовcal
вызвать функцию календаря на этом' ',
добавить к этому столбец пробелов¯2⌽
поверните последние две колонки (суббота) вперед⍺↓
удалить количество левых аргументов строк (2, заголовки) и столбцов (если указано; 5 = сб + вс)↓
разбить матрицу на список строк⍕
формат (сплющивается с вставкой двойного интервала)⍎
выполнить (превращает номера оставшихся дней в плоский числовой список)≢
подсчитать те2÷/
разделить каждую пару (есть только одна)100×
умножить на сто.5+
добавить половину⌊
этажПопробуйте онлайн!
источник
Perl 6 , 78 байт
Попробуйте онлайн!
источник