Dado um ano e um mês, descubra a porcentagem de dias úteis nesse mês. Os dias úteis são de segunda a sexta-feira, sem considerar feriados ou outras coisas especiais. O calendário gregoriano é usado.
Entrada
Um ano e mês no formato ISO 8601 (AAAA-MM). O ano sempre tem quatro dígitos, o mês sempre tem dois dígitos. O ano indicado não será antes de 1582.
Resultado
A saída é a porcentagem de dias úteis (de acordo com a definição acima) no mês especificado, arredondada para um número inteiro. Nenhum sinal de porcentagem ou dígitos fracionários seguem.
Amostra 1
Input Output
2010-05 68
Amostra 2
Input Output
2010-06 73
Amostra 3
Input Output
1920-10 68
Amostra 4
Input Output
2817-12 68
Uma semana se passou, uma resposta foi aceita. Para os curiosos, os tamanhos das inscrições que recebemos em nosso concurso:
129 - Casca em Z
174 - VB.NET
222 - C
233 - C
300 - C
Assim como nossas próprias soluções (sem classificação):
75 - PowerShell
93 - Ruby
112 - Casca de Bourne
echo 100
Respostas:
Perl de 64 bits, 67
68Perl 5.10 ou posterior, execute com
perl -E 'code here'
ouperl -M5.010 filename
Concessões ao tamanho do código:
date
saída não começa com uma letra S. maiúsculaLC_ALL=C
.2> /dev/null
se chateado.por alguma razão, minha versão doRequer uma compilação de 64 bitsdate
2817-12 considera um mês inválido. Quem sabia, o novo apocalipse do GNU é devido!date
para datas após 2038. (Obrigado Joey)fonte
PHP - 135
Eu fiz isso em PHP porque tinha um problema semelhante para tratar há alguns dias.
(Um pouco) Mais legível e sem avisos sobre constantes sendo usadas como seqüências de caracteres:
Isso é possível graças a um algoritmo muito simples para calcular o número de dias úteis em um mês: verifique o dia da semana nos dias 29, 30 e 31 (se essas datas existirem) e adicione 20.
fonte
-R
, essa abordagem pode ter até 86 bytes (63,7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
Veja as etapas de golfe.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 caracteres
fonte
Bash + coreutils, 82 bytes
fonte
Windows PowerShell, 80
fonte
[int]
realmente ronda? Eu tenderia a acreditar no chão.[int]1.5
e[int]2.5
ceder2
. Esse comportamento exato geralmente causa problemas nas tarefas em que é necessária a divisão do piso (o que exige um extra[Math]::Floor()
), mas neste caso não dói e "arredondar para o mesmo" se aplica apenas a números que terminam e.5
que não podem acontecer aqui.[int]
com o PowerShell geralmente é mais uma conversão do que um elenco :-). Coisas como[int[]][char[]]'abc'
também funcionam que você não pode trabalhar em muitos outros idiomas.$input
->$args
salva um byte.D: 186 caracteres
Mais legivelmente:
fonte
Python - 142
Obrigado a fR0DDY pelo bit do calendário.
fonte
Ruby,
124119111Requer Ruby 1.9 devido a splatting do ano e mês antes do argumento -1 "dia" e
?-
para"-"
. Para o Ruby 1.8, devemos adicionar 2 caracteres:Editar : barbeie cinco caracteres com base na ajuda de @ Dogbert.
Editar : barbeie mais oito caracteres com base na ajuda de @ steenslag.
fonte
'-'
poderia ser escrito como?-
em Ruby 1.9PHP 5.2, 88 bytes
Embora eu já tenha jogado a solução do zneak com menos de 85 bytes (acabei de encontrar mais uma), aqui está a minha:
duvido que possa extrair mais três bytes aqui.
recebe entrada de STDIN: Corra com
echo <yyyy>-<mm> | php -nR '<code>'
.A sequência
$a
mapeia os dias por mês (date(t)
) e o dia da semana do primeiro dia do mês (date(N)
: segunda-feira = 1, domingo = 7) para a porcentagem de dias úteis-67;strtotime
converte a entrada em um registro de data e hora UNIX; o restante do código faz o hash.+1 byte para o PHP 5 mais antigo: Substitua
N
porw
e$a=_...;
por$a="..."
.outros +3 bytes para o PHP 4: insira
.-1
depois$argn
.-5 bytes para o PHP 5.5 ou posterior (pós-desafio):
remova tudo antes
echo
e substitua$a
por"4444444255555236666304777411"
.fonte
%7
vez de%28
.Rebol -
118113Ungolfed:
fonte
C #, 158 bytes
Método anônimo que retorna a porcentagem necessária.
Programa completo com métodos não comentados e comentados e casos de teste:
Função alternativa, que adiciona valores negativos ao número de dias úteis, alterando o sinal no retorno sem custo adicional de bytes:
fonte
Oracle SQL, 110 bytes
Ele trabalha com a suposição de que os dados de entrada são armazenados em uma tabela ao usar o
date
tipo de dados, por exemplo,fonte
APL (Dyalog Unicode) , SBCS de 55 bytes
Função de prefixo tácito anônimo.
⊂
incluir data para tratá-lo como um todo(2 5)2{
…}¨
Aplique a seguinte função nisso, mas com os argumentos à esquerda[2,5]
e2
:⎕CY'dfns'
copie a biblioteca "dfns"⍵⊣
descartar o relatório em favor da data' '@5⊢
substitua o quinto caractere (-
) por um espaço⍎
execute isso para obter lista de dois elementoscal
chame a função de calendário nesse' ',
anexar uma coluna de espaços a essa¯2⌽
gire as duas últimas colunas (sábado) para a frente⍺↓
soltar o número do argumento esquerdo de linhas (2, cabeçalhos) e colunas (se especificado; 5 = Sáb + Dom)↓
dividir matriz em lista de linhas⍕
formato (aplana com inserção de espaçamento duplo)⍎
execute (transforma os números restantes do dia em uma lista numérica plana)≢
contabilizar aqueles2÷/
divida cada par (existe apenas um)100×
multiplicar por cem.5+
adicione meio⌊
chãoExperimente online!
fonte
Perl 6 , 78 bytes
Experimente online!
fonte