यह कितना पुराना है?


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

जैसा कि आप ऊपर देख सकते हैं, कहने के समय के बाद, १ दिन (६० * ६० * २४ = see६४०० सेकंड), अब हम आउटपुट मिनट (एस) या घंटा (एस) नहीं हैं , लेकिन केवल एक दिन का समय पार करने तक केवल दिन , और इसी तरह।

एक उम्र होने के लिए दी गई लंबाई पर विचार करें। उदाहरण के लिए, 119 सेकंड के बाद, 1 मिनट बीत चुका है , 2 नहीं।

नियम

  • 0 या नकारात्मक इनपुट के लिए कोई विनिर्देश नहीं।
  • उचित बहुवचन का पालन करें। 1 से अधिक प्रत्येक उपाय में sनिम्नलिखित शब्द शामिल होना चाहिए ।
  • आप पहले से मौजूद लाइब्रेरी का उपयोग नहीं कर सकते हैं जो पूरे कार्यक्रम का कार्य करता है।
  • यह एक कोड गोल्फ है, सबसे छोटा प्रोग्राम इंटरनेट पॉइंट जीतता है।
  • मज़े करो!

3
मुझे समझ नहीं आ रहा है कि हम एक इकाई या राशि कैसे चुनें। क्या हम गोल?
xnor

1
@xnor हम पूर्णांक को विभाजित करते हैं और इसकी इकाई (संभवतः बहुवचन) के साथ सबसे छोटे गैर-शून्य मान का उपयोग करते हैं। इसलिए 59 -> "59 सेकंड" और 86401 -> "1 दिन"।
जोनाथन एलन

5
PPCG में आपका स्वागत है! अच्छी पहली चुनौती। भविष्य के संदर्भ के लिए एक सैंडबॉक्स है जो मुख्य पोस्ट करने से पहले प्रतिक्रिया प्राप्त करने के लिए उपयोगी है।
जोनाथन एलन

4
ध्यान दें कि Y के बिना Do 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

सी, 194 180 144 128 वर्ण

कोड कटौती के लिए @gastropher को धन्यवाद। मैं भूल गया कि सी कश्मीर और आर-शैली के कार्यों का उपयोग करते हुए अंतर्निहित मापदंडों के लिए अनुमति देता है! इसके अलावा सरणियों के बजाय शाब्दिक अंदर डालने के विचार के लिए @gmatht का धन्यवाद। मैं के आधार पर पात्रों के लिए है कि बढ़ाया कोस विस्तृत चरित्र / का लाभ लेने के char16_tतार! संकलक \1हालांकि इसके iler रूप में पसंद नहीं करता है ।

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 बाइट्स तक ले जाने के लिए कुछ ट्रिक्स का इस्तेमाल किया जा सकता है: इसे ऑनलाइन आज़माएं!
गैस्ट्रोपनर

1
क्षमा करें, कि एक बग की शुरुआत हुई। 180 बाइट्स में उचित एक: ऑनलाइन यह कोशिश करो!
गैस्ट्रोपनर

@gastropner मुझे लगता है कि पिछले एक बग भी है। '(d <1)' होना चाहिए '(d <2)' ... या '(d <= 1)', लेकिन पागल नहीं होने देता।
गमथ

@gmatht आप काफी सही हैं!
गैस्ट्रोपनर

ठीक है, पिछले एक, मैं वादा करता हूँ। 164 बाइट्स।
गैस्ट्रोपनर


5

स्टैक्स , 54 बाइट्स

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

इसे चलाएं और डीबग करें

यहाँ एक ही कार्यक्रम के अनपैक्ड, अनगुल्फेड, एससीआई प्रतिनिधित्व हैं।

                            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

जावास्क्रिप्ट (ईएस 6), 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

इसे ऑनलाइन आज़माएं!


मुझे आपके द्वारा प्रयुक्त (विभाजित ,) सिंटैक्स के बारे में पता नहीं था । मैंने कुछ नया सीखा। महान समाधान।
मकोतोसन

1
@ माकोतोसन ध्यान दें कि वास्तव में जो पारित किया गया splitहै वह सरणी है [',']। इसलिए, यह केवल उन फ़ंक्शन के साथ काम करता है जो एक स्ट्रिंग के लिए ज़बरदस्ती मजबूर करते हैं।
अरनुलद

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

-38 बाइट्स @ OlivierGrégoire को धन्यवाद ।

स्पष्टीकरण:

इसे ऑनलाइन आज़माएं।

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 बाइट्स । मैंने आपके नंबरों को छोटे लोगों को दिया और /=जहां जरूरत थी वहां ले जाया गया।
ओलिवियर ग्राएगोइरे

व्यक्तिगत पसंदीदा: 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 बाइट्स), शायद गोल्फ के लिए एक अच्छा आधार है।
ओलिवियर ग्राएगोइरे

आदि के n/7+बजाय 9 बाइट्स बचाएं(n/=7)+
नील

@ नहीं मुझे डर है कि काम नहीं करेगा। उदाहरण के लिए, यदि इनपुट है 2678400, तो आउटपुट 1 monthइसके बजाय 1 months(बहुवचन के बजाय एकवचन) होना चाहिए ।
केविन क्रूज़सेन

ओह, सूक्ष्म, मुझे बताने के लिए धन्यवाद।
नील


2

टी-एसक्यूएल , 306 बाइट्स (बिना आई / ओ के 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, आप एक है + , संभवतः एक होना चाहिए,
स्टीफ़न Bauer

वास्तव में, इसके बजाय + यह होना चाहिए ,और मैंने इसे अब ठीक कर दिया है। हालाँकि, TRIMफ़ंक्शन SQL Server 2017 से परिभाषित किया गया है। धन्यवाद।
रज़वान सोकोल

2

आर , 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आसान है, क्योंकि यह विभाजन में विभाजित है factor, जो आंतरिक रूप से integerएस के रूप में संग्रहीत होते हैं , जिसका अर्थ है कि हम उन्हें सरणी सूचक के रूप में भी उपयोग कर सकते हैं। हम शायद समयावधि के नामों के साथ कुछ अधिक चतुर हो सकते हैं, लेकिन मैं अभी इसका पता नहीं लगा सकता।


2

एपीएल + विन, 88 119 बाइट्स

मूल संस्करण फिल एच के द्वारा इंगित किए गए सप्ताह और महीनों से चूक गया ;;

सेकंड की संख्या के स्क्रीन इनपुट का संकेत देता है

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

क्या किसी ने सप्ताह और महीने खाए?
फिल एच।

@ पिल्ले कुकी राक्षस? ;) धन्यवाद। तदनुसार उत्तर दिया गया।
ग्राहम

यह बहुत साफ लग रहा था, यहां तक ​​कि एपीएल के लिए भी! इसके अलावा, आप बाइट्स कैसे गिन रहे हैं? मैं बाइट्स के बजाय 119 कैरेक्टर गिनता हूं ...
फिल एच।

@PhilH मैं आपकी टिप्पणी को नहीं समझता, पहले हम 119 बाइट्स पर सहमत होते हैं, जो मैंने उत्तर को संपादित करने पर बदल दिया है और ऊपर आप यह नहीं कहते कि आप कितने बाइट्स पर सवाल उठा रहे हैं
ग्राहम


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

पायथन 2 , 146 144 बाइट्स

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]

इसे ऑनलाइन आज़माएं!

2 बाइट्स ने जोनाथन एलन को धन्यवाद दिया


1
if n/xएक बाइट बचाता है।
जोनाथन एलन

1
आदेश को उलट देना और साथ अनुक्रमण करना 0दूसरे को बचाता है।
जोनाथन एलन




0

पर्ल 6 / राकूडो 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

आर, 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

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

इसे ऑनलाइन आज़माएं!

यह समय की नोक-झोंक का उपयोग कर रहा है। शायद अन्य लोग इसे छोटा बना सकते हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.