छुट्टी का सिरदर्द


14

चेतावनी: इस पोस्ट से चिकित्सा सलाह न लें। यदि आप चिकित्सा सलाह चाहते हैं, तो एक योग्य पेशेवर के पास जाएं।

मुझे सिर दर्द है। मुझे सिरदर्द की गोलियाँ चाहिए।

मैं आपको पिछले कुछ खुराक बताऊंगा, और आप मुझे बताएं कि मैं अपनी अगली खुराक कब ले सकता हूं, बिना ओवरडोज किए।

मैं तुम्हें यह तार दे दूँगा: P: 00:00, I: 02:00, P: 04:00, I: 06:00

और आप मुझे यह देंगे: Next P: 08:00, I: 10:00

इनपुट:

निम्नलिखित प्रारूप में प्रत्येक दवा को लिया गया समय का प्रतिनिधित्व करते हुए स्ट्रिंग:

P: 00:00, I: 02:00, P: 04:00, I: 06:00

इसका अर्थ है पेरासिटामोल 00:00 और 04:00 बजे लिया गया था, और इबुप्रोफेन 02:00 और 06:00 पर लिया गया था

आउटपुट (अद्यतन):

प्रत्येक दवा के अगले समय के साथ स्ट्रिंग को निम्न प्रारूप में लिया जा सकता है:

Next P: 08:00, I: 10:00
  • आउटपुट ऑर्डर उस क्रम में होना चाहिए जिसे दवा लेनी है। - अगर इबुप्रोफेन को 09:35 और पैरासिटामोल और 10:22 पर लेना है, तो आउटपुट होना चाहिएNext I: 09:35, P: 10:22
  • यदि प्रत्येक दवा की अगली खुराक का समय समान हो, तो आउटपुट ऑर्डर मायने नहीं रखता: Next P: 08:00, I: 08:00याNext I: 08:00, P: 08:00
  • यदि केवल एक दवा ली जा रही है (इनपुट स्ट्रिंग में), तो केवल वह दवा आउटपुट स्ट्रिंग में होनी चाहिए: Next P: 02:00

नियम:

  • केवल दो प्रकार की दवा होगी, पैरासिटामोल 'पी' और इबुप्रोफेन 'आई'।
  • पेरासिटामोल को हर 4 घंटे में एक बार लिया जा सकता है, 24 घंटे की अवधि में अधिकतम 4 बार।
  • इबुप्रोफेन को भी हर 4 घंटे में एक बार लिया जा सकता है, अधिकतम 24 घंटे की अवधि में 4 बार।
  • पेरासिटामोल और इबुप्रोफेन को एक साथ, या अलग-अलग समय पर लिया जा सकता है। एक दूसरे की खुराक की गिनती नहीं है।
  • इनपुट स्ट्रिंग में समय हमेशा लगातार रहेगा, लेकिन आधी रात (23:00 -> 03:00) तक लुढ़क सकता है
  • इनपुट स्ट्रिंग में समय 24 घंटे से अधिक नहीं होगा
  • प्रत्येक दवा के लिए अधिकतम 4 बार (कुल 8 अधिकतम)
  • इनपुट हमेशा गैर-रिक्त रहेगा और इसमें कम से कम एक दवा और एक समय होगा

उदाहरण:

दो घंटे के अंतराल पर प्रत्येक की दो खुराक:

"P: 00:00, I: 02:00, P: 04:00, I: 06:00" -> "Next P: 08:00, I: 10:00"

पेरासिटामोल की एकल खुराक

"P: 22:00" -> "Next P: 02:00"

अधिकतम पेरासिटामोल खुराक 24 घंटे के भीतर, एकल इबुप्रोफेन खुराक

"P: 04:05, P: 08:10, P: 12:15, I: 12:30, P: 16:25" -> "Next I: 16:30, P: 04:05"

परीक्षण के मामलों:

"I: 06:00" -> "Next I: 10:00"
"P: 22:00" -> "Next P: 02:00"
"P: 22:00, P: 02:00, I: 06:00" -> "Next P: 06:00, I: 10:00"
"P: 00:00, I: 02:00, P: 04:00, I: 06:00" -> "Next P: 08:00, I: 10:00"
"P: 04:05, P: 08:10, P: 12:15, I: 12:30, P: 16:25" -> "Next I: 16:30, P: 04:05"
"I: 06:32, P: 08:15, I: 10:44, P: 13:03" -> "Next I: 14:44, P: 17:03"
"P: 07:30, I: 07:30, P: 11:30, I: 11:30, P: 15:30, I: 15:30, I: 19:30" -> "Next P: 19:30, I: 07:30"
"I: 07:30, P: 11:30, I: 11:30, P: 15:30, I: 15:30, P: 19:30, I: 19:30" -> "Next P: 23:30, I: 07:30"
"P: 07:30, I: 07:30, P: 11:30, I: 11:30, P: 15:30, I: 15:30, P: 19:30, I: 19:30" -> "Next P: 07:30, I: 07:30" OR "Next I: 07:30, P: 07:30"

यह कोड गोल्फ है, इसलिए सबसे छोटा उत्तर इंट बाइट्स जीतता है।

अपडेट करें:

आउटपुट अब पेरासिटामोल और इबुप्रोफेन के संक्षिप्त हो सकते हैं; PतथाI


मुझे इनपुट और आउटपुट फॉर्मेट पर कुछ उत्तोलन अच्छा लगेगा - मेटा पोस्ट
गुरुपद ममदापुर

@GurupadMamadapur आउटपुट शायद, लेकिन इनपुट से समय और दवा के प्रकार को निकालना आधी चुनौती है
Erresen

मैं आपको लोगों को आउटपुट में पेरासिटामोल और इबुप्रोफेन को संक्षिप्त करने की अनुमति देता हूं क्योंकि वे सबमिशन में अनावश्यक लंबाई जोड़ते हैं
साइओस

@Cyoce हाँ, मैं सहमत हूँ, एक समाधान की कोशिश कर रहा हूँ और यह वास्तव में थोड़ा मुश्किल है - संक्षिप्त आउटपुट को अनुमति देने के लिए नियमों को अपडेट किया गया
Erresen

@ लियन सहमत हुए और अद्यतित हुए
Erresen

जवाबों:


4

जावास्क्रिप्ट (ईएस 6), 367 362 354 358 बाइट्स

गोल्फ संस्करण:

A=i=>i>9?""+i:"0"+i,B=(s,a=":")=>s.split(a),C=(a,b,c,d)=>[...[s,t]=B((b>3?c:d)||":"),a+` ${A(s=b>3?+s:(+s+4)%24)}:`+A(t=+t)],F=s=>{a=B(s,m=", ");for(b=c=d=e=f=p=q=0;f<a.length;g=="P:"?(b++,d=d?h:p=h):(c++,e=e?h:q=h))[g,h]=B(a[f++]," ");[i,j,k]=C("P",b,p,d),[n,o,l]=C("I",c,q,e),r=B(h)[0];return"Next "+c?b?n*60+(n<r)*1440+j<i*60+(i<r)*1440+o?l+m+k:k+m+l:l:k}

Ungolfed / टिप्पणी की:

// Returns a zero-padded string of the argument.
A=i=>i>9?""+i:"0"+i,

// Since we do a lot of splitting, alias it. Making the
// second argument optional (and defaulting to ':') saved
// 3 bytes
B=(s,a=":")=>s.split(a),

// Constructs a string for output, along with the time
// of the next dose, in the format [hour, minute, string].
// Arguments:               type
// a -> type (P/I)          String
// b -> amount of doses     Number
//      taken
// c -> first dose taken    String
// d -> last dose taken     String
//
// The first two values are split from the string, but
// before the array is returned, they are converted to
// integers (during the string construction).
C=(a,b,c,d)=>[...[s,t]=B((b>3?c:d)||":"),a+` ${A(s=b>3?+s:(+s+4)%24)}:`+A(t=+t)],

// Main function. Returns the time(s) for the next dose.
// Argument:                type
// s -> list of times of    String
//      and types of 
//      doses taken
F=s=>{
    a=B(s,m=", "); // Split the input by comma + space,
                   // and save that string, since we
                   // need it later when constructing
                   // the output string.
    // For loop has been restructured. Original:
    // for(b=c=f=0;f<a.length;g=="P:"?(b++,d=d?h:p=h):(c++,e=e?h:q=h))
    //     [g,h]=B(a[f++]," ");
    b = 0; // P-dose counter
    c = 0; // I-dose counter
    d = 0; // Last P-dose
    e = 0; // Last I-dose
    p = 0; // First P-dose
    q = 0; // First I-dose
    for (f = 0; f < a.length; f++) {
        [g, h] = B(a[f], " ");  // g contains the type,
                                // h contains the time
        if (g == "P:") {
            b++;                // increase the counter

            if (d == 0) {   // store h in p if this is
                p = h;      // the first dose of this
            }               // type
            d = h;
        } else {
            // See the above code block for comments
            c++;

            if (e == 0) {
                q = h;
            }
            e = h;
        }
    }
    // End of restructured for loop.

    // Construct the output strings, and get the times.
    // See comments at C function.
    [i, j, k] = C("P", b, p, d);
    [n, o, l] = C("I", c, q, e);

    // Get the amount of hours of the dose taken last.
    // We use this to get the correct order of the two
    // times.
    r = B(h)[0];

    // Return statement has been restructured. Original:
    // return "Next "+c?b?n*60+(n<r)*1440+j<i*60+(i<r)*1440+o?l+m+k:k+m+l:l:k
    //==================================================
    // Start creating the output string.
    output = "Next "
    // Use the following checks to figure out what needs
    // to be part of the output and in what order.
    if (c > 0) {
        if (b > 0) {
            // Compare the times of next doses
            // P_time = (i + (i < r) * 24) * 60
            // I'm using implicit conversion of
            // booleans to numbers. If the next
            // dose is past midnight, add 1 * 24
            // to the time, so it is compared
            // correctly.
            // Then add the minutes to the number.
            P_time = i*60+(i<r)*1440+o;
            I_time = n*60+(n<r)*1440+j;

            if (I_time < P_time) {
                output += l + m + k; // I first
            } else {
                output += k + m + l; // P first
            }
        } else {
            output += l; // Just I
        }
    } else {
        output += k; // Just P
    }

    // Finally, return the output
    return output;
}

इसका उपयोग करने के लिए, F को स्ट्रिंग के साथ तर्क के रूप में कॉल करें:

F("P: 04:00, I: 06:00")

यह बहुत अच्छा है, लेकिन मुझे कुछ समस्याएं थीं। यह विफल लगता है अगर इनपुट में केवल एक प्रकार की गोली है, जैसे F("P: 22:00")-> ReferenceError: q is not defined। यह इनपुट तब चलेगा जब P & I को पहले संदर्भित किया गया है, लेकिन I. के लिए पुराने विवरणों के साथ
क्रिस M

धन्यवाद! मैंने अभी इसका परीक्षण किया है और आप संदर्भ त्रुटि के बारे में सही हैं। मुझे लगता है कि q चर रीसेट नहीं हुआ है और मैंने परीक्षण के दौरान पर्याप्त ध्यान नहीं दिया। मुझे बताने के लिए धन्यवाद, मैं इसे बाद में ठीक कर दूंगा।
लूका

एक आसान तय निकला, लेकिन इसकी कीमत मुझे 4 बाइट्स में चुकानी पड़ी।
ल्यूक

1

पायथन 3 - 437 बाइट्स

a=input();i=p=l=-1;j=q=0
for x in a.split(", ")[::-1]:
    for y, z in [x.split(": ")]:
        s=lambda q,r,t:[t,sum([a*b for a,b in zip([60,1],map(int,q.split(':')))])][r%4<2]+[0,240][r<2]
        if y=="I":j+=1;i=s(z,j,i)
        else:q+=1;p=s(z,q,p)
        l=[l,p+i-239][j+q<2]
r=lambda d,e:("","%s: %02d:%02d, "%(d,(e/60)%24,e%60))[e>-1];p+=[1440,0][p>=l];i+=[1440,0][i>=l];print("Next "+[r("I",i)+r("P",p),r("P",p)+r("I",i)][p<i][:-2])

स्पष्टीकरण:

a=input();i=p=l=-1;j=q=0
for x in a.split(", ")[::-1]: #Read in reverse order, a="P: 01:00"
    for y, z in [x.split(": ")]:#Y="P", Z="00:00"
        s=
        lambda q,r,t:[t,sum([a*b for a,b in zip([60,1],map(int,q.split(':')))])]#Convert "01:01" to 61
        [r%4<2]#In case it's the first or fourth string calculate a new value, otherwise: return the original value
        +[0,240][r<2]#In case it's the last string: add 4 hours. Otherwise, leave it.
        if y=="I":j+=1;i=s(z,j,i)#Calculate for i
        else:q+=1;p=s(z,q,p)#Calculate for p
        l=[l,p+i-239][j+q<2]#Sets the last record. Since we read in reverse order, this should be the first one. We've added 4 hours though so remove those again
r=lambda d,e:("","%s: %02d:%02d, "%(d,(e/60)%24,e%60))[e>-1];#Print function, don't print anything when we have no value
p+=[1440,0][p>=l];i+=[1440,0][i>=l];    #Add a day if record is before the last record so we can correctly calculate the order
print("Next "+[r("I",i)+r("P",p),r("P",p)+r("I",i)][p<i][:-2])#print it and remove the last ","

1

PHP, 228 241 239 227 226 बाइट्स

PHP 7 की आवश्यकता है

Next<?foreach(explode(", ",$argv[1])as$d){[$m,$h,$i]=explode(":",$d);$x[$m][++$$m]=24+$h+$i/60;}foreach($x as$m=>$d)$r[$m]=$d[$$m-3]?:$d[$$m]-20;sort($r);foreach($r as$m=>$t)$o[]=" $m: ".date("i:s",$t%24*60);echo join(",",$o);

टूट - फूट

Next<?                              // print "Next"
foreach(explode(", ",$argv[1])as$d) // loop through string split by comma+space
{
    [$m,$h,$i]=explode(":",$d);         // separate drug, hours and minutes
    $x[$m][++$$m]=24+$h+$i/60;          // append time to array, track count in ${$m}
}                                       // (i.e. $P for drug "P" etc.)
foreach($x as$m=>$d)                // loop through drugs
    $r[$m]=                             // add time to result
        $d[$$m-3]                           // if more than 3 medications, use $$m-3
            ??$d[$$m]-20                    // else use last medication - 20 hours
    ;
sort($r);                           // sort results by time
foreach($r as$m=>$t)$o[]=" $m: "    // prepare for output: drug name and formatted time:
    .date("i:s",$t%24*60)           // use hrs as mins and mins as secs to avoid TZ problems
;
echo join(",",$o);                  // print

0

जावास्क्रिप्ट (ईएस 6), 246 बाइट्स

s=>s.split`, `.map(s=>(m[s[0]].unshift(t=s.replace(/\d+/,h=>(h=(1+h)%24)>9?h:`0`+h),s),l=l||t.slice(1)),l=0,m={I:[],P:[]})&&`Next `+[].concat(m.I[7]||m.I[0]||[],m.P[7]||m.P[0]||[]).sort((i,p)=>((i=i.slice(1))<l)-((p=p.slice(1))<l)||i>p).join`, `

स्पष्टीकरण:

प्रत्येक खुराक पर लूपिंग, Iऔर Pखुराक को दो सरणियों में अलग किया जाता है। प्रत्येक खुराक में 4 घंटे भी जोड़े जाते हैं, और उन समय को भी बचाया जाता है। 8 प्रविष्टियों का पता लगाने को आसान बनाने के लिए सरणियों को रिवर्स में आबाद किया जाता है। पहली खुराक के 4 घंटे बाद का समय छँटाई के दौरान उपयोग के लिए भी बच जाता है। इस बिंदु पर प्रत्येक सरणी तीन राज्यों में से एक में हो सकती है:

  • 8 प्रविष्टियाँ, जिस स्थिति में अंतिम प्रविष्टि पहली खुराक है, और अगली खुराक इस खुराक के 24 घंटे बाद होनी चाहिए (यानी कल उसी समय)
  • 2, 4 या 6 प्रविष्टियाँ, जिस स्थिति में पहली प्रविष्टि अंतिम खुराक के 4 घंटे बाद होती है, और इसलिए अगली खुराक का समय
  • 0 प्रविष्टियाँ, जिस स्थिति में हम समाप्‍त करते हैं [], जो चपटी हो जाती है और इसलिए परिणाम से बाहर रखा गया है

दो सरणियों से अगली खुराक बार निकाले जाने के बाद, यह क्रम में उन्हें क्रमबद्ध करने के लिए बनी हुई है। यह पहली खुराक के 4 घंटे बाद के समय की तुलना करके किया जाता है। यदि दो समय में से एक इस समय से पहले है, तो इसे कल को संदर्भित करना चाहिए, और यह खुराक अंतिम बार आता है। अन्यथा, समय की तुलना सीधे तौर पर की जाती है। (असुविधाजनक रूप से, दवा समय से पहले है, इसलिए मुझे इसे ठीक से तुलना करने के लिए पट्टी करना होगा।)

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