Tatil Baş Ağrısı


14

Uyarı: Bu yazıdan tıbbi tavsiye almayın. Tıbbi tavsiye istiyorsanız, kalifiye bir uzmana gidin.

Başım ağrıyor. Baş ağrısı haplarına ihtiyacım var.

Size son birkaç dozu söyleyeceğim ve bana bir sonraki dozumu ne zaman alabileceğimi, aşırı doz yapmadan söyleyeceksiniz.

Size şu dizeyi vereceğim: P: 00:00, I: 02:00, P: 04:00, I: 06:00

Ve bana bunu vereceksin: Next P: 08:00, I: 10:00

Giriş:

Her bir ilacın alındığı süreleri aşağıdaki biçimde temsil eden dize:

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

Bu, Parasetamolün 00:00 ve 04:00 'da alındığı ve Ibuprofen'in 02:00 ve 06:00' da alındığı anlamına gelir.

Çıktı (güncellendi):

Her bir ilacın bir sonraki yaptığı zamanla aşağıdaki formatta dize:

Next P: 08:00, I: 10:00
  • Çıktı sırası ilacın alınacağı sırada olmalıdır. - Ibuprofen 09:35 ve Paracetamol ve 10:22 saatlerinde alınacaksa, çıktıNext I: 09:35, P: 10:22
  • Her ilacın bir sonraki dozu için zamanlar aynıysa, çıkış sırası önemli değildir: Next P: 08:00, I: 08:00VEYANext I: 08:00, P: 08:00
  • Yalnızca bir ilaç alınıyorsa (giriş dizesinde), o zaman sadece bu ilaç çıkış dizesinde olmalıdır: Next P: 02:00

Kurallar:

  • Sadece iki tip ilaç olacaktır, Parasetamol 'P' ve Ibuprofen 'I'.
  • Parasetamol, 24 saatlik bir süre içinde 4 saatte bir, maksimum 4 kez alınabilir.
  • İbuprofen, 24 saatlik bir süre içinde her 4 saatte bir, maksimum 4 kez alınabilir.
  • Parasetamol ve Ibuprofen birlikte veya ayrı zamanlarda alınabilir. Biri diğerinin dozuna sayılmaz.
  • Giriş dizesindeki süreler her zaman ardışık olacaktır, ancak gece yarısı boyunca yuvarlanabilir (23:00 -> 03:00)
  • Giriş dizesindeki süreler 24 saatten fazla sürmez
  • Her ilaç için en fazla 4 kez (toplamda en fazla 8)
  • Giriş her zaman boş olmayacak ve en az bir ilaç ve bir kez içerecektir.

Örnekler:

İki saatlik aralıklarla her biri iki doz:

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

Tek doz Parasetamol

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

24 saat içinde maksimum Parasetamol dozu, tek Ibuprofen dozu

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

Test senaryoları:

"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"

Bu kod golf, bu yüzden en kısa cevap int bayt kazanır.

GÜNCELLEME:

Çıktı artık Parasetamol ve Ibuprofen kısaltmaları olabilir; PveI


Giriş ve çıkış biçiminde biraz kaldıraç elde etmek isterim - meta mesaj
Gurupad Mamadapur

@GurupadMamadapur çıktı belki, ancak girişlerden süreleri ve ilaç türünü
çıkarmak

İnsanların gönderilere gereksiz uzunluk kattıklarından çıktılarında parasetamol ve ibuprofen'i kısaltmasına izin vermenizi öneririm
Cyoce

@ Evet evet katılıyorum, kendim bir çözüm deniyorum ve aslında biraz zor - kısaltılmış çıktıya izin vermek için kuralları güncelledi
Erresen

@Lynn kabul etti ve güncellendi
Erresen

Yanıtlar:


4

JavaScript (ES6), 367 362 354 358 bayt

Golf versiyonu:

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 / yorumladı:

// 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;
}

Bunu kullanmak için, F değişkenini aşağıdaki gibi bağımsız değişken olarak çağırın:

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

Bu harika, ama birkaç sorun vardı. Girişte sadece bir tür hap varsa başarısız görünüyor, örneğin F("P: 22:00")-> ReferenceError: q is not defined. Bu giriş, P&I'ye daha önce başvurulmuşsa, ancak I için eski ayrıntılarla çalışacaktır.
Chris M

Teşekkürler! Sadece test ettim ve referans hatası konusunda haklısın. Sanırım q değişkeni sıfırlanmadı ve test sırasında yeterince dikkat etmedim. Bana bildirdiğiniz için teşekkürler, daha sonra çözeceğim.
Luke

Kolay bir düzeltme olduğu ortaya çıktı, ama bana 4 bayt mal oldu.
Luke

1

Python 3-437 bayt

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çıklama:

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 bayt

PHP 7 gerektirir

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);

Yıkmak

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

JavaScript (ES6), 246 bayt

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`, `

Açıklama:

Her dozun üzerinde döngü yapan Ive ve Pdozlar iki diziye ayrılır. Her doza 4 saat eklenir ve bu süreler de kaydedilir. Diziler, 8 girişi algılamayı kolaylaştırmak için tersine yerleştirilir. Birinci dozdan 4 saat sonra zaman ayırma sırasında kullanım için de kaydedilir. Bu noktada her dizi üç durumdan birinde olabilir:

  • 8 giriş, bu durumda son giriş ilk dozdur ve bir sonraki doz bu dozdan 24 saat sonra olmalıdır (yani yarın aynı saat).
  • 2, 4 veya 6 giriş, bu durumda ilk giriş son dozdan 4 saat sonra ve dolayısıyla bir sonraki dozun zamanı
  • 0 girdi, bu durumda birleştiririz [], düzleştirilir ve bu nedenle sonuçtan çıkarılır

Bir sonraki doz zamanını iki diziden çıkardıktan sonra, bunları sıralamak için kalır. Bu, ilk dozdan 4 saat sonra zamanla karşılaştırılarak yapılır. İki zamandan biri bu süreden önce ise, bu yarın anlamına gelmelidir ve bu doz en son gelir. Aksi takdirde, zamanlar doğrudan doğrudan karşılaştırılır. (Aksine, ilaç zamandan önce, bu yüzden düzgün bir şekilde karşılaştırmak için soymalıyım.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.