eng 호 시간 단위


40

Vinor Vernge 의 훌륭하고 매혹적인 책 A Deepness in the Sky ( 1을 강력히 추천합니다 )에서 다양한 스타 시스템에 걸친 문화 인 Qeng Ho 는 "일", "달"이라는 개념이 없습니다. 년 등 "으로 표시되므로 시간을 초 단위로 측정하는 고유 한 시간 관리 시스템이 있습니다. 가장 일반적으로 사용되는 단위는 Ksec (킬로 초), Msec (메가 초) 및 Gsec (기가 초)입니다. 온라인에서 찾을 수 없으므로 내 책의 편리한 차트가 있습니다.

편리한 차트

당신은 현재 팜 누웬 (Pham Nuwen)을 비행하고 있으며 , " 지구 " 라는 이상한, 알려지지 않은 행성으로부터 메시지를 받았습니다 . 2 그들은 당신과 다른 시간 단위를 사용하며, 컴퓨터는 그들의 시간 단위를 인식하지 못합니다. 선박의 상주 프로그래머-고고학자 인 여러분의 임무는 지구 시간 단위를 인식 할 수 있도록 시간 처리 코드를 패치하는 것 입니다.

당연히, 몇 Ksec 동안 만 잠자기 때문에 코드를 가능한 빨리 짧게 작성하여 빠르게 작성할 수 있습니다. 운 좋게도 성간 거래 문화 인 Qeng Ho는 발명 된 모든 프로그래밍 언어에 액세스 할 수 있습니다.

입력

입력은 하나 이상의 공백으로 분리 된 구성 요소를 포함하는 단일 문자열 입니다. 성분을 다음 정수> 0 ≤ 255, 공간으로서 정의되며, 다음의 하나이며 second, minute, hour, day, week, month, year, decade, 또는 century, 가능 (AN 추가와 복수 s또는 centuries지난 경우에).

유효한 입력 예는 다음과 같습니다.

10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds

입력에 대해 다음을 가정 할 수 있습니다.

  • 단위의 복수화는 항상 관련 번호와 일치합니다.

  • 입력에 여러 구성 요소가 있는 경우 항상 길이가 내림차순입니다.

이 도전의 목적을 위해 다양한 입력 단위의 의미는 다음과 같습니다.

unit     relative    absolute
---------------------------------------
second   1 second    1 second
minute   60 seconds  60 seconds
hour     60 minutes  3600 seconds
day      24 hours    86400 seconds
week     7 days      604800 seconds
month    30 days     2592000 seconds
year     365 days    31536000 seconds
decade   10 years    315360000 seconds
century  10 decades  3153600000 seconds

산출

코드에서 지원해야하는 Qeng Ho 장치는 다음과 같습니다.

unit    relative      absolute
----------------------------------------
second  1 second      1 second
Ksec    1000 seconds  1000 seconds
Msec    1000 Ksecs    1000000 seconds
Gsec    1000 Msecs    1000000000 seconds

다음 알고리즘을 사용하여 코드 출력을 결정하십시오.

  • 먼저 입력이 나타내는 총 시간을 합산하십시오.

  • 입력 시간보다 짧거나 같은 시간에 가장 큰 Qeng Ho 장치를 찾으십시오. 본질적으로 적어도 하나가있는 가장 큰 장치를 찾으십시오.

  • 입력에 주어진 총 시간을이 단위로 변환하고 결과를 소수점 3 자리로 반올림합니다.

반올림, 반올림, 0에서 반올림 또는 ∞ 또는 -∞로 반올림하는 방법 중에서 선택할 수 있습니다. 반올림 결과가로 끝나는 경우 0후행 0을 제거하거나 원하는만큼 유지하거나 입력에 따라 둘 다 수행 할 수 있습니다.

둥근 결과가 정확히 경우 1.000, 당신은 단수 양식을 사용한다 ( second, Ksec, Msec, Gsec); 그렇지 않으면, 복수의 양식을 사용 ( seconds, Ksecs, Msecs, Gsecs).

어떤 경우에는 Ksec와 같은 단위를 사용하고 있지만 반올림 한 결과는 1000.000Ksec입니다. 이 경우 단순히 1000.000 Ksecs대신 출력 할 수 있습니다 1 Msec.

입력 값이 단위 (세기, 10 년, 연도 등)의 내림차순이라고 항상 가정 할 수 있습니다. 또한, 주어진 단위 다음에 오는 구성 요소는 항상 더 짧습니다 (즉, 1 decade 20 years유효하지 않은 입력입니다).

테스트 사례

참고 : 별표 ( *) 로 표시된 결과는 반올림 차이로 인해 무시할만한 양으로 달라질 수 있습니다.

input                                         output
-------------------------------------------------------------
1 hour                                        3.600 Ksecs
1 day                                         86.400 Ksecs
2 weeks                                       1.210 Msecs
1 year                                        31.536 Msecs
32 years                                      1.009 Gsecs   *
1 second                                      1.000 second
1 century 6 decades                           5.046 Gsecs   *
255 centuries                                 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds    1.733 Msecs
1 week 3 days 3 hours 7 minutes               875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds  1.000 Msec
2 months 2 hours                              5.191 Msecs   *
16 minutes 39 seconds                         999.000 seconds

규칙

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

1 : 물론 당신이 하드 공상 과학을 좋아하는 경우에만. 어떤 경우에는 먼저 A Fire Upon the Deep을 읽는 것이 좋습니다 .

2 : 기술적으로 "오래된 지구"는 하늘의 깊은 곳에서 여러 번 언급 되었지만 ...


테스트 사례 9가 올바르지 않은 것 같습니다 (내 답변 참조)
edc65

1
이 우주선은 지구 시간을 모르지만 모든 지구 프로그래밍 언어를 완전히 이해하고 있습니다. 매우 논리적입니다. </ sarcasm>
박수 :

2
Dang, 나는 내장 된 유닛 지원을 사용하여 정말 짧은 Mathematica 솔루션을 가졌지 만 2 months 2 hours"2 개월 * 2 시간"으로 해석 합니다.
2012rcampion

1
흠, 나는 이러한 요소들이 아무도이 언어들에서 많이 사용하지 않는 쓸모없는 시간 처리 기능의 것들과 이상하게 보인다는 것을 알았습니다.
Random832

2
@DarrelHoffman의 날짜 시스템은 1970 년 1 월 1 일을 기준으로합니다. 소프트웨어 고고학자는 수세기의 오래된 프로그램을 파고 디버깅하는 직업입니다. 두 번째로, Qeng Ho는 인간이 구 지구의 달에 처음 발을 딛은 사례를 세었다. 그러나 자세히 살펴보면 ... 시작 인스턴스는 실제로 약 1,500 만 초 후에 인류 최초의 컴퓨터 운영 체제 중 하나의 0 초입니다.

답변:


6

APL (Dyalog APL) , 157 (156) 154 151 154 141 142 바이트

{∊(3⍕N)' '((B/S⊃' KMG')'sec','ond'/⍨~B←T≥1E3),'s'/⍨1≠N←T÷1E3*S←⌊1E3⍟T←+/×/↑⍎¨'\d+ .a?i?'⎕S'&'⊢⍵⊣c←10×d←10×⊃y m w←365 30 7×da←24×h←×⍨mi←60×s←1}

13 바이트를 줄인 ngn에게 감사합니다.

⎕IO←0많은 APL에서 기본값 인을 가져야 합니다.

온라인으로 사용해보십시오!


1E3을 이름 (예 : z)에 지정하면 첫 번째 인스턴스에서는 두 개의 문자를 낭비하고 두 번째 인스턴스에서는 이미 한 문자를 저장했으며 세 번째 인스턴스부터는 두 개의 문자를 저장합니다. 그렇지 않습니까?
lstefano

@lstefano 아니오, 첫 번째 비용은 4 : 4 ⌊1E3⍟⌊(z←1E3)⍟다음에 각각 2를 절약합니다 1E3z.
Adám

그렇습니다. 그리고 그중 3 개만 있으면 이득이 없습니다. 소음이 유감입니다.
lstefano

6

자바 스크립트 (ES6) 255

f=s=>(s=s.replace(/(\d+) (..)/g,(_,n,u)=>t+={se:1,mi:60,ho:3600,da:86400,we:604800,mo:2592e3,ye:31536e3,de:31536e4,ce:31536e5}[u]*n,t=0),[a,b]=t>=1e9?[t/1e9,' Gsec']:t>=1e6?[t/1e6,' Msec']:t>999?[t/1e3,' Ksec']:[t,' second'],a.toFixed(3)+b+(a-1?'s':''))  

// test

console.log=x=>O.innerHTML+=x+'\n'

;[
 ['1 hour','3.600 Ksecs']
,['1 day','86.400 Ksecs']
,['2 weeks','1.210 Msecs']
,['1 year','31.536 Msecs']
,['32 years','1.009 Gsecs'] 
,['1 second','1.000 second']
,['1 century 6 decades','5.046 Gsecs']
,['255 centuries','804.168 Gsecs']
,['2 weeks 6 days 1 hour 19 minutes 4 seconds','1.733 Msecs']
,['1 week 3 days 3 hours 7 minutes','875.220 Ksecs']
,['1 week 4 days 13 hours 46 minutes 40 seconds', '1.000 Msec']
,['2 months 2 hours', '5.191 Msecs']
,['16 minutes 39 seconds', '999 seconds']
].forEach(t=>console.log(t[0]+' '+f(t[0])+' (Check:'+t[1]+')'))
<pre id=O></pre>


2

파이썬, 366 363 바이트

d={};l=1;q=str.replace;i=q(raw_input(),"ie","y")
for u,t in zip('second minute hour day week month year decade century'.split(),(1,60,60,24,7,30./7,73./6,10,10)):l=t*l;d[u]=d[u+"s"]=l
while" "in i:
 i=q(q(i," ","*",1)," ","+",1)
q=eval(i,d);f={};l=1
for u in('second','Ksec','Msec','Gsec'):
 l*=1e3
 if q<l:q=q*1e3/l;print"%.3f %s%s"%(q,u,("s","")[q<1.001]);break

줄에 불필요한 들여 쓰기 q=eval(i,d);f={};l=1가있어 코드가 손상됩니다. 게다가, 당신은 사용하여 2 바이트를 저장할 수 10.73.대신 10.0하고 73.0. 또한 이후 공간이 필요하지 않습니다 print.
올란드

2

SpecBAS - 476 471 바이트

줄 번호와 GOTO 문장보다 "우리의 기술 우위에 대한 찌르기"란 말이 없기 때문에 :-)

1 INPUT e$: DIM t$(SPLIT e$,NOT " "): DIM m=31536e5,31536e4,31536e3,2592e3,604800,86400,3600,60,1
2 LET q=0,n$=" cedeyemowedahomise"
3 FOR i=1 TO ARSIZE t$() STEP 2: LET t=VAL t$(i),u$=t$(i+1)( TO 2),p=POS(u$,n$)/2: INC q,t*m(p): NEXT i
4 IF q>=1e9 THEN LET r=q/1e9,r$=" G": GO TO 8
5 IF q>=1e6 THEN LET r=q/1e6,r$=" M": GO TO 8
6 IF q>999 THEN LET r=q/1e3,r$=" K": GO TO 8
7 IF q<1e3 THEN LET r=q,r$=" "
8 PRINT USING$("&.*0###",r);r$;"sec"+("ond" AND q<1e3)+("s" AND r>1)

1

C # (LinqPad에서 함수로), 460 바이트

void Main(){var x=Console.ReadLine().Split(' ');long s=0,v,i=0;for(;i<x.Length;){v=long.Parse(x[i++]);var w=x[i++].Substring(0,2);s+=w=="ce"?v*3153600000:w=="de"?v*315360000:w=="ye"?v*31536000:w=="mo"?v*2592000:w=="we"?v*604800:w=="da"?v*86400:w=="ho"?v*3600:w=="mi"?v*60:v;}decimal k=1000,m=k*k,g=m*k,r=0;var o="sec";r=s/g>=1?s/g:s/m>=1?s/m:s/k>=1?s/k:s;o=s/g>=1?"G"+o:s/m>=1?"M"+o:s/k>=1?"K"+o:o+"ond";Console.WriteLine(Math.Round(r,3)+" "+o+(r==1?"":"s"));}

언 골프 :

void Main()
{
    var x=Console.ReadLine().Split(' ');
    long s=0,v,i=0;
    for(;i<x.Length;)
    {
        v=long.Parse(x[i++]);
        var w=x[i++].Substring(0,2);
        s+=w=="ce"?v*3153600000:w=="de"?v*315360000:w=="ye"?v*31536000:w=="mo"?v*2592000:w=="we"?v*604800:w=="da"?v*86400:w=="ho"?v*3600:w=="mi"?v*60:v;
    }
    decimal k=1000,m=k*k,g=m*k,r=0;
    var o="sec";
    r=s/g>=1?s/g:s/m>=1?s/m:s/k>=1?s/k:s;
    o=s/g>=1?"G"+o:s/m>=1?"M"+o:s/k>=1?"K"+o:o+"ond";
    Console.WriteLine(Math.Round(r,3)+" "+o+(r==1?"":"s"));
}

1

Mathematica 296 281 바이트

h: 수량 및 단위 크기의 목록에 입력 된 문자열을 깨고, 후 CapitalizePluralize티카 상기 입력 변환 유닛 Quantity(초)의 갯수가 유도되는 '들.

d초를 적절한 단위로 변환합니다. s시간이 1 단위 (모든 종류)에 해당하는 경우 최종 이 제거됩니다.

코드를 약간만 조정하면 자연어 입력을 기존의 측정 시스템으로 변환 할 수 있습니다.

h=Tr[UnitConvert[Quantity@@{ToExpression@#,Capitalize@Pluralize@#2},"Seconds"]&@@@Partition[StringSplit@#,2]][[1]]&;
d=ToString[N@#/(c=10^{9,6,3,0})[[p=Position[l=NumberDecompose[#,c],x_/;x>0][[1,1]]]]]<>StringDrop[{" Gsecs"," Msecs"," Ksecs"," seconds"}[[p]],-Boole[Tr[l]==1]]&
z=d@h@#&;

표 형식으로 넣어 :

z1[n_]:={n,z@n}

Grid[z1 /@ {"1 hour", "2 day", "2 weeks", "1 year", "32 years", 
   "1 second", "1 century 6 decades", "255 centuries", 
   "2 weeks 6 days 1 hour 7 minutes", 
   "1 week 3 days 3 hours 46 minutes 40 seconds", 
   "1 week 4 days 13 hours 46 minutes 40 seconds", "2 months 2 hours",
    "16 minutes 39 seconds"}, Alignment -> Right]

그림


0

하스켈, 565 555 바이트

import Data.List
import Numeric
import Data.Bool
i=isPrefixOf
s x=showFFloat(Just 3)x""
r=read
f=fromIntegral
b=bool"s"""
c=b.(=="1.000")
h(c:u:l)
 |i"s"u=(r c)+h l
 |i"mi"u=(r c*60)+h l
 |i"h"u=(r c*3600)+h l
 |i"da"u=(r c*86400)+h l
 |i"w"u=(r c*604800)+h l
 |i"mo"u=(r c*2592000)+h l
 |i"y"u=(r c*31536000)+h l
 |i"de"u=(r c*315360000)+h l
 |True=(r c*3153600000)+h l
h _=0
q i
 |v<-s((f i)/10^9),i>=10^9=v++" Gsec"++c v
 |v<-s((f i)/10^6),i>=10^6=v++" Msec"++c v
 |v<-s((f i)/1000),i>=1000=v++" ksec"++c v
 |True=show i++" second"++b(i==1)
t=q.h.words

나는 여기에 너무 많은 골프 기회를 놓치고 있다고 확신한다. .. 골프 초보자 인 것의 가격 나는 내가 추측한다.

내 대답은 지구 시간을 입력 매개 변수로 포함하고 Qeng Ho 시간을 반환하는 문자열을 취하는 함수입니다.

추신 : 나는 3 자리의 정밀도를 어리석게 잊어 버렸습니다 ... 바이트 카운트를 운전합니다.

PPS : 10 바이트를 줄인 최상위 수준의 표현식을 선택하는 것이 더 좋았습니다. 이제 부팅하기에 정확해야합니다.


0

Matlab 315 바이트

K='cedeyemowedahomiseconds';Q=' KMGT';for j=1:9;y(j)=double(~isempty(strfind(S,K(2*j-1:2*j))));end
y(y==1)=sscanf(S,repmat('%d %*s ',1,9));y=86400*sum(datenum([sum(y(1:3)*10.^[2;1;0]),y(4),y(5:6)*[7;1],y(7:9)]));z=floor(log10(y)/3);y=num2str(y/10^(3*z)+1e-4);[y(1:4),' ',Q(z+1),K(17:23-(y(1:4)=='1.00'))]

테스트:

S = '2 centuries 1 decade 2 years 3 months 3 weeks 4 days 1 hour 44 minutes 58 seconds';

산출:

ans =
6.69 Gseconds
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.