ฉันจะใช้เวลาฟังก์ชั่นของคุณ แต่ฉันไม่ได้ทำงานวันหยุดสุดสัปดาห์


17

เจ้านายของฉันต้องการทราบว่าต้องใช้เวลานานเท่าใดในการเพิ่มจำนวนเต็มสองจำนวนเข้าด้วยกัน แต่ฉันไม่ชอบทำงานวันหยุดสุดสัปดาห์และฉันคิดว่ามันยุติธรรมที่รหัสของฉันก็ไม่เหมือนกัน ปัญหาคือเจ้านายเป็นคนที่เรียกร้องและคิดว่าฉันควรใส่เวลาเพื่อให้แน่ใจว่าเวลาที่ใช้อยู่เหมือนเดิมและฉันรู้ว่าเขากำลังจะตรวจสอบว่ารหัสทำงานอย่างถูกต้องหรือไม่

คุณช่วยเขียนโปรแกรมสั้น ๆ ที่:

  1. ยอมรับจำนวนเต็มสองจำนวนและส่งคืนผลลัพธ์ที่ถูกต้องของการเพิ่มและเวลาที่ใช้ในการทำการบวก - เวลานี้ควรจะเป็นไปได้และขึ้นอยู่กับรันไทม์ของรหัส อย่างไรก็ตามหากคุณต้องการแอบดูการทำงานบางอย่างระหว่างรหัสที่ตั้งเวลาซึ่งทำให้มันใช้งานได้นานกว่าที่ควรจะได้รับอนุญาต อย่างไรก็ตามคุณไม่สามารถส่งออกเวลาปลอมได้
  2. ไม่ทำงานในวันหยุดสุดสัปดาห์ในรหัสเวลาท้องถิ่น (ไม่สามารถส่งคืนผลลัพธ์ผิดพลาดได้, รหัสต้องหยุดพัก, ข้อผิดพลาดหรือไม่สามารถดำเนินการได้)
  3. ไม่ชัดเจนในทันทีว่าทำไมมันไม่ทำงานในวันหยุดสุดสัปดาห์

ฉันรู้ว่าเกณฑ์แรกเป็นสิ่งที่แปลก แต่ฉันต้องการให้แน่ใจว่าผู้คนสามารถนำเข้าห้องสมุดวันที่ / เวลาหากจำเป็นโดยไม่ต้องสงสัยเกณฑ์ 3 แต่ฉันแน่ใจว่ามีคนฉลาดบางคนดังนั้น-10 ตัวอักษรถึง ทุกคนที่สามารถทำได้โดยไม่ต้องใช้ฟังก์ชันปฏิทินจากไลบรารีวันที่มาตรฐาน

เกี่ยวกับ 'วันที่ / เวลามาตรฐาน'

ตัวอย่างของไลบรารีดาต้าไทม์มาตรฐานรวมถึง pythons datetime, dateobject object ของjavascript , java.util.Dateและ like ฟังก์ชั่นในการคำนวณ timedeltas สำหรับการดำเนินการเช่นtimeitโมดูลpythons จะไม่ละเมิด criteia นี้เนื่องจากเจ้านายคาดหวังว่ารหัสจะถูกกำหนดเวลา ในบางกรณีไลบรารีเหล่านี้จะต้องนำเข้าเพื่อเข้าถึงฟังก์ชั่นเวลาใดก็ได้ดังนั้นจึงอนุญาตให้เรียกใช้ฟังก์ชันที่คืนเวลานับตั้งแต่จุดเริ่มต้นของยุคปัจจุบันเป็นจำนวนเต็ม แต่ฟังก์ชั่นปฏิทินที่ส่งกลับวัตถุ datetime ที่มีโครงสร้าง ไม่อนุญาตให้ชั่วโมงชั่วโมงวัน ฯลฯ

แก้ไข: เกี่ยวกับคำถามของ Dan04 รหัสจะต้องเป็นไปตามเกณฑ์ 4 ข้อเหล่านี้เกี่ยวกับเวลาที่มันจะใช้งานได้หรือไม่ทำงาน คุณควรอธิบายวิธีการตรวจสอบรหัสของคุณด้วยเนื่องจากความหย่อนในเช้าวันจันทร์ / คืนวันศุกร์ควรให้โอกาสสำหรับวิธีที่สร้างสรรค์ในการย่อรหัสให้สั้นลง

  • ต้องไม่ทำงานตั้งแต่ 00:00:00 เช้าวันเสาร์จนถึง 23:59:59 คืนวันอาทิตย์
  • ต้องทำงานจาก 06:00:00 เช้าวันจันทร์ถึง 19:59:59 เย็นวันศุกร์
  • สามารถทำงานได้หรือไม่ทำงานตั้งแต่ 00:00:00 เช้าวันจันทร์ถึง 5:59:59 เช้าวันจันทร์
  • สามารถทำงานได้หรือไม่ทำงานตั้งแต่ 20:00:00 เย็นวันศุกร์ถึง 23:59:59 เช้าวันศุกร์

edit2: โดยทันทีจะต้องตรงตามเกณฑ์ 3 ข้อต่อไปนี้:

  • ต้องไม่เรียกใช้ฟังก์ชันที่เรียกว่า DayOfWeek (หรือคล้ายกัน) โดยไม่ใช้ฟังก์ชันนี้เพื่อคำนวณเวลาของฟังก์ชัน
  • ต้องไม่ใช้วันเสาร์หรือวันอาทิตย์หรือตัวย่อเป็นภาษาอังกฤษ
  • ต้องไม่ใช้ Sat หรือ Sun (หรือในกรณีตัวอักษรสำรอง) โดยไม่มีตัวแปรที่มีชื่อเหมือนกันไม่ได้ใช้เพื่อกำหนดวันในสัปดาห์หรือเมื่อพิจารณาว่าควรรันโค้ดหรือไม่

คุณนิยาม "สุดสัปดาห์" ได้อย่างไร ตกลงไหมถ้ารหัสหยุดทำงานในบ่ายวันศุกร์แทนที่จะรอจนถึงเที่ยงคืน?
dan04

@ dan04 ฉันจะอัปเดตเพื่อแก้ไขปัญหานี้

3
หากต้องการคำตอบที่สร้างสรรค์สิ่งนี้ไม่ควรเป็นรหัสกอล์ฟ หากต้องการใส่รหัสกอล์ฟคุณต้องกำหนด "ชัดเจนทันที"
John Dvorak

เวลาที่จะเข้าใจเป็นเวลาท้องถิ่นหรือ GMT?
John Dvorak

@JanDvorak ฉันได้อัปเดตข้อ จำกัด ให้เป็นแบบนี้มากขึ้นหวังว่าตอนนี้จะดีขึ้นแล้ว: codegolf.stackexchange.com/questions/307/obfuscated-hello-world

คำตอบ:


11

Rebmu : 17 (27 - 10, obfuscated) หรือ 30 ที่ไม่ได้ทำให้รำคาญ

Rebmu ได้รับการออกแบบมาโดยเฉพาะเพื่อเล่น code golf ในขณะที่สามารถอ่านได้ (สำหรับผู้ที่ได้รับ "เคล็ดลับ") ดังนั้นกฎ obfuscation นั้นขัดกับหลักการของมัน แต่:

DnowRjRkILd/7 6[pDT[adJk]]

มันทำงานได้ทั้งวันในวันธรรมดา:

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

... แต่ในวันหยุดสุดสัปดาห์มันไม่ทำอะไรเลย:

Input Integer: 10
Input Integer: 20

คำอธิบาย:

ใช้unmushingและสังเกตเห็นเงินทุนวิ่งของตัวอักษรเป็นคำที่แยกต่างหากและการขาดความเป็นผู้นำวิ่งทุนหมายความว่าเราไม่ได้ทำชุดคำเราได้รับยาก REBOL:

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

สิ่งที่คุณต้องทำคือ:

;-- 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 จะมีหมายเลข 1 สำหรับวันจันทร์ถึง 7 สำหรับวันอาทิตย์ วิธีที่รู้หนังสือมากขึ้นในการทำให้วันหยุดสุดสัปดาห์ออกมาจากวันธรรมดาคือการพูดd/weekdayแต่คุณก็สามารถทำได้ด้วยd/7เช่นกัน โซลูชันที่ฉันต้องการโดยไม่ต้องเปลี่ยนแปลงสิ่งต่าง ๆ เพียงปรับให้เข้ากับปัญหานี้จะเป็นเช่น:

rJrKilNOW/weekday 6[pDT[adJk]]

แต่ถ้ามีการปรับปรุงคำศัพท์สำหรับการใช้งานทั่วไปให้เป็นปัญหาแบบนี้ซึ่งอาจเกิดขึ้นบ่อยครั้งมากพอที่จะไม่ต้องการที่จะล้มเหลวในการ verbose Rebol ทุกครั้งฉันอาจทำให้ MON ถึงอาทิตย์เป็น 1 - 7) และตัวย่อ ตอนนี้ทุกวันจุดที่มันจะดูเหมือนมากขึ้น ...

rJrKilNW/wkdySAT[pDT[adJk]]

หมายเหตุ

ตามปกติคุณสามารถทำให้ "โปรแกรม" สั้นลงเล็กน้อยถ้าคุณยอมให้อินพุตถูกส่งไปยัง Rebmu เป็นอาร์กิวเมนต์และยอมรับผลการประเมิน (ที่นี่ทั้งค่าประเภทเวลาหรือไม่มี) โดยไม่ต้องพิมพ์:

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

นอกจากนี้เดลต้าเวลา, วันที่, รุ่นภาพและจำนวนบ้าของสิ่งที่จะรวมอยู่ใน REBOL ของครึ่งเมกะไบต์, ศูนย์ติดตั้งที่ปฏิบัติการ


Rebmu เป็นที่น่าอัศจรรย์ มีนักแปลเป็นภาษาอื่นนอกเหนือจาก Rebol หรือไม่?
primo

@primo ขอบคุณ! ไม่มีก็สวยมาก 100% ขึ้นอยู่กับ REBOL และเป็นฉันพูดถึงมันเป็นเพียงชั้นบางกว่าภาษา(และน่าสนใจพอเข้ากันได้ถ้ารหัสของคุณเป็นตัวพิมพ์เล็กทั้งหมด ... ดูตัวอย่างนาฬิกาทราย ) Rebol เป็นเวทย์มนตร์ที่แท้จริงที่นี่และในที่สุดก็ได้รับแรงผลักดันตั้งแต่การหาแหล่งแบบเปิดดังนั้นอย่าลังเลที่จะคุยกับเราและRebolBotในการแชท SO
ดร. Rebmu

ฉันถามเพราะฉันชอบที่จะเห็นการถอดแบบนี้ออกไปที่anagolแม้ว่าฉันจะไม่แน่ใจว่ามันต้องใช้ความพยายามมากแค่ไหนที่จะอนุญาตให้ล่ามเขียนใน Rebol
โม่

@primo ขออภัยในความล่าช้าในการตอบสนอง ... ฉันสนใจที่จะเห็นสิ่งนี้เกิดขึ้นจริง ๆ ดังนั้นถ้าคุณรู้ว่ามีใครให้พวกเขาได้รับการติดต่อ เรามี Rebmu บนCloud9 IDEและเรายังมีความสามารถในการเรียกใช้สคริปต์ Rebmu แบบไม่โต้ตอบผ่านเว็บเซอร์วิสที่ RebolBot ใช้ คุณอาจพบคำปราศรัยของฉันในการประชุมที่น่าสนใจของRebol / Redและอาจช่วยโน้มน้าวผู้คนว่าควรอยู่บน 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

เป็นไปตามเงื่อนไขทั้งสามนี้และไม่ใช้ฟังก์ชันไลบรารีมาตรฐานใด ๆ ยกเว้นสิ่งที่จำเป็นต่อการรับเวลาปัจจุบัน ดังนั้นฉันเชื่อว่าฉันมีสิทธิ์ได้รับโบนัส

เกี่ยวกับเกณฑ์การทำให้มัวหมอง - แม้ว่าจะเป็นไปตามตัวอักษรของกฎหมาย แต่ก็ไม่ได้ไร้เดียงสามากนัก เห็นได้ชัดว่ามีบางอย่างเกิดขึ้นกับค่าคงที่เวทย์มนตร์ 60 และ 7 แต่น่าเสียดายที่การทำให้งอใด ๆ จะทำให้ขนคิ้วขึ้น

อินพุต: จำนวนเต็มสองจำนวนคั่นด้วยช่องว่าง

ผลลัพธ์: อาร์เรย์ตัวอักษร Golfscript - จำนวนเต็มสองจำนวน (ผลรวมเวลาเป็นมิลลิวินาที) คั่นด้วยช่องว่างและล้อมรอบด้วยวงเล็บเหลี่ยม

ตัวอย่าง:

;'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}"'เป็นสตริง golfscript ที่มีสตริงตัวอักษร golfscript ที่มีบล็อกที่เรียกใช้ Ruby เพื่อเรียกคืนเวลาปัจจุบัน สแต็คตอนนี้เก็บอินพุตที่ด้านล่างและสูตรเวลาที่ด้านบน
  • .~~โคลนสูตรเวลาและประเมินสองครั้ง การประเมินผลครั้งแรกเปลี่ยนสตริงสตริงให้เป็นสตริงตัวเลขโดยดำเนินการกับส่วนทับทิม การประเมินผลครั้งที่สองเปลี่ยนเป็นตัวเลข ตอนนี้สแต็คจะเก็บ (จากด้านล่าง) อินพุตสูตรเวลาและเวลาเริ่มต้น
  • @~+ดึงอินพุตไปยังด้านบนประเมินผลและดำเนินการเพิ่มเติม สแต็กตอนนี้มีสูตรเวลาเวลาเริ่มต้นและผลรวม
  • @);' "'+~~ดึงสูตรเวลาเปลี่ยน'"'ไปเป็น' "' (ดูการอภิปรายด้านล่าง) และดับเบิลประเมินมัน สแต็กตอนนี้ถือเวลาเริ่มต้นผลรวมและเวลาสิ้นสุด
  • 2$-โคลนเวลาเริ่มต้นไปที่ด้านบนและลบออกจากเวลาสิ้นสุด สแตกตอนนี้มีเวลาเริ่มต้นผลรวมและความแตกต่างของเวลา
  • @86400/ ดึงเวลาเริ่มต้นไปที่ด้านบนและแปลงจากวินาทีเป็นวัน
  • ((7%(ลดจำนวนวันตั้งแต่จุดเริ่มต้นของยุคสองครั้ง (มันคือวันพฤหัสบดีเราต้องการวันเสาร์) ใช้เวลาโมดูโล 7 และลดลงอีกครั้ง แผนที่วันหยุดสุดสัปดาห์ที่ -1 และ 0, แผนที่วันธรรมดาถึง 1..5
  • ,)=สร้างตารางจำนวนเต็มขนาดนั้น นี่เป็นเรื่องปกติ - อาร์เรย์ขนาดลบเป็นค่าว่าง จากนั้นจะใช้องค์ประกอบสุดท้าย น่าเสียดายที่ล่ามบางคนยังไม่พัง แต่พวกมันกลับกลายเป็นศูนย์ - ซึ่งปลอดภัยที่จะทิ้ง ดังนั้นแทนที่จะทิ้งเราจะใช้มันเป็นดัชนีของอาร์เรย์นั้น การใช้ดัชนี nil'th ในที่สุดก็เกิดปัญหาล่าม แต่การเอาองค์ประกอบนอกขอบเขตออกมาใช้ได้ดี - ไม่มีสิ่งใดถูกผลักเข้าไปในกองซ้อน ในกรณีนี้การเข้าถึงอาเรย์นั้นอยู่นอกขอบเขตเสมอดังนั้นเราจึงไม่มีอะไรจะทิ้ง
  • ]` จับสแต็กและจัดรูปแบบเป็นอาร์เรย์ golfscript

ฉันกลัวว่ารหัสของคุณไม่ได้กำหนดเวลาการดำเนินการจริง แทนที่การเพิ่มด้วยการดำเนินการซึ่งใช้เวลาสองสามวินาทีและคุณจะเห็นว่ามันอ้างว่าใช้เวลาไม่นาน ผมได้กล่าวถึงนี้ (และวิธีการแก้ปัญหา) ในบล็อก GolfScript ของฉัน
Peter Taylor


ฉันคิดว่า Golfscript มีคุณสมบัติเป็นความสับสน: PI ไม่อยากจะเชื่อเลยว่ามันมีตัวละครน้อย! คุณจะบอกเราว่าจะเกิดอะไรขึ้นเมื่อคุณเรียกใช้ในวันเสาร์

@LegoStormtroopr ฉันได้รวมตัวอย่างไว้แล้ว
John Dvorak

โอ้โหความผิดพลาดของฉันฉันพลาดไปอย่างสิ้นเชิง สุดยอดความพยายาม

1

JavaScript

มันใช้ยูทิลิตี้นี้:

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

และนี่คือฟังก์ชันจริง:

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

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

ฉันหวังว่ามันจะไม่ชัดเจนในทันที ...


2
@ChristopherWirt: เจ๋ง! ดีใจที่ฉันเอาชนะเส้นตายสำหรับความไม่ลงรอยกัน
Ry-

ไม่ตลกเมื่อปีที่แล้วเช่นกัน แต่ฉันจะให้คุณแน่นอนว่าไม่ใช่ "เป็นทางการ" จนถึงวันนี้;) เว้นแต่คำตอบ (อย่างใด) จะถูกปฏิเสธ
Christopher Wirt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.