Qeng Ho zaman birimleri


40

Vernor Vinge'nin mükemmel ve büyüleyici kitabında Gökyüzündeki A Deepness (bu arada, 1'i şiddetle tavsiye ediyorum ), çeşitli yıldız sistemlerini kapsayan bir kültür olan Qeng Ho , "gün", "" ay "" kavramına sahip değil. yıllar, "vb. ve böylece zamanı tamamen saniye cinsinden ölçen benzersiz bir zaman işleyişi sistemi vardır. En yaygın olarak kullanılan birimler Ksec (kilosecond), Msec (megasecond) ve GSEC (gigasecond). İşte kitabın kendi kopyasından gelen kullanışlı bir grafik (çevrimiçi olarak bulamadığım için):

kullanışlı grafik

Halen Pham Nuwen'e uçuyorsunuz ve “ Dünya ” denilen garip, bilinmeyen bir gezegenden bir mesaj aldınız . 2 Sizden farklı zaman birimleri kullanıyorlar ve bilgisayarlarınız onlarınkileri tanımıyor. Geminin yerleşik Programcı-Arkeoloğu olarak işiniz, zaman işleme kodunu Dünya zaman birimlerini tanıması için yamalamaktır .

Doğal olarak, bir kaç Ksec için sadece soğuk uyku dışında olduğunuz için, kodunuzu olabildiğince kısa yapmak istersiniz, böylece çabucak yazılabilir. Neyse ki, yıldızlar arası bir ticaret kültürü olarak, Qeng Ho icat edilen her programlama diline erişebiliyor.

Giriş

Giriş, bir veya daha fazla boşlukla ayrılmış bileşen içeren tek bir dize olacaktır . Bir bileşen, daha sonra bir tam sayı> 0 ve ≤ 255, bir boşluk olarak tanımlanır ve daha sonra bir bir second, minute, hour, day, week, month, year, decade, ya da centurymuhtemelen (bir ilave ile çoğul sveya centuriesson durum için).

İşte bazı geçerli örnek girişler:

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

Girdi hakkında aşağıdakileri varsayabilirsiniz:

  • Birimlerin çoğullaştırılması her zaman ilgili sayıya katılacaktır.

  • Girdide birden fazla bileşen varsa , bunlar her zaman azalan uzunluk düzeninde olacaktır.

İşte bu zorluğun amaçları için çeşitli girdi birimlerinin ne anlama geldiği:

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

Çıktı

İşte kodunuzun desteklemesi gereken Qeng Ho birimleri:

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

Kodunuzun çıktısını belirlemek için aşağıdaki algoritmayı kullanın:

  • İlk olarak, girişin temsil ettiği toplam süreyi toplayın.

  • Girdiyle aynı olan veya daha kısa olan en büyük Qeng Ho birimini bulun - temelde en az bir tane olan en büyük birimi bulun.

  • Girişte verilen toplam süreyi bu birime dönüştürün ve sonucu üç ondalık basamağa yuvarlayarak çıkarın.

Aşağıdaki yöntemlerden hangisini kullanmak istediğinizi seçebilirsiniz: yukarı yuvarlama, aşağı yuvarlama, sıfırdan yuvarlama veya ∞ veya -∞ yönüne yuvarlama. Yuvarlak sonuç sona ererse 0, sondaki sıfırları kaldırabilir veya istediğiniz kadar tutabilirsiniz (ya da girişe bağlı olarak her ikisini de yapabilirsiniz).

Yuvarlak sonuç tam olarak ise 1.000, sen tekil formu kullanılmalıdır ( second, Ksec, Msec, Gsec); aksi halde, çoğul kullanımı ( seconds, Ksecs, Msecs, Gsecs).

Bazı kenar durumlarda, örneğin Ksec birimini kullanıyor olabilirsiniz, ancak 1000.000 Ksec'lik yuvarlatılmış bir sonuç elde edebilirsiniz. Bu durumda, 1000.000 Ksecsbunun yerine basitçe çıktı alabilirsiniz 1 Msec.

Her zaman, girdilerin azalan birimler sırasına sahip olduğunu varsayabilirsiniz (yüzyıl, on yıl, yıl vb.); ayrıca, herhangi bir birimden sonra gelen bileşen her zaman daha kısa olacaktır (yani 1 decade 20 years, geçersiz girdidir).

Test durumları

Not: Yıldızla ( *) işaretli sonuçlar , yuvarlama farkları nedeniyle göz ardı edilebilir miktarda değişebilir.

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

kurallar

  • Bu , yani bayt cinsinden en kısa kod kazanır.

1: Tabii ki, sadece sert bilimlerden hoşlanıyorsanız. Bu durumda , önce Derinlerde Bir Ateşi okumanızı tavsiye ederim , ki bence bu daha harika.

2: Eh, teknik olarak "Eski Dünya", Gökteki Bir Derinlikte defalarca bahsedilir , ama ...


Sınama durumu 9 hatalı görünüyor (cevabımı görün)
edc65

1
Bu gemi Dünya saatini bilmiyor, ama tüm Dünya programlama dillerini tam olarak anlıyor . Çok mantıklı. </sarcasm>
6:15

2
Dang, yerleşik ünite desteğini kullanarak çok kısa bir Mathematica çözümüm vardı, ancak 2 months 2 hours“2 ay * 2 saat” olarak yorumluyor .
2012rampamp

1
Hmm, bu faktörlerin garip bir şekilde, hiç kimsenin bu dillerin çoğunda kullanmadığı eski zaman işleme fonksiyonlarındaki gibi göründüğünü fark ettim.
Random832

Yanıtlar:


6

APL (Dyalog APL) , 157 156 154 151 154 141 142 bayt

{∊(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 byte'ı tıraş ettiğin için teşekkürler.

Sahip olmalı ⎕IO←0, çoğu APL'de varsayılandır.

Çevrimiçi deneyin!


Bir isme 1E3 atadıysanız (z gibi), ilk örnekte iki karakter boşa geçtiniz, ikinci durumda zaten bir tane kaydettiniz ve üçüncü örnekten itibaren iki karakter kaydediyorsunuz. Değil mi
lstefano

@lstefano Hayır, birincisi 4: ⌊1E3⍟→' ⌊(z←1E3)⍟ya mal olacak ve sonra bir sonraki 1E3→ her birine 2 tasarruf edecek z.
Adám

Evet, kesinlikle doğru. Ve bunlardan sadece 3 tanesi olduğuna göre, kazanç yok. Gürültü için özür dilerim.
lstefano

6

JavaScript (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

Python, 366 363 bayt

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=1Kodları kıran sıraya göre gereksiz girintiniz var . Ayrıca, kullanarak 2 bayt kaydedebilir 10.ve 73.yerine 10.0ve 73.0. Ayrıca, sonradan alana ihtiyaç yoktur print.
aland

2

SpecBAS - 476 471 bayt

Çünkü hiçbir şey "teknolojik üstünlüğümüzden önce korkak" deyince, satır numaralarından ve GOTO ifadelerinden daha iyi değildir :-)

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'de İşlev Olarak), 460 Bayt

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

ungolfed:

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 bayt

h: Miktarı büyüklüklerinin ve birimlerin bir liste halinde giriş dizesi kırılma, sonra Capitalizeve PluralizeMathematica'da girdi birimleri dönüştürmek Quantitysaniye sayısı türetildiği Var.

dsaniyeleri uygun birimlere dönüştürür. sSüre 1 birime karşılık gelirse (herhangi bir türden) final kaldırılır.

Koddaki küçük ayarlamalar ile bu yaklaşım, doğal dil girişinin geleneksel olsun ya da olmasın herhangi bir ölçüm sistemine dönüştürülmesi için çalışmalıdır.

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@#&;

Tablo formuna yerleştirin:

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]

pic


0

Haskell, 565 555 bayt

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

Burada çok fazla golf fırsatını kaçırdığımdan eminim ... Golf acemi olmanın bedeli sanırım.

Cevabım, Dünya saatini bir giriş parametresi olarak içeren ve Qeng Ho zamanını döndüren bir dize alan bir fonksiyondur.

Not: Aptalca bayt sayma neden olur… 3 basamak hassasiyetini unuttum.

PPS: Daha iyi seçilmiş üst düzey ifadeler 10 bayt olarak tıraş edildi… ve şimdi açılış için doğru olmalı.


0

Matlab 315 bayt

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'))]

Ölçek:

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

Çıktı:

ans =
6.69 Gseconds
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.