İşine zaman ayıracağım ama hafta sonları çalışmıyorum


17

Patronumun iki tamsayıyı toplamasının ne kadar süreceğini bilmesi gerekiyor. Ancak, hafta sonları çalışmaktan hoşlanmıyorum ve kodumun da adil olmadığını düşünüyorum. Sorun şu ki, patron zorlu bir adam ve zamanın aynı kaldığından emin olmak için zaman içinde koymam gerektiğini düşünüyor ve kodun düzgün çalışıp çalışmadığını kontrol edeceğini biliyorum.

Bana kısa bir program yazabilir misiniz?

  1. İki tamsayıyı kabul eder ve toplama işleminin doğru sonucunu ve ekleme işleminin ne kadar sürdüğünü döndürür - bu süre mantıklı olmalı ve kodun çalışma süresine bağlı olmalıdır. Ancak, zamanlanmış kod arasında izin verilenden biraz daha uzun çalışmasını sağlayan bazı işlemleri gizlice girmeniz gerekiyorsa. Ancak sadece sahte bir zaman çıkaramazsınız.
  2. Yerel saat kodlarında hafta sonları çalışmaz (sadece yanlış bir sonuç döndüremez, kodun kırılması, hata vermesi veya başka bir şekilde yürütülmesi başarısız olur)
  3. Hafta sonları neden işe yaramadığı hemen belli değil

İlk kriterin biraz garip olduğunu biliyorum, ancak kriter 3 için şüphe uyandırmadan insanların gerektiğinde tarih / saat kitaplıklarını içe aktarabildiğinden emin olmak istedim . bunu yapmak herkes, olmadan standart tarih kütüphanelerinden takvim işlevlerini kullanarak

'Standart tarih / saat kütüphaneleri' ile ilgili

Standart datetime kitaplıklarına örnek olarak pitonlar datetime, javascript datenesne kitaplığı java.util.Dateve benzerleri gösterilebilir. Pythons timeitmodülü gibi yürütme için zaman çizelgelerini hesaplama işlevleri , patron kodun zamanlanmasını beklediğinden bu kriterleri ihlal etmez. Bazı durumlarda, bu kitaplıkların herhangi bir zaman işlevine erişmek için içe aktarılması gerekir ; bu nedenle, geçerli çağın başlangıcından bu yana zamanı döndüren işlevleri tamsayı olarak çağırmasına izin verilir, ancak ayrı verebilecek yapılandırılmış datetime nesneleri döndüren takvim işlevleri saat, gün vb. izin verilmez.

edit: Dan04 sorusu ile ilgili olarak, kod ne zaman işe yarayıp çalışmayacağına ilişkin bu 4 kriteri karşılamalıdır. Pazartesi sabahı / Cuma gecesi gevşeklik , kodu kısaltmak için bazı yaratıcı yollar için biraz fırsat vereceğinden, kodunuzun zamanı nasıl kontrol ettiğini de açıklamalısınız .

  • Cumartesi sabahı saat 23: 59: 59'dan Pazar gecesine kadar çalışmamalıdır.
  • Pazartesi sabahından 19:59:59 Cuma akşamına kadar her zaman çalışmalıdır
  • 00:00:00 Pazartesi sabahından 5:59:59 Pazartesi sabahına kadar çalışabilir veya çalışamaz
  • 20:00:00 Cuma akşamından 23:59:59 Cuma gecesi sabahına kadar çalışabilir veya çalışamaz

edit2: Hemen belli olduğu için aşağıdaki 3 kriteri karşılaması gerekir:

  • İşlevin DayOfWeekzamanını hesaplamak için kullanmadan çağrılan (veya benzeri) bir işlevi çağırmamalısınız .
  • Cumartesi veya pazar günleri veya İngilizce kısaltmaları kullanılmamalıdır.
  • Haftanın gününü belirlemek için veya kodun çalıştırılıp çalıştırılmayacağını belirlerken aynı adlı değişken olmadan Sat veya Sun (veya alternatif harf durumlarında) kullanılmamalıdır.

"Hafta sonlarını" nasıl tanımlıyorsunuz? Kodun gece yarısına kadar beklemek yerine Cuma öğleden sonra çalışması durursa sorun olur mu?
dan04

@ dan04 Bunu ele almak için güncelleyeceğim.

3
yaratıcı cevaplar isteniyorsa, bu bir kod golf olmamalıdır. Kod golfü isteniyorsa, objektif olarak "hemen bariz" olarak tanımlamanız gerekir.
John Dvorak

yerel saat veya GMT olarak anlaşılması gereken zaman nedir?
John Dvorak

@JanDvorak Şu anda daha iyi olmasını ummak için kısıtlamaları güncelledim: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Yanıtlar:


11

Rebmu : 17 ( 27-10 , karıştırılmış) veya 30 karıştırılmamış

Rebmu, okunabilirken ("hile" elde edenler için) kod golf oynamak için özel olarak tasarlanmıştır, bu nedenle gizleme kuralı ilkesine aykırıdır. Fakat:

DnowRjRkILd/7 6[pDT[adJk]]

Hafta içi tüm gün çalışır:

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

... ama hafta sonları hiçbir şey yapmıyor:

Input Integer: 10
Input Integer: 20

Açıklama:

Kullanılması unmushing ve büyük harflerle silsileleri olan ayrı sözcükleri fark ve biz bir dizi kelimeyi yapmıyoruz lider sermaye çalıştırma araçlarının eksikliği, biz kısaltılmış Rebol'un olsun:

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

Kısaltmayı kaldırdığınızda, sarıldığınız şey:

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

Rebol'daki tarih numaraları Pazartesi için 1, Pazar için 7'ye kadar numaralandırılmıştır. Haftanın bir gününü haftanın bir gününden çıkarmanın daha okuryazar yolu söylemek d/weekdayama bunu da alabilirsiniz d/7. Sadece bu soruna uyum sağlamak için bir şeyleri değiştirmeden tercih ettiğim çözüm daha çok şöyle olurdu:

rJrKilNOW/weekday 6[pDT[adJk]]

Ancak, genel uygulama için kelime dağarcığını, muhtemelen her seferinde Rebol'e ayrıntılı olarak düşmek istemeyecek kadar sık ​​ortaya çıkan bu sorun stiline güncellemiş olsaydım, muhtemelen MON-SUN'u 1 - 7 yapalım) ve kısaltacağım ŞİMDİ HAFTAN GÜNÜ, bu noktada muhtemelen daha çok benziyor ...

rJrKilNW/wkdySAT[pDT[adJk]]

notlar

Her zaman olduğu gibi, girdilerin argüman olarak Rebmu'ya iletilmesine izin verirseniz ve değerlendirme sonucunu (burada, zaman tipi veya YOK) yazdırmadan kabul ederseniz, "program" ın kendisini biraz daha kısa hale getirebilirsiniz:

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

Ayrıca delta zamanı, tarihler, görüntü oluşturma ve çılgınca şeyler Rebol'un yarım megabaytlık sıfır yüklemeli yürütülebilir dosyasına zaten dahil edilmiştir .


Rebmu inanılmaz. Rebol'dan başka bir dilde yazılmış bir tercüman var mı?
primo

@primo Teşekkürler! Hayır, neredeyse% 100 Rebol'a bağımlı ve bahsettiğim gibi, bu sadece dil üzerinde ince bir katman (ve ilginç bir şekilde, kodunuz küçük harfle uyumluysa ... örneğin Kum Saati ) . Rebol buradaki gerçek sihirdir ve sonunda açık kaynaklı olduğundan beri biraz ivme kazanır , bu yüzden bizimle sohbet etmekten çekinmeyin ve SO sohbetinde RebolBot .
HostileFork,

Soruyorum, çünkü bu anagolde bunun kalktığını görmek istiyorum , ancak Rebol'da yazılı bir tercümana izin vermenin ne kadar çaba sarf edeceğinden emin değilim.
primo

@primo Yanıttaki gecikme için özür dilerim ... Kesinlikle bunun gerçekleştiğini görmekle ilgileniyorum. Cloud9 IDE'de Rebmu var ve ayrıca RebolBot'un kullandığı web hizmeti üzerinden etkileşimli olmayan Rebmu komut dosyalarını çalıştırma yeteneğine de sahibiz. Konuşmamı Rebol / Red ilgi konferansında bulabilir ve belki de insanları anagolde olması gerektiğine ikna etmeye yardımcı olabilirsiniz. :-)
HostileFork SE

2

Golfscript, 51 56-10 = 46

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

http://golfscript.apphb.com/?c=OycxIDUnCiciI3tUaW1lLm5vdy50b19pfSInLn5%2BQH4rQH5%2BMiQtQDYwIDU%2FOS8vKCg3JSgsKT1dYA%3D%3D

Her üç koşulu da karşılar ve geçerli saati elde etmek için gerekli olanlar dışında standart kütüphane işlevlerinden hiçbirini kullanmaz. Bu yüzden bonus almaya hak kazandığımı düşünüyorum.

Karartma kriterlerine ilişkin olarak - kanunun mektubunu yerine getirirken, çok masum görünmüyor. 60 ve 7 sihirli sabitleri ile ilgili bir şey olduğu oldukça açıktır.

Girdi: boşlukla ayrılmış iki tamsayı

Çıktı: bir golfscript dizisi değişmez değeri - bir boşlukla ayrılmış ve köşeli parantezlerle çevrili iki tamsayı (toplam, ms cinsinden süre).

misal:

;'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}"', geçerli saati almak için Ruby yürütülebilir bloğu içeren bir golfscript dizesi değişmezi içeren bir golfscript dizesidir. Yığın şimdi girişi en altta ve zaman reçetesini en üstte tutar.
  • .~~zaman reçetesini klonlar ve iki kez değerlendirir. İlk değerlendirme, yakut bölümünü yürüterek bir dize dizesini sayısal bir dizeye dönüştürür. İkinci değerlendirme bunu bir sayıya dönüştürür. Yığın şimdi girişi (alttan), zaman tarifini ve başlangıç ​​zamanını tutar
  • @~+girişi en üste çıkarır, değerlendirir ve ekleme yapar. Yığın şimdi zaman tarifini, başlangıç ​​zamanını ve toplamı tutar.
  • @);' "'+~~Zaman tarifi üzerinden çeker değişikliği '"'için ' "'ve çift değerlendirir bu (tartışmaya bakınız aşağıda). Yığın şimdi başlangıç ​​zamanını, toplamı ve bitiş zamanını tutar.
  • 2$-başlangıç ​​zamanını en üste klonlar ve bitiş zamanından çıkarır. Yığın şimdi başlangıç ​​zamanını, toplamı ve zaman farkını tutar.
  • @86400/ başlangıç ​​zamanını en üste çeker ve saniyeden güne çevirir.
  • ((7%(çağın başlangıcından bu yana iki gün azalır (perşembe, cumartesi istiyoruz), modulo 7 alır ve bir kez daha azalır. Hafta sonu -1 ve 0 ile, hafta içi 1..5 ile eşleşir.
  • ,)=bu boyutta bir tamsayı tablosu oluşturur. Bu iyi - negatif boyutlu bir dizi boş. Sonra son elementini alır. Ne yazık ki, bazı tercümanlar henüz çökmedi. Bunun yerine, bir nil patlatıyorlar - bu da atılması güvenlidir. Bu nedenle, atmak yerine, diziye bir dizin olarak kullanıyoruz. Nil dizini almak sonunda yorumlayıcıyı çökertir, ancak sınırların dışında bir eleman almak iyidir - yığına hiçbir şey itilmez. Bu durumda, dizi erişimi her zaman sınırların dışındadır, bu nedenle atmamız gereken bir şey yoktur.
  • ]` yığını tutar ve bir golfscript dizisi olarak biçimlendirir.

Korkarım kodunuz aslında işlemi zamanlamıyor. Eklemeyi birkaç saniye süren bir işlemle değiştirin; zaman almadığını iddia edin. Bunu (ve geçici çözümleri) GolfScript blogumda tartıştım .
Peter Taylor


Bence Golfscript gizleme niteliği taşıyor: PI, bu kadar az karakter gerektirdiğine inanamıyor! Cumartesi günü çalıştırdığınızda ne olacağını bize söyler misiniz?

@LegoStormtroopr Zaten bir örnek ekledim.
John Dvorak

Hata! Tamamen özledim. Buyuk gayret.

1

JavaScript

Bu yardımcı programı kullanır:

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

Ve işte asıl işlev:

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

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

Umarım hemen belli olmazdı …


2
@ChristopherWirt: Harika! Memnuniyetsizlik için son tarihi geçmekten memnunum.
Ry-

Bir yıl önce de gerçekten komik değildi, ama bugüne kadar bunun "resmi" olmadığını kesinlikle söyleyeceğim;) Cevap (bir şekilde) reddedilmedikçe.
Christopher Wirt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.