Süreleri toplama


18

Meydan okuma

Stdin'de görünen tüm süreleri toplayabilecek en kısa kodu yazın. Program, yalnızca aşağıdaki kalıplardan biriyle eşleşen dizeleri dikkate almalı ve gerisini yok saymalıdır.

    HH:MM:SS     (it will be interpreted as HH hours, MM minutes and SS seconds)        
    H:MM:SS      (it will be interpreted as H hours, MM minutes and SS seconds)
    MM:SS        (it will be interpreted as MM minutes, SS seconds)
    M:SS         (it will be interpreted as M minutes, SS seconds)

numaralandırılmış kalıplarla eşleşen dizelere örnekler:

    12:00:01  
    2:03:22  
    00:53  
    9:13

Çıktı formda olmalıdır

    HHh MMm SSs      (that means HH hours, MM minutes and SS seconds with non-zero-padding)

Misal

STDIN

Hoş Geldiniz videosunu izleyin.
Video: 10:37 dk.
Kursun video tanıtımını izleyin.
Video: 3:30 dk. Derse Genel Bakış'ın nasıl kullanılacağına ilişkin videoyu izleyin.
Video: 9:13 dk.
Çalışmanızı paylaşmak için Epsilen sistemini nasıl kullanacağınıza ilişkin videoya genel bakış izleyin.
Video: 03:15 dk.
Teksas Eyaleti Akademik Hazırlık Değerlendirmesi (STAAR) hakkında bilgi edinmek için videoyu izleyin.
Video: 1:05:26 dk.

STDOUT

1s 32d 1sn


Peki dizeler nasıl 10:4:56? Mevcut şartnameye göre, ele alınmaları gereken 4m 56skısım 10göz ardı edilecektir. Aynı soru , görmezden gelmek 10:12:7anlamına mı geliyor ? Yoksa bu dizelerin kullanımı uygulama olarak tanımlanabilir mi? 10m 12s7
Qwertiy

Program sadece dakika ve saniye alanlarında sıfır dolgulu süreleri dikkate almalıdır. Örneğin, "10: 4: 56" dizgisi 4m 56s olarak ele alınacaktır. Ayrıca "10: 12: 7" dizgisi 10m 12s olarak yorumlanacaktır.
Alfredo Diaz

Garip, ama tamam :)
Qwertiy

Çıktıya nasıl 1h 19m 18sgirdiniz? 37+30+13+15+26==121, 10+3+9+3+5==30, 1==1, Bu yüzden beklemek 1h 32m 01s. Bu mantıkta yanlış olan ne? Ayrıca, böyle bir çıktı biçimi beklenen format, değil mi?
Qwertiy

Haklısın. Üzgünüz: S
Alfredo Diaz

Yanıtlar:


3

Pyth 105

K"smh"J"\D\D+|\d+:(?=\d:)|:\d\D"W:QJ1=Q:QJd;FN_msdCfn2lTm+*]0</k\:2msbck\:cQ)~k+d+hK_`%+NZ60=Z/N60=KtK;_k

Çevrimiçi deneyin.

Bu, STDIN'den Javascript cevabının yaptığı gibi giriş gerektirir, \ns gibi yeni satırlar içeren alıntılar .

Örneklem:

"View the Welcome video.\nVideo: 10:37 min.\nView the video introduction to the course.\nVideo: 3:30 min. View the video of how to use the Lesson Overview.\nVideo: 9:13 min.\nView the video overview of how to use the Epsilen system to share your work.\nVideo: 03:15 min.\nView the video to learn about the State of Texas Assessment of Academic Readiness (STAAR).\nVideo: 1:05:26 min."

Çıktı

1h 32m 1s

Tuhaf tarihlerle çalışma örneği:

"10:10:5 and 5:1:10 and 27 or 16: or 1:1:1 or 11:1\n"

Çıktı

0h 11m 20s

(Sadece 10:10 ve 1:10 meşru zamanlardır)

Bunun bu kadar uzun olmasının ana nedeni, Pyth'in olumlu maçlar çıkarmanıza izin vermemesidir. Bu, geçerli bir zaman olmayan her şeyle eşleşir ve onu bir boşluk karakteriyle değiştirir. Sonra, boşluk üzerine bölmek sadece zaman ve bazı yollu sayılar bırakır. Fazla sayılar, :geçerli olmayan zamanlardan kaldırılacak karakterler kontrol edilerek kaldırılır. Bu neredeyse kesinlikle daha fazla golf olabilir;)


Pyth regex sahip olduğunu Şanslı piç çok !
Optimize Edici

@Optimizer: D Gerçi gerçek bir acıydı. "Şu anda sadece bir dize olup olmadığını denetler)
FryAmTheEggman

6

Javascript ES6, 138 karakter

Fonksiyon, 139

Dizeyi bağımsız değişken olarak alır ve çıktıyı konsola yazar:

f=s=>(r=0,s.replace(/(\d\d?):(\d\d)(:(\d\d))?/g,(m,a,b,x,c)=>r+=x?+c+b*60+a*3600:+b+a*60),console.log("%dh %dm %ds",r/3600,r%3600/60,r%60))

Program, 138

prompt(r=0).replace(/(\d\d?):(\d\d)(:(\d\d))?/g,(m,a,b,x,c)=>r+=x?+c+b*60+a*3600:+b+a*60),console.log("%dh %dm %ds",r/3600,r%3600/60,r%60)

Fonksiyon testi

f("View the Welcome video.\n\
Video: 10:37 min.\n\
View the video introduction to the course.\n\
Video: 3:30 min. View the video of how to use the Lesson Overview.\n\
Video: 9:13 min.\n\
View the video overview of how to use the Epsilen system to share your work.\n\
Video: 03:15 min.\n\
View the video to learn about the State of Texas Assessment of Academic Readiness (STAAR).\n\
Video: 1:05:26 min.")

Çıktı

"1h 32m 1s"

Tamam. Firefox Developer Edition 36.0a2'de iyi çalışıyor, biçimlendirme sadece Firefox 34.0'da başarısız oluyor.
manatwork

Promt, çok satırlı dizelere izin vermez. Ama aynı sayıda karakter istemi () çağrısı ile sürüm ekleyebilirsiniz :) Hatta 1 sembol kısaltmak)))
Qwertiy

@Optimizer Nasıl girilir?
Qwertiy

@Optimizer FF 35.0'ımda yeni bir satır eklemek işe yaramıyor.
Qwertiy

Çalıştıramıyorum. İdeone.com üzerinde denedim ideone.com/56EHgV
Alfredo Diaz

4

JavaScript, ES6, 208 200 197 bayt

Bunun çok uzun olduğunu biliyorum, ama ES6, ters, harita azaltma, ok fonksiyonları ve dizi kavrama (yayma operatörü) en son özelliklerini keşfetmek istedim.

alert(prompt().match(/\d\d?:\d\d(:\d\d)?/g).map(x=>[...x.split(":").reverse(),z=0].slice(0,3)).reduce((a,b)=>b.map((y,i)=>+y+ +a[i])).map((x,i)=>(z=(t=x+z|0)/60,t%60+"smh"[i])).reverse().join(" "))

Parçacığı en son Firefox'ta çalıştırın.

Nasıl çalışır (biraz soluksuz)

alert(                              // Alert the final result
  prompt()                          // Take the input via prompt
  .match(/\d\d?:\d\d(:\d\d)?/g)     // Match only correct time formats
  .map(                             // Map all matches using this method
    x=>[                            // Take each element as argument x
      ...x.split(":").reverse(),    // split x on ":" and reverse the array, then spread it
      z=0                           // put 0 as last element of return array
    ].slice(0,3)                    // Take only first 3 elements of the array
  ).reduce(                         // Reduce the result using this method
    (a,b)=>                         // Pairwise elements of the array
    b.map(                          // Map array b
      (y,i)=>~~y+~~a[i]             // Convert b[i] to b[i]+a[i]
    )                               // Now we have array like [SS, MM, HH]
  ).map(                            // Map these three values for carry over calculation
    (x,i)=>(
      t=x+z,                        // z contains carryover amount, add it to this value
      z=(t/60)|0,                   // Carryover is now floor(t/60)
      t%60+"smh"[i]                 // Remove overflow from t and add "s", "m" or "h"
    )                               // Now we have array like ["SSs", "MMm", "HHh"]
  ).reverse().join(" ")             // Reverse it and join by space
)

4

Bash (grep, sed, awk ve tarih ile): 124 bayt, 120 bayt

Metni buna ekleyin:

grep -o '[:0-9]*'|sed 's/^[^:]*:[^:]*$/:\0/'|awk -F: '{T+=3600*$1+60*$2+$3}END{print"@"T}'|xargs date +"%Hh %Mm %Ss" -ud

Nasıl çalışır

  • grep: yalnızca aşağıdakileri içeren girişten dizeler çıkarır: 0123456789:
  • sed: MM: SS ve M: SS'yi M: SS'ye dönüştürür
  • awk: saniyeyi hesaplar, boş dize 0'dır
  • xargs: girdiyi tarihe bağımsız değişken olarak geçirir
  • date: çağdan beri geçen saniye (@ ile öneklidir) istenen biçime dönüştürür

Bu saat sizin saat diliminizle ilgili değil mi?
Qwertiy

Haklısın, güzel yakala :) -u bayrağı eklendi.
pgy

3

Perl - 228 201

use integer;$h=0,$m=0,$s=0;while(<>){if(/(\d+:){1,2}\d+/){@a=reverse(split(/:/,$&));push @a,(0)x(3-@a);$s+=@a[0];$m+=@a[1];$h+=@a[2];}}$m+=$s/60;$s=$s%60;$h+=$m/60;$m=$m%60;print $h."h ".$m."m ".$s."s"

Optimizer ile aynı algoritma (grep, split, reverse, add) olur.

Ben Perl uzmanı değilim, belki bayt sayısı azaltılabilir.

Ungolfed

use integer;                              # will do integer division
$h=0,$m=0,$s=0;
while(<>){
    if(/(\d+:){1,2}\d+/) {                # extract date formats
        @a = reverse(split(/:/,$&));      # split by ":" and reverse
        push @a,(0)x(3-@a);               # pad with zeros (minutes and hours)
        $s+=@a[0];                        # sum seconds
        $m+=@a[1];                        # sum minutes
        $h+=@a[2];                        # sum hours
    }
}

# convert seconds as minutes    
$m += $s / 60;
$s = $s % 60;

# convert minutes as hours
$h += $m / 60;
$m = $m % 60;

print $h."h ".$m."m ".$s."s";

Bana gelince, perl çözüm javascript bir daha uzun görmek garip :)
Qwertiy

Mesele bile sayılırsa, daha uzun olması normaldir.
manatwork

@Qwertiy katılıyorum. Umudum, bazı Perl gurularının bunu düzeltmeme yardımcı olacağıdır.
coredump

@manatwork Neden önemlidir?
Qwertiy

@Qwertiy, çünkü coredump sayımdan çıkarmayı unuttu. : S Yalnızca kaldırılabilir (tüm bu myanahtar kelimelerle birlikte ).
manatwork

3

Asi - 174

n: charset"1234567890"a:[1 2 n]b:[":"2 n]c: 0 parse input[any[copy x[a b b](c: c + do x)| copy x[a b](c: c + do join"0:"x)| skip]]print reword"$1h $2m $3s"[1 c/1 2 c/2 3 c/3]

İşaretsiz + açıklamalı:

n: charset "1234567890"                      ; setup \d regex equiv
a: [1 2 n]                                   ; parse rule for \d{1,2} 
b: [":" 2 n]                                 ; parse rule for :\d\d
c: 0                                         ; time counter

parse input [                                ; parse the input (STDIN)
                                             ; (no regex in Rebol)

  any [                                      ; match zero or more... 
                                             ;
      copy x [a b b] (c: c + do x)           ;  HH:MM:SS or H:MM:SS
                                             ;    - copy match to x
                                             ;    - increment time (c) by x
                                             ; OR
    | copy x [a b] (c: c + do join "0:" x)   ;  MM:SS or M:SS
                                             ;    - copy match to x
                                             ;    - "MM:SS" into "0:MM:SS" (join)
                                             ;    - then increment time (c)
                                             ; OR
    | skip                                   ;   no match so move through input
  ]
]

print reword "$1h $2m $3s" [1 c/1 2 c/2 3 c/3]

Rebol kendi time!veri tipiyle birlikte gelir . Yukarıdaki kodun bunu nasıl kullandığını aşağıdaki örnekte görebilirsiniz (Rebol konsolundan):

>> 0:10:37 + 0:3:30 + 0:9:13 + 0:3:15 + 1:05:26
== 1:32:01

;; Rebol would treat 10:37 as 10 hours & 37 minutes (and not MM:SS)
;; So we have to prefix the "0:"

>> join "0:" 10:37
== "0:10:37"

;; This is a string so we use Rebol DO evaluator to convert to time!

>> do join "0:" 10:37 
== 0:10:37

>> type? do join "0:" 10:37
== time!

>> hms: do join "0:" 10:37
== 0:10:37

>> hms/hour
== 0

>> hms/second
== 37

>> hms/minute
== 10

2

Harika - 195

M=60
r=(System.in.text=~/((\d?\d):)?(\d\d):(\d\d)/).collect{it[2..4]*.toInteger().inject{s,i->(s?:0)*M+i}}.inject{s,i->s+=i}
f=[];(2..0).each{j=M**it;s=r%j;f<<(r-s)/j;r=s}
printf("%sh %sm %ss",f)

Nasıl daha fazla sıkıştıracağımı anlayamıyorum.

Ungolfed

M=60
r=(System.in.text=~/((\d?\d):)?(\d\d):(\d\d)/).collect{  // extract dates
    it[2..4]*.toInteger().inject{ s,i ->                 // convert to seconds
        (s?:0)*M+i
    }
}.inject{s,i ->
    s+=i                                                 // sum seconds
}

f=[];
(2..0).each{                                             // convert to h,m,s
    j=M**it;
    s=r%j;
    f<<(r-s)/j;
    r=s
}

printf("%sh %sm %ss",f)

1

Mathematica 300 karakter

Bu küçük alıştırma Mathematica için bile çok fazla kod aldı. Elbette bunu yapmanın daha etkili yolları var.

golfed

Girişin saklandığı varsayılarak txt,

n=NumberString;
t=ToExpression;
o=TimeObject;

QuotientRemainder[QuantityMagnitude[Plus@@((o[#]-o[{0,0,0}])&/@
(StringSplit[StringCases[w,{(n~~":"~~n~~":"~~n),(n~~":"~~n)}],":"]
/.{{a_,b_}:> {0,t@a,t@b},{a_,b_,c_}:> {t@a,t@b,t@c}}))],60]/.{h_,m_}:> 
Row[{h,"h ",IntegerPart@m,"m ",Round[60 FractionalPart[m]],"s "}]

Nasıl Çalışır (UnGolfed kodunu kullanarak):

1-Süreleri bulun.

StringCases[txt,{(NumberString~~":"~~NumberString~~":"~~NumberString),
(NumberString~~":"~~NumberString)}];

{"10:37", "3:30", "9:13", "03:15", "1:05:26"}


2 saat, dakika, saniye

StringSplit[%,":"]/.{{a_,b_}:> {0,ToExpression@a,ToExpression@b},{a_,b_,c_}:> 
{ToExpression@a,ToExpression@b,ToExpression@c}}

{{0, 10, 37}, {0, 3, 30}, {0, 9, 13}, {0, 3, 15}, {1, 5, 26}}


3-Süreleri toplayın. Zaman nesneleri saat zamanlarıdır. Bir zaman nesnesini başka bir nesneden çıkarmak bir süre döndürür, bu durumda 92.0167 dakika. QuantityMagnitudeölçü birimini düşürür.

q=QuantityMagnitude[Plus@@((TimeObject[#]-TimeObject[{0,0,0}])&/@%)]

92,0167


4-92.0167 dakikayı saat, dakika, saniye olarak dönüştürün.

QuotientRemainder[q,60]/.{h_,m_}:> Row[{h,"h ",IntegerPart@m,"m ",
Round[60 FractionalPart[m]],"s "}]

1s 32d 1sn


1

Perl, 146

Girişim çıktıyı bir boşlukla yazdırıyor - umarım sorun olmaz

while(<>){for(/(\d?\d(?::\d\d){1,2})/g){$m=1;for(reverse split/:/,$_){$t+=$m*$_;$m*=60}}}for('s','m'){$o=($t%60)."$_ $o";$t/=60}print int$t,"h $o"

Her girdi satırı için yalnızca bir kez olacağını varsayabilirsek, 4 karakteri kesebiliriz:

while(<>){if(/(\d?\d(:\d\d){1,2})/){$m=1;for(reverse split/:/,$&){$t+=$m*$_;$m*=60}}}for('s','m'){$o=($t%60)."$_ $o";$t/=60}print int$t,"h $o"

Bunlar, geçen toplam saniyeyi biriktirerek ve daha sonra bu değeri biçimlendirerek çalışır.

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.