মানব পাঠযোগ্য সময়ের ব্যবধানকে তারিখের উপাদানগুলিতে রূপান্তর করুন


16

চ্যালেঞ্জ

সংক্ষিপ্ততম প্রোগ্রামটি লিখুন যা কোনও ফর্মের তারিখের উপাদানগুলিতে একটি মানব পাঠযোগ্য সময়ের ব্যবধানকে রূপান্তর করে:

{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}

নমুনা মামলা

প্রতিটি পরীক্ষার কেস দুটি লাইন হয়, আউটপুট পরে ইনপুট:

1 year 2 months 3 seconds
{1|2|0|0|0|3}

-2 day 5 year 8months
{5|8|-2|0|0|0}

3day 9     years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}

বিধি

  • আপনি ব্যবহার করতে পারবেন না strtotimeবা কোনও সম্পূর্ণ অন্তর্নির্মিত ফাংশন যা পুরো কাজটি করে।
  • সংক্ষিপ্ততম কোড জয় (বাইট)
  • আপনি আপনার আউটপুট stdoutবা একটি ফাইল মুদ্রণ করতে পারেন , ফলাফলটি কোনও ফাংশন দ্বারাও ফিরে আসতে পারে, এটি আপনার উপর নির্ভর করে
  • টোকেন একক বা বহুবচন আকারে হতে পারে।
  • উপাদানগুলি এলোমেলো ক্রমে থাকতে পারে
  • সংখ্যা এবং টোকেনের মধ্যে কোনও সাদা জায়গা নাও থাকতে পারে
  • সময় ব্যবধানটি ইতিবাচক (ইনপুট এবং আউটপুট) হলে সাইন optionচ্ছিক
  • যদি কোনও উপাদান একাধিকবার উপস্থিত হয় তবে মানগুলি যুক্ত করা উচিত
  • প্রতিটি উপাদান নিজস্ব স্বাক্ষর আছে
  • উপাদানগুলি পৃথকভাবে পরিচালনা করা উচিত (উদাহরণস্বরূপ 80 minutesআউটপুটে 80 হিসাবে রয়ে যায়)
  • ইনপুটটি ছোট কেস হিসাবে গ্যারান্টিযুক্ত

শুভ গল্ফিং!


2
আমি এই চ্যালেঞ্জটি পছন্দ করি তবে কোড গল্ফের জন্য অসুস্থ নয় এমন ভাষাগুলিতে দীর্ঘ এবং অগোছালো নয় এমন কিছু নিয়ে আসতে আমার খুব কষ্ট হচ্ছে। : /
অ্যালেক্স এ।

আউটপুট ফর্ম্যাট ব্যাপার?
তিতাস

Sign is optional when the time interval is positiveএর অর্থ কি ইনপুটটিতে +চিহ্ন থাকতে পারে ?
তিতাস

উত্তর:


3

সিজেম, 60 বাইট

60 এর দশকে দীর্ঘ সময় আটকে যাওয়ার পরে অবশেষে আমি এটি 60 বাইটে চেপে ধরতে পেরেছি। যথেষ্ট! শিপ!

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

Squished:

'{0a6*q[{_A,s'-+#)!{"ytdhic"#:I){]'0+iA/I_3$=@+t[}*}*}/'|*'}

সম্প্রসারিত এবং মন্তব্য করা হয়েছে:

'{              "Add '{' to output";
0a6*            "Initialize time to a list of 6 zeros";
q               "Read the input";
[               "Open an empty numeric character buffer";
{               "For each character in the input:";
  _               "Append the character to the numeric character buffer";
  A,s'-+#)!       "Check if the character is not part of a number";
  {               "If so:";
    "ytdhic"#:I     "Remove the character from the numeric character buffer and
                     convert it to the corresponding time unit index, or -1 if
                     not recognized
                     (Time units are recognized by a character in their name
                     that does not appear before the recognition character
                     in any other name)";
    ){              "Repeat (time unit index + 1) times:";
      ]'0+iA/         "Close the numeric character buffer and parse it as an
                       integer (empty buffer is parsed as 0)";
      I_3$=@+t        "Add the integer to the value of the indexed time unit";
      [               "Open an empty numeric character buffer";
    }*              "End repeat
                     (This is used like an if statement, taking advantage of
                     the fact that iterations after the first have no effect)";
  }*              "End if";
}/              "End for";
'|*             "Insert a '|' between each time unit value (implicitly added to
                 output)";
'}              "Add '}' to output";

আমি প্রথমে টোকেন-ভিত্তিক পদ্ধতির ব্যবহার শুরু করেছি, তবে এটি বেশ দৃ by়ভাবে আটকে গিয়েছিল ... 61 বাইটে। দীর্ঘশ্বাস. সুতরাং আমি সম্পূর্ণভাবে গিয়ারগুলি পরিবর্তন করেছি এবং এই চরিত্র-ভিত্তিক পদ্ধতির দিকে সরিয়েছি, যাইহোক এটি আরও বেশি আকর্ষণীয়।

আমার পার্সিং পদ্ধতিটি কোনও বাফারে পৌঁছে যাওয়া কোনও বৈধ সংখ্যাযুক্ত অক্ষর যুক্ত করে ( 0- 9এবং -) যুক্ত করে এবং টাইম ইউনিটের নামগুলির মধ্যে একটির থেকে একটি নির্দিষ্ট অক্ষর পৌঁছলে বাফারটিকে পূর্ণসংখ্যা হিসাবে পার্স করে কাজ করে। ঐ অক্ষর y, t, d, h, i, এবংc, যা সকলেই শর্ত পূরণ করে যে তারা টাইম ইউনিটের নামতে উপস্থিত হয় এবং অন্য কোনও সময়ের ইউনিটের নামে স্বীকৃতি অক্ষরের সামনে উপস্থিত হয় না। অন্য কথায়, যখন এই সময়ের এককের স্বীকৃতি অক্ষরগুলির একটিতে পৌঁছানো হয় তবে এটি সংখ্যার বাফারটি দেখা শেষ সংখ্যার সাথে পূর্ণ হবে যদি এটি আসলে কোনও টাইম ইউনিটের সিগন্যাল দেয়, বা যদি এটি প্রদর্শিত হয় তবে সংখ্যা বাফারটি খালি হবে should টি সিগন্যাল, অন্য কিছু সময় ইউনিট। উভয় ক্ষেত্রেই, সংখ্যার বাফারটি একটি পূর্ণসংখ্যা হিসাবে পার্স করা হয়, বা 0 খালি থাকলে এবং এটি একই সময় ইউনিটের মানতে যুক্ত হয়। সুতরাং স্বীকৃতি অক্ষরের পরে অন্যান্য সময় ইউনিটগুলিতে উপস্থিতি স্বীকৃতি অক্ষরগুলির কোনও প্রভাব নেই।

অন্যান্য ক্রেজি হ্যাকগুলির মধ্যে রয়েছে:

  • লুপগুলি আপত্তিজনকভাবে সংখ্যাযুক্ত অক্ষরগুলি স্ট্যাকের উপর ছেড়ে দেওয়া হয় (যা সংখ্যার চরিত্রের বাফার হিসাবে কাজ করে) "বিনামূল্যে for"
  • শর্তসাপেক্ষীর পরিবর্তে একটি ব্লক শূন্য বা একাধিকবার পুনরাবৃত্তি করা কারণ লুপটি যদি ইফ স্টেটমেন্টের চেয়ে আরও কমপ্যাক্ট হয় এবং প্রথমটির পুনরাবৃত্তির কোনও প্রভাব থাকে না।

আমার টোকেন-ভিত্তিক সমাধান সম্পর্কে কৌতূহলী যারা For১ বাইটে আটকে গেছে, আমি এটি এখানে পোস্ট করব। যদিও আমি এর সম্প্রসারণ বা মন্তব্য করতে পারি নি।

সিজেম, 61 বাইট

'{0a6*q'm-'{,64/~m*{:X/XS**}/S%2/{~0="yodhis"#_3$=@i+t}/'|*'}

+1 এটি অবশ্যই আরও বেশি অগ্রাধিকারের দাবি রাখে।
ওপব্যাস

2
@ ফোরালান07 সমর্থনের জন্য ধন্যবাদ। :) তবে আমি উত্তর দিতে কিছুটা দেরি করেছি, সুতরাং এটি অপ্রত্যাশিত নয়। এই উত্তর উত্পাদন প্রক্রিয়া যাইহোক যথেষ্ট সন্তোষজনক ছিল।
রানার 1112

10

পার্ল: 61 টি অক্ষর

@ নটকি ধন্যবাদ

s/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge

নমুনা রান:

bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '1 year 2 months 3 seconds'
{1|2|0|0|0|3}

bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '-2 day 5 year 8months'
{5|8|-2|0|0|0}

bash-4.3$ perl -pe 's/-?\d+ *m?(.)/$$1+=$&/ge;$_="{y|o|d|h|i|s}";s/\w/${$&}+0/ge' <<< '3day 9     years 4 seconds -5 minute 4 years 4 years -3seconds'
{17|0|3|0|-5|1}

আমার দুর্বল প্রচেষ্টা: 78 77 টি অক্ষর

s/([+-]?\d+) *(..)/$a{$2}+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./$a{$&}||0/ge

1
আমি কিছু উন্নতি পেতে পারি:s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
নটকি

1
আরও 4 টি চর:s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
নটকি

কি দারুন. দুর্দান্ত কৌশল, @ নটকি।
manatwork

1
অন্যান্য সমাধানগুলিতেও পাওয়া যায় (m.|.)- -> m?(.)অতিরিক্ত সাশ্রয় করে
নটকি

ডোহ। এটি এখন চেষ্টা করে যাচ্ছিল। সুতরাং এটি কাজ করে। :)
manatwork

5

রুবি, 119 106 86 85 84 বাইট

একটি বাইট Sp3000 ধন্যবাদ ধন্যবাদ সংরক্ষণ করেছে।

->i{?{+"yodhis".chars.map{|w|s=0;i.scan(/-?\d+(?= *m?#{w})/){|n|s+=n.to_i};s}*?|+?}}

এটি একটি নামবিহীন ফাংশন, যা ইনপুটটিকে স্ট্রিং হিসাবে গ্রহণ করে এবং ফলাফলটি (স্ট্রিং হিসাবেও) প্রদান করে। আপনি এটিকে নির্ধারিত করে f, বলতে এবং এটি পছন্দ করে কল করে পরীক্ষা করতে পারেন

f["3day 9     years 4 seconds -5 minute 4 years 4 years -3seconds"]

5

পাইথন 2, 99 বাইট

import re
f=lambda I:"{%s}"%"|".join(`sum(map(int,re.findall("(-?\d+) *m?"+t,I)))`for t in"yodhis")

এটি একটি ল্যাম্বদা ফাংশন যা একটি স্ট্রিং গ্রহণ করে এবং প্রয়োজনীয় সংখ্যাগুলি বের করার জন্য কেবল একটি রেজেেক্স ব্যবহার করে।

মার্টিনকে ধন্যবাদ জানাতে যে \s*এটি ঠিক হতে পারে <space>*। এটি সহজেই ভুলে যাওয়া সহজ যে রেজিজেসগুলি ফাঁকা জায়গাগুলিকে আক্ষরিক অর্থে ...


4

জাভাস্ক্রিপ্ট 100 105 112

সম্পাদন করাটেমপ্লেট স্ট্রিংগুলি যুক্ত করা (প্রথমবারের মতো ডেস্ক 2014 কার্যকর হয়েছে, এই চ্যালেঞ্জের জন্য তাই বৈধ) - সময়ে আমি তাদের সম্পর্কে অবগত ছিলাম না

ইউরেকা সম্পাদনা করুন , শেষ পর্যন্ত আমি m?অন্য সমস্ত উত্তরগুলির অর্থ পেয়েছি !

s=>s.replace(/(-?\d+) *m?(.)/g,(a,b,c)=>o['yodhis'.search(c)]-=-b,o=[0,0,0,0,0,0])&&`{${o.join`|`}}`

পরীক্ষা

F=
s=>s.replace(/(-?\d+) *m?(.)/g,(a,b,c)=>o['yodhis'.search(c)]-=-b,o=[0,0,0,0,0,0])&&`{${o.join`|`}}`

;['1 year 2 months 3 seconds','-2 day 5 year 8months'
,'3day 9     years 4 seconds -5 minute 4 years 4 years -3seconds']
.forEach(i=>console.log(i,F(i)))


3

আর, 197 বাইট

আমি বুঝতে পারি এটি মোটেও প্রতিযোগিতামূলক এন্ট্রি নয়, আমি বেশিরভাগই কেবল আর-তে একটি সমাধান নিয়ে আসতে চেয়েছিলাম this এটি সংক্ষিপ্ত করা কোনও সহায়তা অবশ্যই স্বাগত।

function(x){s="{";for(c in strsplit("yodhis","")[[1]])s=paste0(s,ifelse(c=="y","","|"),sum(as.numeric(gsub("[^0-9-]","",str_extract_all(x,perl(paste0("(-?\\d+) *m?",c)))[[1]]))));s=paste0(s,"}");s}

মার্টিনের উত্তরের মতো এটিও একটি নামহীন ফাংশন। এটিকে কল করতে, এটি নির্ধারণ করুনf এবং একটি স্ট্রিং পাস করুন।

এটি বেশ জঘন্য, তাই আসুন একটি অ-গল্ফযুক্ত সংস্করণটি দেখে নেওয়া যাক।

function(x) {
    s <- "{"
    for (c in strsplit("yodhis", "")[[1]]) {
        matches <- str_extract_all(x, perl(paste0("(-?\\d+) *m?", c)))[[1]]
        nums <- gsub("[^0-9-]", "", matches)
        y <- sum(as.numeric(nums))
        s <- paste0(s, ifelse(c == "y", "", "|"), y)
    }
    s <- paste0(s, "}")
    return(s)
}

একা কাঠামোর ভিত্তিতে কী চলছে তা দেখতে সহজেই, এমনকি আপনি আর এর সাথে খুব বেশি পরিচিত না হলেও আমি অচেনা চেহারার কয়েকটি দিক ব্যাখ্যা করব।

paste0() আর কীভাবে আর বিভাজকের সাথে স্ট্রিং যুক্ত করে।

str_extract_all()ফাংশন হ্যাডলি আপনি Wickham এর থেকে আসে stringrপ্যাকেজ। বেস প্যাকেজে নিয়মিত প্রকাশের জন্য আর হ্যান্ডলিংটি পছন্দসই পরিমাণে ছেড়ে যায়, যা stringrআসে। এই ফাংশনটি ইনপুট স্ট্রিংগুলিতে নিয়মিত প্রকাশের মিলগুলির একটি তালিকা ফেরত দেয়। perl()খেয়াল করুন কীভাবে কোনও ফাংশনে রেজেক্স চারদিকে রয়েছে - এটি কেবল বলছে যে রেজেক্স পার্ল-স্টাইল, আর স্টাইল নয়।

gsub()ইনপুট ভেক্টরের প্রতিটি উপাদানের জন্য একটি রেজেেক্স ব্যবহার করে সন্ধান এবং প্রতিস্থাপন করে। এখানে আমরা এটি খালি স্ট্রিংয়ের সাথে নম্বর বা বিয়োগ চিহ্ন নয় এমন সমস্ত কিছু প্রতিস্থাপন করতে বলছি।

এবং সেখানে আপনি এটা আছে। অনুরোধের পরে আরও ব্যাখ্যা আনন্দের সাথে সরবরাহ করা হবে।


আমি মনে করি না বাহ্যিক প্যাকেজে আউটসোর্সিং স্ট্রিং এক্সট্রাকশন একটি ভাল ধারণা। যখন কোনও বাহ্যিক সম্প্রদায়-সমর্থিত লাইব্রেরি ব্যবহার করা হয় তখন এটি একটি ফাঁক নয়? এমনকি যদি এটি ঠিক থাকে তবে আপনি কেন library(stringr)আপনার উত্সটিতে অন্তর্ভুক্ত হননি ?
Andreï Kostyrka

2

কোবরা - 165

def f(s='')
    l=int[](6)
    for i in 6,for n in RegularExpressions.Regex.matches(s,'(-?\\d+) *m?['yodhis'[i]]'),l[i]+=int.parse('[n.groups[1]]')
    print'{[l.join('|')]}'

2

সি ++ 14, 234 229 বাইট

সম্পাদনা করুন: পরিবর্তে পুরানো শৈলীর ঘোষণাপত্র ব্যবহার করে 5 বাইট কেটে দিনauto

আমি জানি যে বিজয়ী ইতিমধ্যে বেছে নেওয়া হয়েছে, এবং এটি এখন পর্যন্ত দীর্ঘতম জমা হবে, তবে আমাকে কেবল একটি সি ++ সমাধান পোস্ট করতে হয়েছিল, কারণ আমি বাজি ধরেছি যে কারওই প্রত্যাশা নেই :)

সত্যি কথা বলতে, আমি এটি কতটা সংক্ষিপ্ত হয়ে উঠলাম (সি ++ পরিমাপের মাধ্যমে অবশ্যই) আমি এতে অনেক বেশি খুশি এবং আমি নিশ্চিত যে এটি কোনও ছোট হতে পারে না (কেবলমাত্র একটি মন্তব্য দিয়ে, নীচে দেখুন) । এটি সি ++ 11/14-তে নতুন বৈশিষ্ট্যগুলির একটি দুর্দান্ত সংগ্রহ।

এখানে কোনও তৃতীয় পক্ষের লাইব্রেরি নেই, কেবলমাত্র মানক গ্রন্থাগার ব্যবহৃত হয়।

সমাধানটি ল্যাম্বডা ফাংশনের একরকম:

[](auto&s){sregex_iterator e;auto r="{"s;for(auto&t:{"y","mo","d","h","mi","s"}){int a=0;regex g("-?\\d+ *"s+t);decltype(e)i(begin(s),end(s),g);for_each(i,e,[&](auto&b){a+=stoi(b.str());});r+=to_string(a)+"|";}r.back()='}';s=r;};

Ungolfed:

[](auto&s)
{
    sregex_iterator e;
    auto r="{"s;
    for(auto&t:{"y","mo","d","h","mi","s"})
    {
        int a=0;
        regex g("-?\\d+\\s*"s+t);
        decltype(e)i(begin(s),end(s),g);
        for_each(i,e,[&](auto&b)
        {
            a+=stoi(b.str());
        });
        r+=to_string(a)+"|";
    }
    r.back()='}';
    s=r;
}

কিছু কারণে আমাকে লিখতে হয়েছিল

regex g("-?\\d+\\s*"s+t);
decltype(e)i(begin(s),end(s),g);

পরিবর্তে ন্যায়বিচার

decltype(e)i(begin(s),end(s),regex("-?\\d+\\s*"s+t));

কারণ আমি যদি একটি অস্থায়ী বস্তুটিতে পাস করি তবে কেবল পুনরাবৃত্তিকারী একটি ম্যাচ ফেরত পাঠাতে পারে। এটি আমার কাছে সঠিক বলে মনে হচ্ছে না, তাই আমি ভাবছি যে জিসিসির রেজেক্স বাস্তবায়নে কোনও সমস্যা আছে কিনা।

সম্পূর্ণ পরীক্ষার ফাইল (এর সাথে জিসিসি ৪.৯.২ সহ সংকলিত -std=c++14):

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()
{
    string arr[] = {"1 year 2 months 3 seconds",
                    "-2 day 5 year 8months",
                    "3day 9     years 4 seconds -5 minute 4 years 4 years -3seconds"};
    for_each(begin(arr), end(arr), [](auto&s){sregex_iterator e;auto r="{"s;for(auto&t:{"y","mo","d","h","mi","s"}){int a=0;auto g=regex("-?\\d+ *"s+t);decltype(e)i(begin(s),end(s),g);for_each(i,e,[&](auto&b){a+=stoi(b.str());});r+=to_string(a)+"|";}r.back()='}';s=r;});
    for(auto &s : arr) {cout << s << endl;}
}

আউটপুট:

{1|2|0|0|0|3}
{5|8|-2|0|0|0}
{17|0|3|0|-5|1}

0

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

preg_match_all("#(.?\d+)\s*m?(.)#",$argv[1],$m);$r=[0,0,0,0,0,0];foreach($m[1]as$i=>$n)$r[strpos(yodhis,$m[2][$i])]+=$n;echo json_encode($r);

প্রথম কমান্ড লাইন আর্গুমেন্ট থেকে ইনপুট নেয়; ব্যবহারসমূহ [,]পরিবর্তে আউটপুট {|}। সাথে চালাও -r

ভাঙ্গন

preg_match_all("#(.?\d+)\s*m?(.)#",$argv[1],$m);    # find intervals.
# (The initial dot will match the sign, the space before the number or a first digit.)
$r=[0,0,0,0,0,0];                   # init result
foreach($m[1]as$i=>$n)              # loop through matches
    $r[strpos(yodhis,$m[2][$i])]+=$n;   # map token to result index, increase value
echo json_encode($r);               # print result: "[1,2,3,4,5,6]"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.