Meu chefe precisa saber quanto tempo leva para adicionar dois números inteiros. Mas não gosto de trabalhar nos fins de semana e acho justo que meu código também não. O problema é que o chefe é um cara exigente e acha que eu deveria dedicar mais tempo para garantir que o tempo gasto permaneça o mesmo e sei que ele verificará se o código funciona corretamente.
Você pode me escrever um pequeno programa que:
- Aceita dois números inteiros e retorna o resultado correto da adição e o tempo que leva para realizar a adição - esse tempo deve ser plausível e com base no tempo de execução do código. No entanto, se você precisar esgueirar algumas operações entre o código cronometrado que o faz executar um pouco mais do que deveria, isso é permitido. Você não pode, no entanto, apenas produzir um tempo falso.
- Não funciona nos fins de semana nos códigos de horário local (ele não pode simplesmente retornar um resultado errado, o código precisa ser quebrado, com erro ou, caso contrário, não será executado)
- Não é imediatamente óbvio por que não funciona nos fins de semana
Sei que o primeiro critério é meio estranho, mas queria garantir que as pessoas pudessem importar bibliotecas de data / hora, se necessário, sem levantar suspeitas sobre o critério 3. No entanto, tenho certeza de que existem pessoas inteligentes, portanto, -10 caracteres para qualquer pessoa que possa fazer isso, sem usar funções de calendário de bibliotecas de datas padrão
Em relação às 'bibliotecas de data / hora padrão'
Exemplos de bibliotecas de data e hora padrão incluem pythons datetime
, date
biblioteca de objetos javascript java.util.Date
e similares. As funções para calcular o tempo determinado para execução, como o timeit
módulo pythons , não violariam esses critérios, pois o chefe espera que o código seja cronometrado. Em alguns casos, essas bibliotecas precisarão ser importadas para acessar qualquer função de horário, portanto, é permitido chamar funções que retornam a hora desde o início da época atual como um número inteiro, mas funções de calendário que retornam objetos de data e hora estruturados que podem fornecer dados separados. horas, dias, etc ... não são permitidos.
editar: Em relação à pergunta de Dan04, o código deve atender a esses 4 critérios sobre quando ele funcionará ou não. Você também deve explicar como o seu código verifica o horário, pois a folga na segunda-feira pela manhã / sexta-feira à noite deve oferecer alguma oportunidade para alguns maneiras criativas de diminuir o código.
- não deve funcionar das 00:00:00 da manhã de sábado às 23:59:59 de domingo à noite.
- deve sempre trabalhar das 06:00:00 de segunda à manhã às 19:59:59 sexta-feira à noite
- pode funcionar ou não das 00:00:00 de segunda a manhã às 5:59:59 Segunda de manhã
- pode funcionar ou não das 20:00:00 de sexta à noite até às 23:59:59 na sexta à noite pela manhã
edit2: por óbvio imediato, ele deve atender aos três critérios a seguir:
- Não deve chamar uma função que chamou
DayOfWeek
(ou similar), sem usá-la para calcular o tempo da função. - Não deve usar sábado ou domingo ou suas abreviações em inglês.
- Não deve usar Sat ou Sun (ou em maiúsculas e minúsculas) sem uma variável nomeada idêntica, não usada para determinar o dia da semana ou para determinar se o código deve ser executado.
fonte
Respostas:
Rebmu : 17 (27 - 10, ofuscado) ou 30 não ofuscado
O Rebmu foi projetado especificamente para jogar código-código enquanto é legível (para aqueles que entendem o "truque"); portanto, a regra da ofuscação é contrária ao seu princípio. Mas:
Funciona o dia todo durante a semana:
... mas nos fins de semana não faz nada:
Explicação:
Usando as letras maiúsculas e o silêncio das letras são palavras separadas, e a falta de uma letra maiúscula significa que não estamos fazendo uma palavra-chave, obtemos o Rebol abreviado:
Sem abreviá-lo, o que você conclui é:
Os números de data em Rebol são numerados de 1 para segunda-feira até 7 para domingo. A maneira mais instruída de obter um dia da semana em um dia da semana é dizer,
d/weekday
mas você também pode obtê-lod/7
. Minha solução preferida sem alterar as coisas apenas para se adaptar a esse problema seria mais como:Mas se atualizássemos o vocabulário para aplicação geral a esse estilo de problema, que provavelmente surge com frequência suficiente para não querermos repetir o verbete Rebol toda vez, eu provavelmente faria MON através do SUN ser 1 a 7) e abreviar AGORA SEMANA, quando provavelmente pareceria mais ...
Notas
Como de costume, você pode tornar o "programa" um pouco mais curto se você permitir que as entradas sejam passadas para o Rebmu como argumentos e apenas aceitar o resultado da avaliação (aqui, um valor do tipo time ou NONE) sem imprimi-lo:
Além disso, hora delta, datas, geração de imagens e várias coisas loucas já estão incluídas no executável de meia megabyte e instalação zero da Rebol .
fonte
Golfscript,
5156 - 10 = 46http://golfscript.apphb.com/?c=OycxIDUnCiciI3tUaW1lLm5vdy50b19pfSInLn5%2BQH4rQH5%2BMiQtQDYwIDU%2FOS8vKCg3JSgsKT1dYA%3D%3D
Satisfaz todas as três condições e não usa nenhuma das funções padrão da biblioteca, exceto o necessário para obter a hora atual. Assim, acredito que me qualifico para o bônus.
Quanto aos critérios de ofuscação - embora satisfaça a letra da lei, não parece muito inocente. É bastante óbvio que há algo acontecendo com as constantes mágicas de 60 e 7. Infelizmente, qualquer tipo de ofuscação vai levantar algumas sobrancelhas.
Entrada: dois números inteiros separados por espaço em branco
Saída: literalmente uma matriz golfscript - dois números inteiros (soma, tempo em ms) separados por um espaço e entre colchetes.
exemplo:
'"#{Time.now.to_i}"'
é uma string golfscript contendo um literal de string golfscript contendo um bloco executável do Ruby para recuperar o horário atual. A pilha agora contém a entrada na parte inferior e a receita de tempo na parte superior..~~
clona a receita do tempo e a avalia duas vezes. A primeira avaliação transforma uma sequência de caracteres em uma sequência numérica executando a seção ruby. A segunda avaliação o transforma em um número. A pilha agora contém (de baixo) a entrada, a receita de tempo e a hora de início@~+
puxa a entrada para o topo, avalia-a e executa adição. A pilha agora contém a receita de hora, a hora de início e a soma.@);' "'+~~
retira a receita do tempo, muda'"'
para' "'
(veja a discussão abaixo) e a avalia duas vezes. A pilha agora mantém o horário de início, a soma e o horário de término.2$-
clona a hora de início para o topo e a subtrai da hora de término. A pilha agora mantém a hora de início, a soma e a diferença de tempo.@86400/
puxa a hora de início para o topo e a converte de segundos para dias.((7%(
diminui os dias desde o início da época duas vezes (era quinta-feira, queremos sábado), pega o módulo 7 e diminui mais uma vez. O fim de semana mapeia para -1 e 0, os dias da semana mapeiam para 1..5.,)=
cria uma tabela de números inteiros desse tamanho. Isso é bom - uma matriz de tamanho negativo está vazia. Depois, leva seu último elemento. Infelizmente, alguns intérpretes ainda não falham. Em vez disso, eles surgem um valor zero - o que é seguro descartar. Então, em vez de descartar, usamos como um índice para essa matriz. Obter o nil'th index finalmente trava o intérprete, mas usar um elemento fora dos limites é bom - nada é empurrado para a pilha. Nesse caso, o acesso ao array está sempre fora dos limites, portanto não temos nada a descartar.]`
pega a pilha e formata-a como uma matriz de golfscript.fonte
Javascript
Ele usa este utilitário:
E aqui está a função real:
Espero que não seja imediatamente óbvio ...
fonte