나는 당신의 기능에 시간을 할 것이지만 주말에는 일하지 않습니다


17

상사는 두 정수를 더하는 데 걸리는 시간을 알아야합니다. 그러나 나는 주말에 일하는 것을 좋아하지 않으며 내 코드도 그렇지 않다는 것이 공정하다고 생각합니다. 문제는 보스가 까다로운 사람이며 시간이 지남에 따라 동일한 시간을 유지해야한다고 생각하며 코드가 제대로 작동하는지 확인할 것입니다.

다음과 같은 간단한 프로그램을 작성해 주시겠습니까?

  1. 두 정수를 허용하고 올바른 덧셈 결과와 덧셈을 수행하는 데 걸리는 시간을 반환합니다.이 시간은 그럴듯하고 코드의 런타임을 기반으로해야합니다. 그러나 시간이 지정된 코드 사이에서 일부 작업을 몰래 수행해야 할 경우 허용 시간보다 약간 오래 실행합니다. 그러나 가짜 시간 만 출력 할 수는 없습니다.
  2. 주말에는 현지 시간으로 코드에서 작동하지 않습니다 (잘못된 결과를 반환 할 수 없으며 코드가 깨지거나 오류가 발생하거나 실행되지 않아야 함)
  3. 주말에 작동하지 않는지 즉시 알 수 없습니다

나는 첫 번째 기준이 이상하다는 것을 알고 있지만 사람들이 기준 3에 대한 의혹을 제기하지 않고 필요한 경우 날짜 / 시간 라이브러리를 가져올 수 있기를 원했습니다. 그러나 나는 똑똑한 사람들이 있기 때문에 -10 문자 표준 날짜 라이브러리의 캘린더 기능을 사용 하지 않고이 작업을 수행 할 수있는 사람

'표준 날짜 / 시간 라이브러리'에 관하여

표준 날짜 / 시간 라이브러리의 예로는 pythons datetime, javascript dateobject library 등 java.util.Date이 있습니다. timeitpythons 모듈 과 같은 실행을위한 타임 델타 를 계산하는 함수 는 보스가 코드의 시간이 초과 될 것으로 예상되므로이 기준을 위반하지 않습니다. 경우에 따라 이러한 라이브러리는 모든 시간 함수 에 액세스하기 위해 가져와야 하므로 현재 에포크가 시작된 이후의 시간을 정수로 리턴하는 함수를 호출 할 수 있지만 별도의 줄 수있는 구조화 된 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 , 난독 처리) 또는 30 난독 처리

Rebmu는 ( "트릭"을 얻는 사람들을 위해) 읽을 수있는 동안 코드 골프를하도록 특별히 설계되었으므로 난독 화 규칙은 원칙에 위배됩니다. 그러나:

DnowRjRkILd/7 6[pDT[adJk]]

평일에는 하루 종일 작동합니다.

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

...하지만 주말에는 아무것도하지 않습니다.

Input Integer: 10
Input Integer: 20

설명:

은 Using 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]]

그러나 일반적인 응용 프로그램의 어휘를이 스타일의 문제로 업데이트하려면 매번 Rebol을 자세히 설명하기를 원하지 않을 수도 있습니다 .MON을 통해 MON을 1-7로 만들고 약어를 사용합니다. 지금 WEEKDAY,이 시점에서 아마도 더 비슷하게 보일 것입니다 ...

rJrKilNW/wkdySAT[pDT[adJk]]

노트

평소와 같이 입력을 인수로 Rebmu에 전달하고 평가 결과를 인쇄하지 않고 평가 결과 (여기서는 time 또는 type 유형의 값)를 수락하면 "프로그램"자체를 약간 짧게 만들 수 있습니다.

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

또한 델타 시간, 날짜, 이미지 생성 및 수많은 것들이 이미 Rebol의 1/2 메가 바이트, 제로 설치 실행 파일에 포함되어 있습니다.


Rebmu는 훌륭합니다. Rebol 이외의 언어로 작성된 통역사가 있습니까?
primo

@primo 감사합니다! 아니요, Rebol에 거의 100 % 의존하며 언어에 비해 얇은 층입니다 (그리고 코드가 모두 소문자 인 경우 흥미롭게도 호환 가능합니다 (예 : Hourglass 참조 )) . Rebol은 여기서 진정한 마술이며, 오픈 소싱 이후 마침내 추진력을 얻고 있으므로 SO 채팅에서 우리와 RebolBot 에게 자유롭게 이야기하십시오 .
Dr. Rebmu

나는 이것이 regol로 작성된 통역사를 허용하는 데 얼마나 많은 노력이 필요한지 확실하지는 않지만, 이것이 anagol 에서 이륙하는 것을 정말로보고 싶기 때문에 묻습니다.
primo

@primo 답변이 늦어 져 죄송합니다.이 일이 발생하는 것을보고 싶습니다. 누군가 연락을 취하고 있다는 것을 아는 사람이 있다면 말입니다. Cloud9 IDE 에는 Rebmu가 있으며 RebolBot에서 사용하는 웹 서비스를 통해 비대화 형 Rebmu 스크립트를 실행할 수 있습니다. 당신은 또한 관심 있는 Rebol / Red 컨퍼런스에서 나의 연설을 발견 하고 아마도 사람들이 아나 골에 있어야한다고 설득하는 데 도움이 될 것입니다. :-)
Dr. Rebmu

2

골프 공, 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 배열 리터럴-공백으로 구분되고 대괄호로 둘러싸인 두 정수 (sum, time in ms).

예:

;'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}"'는 현재 시간을 검색하기 위해 Ruby 실행 블록을 포함하는 golfscript 문자열 리터럴을 포함하는 golfscript 문자열입니다. 스택은 이제 맨 아래에 입력을, 맨 위에 시간 레시피를 유지합니다.
  • .~~시간 레시피를 복제하고 두 번 평가합니다. 첫 번째 평가는 루비 섹션을 실행하여 문자열을 숫자 문자열로 바꿉니다. 두 번째 평가는 숫자로 바뀝니다. 스택은 이제 (아래에서) 입력, 시간 레시피 및 시작 시간을 유지합니다
  • @~+입력을 맨 위로 가져 와서 평가하고 추가를 수행합니다. 이제 스택에는 시간 레시피, 시작 시간 및 합계가 있습니다.
  • @);' "'+~~시간 레시피를 꺼내고로 변경 '"'하고 ' "'(아래 설명 참조)이를 두 번 평가합니다. 이제 스택에는 시작 시간, 합계 및 종료 시간이 유지됩니다.
  • 2$-시작 시간을 상단으로 복제하고 종료 시간에서 뺍니다. 이제 스택에는 시작 시간, 합계 및 시간 차이가 있습니다.
  • @86400/ 시작 시간을 맨 위로 가져와 초에서 일로 변환합니다.
  • ((7%(신기원이 시작된 이래로 하루를 두 번 (목요일, 토요일을 원함) 감소시키고, 모듈로 7을 취하고 다시 한 번 감소시킵니다. 주말은 -1과 0에, 주중은 1..5에 매핑됩니다.
  • ,)=해당 크기의 정수 테이블을 작성합니다. 음수 배열이 비어 있습니다. 그런 다음 마지막 요소가 필요합니다. 불행히도 일부 통역사는 아직 충돌하지 않습니다. 대신, 그들은 nil을 팝하여 버리는 것이 안전합니다. 따라서 버리는 대신 해당 배열의 인덱스로 사용합니다. nil 번째 인덱스를 가져 가면 인터프리터가 충돌하지만 범위를 벗어난 요소를 가져가는 것이 좋습니다. 스택에 아무것도 푸시되지 않습니다. 이 경우 배열 액세스는 항상 범위를 벗어나므로 버릴 것이 없습니다.
  • ]` 스택을 잡고 골프 스크립트 배열로 형식화합니다.

귀하의 코드가 실제로 작업 시간을 정하지 않는 것이 두렵습니다. 추가 작업을 몇 초 정도 걸리는 작업으로 바꾸면 시간이 걸리지 않는다는 것을 알 수 있습니다. 내 GolfScript 블로그 에서이 (및 해결 방법) 대해 설명했습니다 .
피터 테일러


나는 Golfscript가 난독 화로 자격이 있다고 생각합니다 : PI는 너무 적은 문자가 필요하다고 믿을 수 없습니다! 토요일에 실행할 때 어떤 일이 발생하는지 알려 주시겠습니까?

@LegoStormtroopr 예제를 이미 포함 시켰습니다.
John Dvorak

오, 내 실수, 나는 그것을 완전히 놓쳤다. 엄청난 노력.

1

자바 스크립트

이 유틸리티를 사용합니다.

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-

1 년 전에는 정말 재미 있지는 않았지만, 오늘까지 "공식적인"것이 아니라는 것을 분명히 알려줄 것입니다.
Christopher Wirt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.