ইংরেজি দীর্ঘ সংক্ষিপ্ত তারিখ


14

সংক্ষিপ্ত তারিখের ফর্ম্যাটটিকে ইংরাজী দীর্ঘ তারিখে যতটা সম্ভব বাইটে রূপান্তর করুন।

ইনপুট

ইনপুটটি yyyy-mm-ddসমস্ত মানের জন্য শূন্য প্যাডিং সহ ফর্ম্যাট সহ একটি স্ট্রিং আকারে হবে। আপনি ধরে নিতে পারেন যে এটি সিন্টেক্সিকভাবে সঠিক, তবে কোনও বৈধ তারিখের প্রয়োজন নেই। নেতিবাচক বছরের মানগুলি সমর্থন করার দরকার নেই।

আউটপুট

আপনাকে অবশ্যই তারিখটি ইংরেজী দীর্ঘ তারিখের ফর্ম্যাটে রূপান্তর করতে হবে (উদাঃ 14th February 2017)। এখানে জিরো প্যাডিং অনুমোদিত নয়।

তারিখটি যদি অবৈধ (উদাঃ 2011-02-29) হয় তবে অবশ্যই এটি কোনওভাবে স্বীকৃত হবে। একটি ব্যতিক্রম নিক্ষেপ অনুমোদিত।

আরও উদাহরণ নীচে দেখা যাবে।

পরীক্ষার কেস

"1980-05-12" -> 12th May 1980
"2005-12-3"  -> 3rd December 2005
"150-4-21"   -> 21st April 150
"2011-2-29"  -> (error/invalid)
"1999-10-35" -> (error/invalid)

5
শূন্য প্যাডিং অনুমোদিত? এর 03rdপরিবর্তে ওরফে3rd
মান কালি

@ ভালুআইঙ্ক যদি আপনি আমার আগের মন্তব্যটি পড়েন তবে এটিকে উপেক্ষা করুন; আমি প্রশ্নটি ভুল বুঝেছি। আউটপুটে জিরো প্যাডিং অনুমোদিত নয়।
গ্যারেথপিডাব্লু

আমাদের কি এক বছরের 4 টিরও বেশি অক্ষরের উপর বিবেচনা করা উচিত (উদাঃ 10987-01-01)?
mdahmoune

@mdahmoune আপনি এটি সমর্থন করার প্রয়োজন নেই যদি না এটি করা সহজ হয়।
গ্যারেথপিডাব্লু

উত্তর:


5

PostgreSQL, 61 টি অক্ষর

prepare f(date)as select to_char($1,'fmDDth fmMonth fmYYYY');

প্রস্তুত বিবৃতি, প্যারামিটার হিসাবে ইনপুট লাগে।

নমুনা রান:

Tuples only is on.
Output format is unaligned.
psql (9.6.3, server 9.4.8)
Type "help" for help.

psql=# prepare f(date)as select to_char($1,'fmDDth fmMonth fmYYYY');
PREPARE

psql=# execute f('1980-05-12');
12th May 1980

psql=# execute f('2005-12-3');
3rd December 2005

psql=# execute f('150-4-21');
21st April 150

psql=# execute f('2011-2-29');
ERROR:  date/time field value out of range: "2011-2-29"
LINE 1: execute f('2011-2-29');
                  ^
psql=# execute f('1999-10-35');
ERROR:  date/time field value out of range: "1999-10-35"
LINE 1: execute f('1999-10-35');
                  ^
HINT:  Perhaps you need a different "datestyle" setting.

ভাল লাগলো, এমএস-এসকিউএল "তম" ফর্ম্যাটিং স্টাইলটি স্বীকৃত হোক wish
ব্র্যাডিসি

আপনি কয়েকটি বাইটের সাহায্যে কার্যটি সঠিকভাবে সম্পন্ন করার কথা বিবেচনা করে, আমি মনে করি আপনার সমাধানটি বিজয়ী!
গ্যারেথপিডাব্লু

কি দারুন. ধন্যবাদ। এটি সম্পূর্ণ অপ্রত্যাশিত। উত্সর্গীকৃত গল্ফিং ভাষার অনুপস্থিতি এখনও অবধি লক্ষ্য করেনি। তবে মাত্র একদিন পর একটি সমাধান গ্রহণ করা কিছুটা শীঘ্রই।
manatwork

@ মান্যাটওয়ার্ক আমি ভাবছিলাম যে এটি যদি খুব তাড়াতাড়ি হয়। তবে প্রয়োজনে যদি হয় তবে আমি এটি পরিবর্তন করতে পারি।
গ্যারেথপিডাব্লু

7

পাইথন 3.6, 137 129 বাইট

from datetime import*
def f(k):g=[*map(int,k.split('-'))];n=g[2];return f"{date(*g):%-d{'tsnrhtdd'[n%5*(n^15>4>n%10)::4]} %B %Y}"

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


3
%-d%dআপনি এর পরিবর্তে আপনার স্ট্রিং ফর্ম্যাটিংয়ে ব্যবহার করতে পারেন এমন কোনও নো-প্যাডিং সংস্করণ {g[2]}। এছাড়াও, 12হওয়া উচিত 12th, 12nd(10-19 থেকে সংখ্যাগুলি 1-9 এবং 20+ এর মতো একই বিধিগুলি অনুসরণ করে না)
মূল্য কালি

1
+1 টি। fস্ট্রিং সম্পর্কে জানতেন না
ফিলিপ নারদী বাটিস্তা

@ ভ্যালিউইঙ্ক ধন্যবাদ! এছাড়াও, অধ্যাদেশ সংক্রান্ত সমস্যাটি স্থির করে
উরিল

5

জাভাস্ক্রিপ্ট (ES6), 142 140 বাইট

NaNth Invalid Dateঅবৈধ তারিখের ফলাফল

অর্ডিনাল সংখ্যার কোডটি এই উত্তর থেকে অভিযোজিত হয়েছিল ।

d=>`${s=(D=new Date(d)).getDate()+''}${[,'st','nd','rd'][s.match`1?.$`]||'th'} `+D.toLocaleDateString('en-GB',{month:'long',year:'numeric'})


1
ক্রোমে 2011-2-29 এর জন্য "1 লা মার্চ 2011" দেয়। এটি একটি কঠিন সমাধান হতে পারে।
রিক হিচকক

5

পাইথন 3.6 , 154 বাইট

from datetime import*
s=[*map(int,input().split('-'))]
b=s[2]
print(date(*s).strftime(f"%-d{'th'if(3<b<21)+(23<b<31)else('st','nd','rd')[b%10-1]} %B %Y"))

এটি অনলাইন চেষ্টা করুন! (ইনপুট স্ট্রিম সেট করুন এবং তারপরে চালান))

নীচে মন্তব্যকারীদের কাছ থেকে ভাল পরামর্শ ধন্যবাদ।


আপনি আপনার তালিকার কমপালের মধ্যে int(x)এবং স্থানটি সরিয়ে একটি বাইট সংরক্ষণ করতে পারেন for
খ্রিস্টান ডিন

@ ক্রিশ্চিয়ানডিয়ান ধন্যবাদ, সম্পন্ন!
লুক সাউকজাক

(('st','nd','rd')[b%10-1]if b<4 or 20<b<24 else'th')আপনার বর্তমান শর্তাধীন -3 বাইটের পরিবর্তে।
মূল্য কালি

@ ভালিউইঙ্ক দুঃখজনকভাবে, এটি 31 তম উত্পাদন করবে। এটিকে ভেঙে ফেলার চিন্তা করার অন্য উপায়টি ছিল 'থ' তবে 0 <বি% 10 <4 বা 10 <বি <14 না হলেও এটি কোনও বাইট সংরক্ষণ করতে পারেনি।
লুক সাউকজাক

সেক্ষেত্রে আপত্তিজনক প্রকারের জালিয়াতি। (3<b<21)+(23<b<31)-1 বাইট জন্য। এটি অনলাইন চেষ্টা করুন!
মূল্য কালি

5

পিএইচপি, 87 বাইট

<?=checkdate(($a=explode("-",$argn))[1],$a[2],$a[0])?date("jS F Y",strtotime($argn)):E;

পাইপ হিসাবে চালান -Fবা এটি অনলাইনে পরীক্ষা করুন । সর্বদা 4 অঙ্কের বছর প্রিন্ট করে; বছরের জন্য ব্যর্থ> 9999।

কোন বৈধতা পরীক্ষা, 35 বাইট:

<?=date("jS F Y",strtotime($argn));

5

বাশ + কোর্টিলস, 115 78

  • 2 বাইট সংরক্ষণ করেছেন @ মান্যাটওয়ার্ককে ধন্যবাদ।
d="date -d$1 +%-e"
t=`$d`
f=thstndrd
$d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"

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


1
মনে হচ্ছে যে অ্যারের পরিবর্তে স্ট্রিং ব্যবহার করে একটি বিট সাহায্য করবে: f=thstndrd; $d"${f:t/10-1?t%10<4?t%10*2:0:0:2} %B %Y"
manatwork

1
বিটিডাব্লু, আপনার সংশোধনী 1 বাশ টিপকে অনুপ্রাণিত করেছে । ;)
manatwork

@ মান্যাটওয়ার্ক হ্যাঁ - এটি মজার - আমি এটি চেষ্টা করার বিষয়টি বিবেচনা করেছি তবে ভাবেনি যে এটি সাহায্য করবে। ধাক্কার জন্য ধন্যবাদ।
ডিজিটাল ট্রমা

4

সি #, 147 143 বাইট

s=>{var t=System.DateTime.Parse(s);int d=t.Day,o=d%10;return d+((d/10)%10==1?"th":o==1?"st":o==2?"nd":o==3?"rd":"th")+t.ToString(" MMMM yyy");}

@ দ্য_লোন_ড্যাভিলকে ধন্যবাদ 4 টি বাইট সংরক্ষণ করা হয়েছে


আপনি দ্বিতীয় না প্রতিস্থাপন করতে পারে t.Dayসঙ্গে dএকটি 4 বাইট সংরক্ষণ জন্য?
The_Lone_Divil

@ দ্য_লোন_ড্যাভিল অবশ্যই আমি ধন্যবাদ জানাতে পারি, কীভাবে আমি এটি মিস করেছি জানি না।
TheLethalCoder

4

এমআইআরসি সংস্করণ 7.49 (197 বাইট)

//tokenize 45 2-2-2 | say $iif($3 isnum 1- $iif($2 = 2,$iif(4 // $1 && 25 \\ $1||16//$1,29,28),$iif($or($2,6) isin 615,30,31))&&$2 isnum1-12&&1//$1,$asctime($ctime($+($1,-,$2,-,$3)date), doo mmmm yyyy))

3

রুবি , 104 103 102 + 8 = 112 111 110 বাইট

Uses -rdate -p program flags.

-1 byte from manatwork.

sub(/.*-(\d*)/){Date.parse($&).strftime"%-d#{d=eval$1;(d<4||d>20)&&"..stndrd"[d%10*2,2]||:th} %B %-Y"}

Try it online!


আপনি টার্নারি অপারেটর ব্যবহার না করায় আমি কি কোনও কারণ অনুভব করছি? d<4||d>20?"..stndrd"[d%10*2,2]:"th"
manatwork

@ মান্যাট ওয়ার্কের মতো একটি সংখ্যা অনুসন্ধানের স্ট্রিংয়ের 26সূচকগুলি অ্যাক্সেস করার চেষ্টা করবে 12..13যা সীমার বাইরে নয় এবং এভাবে ফিরে আসে nil। এইভাবে টের্নারি ব্যবহার করে এটি তৈরি হয় d<4||d>20?"..stndrd"[d%10*2,2]||"th":"th", যা 2 বাইট দ্বারা দীর্ঘ হয়।
মূল্য কালি

আহ আমি দেখি. ভাল, তারপরে দুর্দান্ত কৌশল @ ভ্যালিউইঙ্ক k
manatwork

প্রায় ভুলে গেছি, একটি ক্ষুদ্র পরিবর্তন: "th":th
manatwork

2

সি # (.নেট কোর) , 167 197 বাইট

s=>s.Equals(DateTime.MinValue)?"":s.Day+((s.Day%10==1&s.Day!=11)?"st":(s.Day%10==2&s.Day!=12)?"nd":(s.Day%10==3&s.Day!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year

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

+30 bytes for

using System;

DateTime.Parse()


You can reverse the ternary check to get rid of the ! for -1 byte. And you can change the && to & for -3 bytes. Also, since you use s.Day 7 times it saves some bytes to create a temp value for it: s=>{var t=s.Day;return s.Equals(DateTime.MinValue)?"":t+((t%10==1&t!=11)?"st":(t%10==2&t!=12)?"nd":(t%10==3&t!=13)?"rd":"th")+" "+s.ToString("MMMM")+" "+s.Year;}
Kevin Cruijssen

@KevinCruijssen Thanks!
kakkarot

You also need to include using System; or fully qualify the DateTime object.
TheLethalCoder

Also DateTime.MinValue is 1-1-1 so I don't think you need that check. Which would also make my previous point irrelevant.
TheLethalCoder

1
Taking input as a DateTime and parsing outside of the method isn't acceptable you should do all the work inside the method. Or add an extra method to split work off.
TheLethalCoder

2

Excel, 212 bytes

=ABS(RIGHT(A1,2))&IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th"))&TEXT(MID(A1,FIND("-",A1)+1,FIND("-",REPLACE(A1,1,FIND("-",A1),""))-1)*30," mmmm ")&LEFT(A1,FIND("-",A1)-1)

If you break it into chunks at every ampersand, you get these pieces:

  • ABS() pulls the day number from the last two characters in the string. Since that may include a hyphen, ABS converts it to positive.
  • IF((ABS-12)<2,"th",SWITCH()) adds the ordinal. The -12 bit is because 11, 12, and 13 don't follow the normal rule and they all get th instead of st, nd, and rd. This corrects for that.
    • Note: The SWITCH function is only available in Excel 2016 and later. (Source) It's shorter than CHOOSE in this case because it can return a value if no match is found whereas CHOOSE requires numeric input and must have a corresponding return for each possible value.
  • TEXT(MID()*30," mmmm ") extracts the month name. MID() pulls out the month number as a string and multiplying by 30 returns a number. Excel sees that number as a date (1900-01-30, 1900-02-29, 1900-03-30, etc.) and TEXT() formats it as a month name with a space on both ends. 28 and 29 would have also works but 30 looks "nicer".
  • LEFT() extracts the year number.

Now, given all that, it would have been way easier if the test cases were all in a date range that Excel can handle as an actual date: 1900-01-01 to 9999-12-31. The big advantage is that the entire date is formatted at once. That solution is 133 bytes:

=TEXT(DATEVALUE(A1),"d""" & IF(ABS(ABS(RIGHT(A1,2))-12)<2,"th",SWITCH(RIGHT(A1,1),"1","st","2","nd","3","rd","th")) & """ mmmm yyyy")

The other big hurdle was having to include the ordinal. Without that, the solution is just 34 bytes:

=TEXT(DATEVALUE(A1),"d mmmm yyyy")

1

Swift 3 : 298 bytes

let d=DateFormatter()
d.dateFormat="yyyy-MM-dd"
if let m=d.date(from:"1999-10-3"){let n=NumberFormatter()
n.numberStyle = .ordinal
let s=n.string(from:NSNumber(value:Calendar.current.component(.day, from:m)))
d.dateFormat="MMMM YYY"
print("\(s!) \(d.string(from:m))")}else{print("(error/invalid)")}

Try it online!


8
সাইটে স্বাগতম! এখানে লক্ষ্যটি কোডটি যতটা সম্ভব সংক্ষিপ্ত করা, আমি দেখতে পাচ্ছি আপনার দীর্ঘ পরিবর্তনশীল নাম এবং প্রচুর হোয়াইটস্পেস রয়েছে, আপনি প্রচুর বাইট সংরক্ষণ করতে এগুলি সংক্ষিপ্ত করে মুছতে পারেন। আমরা সাধারণত আকারে উত্তর শীর্ষে একটি শিরোনাম অন্তর্ভুক্ত # Language, N bytes। আপনি যদি এটির সাথে যুক্ত করতে পারেন তবে ভাল হবে।
TheLethalCoder

1

T-SQL, 194 bytes

DECLARE @ DATE;SELECT @=PARSE('00'+i AS DATE)FROM t;PRINT DATENAME(d,@)+CASE WHEN DAY(@)IN(1,21,31)THEN'st'WHEN DAY(@)IN(2,22)THEN'nd'WHEN DAY(@)IN(3,23)THEN'rd'ELSE'th'END+FORMAT(@,' MMMM yyy')

ইনপুট পাঠ্য কলাম মারফত আমি পূর্ব বিদ্যমান সারণিতে টি , আমাদের আই মান অনুযায়ী

জানুয়ারী 1, 0001 থেকে 31 ডিসেম্বর, 9999 এর তারিখগুলির জন্য কাজ করে year বছরটি কমপক্ষে 3 টি সংখ্যার (প্রতি 150AD উদাহরণ হিসাবে) আউটপুট।

অবৈধ তারিখগুলি নিম্নলিখিত কুৎসিত ত্রুটির ফলে আসবে:

Error converting string value 'foo' into data type date using culture ''.

বিভিন্ন ডিফল্ট ভাষা / সংস্কৃতি সেটিংস এই আচরণটি পরিবর্তন করতে পারে। আপনি যদি একটি সামান্য বেশি সুতনু ত্রুটি আউটপুট (শূন্য) চান, পরিবর্তন করে 4 বাইট যোগ PARSE()করার TRY_PARSE()

ফর্ম্যাট এবং ব্যাখ্যা:

DECLARE @ DATE;
SELECT @=PARSE('00'+i AS DATE)FROM t;
PRINT DATENAME(d,@) + 
    CASE WHEN DAY(@) IN (1,21,31) THEN 'st'
         WHEN DAY(@) IN (2,22)    THEN 'nd'
         WHEN DAY(@) IN (3,23)    THEN 'rd'
         ELSE 'th' END
    + FORMAT(@, ' MMMM yyy')

DATEএসকিউএল 2008 সালে চালু ডাটা টাইপ তুলনায় অনেক বৃহত্তর পরিসর পারবেন DATETIME1 জানুয়ারি, 0001 থেকে ডিসেম্বর 31, 9999 চাপ দিতে থাকেন।

কিছু প্রথম দিকের তারিখগুলি আমার মার্কিন অঞ্চলের সেটিংসের সাথে ভুলভাবে বিভক্ত হতে পারে ("01-02-03" "2 জানুয়ারী 2003" হয়ে যায়), তাই আমি কয়েকটা অতিরিক্ত শূন্যকে প্রাক-পেন্ডিং করেছিলাম যাতে এটি জানে যে প্রথম মানটি বছর।

তার পরে, CASEএটি দিনটিতে অর্ডিনাল প্রত্যয় যুক্ত করার জন্য কেবল একটি অগোছালো বিবৃতি। বিরক্তিকরভাবে, এসকিউএল FORMATকমান্ডের স্বয়ংক্রিয়ভাবে এটি করার কোনও উপায় নেই।


1

কিউ / কেডিবি + 210 বাইট, প্রতিযোগিতামূলক

সমাধান:

f:{a:"I"$"-"vs x;if[(12<a 1)|31<d:a 2;:0];" "sv(raze($)d,$[d in 1 21 31;`st;d in 2 22;`nd;d in 3 23;`rd;`th];$:[``January`February`March`April`May`June`July`August`September`October`November`December]a 1;($)a 0)};

উদাহরণ:

q)f "2017-08-03"
"3rd August 2017"
q)f "1980-05-12"
"12th May 1980"
q)f "2005-12-3"
"3rd December 2005"
q)f "150-4-21" 
"21st April 150"
q)f "2011-2-29"       / yes it's wrong :(
"29th February 2011"
q)f "1999-10-35"
0

ব্যাখ্যা:

তারিখ বিন্যাসকরণ না থাকায় এটি একটি ভয়ঙ্কর চ্যালেঞ্জ, সুতরাং আমাকে স্ক্র্যাচ (95 বাইট) থেকে প্রত্যয় তৈরির পাশাপাশি কয়েক মাস তৈরি করতে হবে।

নিখরচায় সমাধানটি নীচে, মূলত ইনপুট স্ট্রিংটিকে বিভক্ত করুন এবং তারপরে আমরা প্রত্যয় যুক্ত করে এবং মাসটি সরিয়ে ফেলার পরে একসাথে ফিরে আসুন।

f:{
   // split input on "-", cast to integers, save as variable a
   a:"I"$ "-" vs x;
   // if a[1] (month) > 12 or a[2] (day) > 31 return 0; note: save day in variable d for later
   if[(12<a 1) | 31<d:a 2;
     :0];
   // joins the list on " " (like " ".join(...) in python)
   " " sv (
           // the day with suffix
           raze string d,$[d in 1 21 31;`st;d in 2 22;`nd;d in 3 23;`rd;`th];
           // index into a of months, start with 0 as null, to mimic 1-indexing
           string[``January`February`March`April`May`June`July`August`September`October`November`December]a 1;
           // the year cast back to a string (removes any leading zeroes)
           string a 0)
  };

মন্তব্য:

Q এ তারিখগুলি কেবল 1709 ডলারে ফিরে যায় সুতরাং তারিখটি যাচাই করার মতো তুচ্ছ উপায় আমার কাছে নেই, সুতরাং এটি একটি প্রতিদ্বন্দ্বিতাযোগ্য প্রবেশিকা ... আমি সবচেয়ে ভাল করতে পারি যে দিনটি> 31 বা মাসটি কিনা তা যাচাই করা উচিত > 12 এবং 0 এ ফিরে আসুন।

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