Saya akan mengatur waktu fungsi Anda, tetapi saya tidak bekerja pada akhir pekan

17

Bos saya perlu tahu berapa lama untuk menambahkan dua bilangan bulat. Tapi, saya tidak suka bekerja di akhir pekan, dan saya pikir wajar kalau kode saya juga tidak. Masalahnya adalah, bos adalah orang yang menuntut dan berpikir saya harus memasukkan dari waktu ke waktu untuk memastikan waktu yang dibutuhkan tetap sama, dan saya tahu dia akan memeriksa apakah kodenya berfungsi dengan baik.

Bisakah Anda menulis kepada saya program singkat yang:

  1. Menerima dua bilangan bulat, dan mengembalikan hasil penambahan yang benar dan berapa lama waktu yang diperlukan untuk melakukan penambahan - waktu ini harus masuk akal dan didasarkan pada runtime kode. Namun, jika Anda perlu menyelinap beberapa operasi antara kode waktunya yang membuatnya berjalan sedikit lebih lama dari seharusnya ini diizinkan. Namun Anda tidak bisa hanya menampilkan waktu palsu.
  2. Tidak bekerja pada akhir pekan di kode waktu setempat (tidak bisa hanya mengembalikan hasil yang salah, kode perlu rusak, kesalahan, atau gagal dieksekusi)
  3. Tidak segera jelas mengapa itu tidak bekerja pada akhir pekan

Saya tahu kriteria pertama agak aneh, tapi saya ingin memastikan orang bisa mengimpor perpustakaan tanggal / waktu jika diperlukan, tanpa menimbulkan kecurigaan untuk kriteria 3. Namun, saya yakin ada beberapa orang pintar, jadi -10 karakter untuk siapa pun yang dapat melakukan ini, tanpa menggunakan fungsi kalender dari pustaka tanggal standar

Mengenai 'perpustakaan tanggal / waktu standar'

Contoh pustaka datetime standar termasuk python datetime, datepustaka objek javascript , java.util.Datedan sejenisnya. Fungsi untuk menghitung timedeltas untuk dieksekusi seperti timeitmodul ular sanca tidak akan melanggar criteia ini karena bos mengharapkan kode untuk diatur waktunya. Dalam beberapa kasus, pustaka-pustaka ini perlu diimpor untuk mengakses fungsi waktu apa pun , sehingga diizinkan untuk memanggil fungsi yang mengembalikan waktu sejak dimulainya zaman saat ini sebagai bilangan bulat, tetapi fungsi kalender yang mengembalikan objek waktu terstruktur yang dapat memberikan objek terpisah jam, hari, dll ... tidak diperbolehkan.

sunting: Mengenai pertanyaan Dan04, kode harus memenuhi 4 kriteria ini tentang kapan akan berfungsi atau tidak. Anda juga harus menjelaskan bagaimana kode Anda memeriksa waktu, karena slack pada Senin pagi / Jumat malam harus memberikan beberapa peluang untuk beberapa cara kreatif untuk mempersingkat kode.

  • tidak boleh bekerja dari 00:00:00 Sabtu pagi hingga 23:59:59 Minggu malam.
  • harus selalu bekerja mulai pukul 06:00:00 Senin pagi hingga 19:59:59 Jumat malam
  • dapat bekerja atau tidak bekerja dari 00:00:00 Senin pagi hingga 5:59:59 Senin pagi
  • bisa bekerja atau tidak bekerja mulai pukul 20:00:00 Jumat malam hingga 23:59:59 Jumat malam pagi

sunting2: Dengan segera jelas itu harus memenuhi 3 kriteria berikut:

  • Tidak boleh memanggil fungsi yang disebut DayOfWeek(atau serupa), tanpa menggunakannya untuk menghitung waktu fungsi.
  • Tidak boleh menggunakan Sabtu atau Minggu atau singkatannya dalam bahasa Inggris.
  • Tidak boleh menggunakan Sat atau Sun (atau dalam kasus huruf alternatif mereka) tanpa variabel bernama identik tidak digunakan untuk menentukan hari dalam seminggu atau ketika menentukan apakah kode harus dijalankan.
targumon
sumber
Bagaimana Anda mendefinisikan "akhir pekan"? Apakah boleh jika kode berhenti bekerja pada hari Jumat sore alih-alih menunggu hingga tengah malam?
dan04
@ dan04 Saya akan memperbarui untuk mengatasi ini.
3
jika jawaban kreatif diinginkan, ini bukan golf kode. Jika kode golf diinginkan, Anda perlu mendefinisikan "segera jelas" secara objektif.
John Dvorak
adalah waktu untuk dipahami sebagai waktu setempat, atau GMT?
John Dvorak
@JanDvorak Saya telah memperbarui pembatasan untuk menjadi lebih seperti harapan ini lebih baik sekarang: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Jawaban:

11

Rebmu : 17 (27 - 10, dikaburkan) atau 30 tidak dikaburkan

Rebmu dirancang khusus untuk bermain golf kode sambil dibaca (bagi mereka yang mendapatkan "trik"), sehingga aturan kebingungan bertentangan dengan prinsipnya. Tapi:

DnowRjRkILd/7 6[pDT[adJk]]

Ini berfungsi sepanjang hari pada hari kerja:

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

... tetapi pada akhir pekan itu tidak melakukan apa-apa:

Input Integer: 10
Input Integer: 20

Penjelasan:

Menggunakan huruf kapital yang unmushing dan memperhatikan adalah kata-kata yang terpisah, dan kurangnya aliran modal terkemuka berarti kita tidak membuat kata-kata, kita mendapatkan Rebol disingkat:

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

Tanpa menyingkatnya, yang Anda dapatkan adalah:

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

Nomor tanggal dalam Rebol diberi nomor 1 untuk hari Senin hingga 7 untuk hari Minggu. Cara yang lebih melek huruf untuk mendapatkan satu hari dalam seminggu dari hari kerja adalah dengan mengatakan d/weekdaytetapi Anda juga bisa mendapatkannya d/7. Solusi pilihan saya tanpa mengubah hal-hal hanya untuk beradaptasi dengan masalah ini akan lebih seperti:

rJrKilNOW/weekday 6[pDT[adJk]]

Tetapi jika ingin memperbarui kosa kata untuk aplikasi umum untuk gaya masalah ini, yang mungkin muncul cukup sering untuk tidak ingin jatuh ke kata-kata Rebol setiap kali, saya mungkin akan membuat MON melalui SUN menjadi 1 - 7) dan menyingkat SEKARANG MINGGU, pada saat itu akan terlihat lebih seperti ...

rJrKilNW/wkdySAT[pDT[adJk]]

Catatan

Seperti biasa, Anda dapat membuat "program" itu sendiri sedikit lebih pendek jika Anda mengizinkan input untuk diteruskan ke Rebmu sebagai argumen dan hanya menerima hasil evaluasi (di sini, baik nilai type time atau NONE) tanpa mencetaknya:

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

Juga waktu delta, tanggal, pembuatan gambar, dan sejumlah hal gila sudah termasuk dalam setengah megabita Rebol , eksekusi tanpa instalasi .

Rebmu
sumber
Rebmu luar biasa. Apakah ada penerjemah yang ditulis dalam bahasa selain Rebol?
Primo
@primo Terima kasih! Tidak, ini tergantung 100% pada Rebol, dan seperti yang saya sebutkan itu hanya lapisan tipis di atas bahasa (dan cukup menarik, kompatibel jika kode Anda semuanya huruf kecil ... lihat misalnya Jam Pasir ) . Rebol adalah keajaiban nyata di sini, dan akhirnya mendapatkan momentum sejak open-source-nya, jadi jangan ragu untuk berbicara dengan kami dan RebolBot pada obrolan SO.
Dr. Rebmu
Saya bertanya, karena saya benar-benar ingin melihat ini lepas landas dengan anagol , walaupun saya tidak yakin berapa banyak upaya yang akan dilakukan untuk memungkinkan penerjemah yang ditulis dalam Rebol.
primo
@ primo Maaf atas keterlambatan dalam tanggapan ... Saya pasti tertarik melihat ini terjadi, jadi jika Anda tahu ada orang yang menghubungi mereka. Kami memiliki Rebmu di Cloud9 IDE dan kami juga memiliki kemampuan untuk menjalankan skrip Rebmu non-interaktif melalui layanan web yang digunakan RebolBot. Anda mungkin juga menemukan pembicaraan saya di konferensi kepentingan Rebol / Merah dan mungkin membantu membujuk orang-orang bahwa hal itu harus dilakukan secara anagol. :-)
Dr. Rebmu
2

Skrip golf, 51 56 - 10 = 46

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

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

Memenuhi ketiga kondisi, dan tidak menggunakan salah satu fungsi perpustakaan standar kecuali apa yang diperlukan untuk mendapatkan waktu saat ini. Jadi, saya yakin saya memenuhi syarat untuk bonus.

Mengenai kriteria obsfuscation - meskipun memenuhi surat hukum, itu tidak tampak sangat polos. Sangat jelas ada sesuatu yang terjadi dengan konstanta ajaib 60 dan 7. Sayangnya, segala jenis kebingungan akan menaikkan alis.

Input: dua bilangan bulat dipisahkan oleh spasi putih

Keluaran: suatu array skrip golf literal - dua bilangan bulat (jumlah, waktu dalam ms) dipisahkan oleh spasi dan dikelilingi oleh tanda kurung siku.

contoh:

;'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}"'adalah string skrip golf yang berisi string skrip golf berisi blok Ruby yang dapat dieksekusi untuk mengambil kembali waktu saat ini. Tumpukan sekarang memegang input di bagian bawah dan resep waktu di bagian atas.
  • .~~mengkloning resep waktu dan mengevaluasinya dua kali. Evaluasi pertama mengubah string string menjadi string numerik dengan mengeksekusi ruby ​​section. Evaluasi kedua mengubahnya menjadi angka. Tumpukan sekarang menampung (dari bawah) input, resep waktu dan waktu mulai
  • @~+mengeluarkan input ke atas, mengevaluasinya, dan melakukan penambahan. Tumpukan sekarang memegang resep waktu, waktu mulai, dan jumlahnya.
  • @);' "'+~~menarik keluar resep waktu, mengubahnya '"'menjadi ' "'(lihat pembahasan di bawah) dan mengevaluasi dua kali. Tumpukan sekarang memegang waktu mulai, jumlah dan waktu akhir.
  • 2$-mengkloning waktu mulai ke atas dan mengurangi dari waktu akhir. Tumpukan sekarang memegang waktu mulai, jumlah dan perbedaan waktu.
  • @86400/ menarik waktu mulai ke atas dan mengubahnya dari detik ke hari.
  • ((7%(mengurangi hari-hari sejak dimulainya zaman dua kali (itu Kamis, kami ingin Sabtu), mengambil modulo 7 dan mengurangi sekali lagi. Peta akhir pekan ke -1 dan 0, peta hari kerja ke 1..5.
  • ,)=membuat tabel bilangan bulat ukuran itu. Ini bagus - array ukuran negatif kosong. Kemudian dibutuhkan elemen terakhirnya. Sayangnya, beberapa penerjemah belum crash. Sebagai gantinya, mereka mengeluarkan nol - yang aman untuk dibuang. Jadi, alih-alih membuang, kami menggunakannya sebagai indeks untuk array itu. Mengambil indeks ke-n akhirnya menabrak penerjemah, tetapi mengambil elemen out-of-bound baik-baik saja - tidak ada yang didorong ke stack. Dalam hal ini, akses array selalu di luar batas, jadi kami tidak perlu membuang.
  • ]` meraih tumpukan dan memformatnya sebagai array skrip golf.
John Dvorak
sumber
Saya khawatir kode Anda tidak menentukan waktu pengoperasian. Ganti penambahan dengan operasi yang membutuhkan waktu beberapa detik dan Anda akan melihat bahwa itu mengklaim tidak membutuhkan waktu. Saya sudah membahas ini (dan solusinya) di blog GolfScript saya .
Peter Taylor
Saya pikir Golfscript memenuhi syarat sebagai kebingungan: PI tidak percaya butuh begitu sedikit karakter! Akankah Anda memberi tahu kami apa yang terjadi ketika Anda menjalankannya pada hari Sabtu?
@LegoStormtroopr Saya sudah menyertakan contoh.
John Dvorak
Astaga, kesalahan saya, saya sangat merindukannya. Usaha yang bagus.
1

JavaScript

Ini menggunakan utilitas ini:

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

Dan inilah fungsi sebenarnya:

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

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

Saya harap itu tidak segera jelas ...

Ry-
sumber
2
@ChristopherWirt: Keren! Senangnya saya mengalahkan tenggat waktu karena tidak sopan.
Ry-
Itu tidak benar-benar lucu setahun yang lalu, tetapi saya pasti akan memberi Anda bahwa itu tidak "resmi" sampai hari ini;) Kecuali jika jawaban (entah bagaimana) ditolak.
Christopher Wirt