Berapa banyak waktu yang tersisa?

31

Program

Anda diberi dua string, A dan B . A adalah posisi saat ini di mana timer Anda berada, dan B adalah posisi di mana timer Anda akan berhenti. Kedua string berada dalam format m: ss . Anda harus menulis sebuah program yang menentukan jumlah waktu yang tersisa yang juga harus diformat sebagai m: ss atau mm: ss .

Contoh

0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30
Josh
sumber
1
Di dc input dibaca salah, karena :merupakan perintah (data sebagai filosofi kode). Apakah saya diizinkan menggunakan spasi atau apakah saya perlu menemukan bahasa lain untuk menjawab ini?
seshoumara
1
apakah 01:30output yang valid? (memimpin nol)
Luis Mendo
2
Ya, saya akan menerimanya sebagai valid. Saya akan mengedit deskripsi.
Josh
1
@seshoumara Input harus mengandung titik dua.
Josh
Berapa nilai maksimum yang diharapkan untuk m ?
Digital Trauma

Jawaban:

92

Excel, 6 Bytes

=B1-A1

Dengan asumsi A ada di dalam sel A1dan B di dalam selB1

Riley
sumber
37
Tidak ... TIDAK ... AKU TIDAK AKAN BIARKAN EXCEL MENANG. +1 Anda individu yang licik.
Magic Octopus Urn
2
Batalkan itu, |vy':¡bootstrap di 05AB1E, tidak ada yang bisa saya lakukan ... Saya pikir Excel dapat dengan jujur ​​memenangkan ini, tidak ada yang lain secara otomatis mem-parsing format yang saya tahu.
Magic Octopus Urn
7
BAGAIMANA? BAGAIMANA? Bagaimana Excel menang? Otak saya sekarang harus mengeksploitasi ...
caird coinheringaahing
2
Jika m lebih besar dari 23, maka pemformatan tampaknya tidak berfungsi. Misalnya jika saya mengetikkan 45:45A1 dan 22:22B1, maka hasilnya adalah 23:23:00 Edit Nevermind - nilai maksimum yang diharapkan untuk m adalah 9.
Digital Trauma
4
@EngineerToast Apa pun pemformatan default berfungsi untuk saya. Saya baru saja mengetik di input, pindah ke sel yang berbeda, mengetik rumus dan tekan enter.
Riley
15

MATL , 17 7 byte

YOd15XO

Input adalah array sel string, dalam bentuk {'1:45' '3:15'}atau {'1:45', '3:15'}.

Cobalah online!

Penjelasan

YO     % Input cell array of strings (implicit). Convert to serial date numbers
d      % Difference
15XO   % Convert to format 15, i.e. 'HH:MM'. Display (implicit)
Luis Mendo
sumber
Oh bagus! Lanjutkan!
Suever
8

Bash + coreutils, 44 39 byte

tr : \ |dc -e?r60*+r-r60*-60~rn58PA~rnn

Cobalah online!

Penjelasan: menggunakan "1:45 3:15" sebagai test case (contoh terakhir). Saya menunjukkan langkah perantara dalam tanda kutip.

tr : \ |         # replace colons with spaces: "1 45 3 15"
dc -e?           # start dc script, push input to LIFO stack: "15 3 45 1"
     r60*+            # turn time B to total seconds: "195 45 1"
     r-r60*-          # turn time A to total seconds and get difference: "90"
     60~r             # turn difference (time left) to minutes and seconds: "1 30"
     n58P             # pop and print minutes, print colon (ASCII code 58): "30"
     A~rnn            # print seconds. Padding with zeroes is done by dividing by
                      #10 (A), and printing the quotient and the remainder.

Perhatikan bahwa saya tidak memeriksa apakah nilai menit membutuhkan zero padding, karena OP menyatakan bahwa nilai maksimum madalah 9.


Di bawah ini adalah jawaban saya yang asli 44 byte, yang menggunakan dateperintah untuk mengubah total waktu yang tersisa dalam hitungan detik ke m:ssformat.

date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S
seshoumara
sumber
2
@DigitalTrauma Terima kasih. Tetapi pada akhirnya, saya berhasil menghapus perintah tanggal dan melakukan pencetakan format di dc juga.
seshoumara
1
Dicoret 44 seperti biasa 44.
Riley
1
@Riley Saya mencoret ruang sekitar 44 juga, untuk mendapatkan efek yang seharusnya ada di tempat pertama.
seshoumara
7

Python 2, 90 87 83 80 byte

Mengambil input seperti "2:45","5:01".

a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
print'%d:%02d'%divmod(b-a,60)

Cobalah online

mbomb007
sumber
Anda dapat menggunakan daftar pemahaman untuk menyimpan beberapa byte:a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
Felipe Nardi Batista
Jika saya tidak salah, Anda dapat menyimpan tiga karakter tambahan menggantikan dua baris terakhir dengan print'%d:%02d'%divmod(b-a,60):)
Morwenn
5

c, 86

f(a,b,c,d){scanf("%d:%d%d:%d",&a,&b,&c,&d);d+=(c-a)*60-b;printf("%d:%02d",d/60,d%60);}

Membaca waktu yang dipisahkan ruang dari STDIN.

Cobalah online .

Trauma Digital
sumber
5

Batch, 74 byte

@set t=%2-(%1)
@set/as=%t::=*60+1%,m=s/60,t=s/10%%6
@echo %m%:%t%%s:~-1%

Mengganti :waktu dengan *60+1mengubahnya menjadi ekspresi yang menghitung jumlah detik. Batch menginterpretasikan angka nol sebagai oktal jadi saya menambahkan a 1ke detik untuk memastikan konversi desimal; untungnya keduanya 1membatalkan.

Neil
sumber
5

C, 112 100 byte

Terima kasih kepada @betseg untuk menghemat 11 byte dan terima kasih kepada @Johan du Toit karena telah menghemat satu byte!

i,j;f(char*a,char*b){i=atoi(b)-atoi(a);j=atoi(b+2)-atoi(a+2);j<0?i--,j+=60:0;printf("%d:%02d",i,j);}

Cobalah online!

Steadybox
sumber
1
Anda dapat mengubah %s%ddengan %02ddan menghapus ?:. Cobalah online!
betseg
1
scanf()adalah teman Anda untuk membaca banyak bilangan bulat.
Digital Trauma
1
Anda juga dapat menyimpan 1 byte dengan menggunakan: j <0? I ++, j + = 60: 0;
Johan du Toit
@DigitalTrauma Nononono, Biasanya lebih pendek untuk menggunakan argumen yang dia lakukan.
Matius Roh
5

MySQL, 13 22 byte

select right(timediff(B,A),5)

mengharapkan waktu dalam Adan B.

Titus
sumber
4

Utilitas Bash + GNU, 43

date -d@`date -f- +%s|dc -e??r-60/p` +%M:%S

Cobalah online .

Penjelasan

         date -f- +%s                        # read in 2 line-delimited dates and output as number of seconds since the epoch
                     |dc -e                  # pipe to dc expression:
                           ??                # - read 2 input numbers
                             r-              # - reverse and subtract
                               60/           # - divide by 60
                                  p          # - output
        `                          `         # evaluate date|dc command
date -d@                             +%M:%S  # format seconds difference and output

Perhatikan bahwa dcungkapan dibagi menjadi 60, karena datemembaca input sebagai H: MM dan bukan M: SS.

Trauma Digital
sumber
4

ECMASkrip 6, 99 91 85 byte

Garis tunggal:

f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);t=n=>~~(n/60)+":"+n%60;t(f(b)-f(a));

Sedikit diformat:

f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);
t=n=>~~(n/60)+":"+n%60;
t(f(b)-f(a));

Saya merasa mungkin ada beberapa penghematan di sana .. tetapi saya tidak melihat mereka saat ini.

Edit - saran bagus di komentar.

Empat puluh3
sumber
Anda dapat menghapus tanda kurung di sekitar s.
Arjun
Dan bukannya s.split(":"), Anda dapat menggunakan sintaks baru: s.split<backtick>:<backtick>.
Arjun
4

PHP, 55 53 byte

<?=date('i:s',($s=strtotime)($argv[2])-$s($argv[1]));

mengambil input dari argumen baris perintah

Titus
sumber
1
53 byte:<?=date('i:s',($x=strtotime)($argv[2])-$x($argv[1]));
Ismael Miguel
4

C #, 72 byte

using System;a=>b=>((DateTime.Parse(b)-DateTime.Parse(a))+"").Remove(5);

Mengambil input sebagai string. b="3:15" a="1:45".

Penjelasan:

Karena DateTime.Parse()mengembalikan Tanggal dalam hh:mm:ssformat, saya dapat mem-parsing hasilnya menjadi string menggunakan +"", lalu memangkas trailing :00.

Ini berfungsi dengan baik hh:mmkarena ada 60 detik dalam satu menit dan 60 menit dalam satu jam.

0:01 0:00 kembali 0:01

1:00 0:55 kembali 0:05

3:15 1:45 kembali 1:30

Oliver
sumber
3
Sayangnya, DateTime.Parse()mengambil input - misalnya, 1:45- seperti hh:mmdan tidak mm:ss, menghasilkan output yang diikuti - untuk A 1:45 dan B 3:15 - [01:30:00]( hh:mm:ss) ( bahkan dengan yang CultureInfo.InvariantCultureditentukan ). Anda mungkin harus menambahkan "0:" + a/bketika parsing.
auhmaan
@auhmaan Ah, tangkapan yang bagus. Saya akhirnya memotong jalan :00.
Oliver
Saya percaya Anda perlu ;pada akhirnya, Anda dapat menggunakan kari yaitu a=>b=>, Anda harus memenuhi syarat DateTimeatau memasukkan sepenuhnya using System;.
TheLethalCoder
3

Rebol, 5 byte

b - a

Dengan asumsi saya tidak melewatkan aturan apa pun ..

Rebol memiliki built-in hitung untuk sejumlah tipe data literal. Ini juga berlaku untuk keturunannya seperti Merah

Geeky I
sumber
Saya tidak tahu banyak tentang bahasa ini.
Guci Gurita Ajaib
@carusocomputing chat.stackoverflow.com/rooms/291/rebol
Geeky I
2

Pyth, 47 45 44 40 Bytes

J.U-Zbm+*60hdedmmvkcd\:.z%"%d:%02d".DJ60

Membawa input dipisahkan oleh baris baru.

Pyth tidak punya waktu built-in berguna untuk ini. Saya mencoba beberapa barang eval () mewah tetapi tampaknya Pyth tidak dapat melakukan eval dengan barang *atau nol terkemuka apa pun. Ini menjadi lebih lama dari yang saya harapkan. Cukup banyak byte yang dihabiskan untuk menambahkan nol di depan untuk output. Setidaknya saya lebih pendek dari bash. Akan menambah penjelasan jika ditanya.

Coba ini!

solusi alternatif, 48 Bytes

J.U-Zbm+*60hdh_dmmvkcd\:.z
K%J60
s[/J60\:*<KT\0K
KarlKastor
sumber
2

Haskell, 98 127 86 Bytes

r(m:_:s)=60*read[m]+read s
a#b|(d,m)<-divMod(r b-r a)60=show d++':':['0'|m<=9]++show m

Cobalah online!

Tapi saya ingin tahu apakah ada beberapa fungsi perpustakaan untuk ini

EDIT: Impor dihapus, juga memperbaiki kesalahan di mana ia menunjukkan m: s bukan m: ss

Juga, versi yang diformat dengan baik:

convert :: String -> Integer
convert (a:_:b) = (read [a])*60+(read b)

diffTime :: String -> String -> String
diffTime s1 s2 = let (d,m) = divMod (c b-c a) 60 in show d ++ ":" ++ pad2d m

pad2d :: Int -> String
pad2d n = ['0'|n<=9]++show n

EDIT2: Golf off (30?) Bytes terima kasih kepada Laikoni! Juga bermain golf beberapa misc lainnya. byte.

Nama Tampilan Umum
sumber
1
Anda harus memberi tahu kami apa bahasa ini dan berapa byte yang digunakannya.
Josh
2
Ya, saya tidak bermaksud menekan posting (siapa yang tahu tab + enter dari kotak teks memposting jawaban Anda?)
Generic Display Name
Pendekatan yang sama, 86 byte: Cobalah online!
Laikoni
Saya tidak berpikir untuk menggunakan pemahaman daftar. Terima kasih :)
Nama Tampilan Umum
2

T-SQL, 238 byte

CREATE PROCEDURE d @a time,@b time AS BEGIN DECLARE @d int DECLARE @s varchar(2) SET @d=datediff(s,@a,@b);SET @s=CAST(@d%3600/60 AS VARCHAR(3)) SELECT CAST(@d/3600 AS VARCHAR(3))+':'+(SELECT CASE WHEN LEN(@s)=1 THEN '0'+@s ELSE @s END)END

Pemakaian:

EXEC d '00:55','01:00'

Melihat contoh PostGres sebelumnya saya menyadari bahwa saya belum melihat banyak upaya golf di SQL jadi saya mencobanya di T-SQL. Sekarang saya tahu mengapa Anda tidak melihat banyak golf di SQL: D

motosubatsu
sumber
2

CJam , 34 33 25 byte

Disimpan 8 byte berkat Martin Ender!

{r':/60b}2*\m60mds2Te[':\

Cobalah online!

Penjelasan

{             e# Start of block
 r            e#  Read one time from input
 ':/          e#  Split on colons, gives [minutes seconds]
 60b          e#  Convert from base 60
}2*           e# Run this block 2 times
              e# At this point, we have the two times in seconds on the stack
\             e# Swap top elements
m             e# Subtract
60md          e# Divmod the result by 60, to convert back to minutes and seconds
s             e# Convert the seconds to a string
2Te[          e# Pad it to 2 characters by adding 0s to the left (T = 0)
':            e# Push a colon character
\             e# Swap top elements, bringing seconds back to the top
Kucing Bisnis
sumber
2

T-SQL, 82 Bytes

select left(cast(dateadd(minute, datediff(S,'0:00','0:01')/60,114) as time(0)), 5)
Nelz
sumber
2

Python, 160 byte

Saya masih baru dengan kode golf jadi jika ada yang punya saran, saya akan sangat menghargainya.

a, b = input()
def z(x):
    x = x.split(":")
    return int(x[0])*60+int(x[1])
a, b = z(a),z(b)
s, m = b-a,0
while s >= 60:
    s -= 60
    m += 1
print(str(m)+":"+str(s))
JKonowitz
sumber
1
Halo dan selamat datang di situs kami. Tampaknya Anda mengambil input untuk program Anda dari variabel yang sudah diinisialisasi. Namun ini tidak diizinkan di bawah default untuk IO . Saya akan merekomendasikan untuk kasus khusus ini untuk mengambil input via raw_input().
Wheat Wizard
1

REXX, 79 byte

arg t q
say right(time(,f(q)-f(t),s),5)
f:return time(s,'00:'right(arg(1),5,0))
idrougge
sumber
1

Pyth, 28

%"%d:%02d".Dh.+misMcd\:60Q60

Cobalah .

Penjelasan

                   cd\:      # lambda to split c on ":"
                 sM          # map to convert string to int
               mi      60Q   # convert from base-60 list to give seconds
             .+              # delta of the two seconds values
            h                # single-item list to int
          .D              60 # divmod by 60
%"%d:%02d"                   # format output
Trauma Digital
sumber
1

Java 7, 164 byte

String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}

Penjelasan:

String c(String a, String b){       // Method with two String parameters and String return-type
  long s = x(b,1) - x(a,1)          //  Get difference in seconds from input times
           + (x(b,0) - x(a,0)*60,   //   plus the difference in minutes times 60 to get the seconds
    m = s%60;                       //  Temp variable of seconds after we've subtracted the minutes (used multiple times)
  return (s/60)                     //  Return minutes
    +":"                            //   plus ":"
    +(m>9?m:"0"+m);                 //   plus seconds (with a leading 0 if necessary)
}                                   // End of method

long x(String s,int i){             // Separate ethod with String and Integer parameters and long return-type
  return new Long(s.split(":")[i];  //  Return either minutes or seconds of String parameter based on the index
}                                   // End of method

Kode uji:

Coba di sini.

class M{
  String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}

  public static void main(String[] a){
    M m = new M();
    System.out.println(m.c("0:00", "0:01"));
    System.out.println(m.c("0:55", "1:00"));
    System.out.println(m.c("1:45", "3:15"));
  }
}

Keluaran:

0:01
0:05
1:30
Kevin Cruijssen
sumber
1

TXR Lisp, 101 byte

$ txr -e '(awk (:let (s "%M:%S"))
               ((mf (time-parse s))
                (prn (time-string-local (- [f 1].(time-utc) [f 0].(time-utc)) s))))'
13:49 14:49 
01:00
0:13 1:47
01:34
5:01 5:59
00:58
6:00 6:00
00:00
6:00 5:00
59:00

Kental: (awk(:let(s"%M:%S"))((mf(time-parse s))(prn(time-string-local(-[f 1].(time-utc)[f 0].(time-utc))s))))

Kaz
sumber
Anda memerlukan bytecount, dan saya tidak berpikir ini sepenuhnya golf.
Rɪᴋᴇʀ
1

Ruby , 91 byte

require'time';t=Time;d=t.parse($*[1])-t.parse($*[0]);puts t.at(d.to_i).utc.strftime '%H:%M'

Cobalah online!

Mengambil input dari argumen baris perintah.

Doa:

ruby outatime.rb $A $B

Contoh:

ruby outatime.rb 1:45 3:15

Keluaran:

01:30

sfgeorge
sumber
Selamat datang di situs ini!
DJMcMayhem
1

PowerShell 47 Bytes

param($s,[timespan]$f)($f-$s).ToString("h\:mm")

Matematikapanpan sederhana dan mencakup string jam dan detik.

Mat
sumber
0

JavaScript, 88 byte

a=>b=>{c=a.split`:`,d=b.split`:`;return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60}

Cobalah online!

Penjelasan:

Pisahkan input pada titik dua

c=a.split`:`,d=b.split`:`;

Mengubah string menjadi int

+c[0]

Mendapat nilai menit

+c[0]-d[0]-d[1]>c[1]?1:0

Mendapat nilai kedua

(+c[1]+60-d[1])%60

Mengembalikan menit string: detik

return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
fəˈnɛtɪk
sumber