কবল ওয়াই 2 কে রিডেক্স


36

1990 সালে, ব্যবসায়িক কাজে ব্যবহৃত এক বিশেষ ধরনের কম্পিউটার ভাষা কম্পিউটার ইঞ্জিনিয়ারদের তাদের রূপান্তর দ্বারা ছয় অঙ্কের তারিখ ক্ষেত্র প্রসারিত একটি উপায় কাজ YYYDDDযেখানে YYYহয় year - 1900এবং DDDবছরের দিন [001 to 366]। এই স্কিমটি সর্বোচ্চ তারিখ বাড়িয়ে দিতে পারে 2899-12-31

২৮৯৮ সালে ইঞ্জিনিয়াররা আতঙ্কিত হওয়া শুরু করেছিলেন কারণ তাদের ৯০০ বছরের পুরানো কোড বেসগুলি ব্যর্থ হতে চলেছে। 2898 সাল থেকে, তারা কেবলমাত্র তাদের টাইম মেশিনটি এই অ্যালগরিদম এবং এটি যথাসময়ে ব্যাপকভাবে বাস্তবায়নের কাজটি দিয়ে 1998 সালে একক কোডিনেটর প্রেরণের জন্য ব্যবহার করেছিল:

এমন কোনও স্কিম ব্যবহার করুন PPQQRRযেখানে তা যদি 1900 এর দশকের 01 ≤ QQ ≤ 12মানক YYMMDDতারিখ হয় তবে তবে যদি QQ > 12এটি 2000-01-01100 বেসের জন্য PPএবং RRতবে 87 এর জন্য বেসগুলিতে প্রদর্শিত হয় QQ - 13

এই স্কিমটি ২৮৯৯ সাল ছাড়িয়ে অনেক বেশি প্রসারিত এবং মানক তারিখগুলির সাথে পিছনেও সামঞ্জস্যপূর্ণ, সুতরাং বিদ্যমান সংরক্ষণাগারগুলির কোনও সংশোধন করার প্রয়োজন নেই।

কিছু উদাহরণ:

PPQQRR  YYYY-MM-DD
000101  1900-01-01  -- minimum conventional date suggested by J. Allen
010101  1901-01-01  -- edge case suggested by J. Allen
681231  1968-12-31  -- as above
991231  1999-12-31  -- maximum conventional date
001300  2000-01-01  -- zero days after 2000-01-01
008059  2018-07-04  -- current date
378118  2899-12-31  -- maximum date using YYYDDD scheme
999999  4381-12-23  -- maximum date using PPQQRR scheme

আপনার চ্যালেঞ্জটি হ'ল PPQQRRকোনও আইএসও তারিখ হিসাবে ইনপুট এবং আউটপুট হিসাবে গ্রহণ করার জন্য একটি প্রোগ্রাম লিখুন বা ফাংশন YYYY-MM-DD। ইনপুট পদ্ধতিটি প্যারামিটার, কনসোল বা কমান্ড লাইন হতে পারে, যা সহজ।

আপনার চিত্তবিনোদনের জন্য, এখানে সিওবিএল-85 এ একটি নন-কেপটিং সমাধান রয়েছে:

IDENTIFICATION DIVISION.
    PROGRAM-ID. DATE-CONVERSION.
DATA DIVISION.
    WORKING-STORAGE SECTION.
    01 T PIC 9(8).
    01 U PIC 9(8).
    01 D VALUE '999999'. 
        05 P PIC 9(2).
        05 Q PIC 9(2).
        05 R PIC 9(2).
    01 F.
        05 Y PIC 9(4).
        05 M PIC 9(2).
        05 D PIC 9(2).
PROCEDURE DIVISION.
    IF Q OF D > 12 THEN
        MOVE FUNCTION INTEGER-OF-DATE(20000101) TO T
        COMPUTE U = R OF D + 100 * ((Q OF D - 13) + 87 * P OF D) + T
        MOVE FUNCTION DATE-OF-INTEGER(U) TO F
        DISPLAY "Date: " Y OF F "-" M OF F "-" D OF F
    ELSE
        DISPLAY "Date: 19" P OF D "-" Q OF D "-" R OF D 
    END-IF.
STOP RUN.

4
"তবে আপনি যদি এড়াতে পারেন তবে সিওবিএলে প্রোগ্রাম করবেন না" " - প্রোগ্রামিং এর টাও
tsh


1
@ ব্যবহারকারী202729 কারণ yymmddবছরের >=2000পর বছর ধরে কাজ করে না, এটিই ওয়াই 2 কে পরাজয়ের পুরো পয়েন্ট।
জেএডি

2
@ অ্যাডাম - কোবোলের চেতনায় যা খুব উদ্বেগজনক আই / ও, আমি বলতে হবে এটি আইএসও yyyy-mm-ddফর্ম্যাটে থাকা দরকার।

4
@ জিউসেপ - কোবোলের চেতনায় যা সত্যই স্ট্রিং এবং সংখ্যাকে আলাদা করে না, হ্যাঁ! প্রদত্ত আপনি নেতৃস্থানীয় শূন্যগুলি ইনপুট করতে পারেন, যেমন 001300

উত্তর:


5

টি-এসকিউএল, 99 98 বাইট

SELECT CONVERT(DATE,IIF(ISDATE(i)=1,'19'+i,
       DATEADD(d,8700*LEFT(i,2)+RIGHT(i,4)-935,'1999')))FROM t

লাইন বিরতি কেবল পঠনযোগ্যতার জন্য। অন্তর্নিহিত ingালাইয়ের জন্য শুভতা ধন্যবাদ।

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

নিম্নলিখিত পদক্ষেপগুলি অতিক্রম করে:

  1. প্রাথমিক চেক এসকিউএল ফাংশনের মাধ্যমে হয় ISDATE()। (ভাষা সেটিংসের উপর ভিত্তি করে এই ফাংশনের আচরণটি পরিবর্তিত হয়, এটি আমার english-usসার্ভারে প্রত্যাশা অনুযায়ী কাজ করে )। এটি কেবলমাত্র বৈধতার জন্য যাচাই করার জন্য এটি পরীক্ষা করুন, যদি আমরা এটি সরাসরি পার্স করার চেষ্টা করি তবে এটি 2501011925-01-01 নয়, 2025-01-01 হিসাবে মানচিত্র তৈরি করবে ।
  2. যদি স্ট্রিংটি একটি তারিখ হিসাবে সঠিকভাবে 19বিশ্লেষণ করে তবে সামনের দিকে টেক করুন (সার্ভার-স্তরীয় বছর কাটফর্ম সেটিং পরিবর্তন করার পরিবর্তে)। চূড়ান্ত তারিখ রূপান্তর শেষে আসবে।
  3. স্ট্রিং যদি তারিখ হিসাবে বিশ্লেষণ না করে তবে পরিবর্তে এটি একটি সংখ্যায় রূপান্তর করুন। আমি যে সংক্ষিপ্ততম গণিতটি খুঁজে পেতে পারি তা হ'ল 8700*PP + QQRR - 1300এটি (খুব দীর্ঘ) এসকিউএল SUBSTRING()ফাংশনটিকে এড়িয়ে চলে । এই গণিতটি প্রদত্ত নমুনাগুলি পরীক্ষা করে দেখায়, আমি নিশ্চিত যে এটি ঠিক।
  4. এতে DATEADDঅনেক দিন যুক্ত করতে ব্যবহার করুন 2000-01-01, যা সংক্ষিপ্ত করা যেতে পারে 2000
  5. চূড়ান্ত ফলাফলটি নিন (হয় পদক্ষেপ 2 থেকে একটি স্ট্রিং, বা 4 ধাপ থেকে DATETIME), এবং CONVERT()এটি খাঁটি হয়ে উঠবে DATE

আমি এক পর্যায়ে মনে হয়েছিলো আমি সমস্যাযুক্ত তারিখ পাওয়া যায়নি: 000229। এটি কেবলমাত্র তারিখ parses হয় ভিন্নভাবে 19xx বনাম 20xx জন্য (2000 সাল থেকে অধিবর্ষ ছিল, কিন্তু 1900 কারণে ছিল না অদ্ভুত লিপ বছর ব্যতিক্রম )। যে কারণে, যদিও 000229এটি একটি বৈধ ইনপুটও নয় (যেহেতু, হিসাবে বলা হয়েছে, 1900 একটি লিপ বছর ছিল না), তাই তার জন্য হিসাব করতে হবে না।


ভাল জিনিস. এটি খুব খারাপ ISDATEযে কোনও বুলিয়ান ফেরত দেয় না, বা পূর্ণসংখ্যাকে সুস্পষ্টভাবে বুলেয়ানে রূপান্তর করা যায় না IIFঅন্যথায় আপনি দুটি বাইট সংরক্ষণ করতে পারেন।

@ ইয়িমিনরং ইয়েপ, এসকিউএল-তে অন্তর্নিহিত castালাই খুব ট্রায়াল-অ্যান্ড-ত্রুটি এবং কিছু ফাংশনে ভিন্নভাবে কাজ করে যা অন্যথায় খুব মিল similar আমি ভাগ্যবান আমি আমার LEFT()এবং RIGHT()ফাংশন ফলাফলগুলি পূর্ণসংখ্যায় তাদের সংখ্যাবৃদ্ধির আগে স্পষ্ট করে বলতে হয়নি , যা সত্যিই আমার বাইট
গণনাটিতে গোলমেলে হত

1
আমার মনে হয় আপনি প্রতিস্থাপন একটি অতিরিক্ত চরিত্র অপসারণ করতে পারেন -1300,'2000'সঙ্গে -935,'1999'
রাজ্জান সোসোল

দুর্দান্ত ধারণা, @ রেজওয়ানসোকল। আমি ৩5৫ দিনের আরও বহুগুণ ফিরে যাওয়ার চেষ্টা করেছি, তবে দুর্ভাগ্যক্রমে এর চেয়ে ছোট কিছু খুঁজে পাইনি।
ব্র্যাডিসি

5

আর , 126 বাইট

function(x,a=x%/%100^(2:0)%%100,d=as.Date)'if'(a[2]<13,d(paste(19e6+x),'%Y%m%d'),d(a[3]+100*((a[2]-13)+87*a[1]),'2000-01-01'))

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

  • -5 বাইটস স্ট্রিংয়ের পরিবর্তে একটি সংখ্যার ইনপুট নেওয়ার জন্য @ জিউজ্পে পরামর্শকে ধন্যবাদ জানায়

4
প্রথম 1969 (যেমন 000101বা 681231) এর আগে জানুয়ারীর আগে তারিখগুলির প্রতিনিধিত্বকারী ইনপুটগুলির ব্যর্থতা
জোনাথন অ্যালান

2
@ জোনাথন অ্যালান: ভাল দাগ, ধন্যবাদ। এখন এটি স্থির করা উচিত (দুর্ভাগ্যক্রমে আরও 5 টি বাইটের প্রয়োজন ...)
digEmAll

4

জাভাস্ক্রিপ্ট (স্পাইডারমনকি) , 103 বাইট

s=>new Date(...([a,b,c]=s.match(/../g),b>12?[2e3,0,(b-13+a*87)*100-~c]:[a,b-1,c])).toJSON().split`T`[0]

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


.toJSONকোনও ইউটিসি + এক্স টাইমজোনে ব্যর্থ হবে। এই কোডটি কাজ করে তবে লম্বা (+ 11 বাইটস):

s=>Intl.DateTimeFormat`ii`.format(new Date(...([a,b,c]=s.match(/../g),b>12?[2e3,0,(b-13+a*87)*100-~c]:[a,b-1,c])))

এর সাহায্যে 13 টি বাইট সংরক্ষণ করতে পারবেন .toJSON()
আর্নল্ড

এবং আপনি ইনপুট স্ট্রিংকে তিনটি 2-চর সাবস্ট্রিংয়ে বিভক্ত করে আরও 9 টি বাইট সংরক্ষণ করতে পারেন ।
আর্নল্ড

@ আরনল্ড আমি মূলত আমার মেশিনে এটি চেষ্টা করছিলাম। আমার টাইমজোনটি ইউটিসি +8 হওয়ায় এটি কার্যকর হয় না। তবে এটি কমপক্ষে টিআইওতে কাজ করে।
tsh

যেহেতু আমরা ভাষাগুলি তাদের প্রয়োগের মাধ্যমে সংজ্ঞায়িত করি (এখানে 'টিওওতে চলছে নোড.জেস'), এটি কি সত্যই অবৈধ?
আর্নল্ড

বুলেট-প্রুফ সংস্করণের জন্য, আপনি 1 বাইট সংরক্ষণ করার জন্য এটি করতে পারেন ।
আর্নল্ড


2

এবিএপি, 173 171 বাইট

আউটপুটটিকে আরও অনুকূলিত করে 2 বাইট সংরক্ষণ করা হয়েছে

কিংবদন্তি অনুসারে, একবিংশ শতাব্দীর গোড়ার দিকে একজন এসএপি গ্রাহক একবার বলেছিলেন:

সম্পূর্ণ ধ্বংসের পরমাণু যুদ্ধের পরে, বাকি একটি জিনিস হ'ল এসএপজিইউআই।

সে সঠিক ছিল. আজ, 2980-এ, আর কোনও সি ++ নেই, আর কোনও সিওবিওএল নেই। যুদ্ধের পরে প্রত্যেককে তাদের কোড এসএপি এএপএজে নতুন করে লিখতে হয়েছিল। ২৮০০ এর সিওবিএল প্রোগ্রামের বাম অংশগুলিতে পিছনের দিকে সামঞ্জস্যতা সরবরাহ করতে, আমাদের বিজ্ঞানীরা এএএপিএপ-এর সাবরুটিন হিসাবে এটি পুনর্নির্মাণ করেছেন।

FORM x USING s.DATA d TYPE d.IF s+2 < 1300.d ='19'&& s.ELSE.d ='20000101'.d = d + s+4 + 100 * ( ( s+2(2) - 13 ) + 87 * s(2) ).ENDIF.WRITE:d(4),d+4,9 d+6,8'-',5'-'.ENDFORM.

এটি এই জাতীয় প্রোগ্রাম দ্বারা কল করা যেতে পারে:

REPORT z.
  PARAMETERS date(6) TYPE c. "Text input parameter
  PERFORM x USING date.      "Calls the subroutine

আমার কোড ব্যাখ্যা:

FORM x USING s.     "Subroutine with input s
  DATA d TYPE d.    "Declare a date variable (internal format: YYYYMMDD)
  IF s+2 < 1300.    "If substring s from index 2 to end is less than 1300
    d ='19'&& s.    "the date is 19YYMMDD
  ELSE.             "a date past 2000
    d ='20000101'.  "Initial d = 2000 01 01 (yyyy mm dd)

    "The true magic. Uses ABAPs implicit chars to number cast
    "and the ability to add days to a date by simple addition.
    "Using PPQQRR as input:
    " s+4 = RR, s+2(2) = QQ, s(2) = PP
    d = d + s+4 + 100 * ( ( s+2(2) - 13 ) + 87 * s(2) ).
  ENDIF.
    "Make it an ISO date by splitting, concatenating and positioning the substrings of our date.
    WRITE:             "Explanation:
      d(4),            "d(4) = YYYY portion. WRITE adds a space after each parameter, so...
      5 '-' && d+4,    "place dash at absolute position 5. Concatenate '-' with MMDD...
      8 '-' && d+6.    "place dash at absolute position 8, overwriting DD. Concatenate with DD again.
ENDFORM.

ABAP- র তারিখের প্রকারটি ব্যবহার করার সময় ডিডিএমওয়াইওয়াইওয়াই হিসাবে ফরম্যাট করার জন্য একটি অদ্ভুত সম্পত্তি রয়েছে WRITE- অভ্যন্তরীণ বিন্যাসটি ওয়াইওয়াইওয়াইএমডিডি হওয়া সত্ত্বেও লোকাল নির্ভর হতে পারে। তবে যখন আমরা কোনও সাবস্ট্রিং সিলেক্টর ব্যবহার করি তখন d(4)এটি অভ্যন্তরীণ বিন্যাসের প্রথম 4 টি অক্ষর নির্বাচন করে , তাই আমাদের ওয়াইওয়াই দেয় giving

আপডেট : ব্যাখ্যাটিতে আউটপুট বিন্যাস এখন পুরানো, আমি গল্ফযুক্ত সংস্করণে এটি 2 বাইট দ্বারা অনুকূলিত করেছি:

WRITE:  "Write to screen, example for 2000-10-29
 d(4),   "YYYY[space]                =>  2000
 d+4,    "MMDD[space]                =>  2000 1029
 9 d+6,  "Overwrites at position 9   =>  2000 10229
 8'-',   "Place dash at position 8   =>  2000 10-29
 5'-'.   "Place dash at position 5   =>  2000-10-29

চমৎকার, আমি এটি পছন্দ করি। এখন আমাদের যা দরকার তা হ'ল একটি সংস্করণ MUMPSএবং আমরা কিছুতেই বাঁচব!

1
@ ইয়িমিনরং ধন্যবাদ! আপনার সিওবিএল ভিত্তিক প্রশ্নটি মূলত এরকম কিছু চেয়েছিল, আমার কোনও বিকল্প ছিল না।
মাজ

1

কোটলিন , 222 বাইট

49 বাইট সংরক্ষণের জন্য হার্ড কোডিং ক্যালেন্ডার ফিল্ডের নাম স্থির করে।

{d:Int->val p=d/10000
val q=d/100%100
val r=d%100
if(q<13)"19%02d-%02d-%02d".format(p,q,r)
else{val c=Calendar.getInstance()
c.set(2000,0,1)
c.add(5,(p*87+q-13)*100+r)
"%4d-%02d-%02d".format(c.get(1),c.get(2)+1,c.get(5))}}

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

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