মোটামুটি বয়স কত?


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 সেকেন্ড) বলার পরে, আমরা আর আউটপুট মিনিট (ঘন্টা) বা ঘন্টা (গুলি) রাখি না, তবে কেবলমাত্র এক সপ্তাহের সময়কে ছাড়িয়ে যাওয়া পর্যন্ত কেবল দিনগুলি থাকে না , ইত্যাদি।

বয়স হিসাবে প্রদত্ত সময়ের দৈর্ঘ্য বিবেচনা করুন। উদাহরণস্বরূপ, ১১৯ সেকেন্ডের পরে, 1 মিনিট কেটে গেছে , 2 নয়।

বিধি

  • 0 বা নেতিবাচক ইনপুটগুলির জন্য কোনও স্পেসিফিকেশন নেই।
  • যথাযথ বহুবচন অনুসরণ করুন। 1 এর চেয়ে বড় প্রতিটি পরিমাপে অবশ্যই sনিম্নলিখিত শব্দটি অন্তর্ভুক্ত করতে হবে ।
  • আপনি কোনও পূর্ব-বিদ্যমান লাইব্রেরি ব্যবহার করতে পারবেন না যা পুরো প্রোগ্রামটির কার্যকারিতা সরবরাহ করে।
  • এটি একটি কোড গল্ফ, সংক্ষিপ্ততম প্রোগ্রাম পয়েন্ট জয় করে।
  • আনন্দ কর!

3
আমি বুঝতে পারি না আমরা কীভাবে ইউনিট বা পরিমাণ বেছে নিই। আমরা কি গোল করি?
xnor

1
@ এক্সনোর আমরা সংখ্যাকে বিভাজন হিসাবে ব্যবহার করি এবং এর ইউনিট (সম্ভবত বহুবচন) সহ ক্ষুদ্রতম অ-শূন্য মানটি ব্যবহার করি। অতএব 59 -> "59 সেকেন্ড" এবং 86401 -> "1 দিন"।
জোনাথন অ্যালান

5
পিপিসিজিতে আপনাকে স্বাগতম! ভাল প্রথম চ্যালেঞ্জ। ভবিষ্যতের রেফারেন্সের জন্য একটি স্যান্ডবক্স রয়েছে যা মূল পোস্ট করার আগে প্রতিক্রিয়া পাওয়ার জন্য কার্যকর।
জোনাথন অ্যালান


1
আমাদের সংখ্যাটি কীভাবে গোল করা উচিত? ১১৯ সেকেন্ড কি এক মিনিট বা ২ মিনিট হওয়া উচিত? 90 এর কি?
ব্যবহারকারী 202729

উত্তর:


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 টি অক্ষর

কোড হ্রাসের জন্য @ গ্যাস্ট্রোফারকে ধন্যবাদ। আমি ভুলে গেছি যে সি কে ও আর-স্টাইলের ফাংশনগুলি ব্যবহার করে অন্তর্নিহিত পরামিতিগুলির অনুমতি দেয়! অ্যারে পরিবর্তে ভিতরে আক্ষরিক প্রবেশের ধারণার জন্য @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 বাইটে নামানোর জন্য কয়েকটি কৌশল ব্যবহার করা যেতে পারে: এটি অনলাইনে চেষ্টা করুন!
গ্যাস্ট্রোপনার

1
দুঃখিত, এটি একটি বাগ প্রবর্তন করেছে। 180 বাইটে যথাযথ এক: এটি অনলাইনে চেষ্টা করুন!
গ্যাস্ট্রোপনার

@ গ্যাস্ট্রোপনার আমি মনে করি শেষটির একটিতেও একটি বাগ রয়েছে। '(d <1)' হওয়া উচিত '(d <2)' ... বা '(d <= 1)', তবে পাগল হতে দেয় না।
gmatht

@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

জাভাস্ক্রিপ্ট (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

এটি অনলাইন চেষ্টা করুন!


আপনি যে সিনট্যাক্সটি ব্যবহার করেছেন (বিভক্ত ,) তা সম্পর্কে আমি অবগত ছিলাম না । আমি নতুন কিছু শিখেছি। দুর্দান্ত সমাধান।
মকোটোসান

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 বাইট @ অলিভিগ্রগ্রোয়ারকে ধন্যবাদ ।

ব্যাখ্যা:

এটি অনলাইনে চেষ্টা করুন।

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 বাইট), সম্ভবত গল্ফ করার জন্য একটি ভাল বেস।
অলিভিয়ের গ্রাগোয়ার 13

ব্যবহার 9 বাইট সংরক্ষণ n/7+পরিবর্তে (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আপনার একটি + সম্ভবত হওয়া উচিত,
স্টিফান বাউয়ার

আসলে + এটির পরিবর্তে একটি হওয়া উচিত ,এবং আমি এখন এটি সংশোধন করেছি। যাইহোক, TRIMফাংশনটি এসকিউএল সার্ভার 2017 সাল থেকে সংজ্ঞায়িত করা হয়েছে Thanks ধন্যবাদ।
রাজন সোসোল

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সুবিধাজনক, যেহেতু এটি ব্যাপ্তিগুলিকে factors এর মধ্যে বিভক্ত করে , যা অভ্যন্তরীণভাবে 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 টি অক্ষর গণনা করেছি ...
ফিল এইচ

@ ফিলিহ আমি আপনার মন্তব্যটি বুঝতে পারি না প্রথমে আমরা ১১৯ বাইটের সাথে একমত হয়েছি যা আমি উত্তর সম্পাদনার সময় পরিবর্তন করেছি এবং উপরে আপনি কতটা বাইট নিয়ে প্রশ্ন করছেন তা বলবেন না
গ্রাহাম


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

এটি অনলাইন চেষ্টা করুন!

এটি সময়কালের পরিবর্তে সময় গঠনের জন্য এটির নরকের জন্য ব্যবহার করছে। অন্যরাও কি এটিকে আরও ছোট করতে পারে?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.