Mi occuperò della tua funzione, ma non lavoro nei fine settimana


17

Il mio capo deve sapere quanto tempo ci vuole per sommare due numeri interi. Ma non mi piace lavorare nei fine settimana e penso sia giusto che neanche il mio codice. Il problema è che il capo è un tipo esigente e pensa che dovrei inserirmi nel tempo per assicurarsi che il tempo impiegato rimanga lo stesso, e so che controllerà se il codice funziona correttamente.

Puoi scrivermi un breve programma che:

  1. Accetta due numeri interi e restituisce il risultato corretto dell'aggiunta e il tempo necessario per eseguire l'aggiunta: questa volta dovrebbe essere plausibile e basato sul tempo di esecuzione del codice. Tuttavia, se è necessario eseguire alcune operazioni tra il codice temporizzato che lo rende leggermente più lungo di quanto dovrebbe essere consentito. Tuttavia, non puoi semplicemente emettere un tempo falso.
  2. Non funziona nei fine settimana nei codici ora locale (non può semplicemente restituire un risultato errato, il codice deve rompersi, errore o altrimenti non riuscire a essere eseguito)
  3. Non è immediatamente ovvio il motivo per cui non funziona nei fine settimana

So che il primo criterio è un po 'strano, ma volevo assicurarmi che le persone potessero importare librerie di data / ora se necessario, senza sollevare sospetti per i criteri 3. Tuttavia, sono sicuro che ci sono alcune persone intelligenti, quindi -10 caratteri per chiunque sia in grado di farlo, senza utilizzare le funzioni di calendario delle librerie di date standard

Riguardo alle "librerie di data / ora standard"

Esempi di librerie datetime standard includono python datetime, datelibreria di oggetti javascript java.util.Datee simili. Le funzioni per calcolare i timedelt per l'esecuzione come il timeitmodulo Pythons non violerebbero questa critica poiché il boss si aspetta che il codice sia cronometrato. In alcuni casi, queste librerie dovranno essere importate per accedere a tutte le funzioni temporali, quindi è consentito chiamare funzioni che restituiscono il tempo dall'inizio dell'intera epoca come numero intero, ma funzioni di calendario che restituiscono oggetti datetime strutturati che possono dare separati ore, giorni, ecc ... non sono ammessi.

modifica: per quanto riguarda la domanda di Dan04, il codice deve soddisfare questi 4 criteri relativi a quando funzionerà o meno. Dovresti anche spiegare in che modo il tuo codice controlla l'ora, poiché il rallentamento del lunedì mattina / venerdì sera dovrebbe offrire l'opportunità di alcuni modi creativi per abbreviare il codice.

  • non deve funzionare dalle 00:00:00 di sabato mattina alle 23:59:59 di domenica sera.
  • deve sempre funzionare dalle 06:00:00 di lunedì mattina alle 19:59:59 di venerdì sera
  • può funzionare o meno dalle 00:00:00 di lunedì mattina alle 5:59:59 di lunedì mattina
  • può funzionare o meno dalle 20:00:00 di venerdì sera alle 23:59:59 di venerdì sera

edit2: immediatamente evidente deve soddisfare i seguenti 3 criteri:

  • Non deve chiamare una funzione che ha chiamato DayOfWeek(o simile), senza usarla per calcolare il tempo della funzione.
  • Non devono usare sabato o domenica o le loro abbreviazioni in inglese.
  • Non devono usare Sat o Sun (o nei loro casi di lettere alternative) senza una variabile con nome identico non utilizzata per determinare il giorno della settimana o per determinare se il codice deve essere eseguito.

Come definisci i "fine settimana"? Va bene se il codice smette di funzionare venerdì pomeriggio invece di aspettare fino a mezzanotte?
dan04,

@ dan04 aggiornerò per risolvere questo problema.

3
se si desiderano risposte creative, questo non dovrebbe essere un codice golf. Se si desidera il codice golf, è necessario definire oggettivamente "immediatamente ovvio".
John Dvorak,

l'ora deve essere intesa come ora locale o GMT?
John Dvorak,

@JanDvorak Ho aggiornato le restrizioni per essere più simile a questa speranza, ora è meglio: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Risposte:


11

Rebmu : 17 (27 - 10, offuscato) o 30 unobfuscated

Rebmu è specificamente progettato per giocare a code golf mentre è leggibile (per coloro che ottengono il "trucco"), quindi la regola dell'offuscamento è contro il suo principio. Ma:

DnowRjRkILd/7 6[pDT[adJk]]

Funziona tutto il giorno nei giorni feriali:

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

... ma nei fine settimana non fa proprio nulla:

Input Integer: 10
Input Integer: 20

Spiegazione:

Usare le lettere maiuscole non notate e notare è una parola separata, e la mancanza di una corsa maiuscola significa che non stiamo creando una parola, otteniamo l'abbreviazione Rebol:

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

Non abbreviandolo, quello che ti finisce è:

;-- 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
    ]
]

I numeri di data in Rebol sono numerati da 1 a lunedì fino a 7 per domenica. Il modo più educato di ottenere un giorno della settimana da un giorno feriale è quello di dire, d/weekdayma puoi anche farlo d/7. La mia soluzione preferita senza cambiare le cose solo per adattarmi a questo problema sarebbe più simile a:

rJrKilNOW/weekday 6[pDT[adJk]]

Ma se dovessi aggiornare il vocabolario per l'applicazione generale a questo stile di problema, che probabilmente emerge abbastanza spesso da non voler fallire ogni volta con il prolisso Rebol, probabilmente farei dal MON al SUN 1 - 7) e abbreviato ORA WEEKDAY, a quel punto sarebbe probabilmente più simile a ...

rJrKilNW/wkdySAT[pDT[adJk]]

Appunti

Come al solito, puoi rendere "il programma" stesso un po 'più breve se consenti che gli input vengano passati a Rebmu come argomenti e accetti semplicemente il risultato della valutazione (qui, un valore di tipo time o NONE) senza stamparlo:

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

Anche il delta-time, le date, la generazione di immagini e un numero folle di cose sono già inclusi nell'eseguibile da mezzo megabyte, a installazione zero di Rebol .


Rebmu è fantastico. Esiste un interprete scritto in una lingua diversa da Rebol?
primo

@primo Grazie! No, è praticamente dipendente al 100% da Rebol e, come ho già detto, è solo un sottile strato sulla lingua (e abbastanza interessante, compatibile se il tuo codice è tutto minuscolo ... vedi ad esempio Hourglass ) . Rebol è la vera magia qui, e finalmente sta ricevendo un po 'di slancio dalla sua fonte aperta, quindi sentiti libero di venire a parlare con noi e RebolBot nella chat SO.
Dr. Rebmu,

Chiedo, perché mi piacerebbe davvero vederlo decollare su Anagol , anche se non sono sicuro di quanto sforzo sarebbe consentire a un interprete scritto in Rebol.
primo

@primo Ci scusiamo per il ritardo nella risposta ... Sono decisamente interessato a vederlo accadere, quindi se sai che qualcuno li ha in contatto. Abbiamo Rebmu su Cloud9 IDE e abbiamo anche la possibilità di eseguire script Rebmu non interattivi tramite il servizio Web utilizzato da RebolBot. Potresti anche trovare il mio discorso alla conferenza di interesse Rebol / Red e forse aiutare a persuadere le persone che dovrebbe essere in 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

Soddisfa tutte e tre le condizioni e non utilizza nessuna delle funzioni di libreria standard tranne ciò che è necessario per ottenere l'ora corrente. Quindi, credo di qualificarmi per il bonus.

Per quanto riguarda i criteri di oscuramento - sebbene soddisfi la lettera della legge, non sembra molto innocente. È abbastanza ovvio che sta succedendo qualcosa con le costanti magiche di 60 e 7. Sfortunatamente, qualsiasi tipo di offuscamento farà alzare alcune sopracciglia.

Input: due numeri interi separati da spazi bianchi

Output: un array di script di golf letterale - due numeri interi (somma, tempo in ms) separati da uno spazio e racchiusi tra parentesi quadre.

esempio:

;'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}"'è una stringa di golfscript contenente una stringa di golfscript che contiene un blocco eseguibile Ruby per recuperare l'ora corrente. Lo stack ora contiene l'input in basso e la ricetta del tempo in alto.
  • .~~clona la ricetta del tempo e la valuta due volte. La prima valutazione trasforma una stringa di stringa in una stringa numerica eseguendo la sezione ruby. La seconda valutazione lo trasforma in un numero. Lo stack ora contiene (dal basso) l'input, la ricetta del tempo e l'ora di inizio
  • @~+estrae l'input verso l'alto, lo valuta ed esegue l'addizione. Lo stack ora contiene la ricetta del tempo, l'ora di inizio e la somma.
  • @);' "'+~~estrae la ricetta del tempo, cambia '"'in ' "'(vedi la discussione sotto) e la valuta due volte. Lo stack ora contiene l'ora di inizio, la somma e l'ora di fine.
  • 2$-clona l'ora di inizio in alto e la sottrae dall'ora di fine. Lo stack ora contiene l'ora di inizio, la somma e la differenza di tempo.
  • @86400/ sposta l'ora di inizio in alto e la converte da secondi a giorni.
  • ((7%(diminuisce i giorni dall'inizio dell'epoca due volte (era giovedì, vogliamo sabato), prende il modulo 7 e diminuisce ancora una volta. Mappe del fine settimana a -1 e 0, mappa dei giorni feriali a 1..5.
  • ,)=crea una tabella di numeri interi di quella dimensione. Questo va bene - un array di dimensioni negative è vuoto. Quindi prende il suo ultimo elemento. Sfortunatamente, alcuni interpreti non si bloccano ancora. Invece, fanno esplodere uno zero, che è sicuro scartare. Quindi, invece di scartarlo, lo usiamo come indice per quell'array. Prendendo l'ennesimo indice alla fine si blocca l'interprete, ma prendere un elemento fuori limite va bene - niente viene inserito nello stack. In questo caso, l'accesso all'array è sempre fuori limite, quindi non abbiamo nulla da scartare.
  • ]` prende lo stack e lo formatta come un array golfscript.

Temo che il tuo codice non stia effettivamente sincronizzando l'operazione. Sostituisci l'aggiunta con un'operazione che richiede alcuni secondi e vedrai che afferma di non aver bisogno di tempo. Ne ho discusso (e soluzioni alternative) nel mio blog GolfScript .
Peter Taylor,


Penso che Golfscript si qualifichi come offuscamento: PI non può credere che ci siano voluti così pochi personaggi! Ci dirai cosa succede quando lo esegui sabato?

@LegoStormtroopr Ho già incluso un esempio.
John Dvorak,

Oh whoops, errore mio, l'ho perso completamente. Grande sforzo.

1

JavaScript

Utilizza questa utility:

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()); });

Ed ecco la vera funzione:

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

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

Spero non sia stato subito ovvio ...


2
@ChristopherWirt: Cool! Sono contento di aver superato la scadenza per infedeltà.
Ry-

Non è stato neanche divertente un anno fa, ma ti darò sicuramente che non è stato "ufficiale" fino ad oggi;) A meno che la risposta (in qualche modo) venga respinta.
Christopher Wirt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.