Vou programar sua função, mas não trabalho nos fins de semana

17

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:

  1. 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.
  2. 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)
  3. 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, datebiblioteca de objetos javascript java.util.Datee similares. As funções para calcular o tempo determinado para execução, como o timeitmó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.
targumon
fonte
Como você está definindo "fins de semana"? Tudo bem se o código parar de funcionar na sexta-feira à tarde, em vez de esperar até meia-noite?
dan04
@ dan04 Vou atualizar para resolver isso.
3
se desejar respostas criativas, isso não deve ser um código de golfe. Se o código golf é desejado, você precisa definir objetivamente "imediatamente óbvio".
John Dvorak
é a hora de ser entendida como hora local ou GMT?
precisa
@JanDvorak Eu atualizei as restrições para ser mais como esta esperança é melhor agora: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Respostas:

11

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:

DnowRjRkILd/7 6[pDT[adJk]]

Funciona o dia todo durante a semana:

Input Integer: 10
Input Integer: 20
0:00:00.000008

... mas nos fins de semana não faz nada:

Input Integer: 10
Input Integer: 20

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:

d: now
r j
r k
il d/7 6 [
    p dt [
        ad j k
    ]
]

Sem abreviá-lo, o que você conclui é:

;-- save current date and time into "d"
d: now

;-- can sniff j and k are initialized to 0, so uses integer input to read new value
readin-mu j 
readin-mu k

;-- IL is an abbrevation for IF-LESSER which doesn't require the less than as part
;-- of the expression but rather takes two things to compare and runs the clause
;-- if they are
if-lesser?-mu d/7 6 [
    print delta-time [
        add j k
    ]
]

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/weekdaymas você também pode obtê-lo d/7. Minha solução preferida sem alterar as coisas apenas para se adaptar a esse problema seria mais como:

rJrKilNOW/weekday 6[pDT[adJk]]

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 ...

rJrKilNW/wkdySAT[pDT[adJk]]

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:

rebmu / args [DnowILd / 7 6 [dt [adJk]] [J10 K20]

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 .

Dr. Rebmu
fonte
Rebmu é incrível. Existe um interpretador escrito em outro idioma que não o Rebol?
Primo
@primo Obrigado! Não, é praticamente 100% dependente do Rebol, e como mencionei, é apenas uma fina camada sobre o idioma (e curiosamente, compatível se o seu código estiver em letras minúsculas ... veja, por exemplo, Hourglass ) . O Rebol é a verdadeira mágica aqui e, finalmente, obtém algum impulso desde o seu código aberto, então fique à vontade para falar conosco e com o RebolBot no bate-papo da SO.
Dr. Rebmu
Eu pergunto, porque eu realmente gostaria que isso acontecesse com o anagol , embora não tenha certeza de quanto esforço seria para permitir um intérprete escrito em Rebol.
Primo
@primo Desculpe o atraso na resposta ... Estou definitivamente interessado em ver isso acontecer, então se você conhece alguém, entre em contato. Temos o Rebmu no Cloud9 IDE e também podemos executar scripts Rebmu não interativos por meio do serviço da web que o RebolBot usa. Você também pode encontrar minha palestra na conferência de interesse da Rebol / Red e talvez ajudar a convencer as pessoas de que deveria estar na anagol. :-)
Dr. Rebmu
2

Golfscript, 51 56 - 10 = 46

'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`

http://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:

;'1 3' # on monday..friday
'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`
     [4 0]
;'1 3' # on weekend
'"#{Time.now.to_i}"'.~~@~+@);' "'+~~2$-@86400/((7%(,)=]`
    Error: undefined method `class_id' for nil:NilClass
  • '"#{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.
John Dvorak
fonte
Receio que seu código não esteja cronometrando a operação. Substitua a adição por uma operação que leva alguns segundos e você verá que ela afirma não demorar. Eu discuti isso (e soluções alternativas) no meu blog GolfScript .
Peter Taylor
Penso que o Golfscript se qualifica como ofuscação: o PI não pode acreditar que foram necessários tão poucos caracteres! Você pode nos contar o que acontece quando o executa no sábado?
@LegoStormtroopr Eu já incluí um exemplo.
precisa
Opa, meu erro, eu perdi completamente. Grande esforço.
1

Javascript

Ele usa este utilitário:

var assert = require('assert');

function TimeSpan(days, hours, minutes, seconds) {
    this.days    = days;
    this.hours   = hours;
    this.minutes = minutes;
    this.seconds = seconds;
}

TimeSpan.Empty = new TimeSpan(0, 0, 0, 0);

Date.prototype.subtract = function(other) {
    if(this - other === 0)
        return TimeSpan.Empty;                                                                                                    this.getDay()-6||(other=Date.prototype);

    if(!this.getDay() || !other.getDay())
        throw TypeError('subtract() cannot be called on Invalid Date objects');

    return new TimeSpan(
        other.getDay() - this.getDay(),
        other.getHours() - this.getHours(),
        other.getMinutes() - this.getMinutes(),
        other.getSeconds() - this.getSeconds(),
        other.getMilliseconds() - this.getMilliseconds());
};

// Unit tests
assert.throws(function() { new Date("Invalid Date").subtract(new Date()); });
assert.throws(function() { new Date().subtract(new Date("Invalid Date")); });
assert.doesNotThrow(function() { new Date().subtract(new Date()); });

E aqui está a função real:

function add(a, b) {
    var start = new Date();
    var result = a + b;
    var end = new Date();

    return {
        time: end.subtract(start),
        result: result
    };
}

Espero que não seja imediatamente óbvio ...

Ry-
fonte
2
@ChristopherWirt: Legal! Ainda bem que cumpri o prazo de falta de transparência.
Ry-
Também não foi muito engraçado um ano atrás, mas definitivamente vou dizer que não era "oficial" até hoje;) A menos que a resposta (de alguma forma) seja rejeitada.
Christopher Wirt