Tôi sẽ hết giờ làm việc, nhưng tôi không làm việc vào cuối tuần


17

Sếp của tôi cần biết phải mất bao lâu để cộng hai số nguyên lại với nhau. Nhưng, tôi không thích làm việc vào cuối tuần và tôi nghĩ thật công bằng khi mã của tôi cũng không. Vấn đề là, ông chủ là một người khó tính và nghĩ rằng tôi nên đưa vào theo thời gian để đảm bảo thời gian cần giữ nguyên, và tôi biết ông sẽ kiểm tra xem mã có hoạt động tốt không.

Bạn có thể viết cho tôi một chương trình ngắn rằng:

  1. Chấp nhận hai số nguyên và trả về kết quả chính xác của phép cộng và thời gian cần thiết để thực hiện phép cộng - thời gian này phải hợp lý và dựa trên thời gian chạy của mã. Tuy nhiên, nếu bạn cần lén lút một số thao tác giữa mã thời gian làm cho nó chạy lâu hơn một chút so với điều này được cho phép. Tuy nhiên, bạn không thể chỉ xuất ra một thời gian giả.
  2. Không hoạt động vào cuối tuần theo mã theo giờ địa phương (nó không thể trả về kết quả sai, mã cần bị hỏng, lỗi hoặc nếu không thực thi)
  3. Không rõ ràng ngay tại sao nó không hoạt động vào cuối tuần

Tôi biết tiêu chí đầu tiên khá kỳ lạ, nhưng tôi muốn đảm bảo mọi người có thể nhập thư viện ngày / giờ nếu cần, mà không gây nghi ngờ cho tiêu chí 3. Tuy nhiên, tôi chắc chắn có một số dân gian thông minh, vì vậy -10 ký tự bất cứ ai có thể làm điều này mà không cần sử dụng các chức năng lịch từ các thư viện ngày tiêu chuẩn

Về 'thư viện ngày / giờ tiêu chuẩn'

Ví dụ về các thư viện datetime tiêu chuẩn bao gồm pythons datetime, datethư viện đối tượng javascript java.util.Datevà tương tự. Các hàm để tính toán thời gian để thực hiện, chẳng hạn như timeitmô-đun pythons sẽ không vi phạm criteia này vì ông chủ đang mong đợi mã sẽ được tính thời gian. Trong một số trường hợp, các thư viện này sẽ cần phải được nhập để truy cập vào bất kỳ hàm thời gian nào , do đó, nó được phép gọi các hàm trả về thời gian kể từ khi bắt đầu kỷ nguyên hiện tại dưới dạng số nguyên, nhưng các hàm lịch trả về các đối tượng datetime có cấu trúc có thể tách rời giờ, ngày, vv ... không được phép.

chỉnh sửa: Liên quan đến câu hỏi của Dan04, mã phải đáp ứng 4 tiêu chí này về thời điểm nó hoạt động hay không hoạt động. Bạn cũng nên giải thích cách mã của bạn kiểm tra thời gian, vì sự chậm chạp vào sáng thứ Hai / tối thứ Sáu sẽ tạo cơ hội cho một số cách sáng tạo để rút ngắn mã.

  • không được làm việc từ 00:00:00 sáng thứ bảy đến 23:59:59 tối chủ nhật.
  • phải luôn làm việc từ 06:00:00 sáng thứ Hai đến 19:59:59 tối thứ Sáu
  • có thể làm việc hoặc không làm việc từ 00:00:00 sáng thứ Hai đến 5:59:59 sáng thứ Hai
  • có thể làm việc hoặc không làm việc từ 20:00:00 tối thứ sáu đến 23:59:59 sáng thứ sáu

chỉnh sửa2: Bởi ngay lập tức rõ ràng nó phải đáp ứng 3 tiêu chí sau:

  • Không được gọi một hàm gọi DayOfWeek(hoặc tương tự), mà không sử dụng nó để tính thời gian của hàm.
  • Không được sử dụng thứ bảy hoặc chủ nhật hoặc viết tắt bằng tiếng Anh.
  • Không được sử dụng Sat hoặc Sun (hoặc trong các trường hợp chữ cái thay thế của chúng) mà không có biến có tên giống hệt nhau không được sử dụng để xác định ngày trong tuần hoặc khi xác định xem mã có nên chạy hay không.

Làm thế nào để bạn xác định "cuối tuần"? Có ổn không nếu mã ngừng hoạt động vào chiều thứ Sáu thay vì đợi đến nửa đêm?
dan04

@ dan04 Tôi sẽ cập nhật để giải quyết vấn đề này.

3
nếu câu trả lời sáng tạo là mong muốn, đây không nên là một mã golf. Nếu mã golf là mong muốn, bạn cần xác định một cách khách quan "ngay lập tức rõ ràng".
John Dvorak

là thời gian để được hiểu là giờ địa phương, hay GMT?
John Dvorak

@JanDvorak Tôi đã cập nhật các hạn chế để trở nên giống như thế này với hy vọng nó sẽ tốt hơn bây giờ: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

Câu trả lời:


11

Rebmu : 17 (27 - 10, bị xáo trộn) hoặc 30 không được kích thích

Rebmu được thiết kế đặc biệt để chơi golf mã trong khi có thể đọc được (đối với những người nhận được "mánh khóe"), vì vậy quy tắc che giấu là trái với nguyên tắc của nó. Nhưng:

DnowRjRkILd/7 6[pDT[adJk]]

Nó hoạt động cả ngày vào các ngày trong tuần:

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

... nhưng vào cuối tuần, nó chẳng làm gì cả:

Input Integer: 10
Input Integer: 20

Giải trình:

Sử dụng các chữ cái viết tắt và chú ý các chữ cái là các từ riêng biệt và việc thiếu một chữ viết hoa hàng đầu có nghĩa là chúng ta không tạo ra một từ được đặt, chúng ta có được chữ viết tắt Rebol:

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

Không viết tắt nó, những gì bạn kết thúc là:

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

Số ngày trong Rebol được đánh số 1 cho Thứ Hai đến 7 cho Chủ Nhật. Cách nói rõ ràng hơn để có được một ngày trong tuần ra khỏi một ngày trong tuần là để nói d/weekdaynhưng bạn cũng có thể có được nó với d/7. Giải pháp ưa thích của tôi mà không thay đổi mọi thứ chỉ để thích ứng với vấn đề này sẽ giống như:

rJrKilNOW/weekday 6[pDT[adJk]]

Nhưng nếu phải cập nhật từ vựng cho ứng dụng chung cho kiểu vấn đề này, điều này có lẽ xuất hiện thường xuyên đến mức không muốn rơi vào trạng thái giật gân Rebol mỗi lần, có lẽ tôi sẽ biến MON qua SUN thành 1 - 7) và viết tắt NGAY BÂY GIỜ, tại thời điểm đó, nó có thể trông giống như ...

rJrKilNW/wkdySAT[pDT[adJk]]

Ghi chú

Như thường lệ, bạn có thể làm cho "chương trình" ngắn hơn một chút nếu bạn cho phép các đầu vào được chuyển đến Rebmu dưới dạng đối số và chỉ chấp nhận kết quả đánh giá (ở đây, giá trị của thời gian loại hoặc KHÔNG) mà không cần in:

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

Ngoài ra thời gian delta, ngày tháng, tạo hình ảnh và một số thứ điên rồ đã được bao gồm trong nửa megabyte, thực thi không cài đặt của Rebol .


Rebmu thật tuyệt vời. Có một phiên dịch viên được viết bằng một ngôn ngữ khác ngoài Rebol không?
primo

@primo Cảm ơn! Không, nó phụ thuộc khá nhiều 100% vào Rebol, và như tôi đã đề cập, nó chỉ là một lớp mỏng trên ngôn ngữ (và đủ thú vị, tương thích nếu mã của bạn hoàn toàn là chữ thường ... xem ví dụ Đồng hồ cát ) . Rebol là ma thuật thực sự ở đây, và cuối cùng cũng có được động lực kể từ khi tìm nguồn mở, vì vậy hãy thoải mái nói chuyện với chúng tôi và RebolBot trong cuộc trò chuyện SO.
Bác sĩ Rebmu

Tôi hỏi, bởi vì tôi thực sự muốn thấy điều này diễn ra trên anagol , mặc dù tôi không chắc sẽ mất bao nhiêu nỗ lực để cho phép một thông dịch viên viết bằng Rebol.
primo

@primo Xin lỗi vì sự chậm trễ trong phản hồi ... Tôi chắc chắn rất thích nhìn thấy điều này xảy ra, vì vậy nếu bạn biết bất cứ ai có họ liên lạc. Chúng tôi có Rebmu trên Cloud9 IDE và chúng tôi cũng có khả năng chạy các tập lệnh Rebmu không tương tác thông qua dịch vụ web mà RebolBot sử dụng. Bạn cũng có thể tìm thấy bài nói chuyện của tôi tại hội nghị quan tâm của Rebol / Red và có lẽ giúp thuyết phục mọi người rằng nó nên có trên anagol. :-)
Bác sĩ Rebmu

2

Golf, 51 56 - 10 = 46

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

http://golfscript.apphb.com/?c=OycxIDUnCiciI3tUaW1lLm5vdy50b19pfSInLn5%2BQH4rQH5%2BMiQtQDYwIDU%2FOS8vKC3

Đáp ứng cả ba điều kiện và không sử dụng bất kỳ chức năng thư viện tiêu chuẩn nào ngoại trừ những gì cần thiết để có được thời gian hiện tại. Vì vậy, tôi tin rằng tôi đủ điều kiện nhận tiền thưởng.

Liên quan đến các tiêu chí ám ảnh - trong khi nó đáp ứng thư pháp luật, nó không có vẻ rất vô tội. Một điều khá rõ ràng là có một cái gì đó đang diễn ra với các hằng số ma thuật của 60 và 7. Thật không may, bất kỳ loại obfuscation nào cũng sẽ làm nhướn mày.

Đầu vào: hai số nguyên cách nhau bởi khoảng trắng

Đầu ra: một mảng golfscript bằng chữ - hai số nguyên (tổng, thời gian tính bằng ms) cách nhau bởi một khoảng trắng và được bao quanh bởi dấu ngoặc vuông.

thí dụ:

;'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}"'là một chuỗi golfscript chứa một chuỗi ký tự golf có chứa một khối thực thi Ruby để lấy lại thời gian hiện tại. Bây giờ ngăn xếp giữ đầu vào ở dưới cùng và công thức thời gian ở trên cùng.
  • .~~nhân bản công thức thời gian và đánh giá nó hai lần. Đánh giá đầu tiên biến một chuỗi chuỗi thành một chuỗi số bằng cách thực hiện phần ruby. Đánh giá thứ hai biến nó thành một số. Bây giờ ngăn xếp giữ (từ dưới cùng) đầu vào, công thức thời gian và thời gian bắt đầu
  • @~+kéo đầu vào lên trên cùng, đánh giá nó và thực hiện phép cộng. Bây giờ ngăn xếp giữ công thức thời gian, thời gian bắt đầu và tổng.
  • @);' "'+~~lấy ra công thức thời gian, thay đổi '"'thành ' "'(xem phần thảo luận bên dưới) và đánh giá hai lần. Bây giờ ngăn xếp giữ thời gian bắt đầu, tổng và thời gian kết thúc.
  • 2$-nhân bản thời gian bắt đầu lên đầu và trừ nó từ thời gian kết thúc. Bây giờ ngăn xếp giữ thời gian bắt đầu, tổng và chênh lệch thời gian.
  • @86400/ kéo thời gian bắt đầu lên đầu và chuyển đổi từ giây sang ngày.
  • ((7%(giảm số ngày kể từ khi bắt đầu kỷ nguyên hai lần (đó là thứ năm, chúng tôi muốn thứ bảy), mất modulo 7 và giảm một lần nữa. Bản đồ cuối tuần đến -1 và 0, bản đồ ngày trong tuần tới 1..5.
  • ,)=tạo một bảng các số nguyên có kích thước đó. Điều này là tốt - một mảng kích thước âm là trống rỗng. Sau đó, nó có yếu tố cuối cùng của nó. Thật không may, một số thông dịch viên chưa sụp đổ. Thay vào đó, họ bật một con số không - an toàn để loại bỏ. Vì vậy, thay vì loại bỏ, chúng tôi sử dụng nó như một chỉ mục cho mảng đó. Lấy chỉ số thứ ba cuối cùng cũng làm hỏng trình thông dịch, nhưng lấy một phần tử nằm ngoài giới hạn là ổn - không có gì được đẩy vào ngăn xếp. Trong trường hợp này, truy cập mảng luôn nằm ngoài giới hạn, vì vậy chúng tôi không có gì để loại bỏ.
  • ]` lấy stack và định dạng nó như một mảng golfscript.

Tôi sợ rằng mã của bạn không thực sự định thời gian hoạt động. Thay thế bổ sung bằng một thao tác mất vài giây và bạn sẽ thấy rằng nó tuyên bố sẽ không mất thời gian. Tôi đã thảo luận về điều này (và cách giải quyết) trong blog GolfScript của tôi .
Peter Taylor


Tôi nghĩ rằng Golfscript đủ điều kiện là obfuscation: PI không thể tin rằng nó cần quá ít nhân vật! Bạn sẽ cho chúng tôi biết những gì xảy ra khi bạn chạy nó vào thứ bảy?

@LegoStormtroopr Tôi đã bao gồm một ví dụ.
John Dvorak

Ôi, lỗi của tôi, tôi đã bỏ lỡ nó hoàn toàn. Nỗ lực lớn lao.

1

JavaScript

Nó sử dụng tiện ích này:

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

Và đây là chức năng thực tế:

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

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

Tôi hy vọng nó không rõ ràng ngay lập tức


2
@ChristopherWirt: Tuyệt! Vui mừng tôi đã đánh bại thời hạn cho sự bất hạnh.
Ry-

Nó cũng không thực sự buồn cười một năm trước, nhưng tôi chắc chắn sẽ cho bạn biết rằng nó không "chính thức" cho đến ngày hôm nay;) Trừ khi câu trả lời (bằng cách nào đó) bị từ chối.
Christopher Wirt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.