대략 몇 살입니까?


29

연령을 나타내는 양의 시간 (초)이 걸리고 그 시간의 추정치를 영어로 출력하는 짧은 프로그램을 작성하십시오.

프로그램은 다음 측정 항목과 길이 (초) 중 경과 된 최소 시간을 출력해야합니다 .

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

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

위에서 볼 수 있듯이 1 일 (60 * 60 * 24 = 86400 초) 시간이 지나면 더 이상 분 또는 시간을 출력하지 않지만 일주일 시간을 초과 할 때까지 며칠 만 출력합니다. , 등등.

주어진 시간을 나이로 생각하십시오. 예를 들어, 119 초 후 1 분이 아닌 2 분이 지났습니다 .

규칙

  • 0 또는 음의 입력에 대한 사양이 없습니다.
  • 적절한 복수형을 따르십시오. 1보다 큰 모든 측정 값에는 s다음 단어 가 포함되어야합니다 .
  • 전체 프로그램의 기능을 수행하는 기존 라이브러리를 사용할 수 없습니다.
  • 이것은 코드 골프이며, 가장 짧은 프로그램은 인터넷 포인트를 얻습니다.
  • 즐기세요!

3
단위 또는 금액을 선택하는 방법을 이해하지 못합니다. 우리는 둥글니까?
xnor

1
@xnor 정수를 나누고 0이 아닌 가장 작은 값을 단위와 함께 사용합니다 (복수화 가능). 따라서 59-> "59 초"및 86401-> "1 일"입니다.
Jonathan Allan

5
PPCG에 오신 것을 환영합니다! 좋은 첫 번째 도전. 나중에 참조 할 수 있도록 메인에 게시하기 전에 피드백을받는 데 유용한 샌드 박스 가 있습니다.
Jonathan Allan

4
참고 Y없이 할 X이 뿐만 아니라, 권장하지 않습니다 비 관찰 프로그램 요구 사항 .
user202729

1
우리는 어떻게 숫자를 반올림해야합니까? 119 초가 1 분 또는 2 분이어야합니까? 90 은요?
user202729

답변:


8

젤리 , 62 바이트

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

결과를 인쇄하는 전체 프로그램.
(모나 딕 링크로서 정수와 문자의 목록을 반환합니다)

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

방법?

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자를

코드 축소를위한 @gastropher에게 감사합니다. C가 K & R 스타일 함수를 사용하여 암시 적 매개 변수를 허용한다는 것을 잊었습니다! 또한 배열 대신 리터럴을 넣는 아이디어에 대해 @gmatht에게 감사드립니다. 넓은 문자 / 문자열 을 활용 하여 학대 하여 문자로 확장했습니다 char16_t! 컴파일러는 \1☺ 형식 으로 좋아하지 않는 것 같습니다 .

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

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

독창적 인 솔루션

나머지 솔루션을 더 쉽게 볼 수 있도록 배열을 별도의 줄로 나눕니다.

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

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

제수를 가장 큰 것부터 가장 작은 것까지 순서대로 돌리면 가장 거친 시간 단위가됩니다. 0 초를 지정하면 프로그램이 잘못 작동하지만 사양 에서이 값을 명시 적으로 제외하므로 허용되는 것으로 간주합니다.


몇 가지 트릭을 사용하여 183 바이트로 줄일 수 있습니다. 온라인으로 사용해보십시오!
gastropner

1
죄송합니다. 버그가 발생했습니다. 180 바이트에서 올바르게 : 온라인으로 사용해보십시오!
gastropner

@gastropner 마지막 ​​것 역시 버그가 있다고 생각합니다. '(d <1)'은 '(d <2)'... 또는 '(d <= 1)'이어야하지만 미쳐서는 안됩니다.
gmatht

@gmatht 당신은 아주 옳습니다!
gastropner

마지막으로 약속합니다. 164 바이트
gastropner


5

Stax , 54 바이트

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

실행 및 디버깅

다음은 동일한 프로그램의 압축을 풀고 언 골프 된 ASCII 표현입니다.

                            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

실행 후에는 다른 출력이 없으므로 스택의 상단이 암시 적으로 인쇄됩니다.

이것을 실행


5

자바 스크립트 (ES6), 131 바이트

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

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


나는 당신이 사용한 구문을 알지 못했습니다 (split ,). 나는 새로운 것을 배웠다. 훌륭한 솔루션.
Makotosan

1
@Makotosan 실제로 전달되는 split것은 배열 [',']입니다. 따라서 이것은 강제 변환을 문자열로 만드는 함수에서만 작동합니다.
Arnauld

3

자바 8, 197 195 157 바이트

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 덕분에 -38 바이트 .

설명:

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

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 바이트 . 나는 당신의 숫자를 더 짧은 숫자로 골라 내고 /=필요한 곳으로 옮겼습니다 .
Olivier Grégoire

개인적인 마음에 드는 것 : 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 바이트), 아마도 골프를하기에 좋은 기지 일 것입니다.
Olivier Grégoire

n/7+대신에 9 바이트를 절약하십시오 (n/=7)+.
Neil

@ Neil 나는 그것이 작동하지 않을까 두려워한다. 입력 인 경우, 예를 들어 2678400, 출력은이어야 1 month대신 1 months(대신 복수의 단수).
케빈 크루이 센

미묘하게 알려 줘서 고마워
Neil


2

T-SQL , 306 바이트 (I / O가없는 281 바이트)

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

두 개의 작은 오타 TRIM가 정의되어 있지 않습니다 LTRIM. week와 사이 day에 다음이 + 있을 수 있습니다.,
Stephan Bauer

실제로, 대신에 + a이어야하며 ,지금 수정했습니다. 그러나이 TRIM기능은 SQL Server 2017부터 정의되었습니다. 감사합니다.
Razvan Socol

2

R , 157 바이트

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

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

cut범위를 factors 로 나누기 때문에 내부적으로 integers 로 저장 되므로 배열 인덱스로도 사용할 수 있습니다. 우리는 아마도 기간 이름으로 좀 더 영리한 것을 할 수는 있지만 아직 알아낼 ​​수는 없습니다.


2

APL + WIN, 88 119 바이트

Phil H가 지적한대로 원래 버전은 몇 주와 몇 달이 빠졌습니다. (

초 수의 화면 입력을 프롬프트합니다

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'

설명

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

누군가 몇 주와 몇 달을 먹었습니까?
Phil H

@PhilH 쿠키 몬스터? ;) 감사. 이에 따라 답변이 수정되었습니다.
Graham

APL조차도 너무 깔끔하게 보였습니다! 또한 바이트 수를 어떻게 계산합니까? 바이트가 아닌 119 문자로 계산합니다.
Phil H

@PhilH 나는 당신의 의견을 먼저 이해하지 못합니다. 우리는 대답을 편집 할 때 변경 된 119 바이트에 동의하며 그보다 많은 바이트를 질문하지 않습니다
Graham


1

배치, 185 바이트

@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 바이트

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

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




0

Perl 6 / Rakudo 138 바이트

더 나아갈 것이 확실하지만 지금은

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

설명 :

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

진행중인 작업

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 바이트

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

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

이것은 단순히 대수 대신에 시간 형식을 사용하고 있습니다. 다른 사람들이 이것을 더 작게 만들 수 있습니까?

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