Nó bao nhiêu tuổi


29

Viết một chương trình ngắn trong một số giây tích cực đại diện cho độ tuổi và đưa ra ước tính về thời gian đó bằng tiếng Anh.

Chương trình của bạn phải xuất ra lượng thời gian ít chính xác nhất đã qua, trong số các số liệu sau và độ dài của chúng tính bằng giây:

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

Ví dụ

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

Như bạn có thể thấy ở trên, sau thời gian nói, 1 ngày (60 * 60 * 24 = 86400 giây), chúng tôi không còn xuất ra phút (s) hoặc giờ , mà chỉ vài ngày cho đến khi chúng tôi vượt qua thời gian của một tuần , v.v.

Xem xét khoảng thời gian nhất định là một độ tuổi. Chẳng hạn, sau 119 giây, 1 phút đã trôi qua chứ không phải 2.

Quy tắc

  • Không có đặc điểm kỹ thuật cho đầu vào 0 hoặc âm.
  • Thực hiện theo số nhiều thích hợp. Mỗi số đo lớn hơn 1 phải bao gồm một từ stheo sau.
  • Bạn không được sử dụng thư viện có sẵn phục vụ chức năng của toàn bộ chương trình.
  • Đây là một mã golf, chương trình ngắn nhất giành được điểm internet.
  • Chúc vui vẻ!

3
Tôi không hiểu làm thế nào chúng ta chọn một đơn vị hoặc số tiền. Chúng ta có làm tròn không?
xnor 18/03/18

1
@xnor chúng tôi chia số nguyên và sử dụng giá trị khác không nhỏ nhất cùng với đơn vị của nó (có thể là số nhiều). Do đó 59 -> "59 giây" và 86401 -> "1 ngày".
Jonathan Allan

5
Chào mừng đến với PPCG! Thử thách đầu tiên tốt đẹp. Để tham khảo trong tương lai, có một hộp cát rất hữu ích để nhận phản hồi trước khi đăng lên main.
Jonathan Allan


1
Làm thế nào chúng ta nên làm tròn số? Nên 119 giây là 1 phút hay 2 phút? Còn 90 thì sao?
dùng202729

Câu trả lời:


8

Thạch , 62 byte

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

Một chương trình đầy đủ in kết quả.
(Là một liên kết đơn, nó trả về một danh sách các số nguyên theo sau là các ký tự)

Hãy thử trực tuyến!

Làm sao?

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 ký tự

Cảm ơn @gastropher đã giảm mã. Tôi quên rằng C cho phép các tham số ngầm sử dụng các hàm kiểu K & R! Cũng cảm ơn @gmatht vì ý tưởng đặt chữ bên trong thay vì mảng. Tôi mở rộng điều đó cho các nhân vật bằng cách lạm dụng lợi thế của các ký tự / char16_tchuỗi rộng! Trình biên dịch dường như không thích \1ở dạng though của nó.

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

Hãy thử trực tuyến!

Giải pháp ban đầu

Tôi chia các mảng thành các dòng riêng biệt để dễ dàng nhìn thấy phần còn lại của giải pháp.

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

Hãy thử trực tuyến!

Chạy các ước số theo thứ tự từ lớn nhất đến nhỏ nhất, chúng ta có được đơn vị thời gian thô nhất. Chương trình hoạt động sai nếu bạn cho nó 0 giây, nhưng vì thông số kỹ thuật loại trừ rõ ràng giá trị này, tôi cho rằng điều đó có thể chấp nhận được.


Một số thủ thuật có thể được sử dụng để giảm xuống còn 183 byte: Hãy thử trực tuyến!
dạ dày 18/03/18

1
Xin lỗi, cái đó đã giới thiệu một lỗi. Đúng một ở 180 byte: Hãy thử trực tuyến!
dạ dày 18/03/18

@gastropner Tôi nghĩ cái cuối cùng cũng có lỗi. '(d <1)' nên là '(d <2)' ... hoặc '(d <= 1)', nhưng đừng để phát điên.
gmatht

@gmatht Bạn nói khá đúng!
dạ dày

OK, cuối cùng, tôi hứa. 164 byte.
dạ dày


5

Stax , 54 byte

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

Chạy và gỡ lỗi nó

Đây là đại diện của ascii đã giải nén, không mã hóa, của cùng một chương trình.

                            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

Sau khi thực hiện, vì không có đầu ra nào khác, phần trên cùng của ngăn xếp được in ngầm.

Chạy cái này


5

JavaScript (ES6), 131 byte

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

Hãy thử trực tuyến!


Tôi không biết cú pháp mà bạn đã sử dụng (tách ,). Tôi đã học được một cái gì đó mới. Giải pháp tuyệt vời.
Makotosan 18/03/18

1
@Makotosan Lưu ý rằng những gì thực sự được truyền vào splitlà mảng [',']. Do đó, điều này chỉ hoạt động với các chức năng buộc ép buộc thành một chuỗi.
Arnauld

3

Java 8, 197 195 157 byte

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":"")

-38 byte nhờ @ OlivierGrégoire .

Giải trình:

Hãy thử trực tuyến.

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 byte . Tôi chỉ đánh số của bạn để số ngắn hơn và di chuyển /=xung quanh nơi cần thiết.
Olivier Grégoire

Yêu thích cá nhân: 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 byte), có lẽ là một cơ sở tốt để chơi gôn.
Olivier Grégoire

Lưu 9 byte bằng cách sử dụng n/7+thay vì (n/=7)+vv
Neil

@Neil Tôi sợ rằng sẽ không làm việc. Ví dụ, nếu đầu vào là 2678400, đầu ra nên 1 monththay vì 1 months(số ít thay vì số nhiều).
Kevin Cruijssen

Oh, tinh tế, cảm ơn đã cho tôi biết.
Neil

2

Kotlin , 205 203 196 byte

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

Hãy thử trực tuyến!


2

T-SQL , 306 byte (281 byte không có I / O)

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

Hai lỗi chính tả nhỏ: TRIMkhông được xác định, điều này có thể nên được LTRIM. Giữa weekday, bạn có một + , nên có thể là một,
Stephan Bauer

Thật vậy, thay vì + nó nên là một ,và tôi đã sửa nó ngay bây giờ. Tuy nhiên, TRIMchức năng được xác định kể từ SQL Server 2017. Cảm ơn.
Razvan Socol

2

R , 157 byte

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="")

Hãy thử trực tuyến!

cutlà tiện dụng, vì nó phân chia phạm vi thành factors, được lưu trữ bên trong dưới dạng integers, có nghĩa là chúng ta cũng có thể sử dụng chúng làm chỉ số mảng. Chúng ta có thể có thể làm một cái gì đó thông minh hơn một chút với các tên khoảng thời gian, nhưng tôi chưa thể tìm ra nó.


2

APL + THẮNG, 88 119 byte

Phiên bản gốc đã bỏ lỡ nhiều tuần và tháng như Phil H;

Nhắc đầu vào màn hình số giây

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'

Giải trình

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

Có ai ăn tuần và tháng không?
Phil H

@PhilH Cookie quái vật? ;) Cảm ơn. Trả lời chỉnh sửa cho phù hợp.
Graham

Nó trông quá gọn gàng, ngay cả đối với APL! Ngoài ra, làm thế nào bạn đếm các byte? Tôi đếm được 119 ký tự chứ không phải byte ...
Phil H

@PhilH Tôi không hiểu nhận xét của bạn trước tiên, chúng tôi đồng ý với 119 byte mà tôi đã thay đổi khi chỉnh sửa câu trả lời và ở trên bạn không nói bạn đang hỏi bao nhiêu byte
Graham


1

Mẻ, 185 byte

@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

PHP , 183 byte

<?$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;

Hãy thử trực tuyến!




0

Perl 6 / Rakudo 138 byte

Tôi chắc chắn sẽ còn nhiều hơn nữa, nhưng bây giờ

{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"!!"")}

Giải thích:

{ # 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

Đang làm việc

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 byte

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

Hãy thử trực tuyến!

Điều này đang sử dụng thời gian hình thành thay vì phân tích, chỉ cho địa ngục của nó. Có lẽ những người khác có thể làm cho điều này nhỏ hơn?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.