Kabaca kaç yaşında?


29

Bir yaşı temsil eden pozitif saniye süren ve bu sürenin İngilizce olarak tahminini veren kısa bir program yazın.

Programınız , aşağıdaki metrikler ve uzunlukları saniye cinsinden geçen en az kesin süreyi vermelidir :

second = 1
minute = 60
hour   = 60 * 60
day    = 60 * 60 * 24
week   = 60 * 60 * 24 * 7
month  = 60 * 60 * 24 * 31
year   = 60 * 60 * 24 * 365

Örnekler

input      : output
1          : 1 second
59         : 59 seconds
60         : 1 minute
119        : 1 minute
120        : 2 minutes
43200      : 12 hours
86401      : 1 day
1815603    : 3 weeks
1426636800 : 45 years

Yukarıda da görebileceğiniz gibi, 1 gün (60 * 60 * 24 = 86400 saniye) süresinden sonra, artık dakika (dakika) veya saat (dakika ) vermeyiz , ancak yalnızca bir haftanın süresini geçene kadar günler , ve bunun gibi.

Verilen süreyi bir yaş olarak düşünün. Örneğin, 119 saniye sonra, 2 dakika değil 1 dakika geçti .

kurallar

  • 0 veya negatif girişler için özellik yok.
  • Uygun çoğullaştırma izleyin. 1'den büyük her ölçü bir ssonraki sözcüğü içermelidir .
  • Tüm programın işlevine hizmet eden önceden varolan bir kütüphane kullanamazsınız.
  • Bu bir golf kodudur, en kısa program internet puanlarını kazanır.
  • İyi eğlenceler!

3
Bir birimi veya miktarı nasıl seçtiğimizi anlamıyorum. Yuvarlak mıyız?
xnor

1
@xnor biz tamsayı bölmek ve ünite ile birlikte (muhtemelen çoğul) sıfır olmayan en küçük değeri kullanın. Dolayısıyla 59 -> "59 saniye" ve 86401 -> "1 gün".
Jonathan Allan,

5
PPCG'ye Hoşgeldiniz! Güzel ilk meydan okuma. Gelecekte referans olması için, ana göndermeden önce geri bildirim almak için yararlı olan bir sanal alan vardır.
Jonathan Allan


1
Rakamları nasıl yuvarlamalıyız? 119 saniye 1 dakika mı yoksa 2 dakika mı olmalıdır? Peki ya 90?
user202729

Yanıtlar:


8

Jöle , 62 bayt

TṀị
“¢<<ð¢‘×\×€0¦7,31,365F⁸:µç“ɲþḣ⁹ḢṡṾDU¤µQƝṁ⁼ẹ»Ḳ¤ṭÇK;⁸Ç>1¤¡”s

Sonucu basan tam bir program.
(Monadik bir bağlantı olarak karakterleri takip eden bir tamsayı listesi döndürür)

Çevrimiçi deneyin!

Nasıl?

TṀị - Link 1: list of integers, K; list, V  e.g. [86401,1440,24,1,0,0,0], ["second","minute","hour","day","week","month","year"]
T   - truthy indexes of K                        [1,2,3,4]
 Ṁ  - maximum                                    4
  ị - index into V                               "day"

“¢<<ð¢‘×\×€0¦7,31,365F⁸:µç“...»Ḳ¤ṭÇK;⁸Ç>1¤¡”s - Main link: integer, N  e.g. 3599
“¢<<𢑠                                      - list of code-page indices = [1,60,60,24,1]
        \                                     - cumulative reduce with:
       ×                                      -  multiplication = [1,60,3600,86400,86400]
             7,31,365                         - list of integers = [7,31,365]
            ¦                                 - sparse application...
           0                                  - ...to index: 0 (rightmost)
         ×€                                   - ...of: multiplication for €ach = [1,60,3600,86400,[604800,2678400,31536000]]
                     F                        - flatten = [1,60,3600,86400,604800,2678400,31536000]
                      ⁸                       - chain's left argument, N    3599
                       :                      - integer divide         [3599,59,0,0,0,0,0]
                        µ                     - start a new monadic chain, call that X
                                ¤             - nilad followed by links as a nilad:
                          “...»               -   compression of "second minute hour day week month year"
                               Ḳ              -   split at spaces = ["second","minute","hour","day","week","month","year"]
                         ç                    - call the last link (1) as a dyad - i.e. f(X,["second","minute","hour","day","week","month","year"])
                                              -                             "minute"
                                  Ç           - call the last link (1) as a monad - i.e. f(X,X)
                                              -                             59
                                 ṭ            - tack                        [59,['m','i','n','u','t','e']]
                                   K          - join with spaces            [59,' ','m','i','n','u','t','e']
                                           ”s - literal character '
                                          ¡   - repeat...
                                         ¤    - ...number of times: nilad followed by link(s) as a nilad:
                                     ⁸        -   chain's left argument, X  [3599,59,0,0,0,0,0]
                                      Ç       -   call the last link (1) as a monad - i.e. f(X,X)
                                              -                             59
                                       >1     -   greater than 1?           1
                                    ;         - concatenate                 [59,' ','m','i','n','u','t','e','s']
                                              - implicit print - smashes to print  "59 minutes"

8

C, 194 180 144 128 karakter

Kod azaltma için @gastropher sayesinde. C'nin K & R-style fonksiyonlarını kullanarak örtük parametrelere izin verdiğini unuttum! Ayrıca, dizileri yerine değişmezleri yerleştirme fikri için @gmatht'a teşekkür ederiz. Bunu , geniş karakter / karakterlerden yararlanarak kötüye kullanarak karakterlere genişlettim char16_t! Derleyici \1, ☺ biçiminde olsa da görünmüyor .

f(t,c,d){for(c=7;!(d=t/L"\1<ฐ\1•▼ŭ"[--c]/(c>2?86400:1)););printf("%d %.6s%s\n",d,c*6+(char*)u"敳潣摮業畮整潨牵 慤y†敷步 潭瑮h敹牡",(d<2)+"s");}

Çevrimiçi deneyin!

Orijinal çözüm

Çözümün geri kalanını daha kolay görebilmem için dizileri ayrı hatlara böldüm.

char *n[]={"second","minute","hour","day","week","month","year"};
int o[]={1,60,3600,86400,604800,2678400,31536000};
f(int t){int c=7,d;while(!(d=t/o[--c]));printf("%d %s%s\n",d,n[c],d>1?"s":"");}

Çevrimiçi deneyin!

Bölenleri en büyüğünden en küçüğüne doğru çalıştırarak en kaba zaman dilimini elde ediyoruz. Eğer program 0 saniye verirseniz, yaramazlık yapar, ancak şartname bu değeri açıkça hariç tuttuğu için kabul edilebilir olduğunu düşünüyorum.


Bazı hileler, 183 bayta indirilmesi için kullanılabilir: Çevrimiçi deneyin!
18'de gastropner

1
Üzgünüz, bu bir hata yaptı. 180 byte'a uygun bir tane: Çevrimiçi deneyin!
18'de gastropner

@gastropner Ben sonuncusu da bir böcek olduğunu düşünüyorum. '(d <1)' '(d <2)' ... veya '(d <= 1)' olmalıdır, ancak çıldırmasın.
mart

@gmatht Çok haklısın!
18'de gastropner

Tamam, sonuncusu, söz veriyorum. 164 bayt.
18'de gastropner


5

Stax , 54 bayt

▀♂♂┼╕Qá◙à*ä∙Φò►⌠╨Ns↔║►πîÇ∙cI≡ªb?δ♪9gΓ╕┬≥‼⌡Öå01:♪EoE╘≡ë

Koş ve hata ayıkla

İşte aynı programın açılmış, açılmış, ascii gösterimi.

                            stack starts with total seconds
c60/                        push total minutes to stack
c60/                        ... hours 
c24/                        ... days
Yc7/                        ... weeks
y31/                        ... months
y365/                       ... years
L                           make a list out of all the calculated time units
`)sQP(dr'pk,oV4?_HIFD?x`j   compressed literal for singular forms of unit names
\                           zip totals with names
rF                          foreach pair of total and name (in reverse orer)
  h!C                       skip if the current total is falsey (0)
  _J                        join the total and unit name with a space
  's_1=T+                   concat 's' unless the total is one

Yürütmeden sonra, başka bir çıktı olmadığından, yığının üstü örtük bir şekilde yazdırılır.

Bunu çalıştır


5

JavaScript (ES6), 131 bayt

n=>[60,60,24,7,31/7,365/31,0].map((v,i)=>s=n<1?s:(k=n|0)+' '+'second,minute,hour,day,week,month,year'.split`,`[n/=v,i])|k>1?s+'s':s

Çevrimiçi deneyin!


Kullandığın sözdiziminin farkında değildim (ayrıldı ,). Yeni bir şey öğrendim. Harika çözüm
Makotosan

1
@Makotosan Aslında iletilen şeyin splitdizi olduğunu unutmayın [',']. Bu nedenle, bu yalnızca zorlamayı bir dizeye zorlayan işlevlerle çalışır.
Arnauld

3

Java 8, 197 195 157 bayt

n->(n<60?n+" second":(n/=60)<60?n+" minute":(n/=60)<24?n+" hour":(n/=24)<7?n+" day":n<31?(n/=7)+" week":n<365?(n/=31)+" month":(n/=365)+" year")+(n>1?"s":"")

@ OlivierGrégoire sayesinde -38 bayt .

Açıklama:

Çevrimiçi deneyin.

n->               // Method with long parameter and String return-type
  (n<60?          //  If `n` is below 60:
    n             //   Output `n`
    +" second"    //   + " second"
   :(n/=60)<60?   //  Else-if `n` is below 60*60
    n             //   Integer-divide `n` by 60, and output it
    +" minute"    //   + " minute"
   :(n/=60)<24?   //  Else-if `n` is below 60*60*24:
    n             //   Integer-divide `n` by 60*60, and output it
    +" hour"      //   + " hour"
   :(n/=24)<7?    //  Else-if `n` is below 60*60*24*7:
    n             //   Integer-divide `n` by 60*60*24, and output it
    +" day"       //   + " day"
   :n<31?         //  Else-if `n` is below 60*60*24*31:
    (n/=7)        //   Integer-divide `n` by 60*60*24*7, and output it
    +" week"      //   + " week"
   :n<365?        //  Else-if `n` is below 60*60*24*365:
    (n/=31)       //   Integer-divide `n` by 60*60*24*31, and output it
    +" month"     //   + " month"
   :              //  Else:
    (n/=365)      //   Integer-divide `n` by 60*60*24*365, and output it
    +" year")     //   + " year"
   +(n>1?"s":"")  //  And add a trailing (plural) "s" if (the new) `n` is larger than 1

1
157 bayt . Sadece sayılarını daha kısa olanlara bıraktım ve /=gereken yere taşındım .
Olivier Grégoire

Kişisel favori: n->{for(int t=60,d[]={1,t,t*=60,t*=24,t*7,t*31,t*365},x=7;;)if(n>=d[--x])return(n/=d[x])+" "+"second,minute,hour,day,week,month,year".split(",")[x]+(n>1?"s":"");}(162 bayt), muhtemelen golf oynamak için iyi bir üs.
Olivier Grégoire

Vb n/7+yerine 9 bayttan (n/=7)+
Neil

@ Ne korkarım ki işe yaramayacak. Giriş ise, örneğin, 2678400çıkış olmalıdır 1 monthyerine 1 months(yerine çoğul tekil).
Kevin Cruijssen

Sessiz, haber verdiğin için teşekkürler.
Neil

2

Kotlin , 205 203 196 bayt

x->val d=86400
with(listOf(1 to "second",60 to "minute",3600 to "hour",d to "day",d*7 to "week",d*31 to "month",d*365 to "year").last{x>=it.first}){val c=x/first
"$c ${second+if(c>1)"s" else ""}"}

Çevrimiçi deneyin!


2

T-SQL , 306 bayt (G / Ç olmadan 281 bayt)

DECLARE @n INT=1
DECLARE @r VARCHAR(30)=TRIM(COALESCE(STR(NULLIF(@n/31536000,0))+' year',STR(NULLIF(@n/2678400,0))+' month',STR(NULLIF(@n/604800,0))+' week',STR(NULLIF(@n/86400,0))+' day',STR(NULLIF(@n/3600,0))+' hour',STR(NULLIF(@n/60,0))+' minute',STR(@n)+' second'))IF LEFT(@r,2)>1 SET @r+='s'
PRINT @r

İki küçük yazım hatası: TRIMtanımlanmamış, bu muhtemelen olmalıdır LTRIM. Arasında weekve day, bir var + , muhtemelen bir olmalıdır,
Stephan Bauer

Nitekim, bunun yerine bir + olmalı ,ve şimdi bunu düzelttim. Ancak, TRIMişlev SQL Server 2017'den beri tanımlanmıştır. Teşekkürler.
Razvan Socol

2

R , 157 bayt

function(n,x=cumprod(c(1,60,60,24,7,31/7,365/31)),i=cut(n,x),o=n%/%x[i])cat(o," ",c("second","minute","hour","day","week","year")[i],"if"(o>1,"s",""),sep="")

Çevrimiçi deneyin!

cutKullanışlı, aralıkları factors içerisine böldüğü için s olarak saklanır integer, yani bunları dizi dizinleri olarak da kullanabiliriz. Zaman periyodu isimleriyle biraz daha zekice bir şeyler yapabiliriz, fakat henüz henüz çözemiyorum.


2

APL + WIN, 88 119 bayt

Orijinal versiyon Phil H'nin belirttiği gibi haftalar ve aylar kaçırdı;

Saniye sayısı ekran girişi ister

a←⌽<\⌽1≤b←⎕÷×\1 60 60 24 7,(31÷7),365÷31⋄b,(-(b←⌊a/b)=1)↓∊a/'seconds' 'minutes' 'hours' 'days' 'weeks' 'months' 'years'

açıklama

b←⎕÷×\1 60 60 24 7,(31÷7),365÷31 prompts for input and converts to years, days, hours, minutes, seconds

a←⌽<\⌽1≤b identify largest unit of time and assign it to a

a/'years' 'days' 'hours' 'minutes' 'seconds' select time unit

(-(b←⌊a/b)=1)↓∊ determine if singular if so drop final s in time unit

b, concatenate number of units to time unit from previous steps

Birisi haftaları ve ayları yedi mi?
Phil H

@PhilH Kurabiye canavarı? ;) Teşekkürler. Cevap buna göre düzenlendi.
Graham

APL için bile çok temiz görünüyordu! Ayrıca, baytları nasıl sayıyorsunuz? Bayt yerine 119 karakter sayıyorum ...
Phil H

@PhilH Yorumunuzu anlamıyorum, önce cevabı düzenlemede değiştirdiğim 119 baytta hemfikiriz; yukarıda ise kaç bayt sorguladığınızı söylemiyorsunuz
Graham


1

Toplu iş, 185 bayt

@for %%t in (1.second 60.minute 3600.hour 43200.day 302400.week, 1339200.month, 15768000.year)do @if %1 geq %%~nt set/an=%1/%%~nt&set u=%%~xt
@if %n% gtr 1 set u=%u%s
@echo %n%%u:.= %

1

Python 2 , 146 144 bayt

lambda n,d=86400:[`n/x`+' '+y+'s'*(n/x>1)for x,y in zip([365*d,31*d,7*d,d,3600,60,1],'year month week day hour minute second'.split())if n/x][0]

Çevrimiçi deneyin!

Jonathan Allan sayesinde 2 bayt kurtarıldı


1
if n/xbir bayt kaydeder.
Jonathan Allan

1
Siparişi tersine çevirmek ve indekslemek bir tane daha 0tasarruf sağlar.
Jonathan Allan

1

PHP , 183 bayt

<?$a=[second=>$l=1,minute=>60,hour=>60,day=>24,week=>7,month=>31/7,year=>365/31];foreach($a as$p=>$n){$q=$n*$l;if($q<=$s=$argv[1])$r=($m=floor($s/$q))." $p".($m>1?s:"");$l=$q;}echo$r;

Çevrimiçi deneyin!


1

Julia 0.6 , 161 bayt

f(n,d=cumprod([1,60,60,24,7,31/7,365/31]),r=div.(n,d),i=findlast(r.>=1),l=Int(r[i]))="$l $(split("second minute hour day week month year",' ')[i])$("s"^(l>1*1))"

Çevrimiçi deneyin!



0

Perl 6 / Rakudo 138 bayt

Bundan daha fazla gidebileceğinden eminim, ama şimdilik

{my @d=(365/31,31/7,7,24,60,60);$_/=@d.pop while @d&&$_>@d[*-1];$_.Int~" "~ <year month week day hour minute second>[+@d]~($_>1??"s"!!"")}

irdelenmesi:

{ # bare code block, implicit $_ input
    my @d=(365/31,31/7,7,24,60,60); # ratios between units
    $_ /= @d.pop while @d && $_ > @d[*-1]; # pop ratios off @d until dwarfed
    $_.Int~   # implicitly output: rounded count
        " "~  # space
        <year month week day hour minute second>[+@d]~ # unit given @d
        ($_>1??"s"!!"")  # plural
}

0

R, 336

Çalışma devam ediyor

function(x){
a=cumprod(c(1,60,60,24,7,31/7,365/31))
t=c("second","minute","hour","day","week","month")
e=as.data.frame(cbind(table(cut(x,a,t)),a,t))
y=x%/%as.integer(as.character(e$a[e$V1==1]))
ifelse(x>=a[7],paste(x%/%a[7],ifelse(x%/%a[7]==1,"year","years")),
ifelse(y>1,paste(y,paste0(e$t[e$V1==1],"s")),paste(y,e$t[e$V1==1])))}

0

R , 246 bayt

f=function(x,r=as.integer(strsplit(strftime(as.POSIXlt(x,"","1970-01-01"),"%Y %m %V %d %H %M %S")," ")[[1]])-c(1970,1,1,1,1,0,0),i=which.max(r>0)){cat(r[i],paste0(c("year","month","week","day","hour","minute","second")[i],ifelse(r[i]>1,"s","")))}

Çevrimiçi deneyin!

Bu, sadece cehennem için, aritmetik yerine zaman oluşturmayı kullanıyor. Belki başkaları bunu küçültebilir?

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.