เหลือเวลาอีกเท่าไร


31

โปรแกรม

คุณจะได้รับสองสายและB Aคือตำแหน่งปัจจุบันที่ตัวจับเวลาของคุณอยู่ที่และBคือตำแหน่งที่ตัวจับเวลาของคุณจะหยุด สตริงทั้งสองอยู่ในรูปแบบm: ss คุณต้องเขียนโปรแกรมที่กำหนดจำนวนของเวลาที่เหลือซึ่งก็ควรจะจัดรูปแบบเป็นm: ssหรือmm: ss

ตัวอย่าง

0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30

1
ใน dc อินพุตถูกอ่านอย่างไม่ถูกต้องเนื่องจาก:เป็นคำสั่ง (data as Philosophy code) ฉันได้รับอนุญาตให้ใช้ช่องว่างแทนหรือฉันจำเป็นต้องค้นหาภาษาอื่นเพื่อตอบคำถามนี้หรือไม่?
seshoumara

1
01:30ออกที่ถูกต้องคืออะไร? (นำหน้าศูนย์)
หลุยส์เมนโดะ

2
ใช่ฉันจะยอมรับว่าถูกต้อง ฉันจะแก้ไขคำอธิบาย
Josh

1
@seshoumara อินพุตต้องมีโคลอน
Josh

ค่าสูงสุดที่คาดหวังสำหรับmคือเท่าใด
บาดเจ็บทางดิจิตอล

คำตอบ:


92

Excel, 6 ไบต์

=B1-A1

สมมติว่า A อยู่ในเซลล์A1และ B อยู่ในเซลล์B1


37
ไม่ ... ไม่ ... ฉันจะไม่ยอมให้ชนะไปเลย +1 คุณเป็นคนคดเคี้ยว
Magic Octopus Urn

2
ยกเลิกที่|vy':¡bootstrapped ใน 05AB1E ไม่มีอะไรที่ฉันทำได้ ... ฉันคิดว่า Excel อาจชนะสิ่งนี้โดยสุจริตไม่มีอะไรแยกวิเคราะห์รูปแบบนั้นโดยอัตโนมัติที่ฉันรู้
Magic Octopus Urn

7
อย่างไร อย่างไร Excel ชนะได้อย่างไร ตอนนี้สมองของฉันต้อง
เอารัดเอาเปรียบ

2
หากmมากกว่า 23 แสดงว่าการจัดรูปแบบไม่ทำงาน ตัวอย่างเช่นถ้าฉันพิมพ์45:45ใน A1 และ22:22ใน B1 ผลลัพธ์จะเป็น23:23:00 Edit Nevermind - ค่าสูงสุดที่คาดไว้สำหรับmคือ 9
Digital Trauma

4
@EngineerToast ไม่ว่าการจัดรูปแบบเริ่มต้นจะใช้งานได้สำหรับฉัน ฉันเพิ่งพิมพ์ในอินพุตย้ายไปที่เซลล์อื่นพิมพ์สูตรและกด Enter
Riley

15

MATL , 17 7 ไบต์

YOd15XO

การป้อนข้อมูลเป็นอาร์เรย์เซลล์ของสตริงในรูปแบบหรือ{'1:45' '3:15'}{'1:45', '3:15'}

ลองออนไลน์!

คำอธิบาย

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)

ดี! ดำเนินการต่อไป!
Suever

8

Bash + coreutils, 44 39 ไบต์

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

ลองออนไลน์!

คำอธิบาย:ใช้ "1:45 3:15" เป็นกรณีทดสอบ (ตัวอย่างล่าสุด) ฉันแสดงขั้นตอนตัวกลางในเครื่องหมายคำพูด

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.

โปรดทราบว่าฉันไม่ได้ตรวจสอบว่าค่านาทีจำเป็นต้องมีการเติมเต็มศูนย์หรือไม่เนื่องจาก OP ระบุว่าค่าสูงสุดสำหรับmคือ 9


ด้านล่างคือคำตอบ 44 ไบต์เดิมของฉันซึ่งใช้dateคำสั่งเพื่อเปลี่ยนเวลาทั้งหมดที่เหลือในไม่กี่วินาทีให้เป็นm:ssรูปแบบ

date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S

2
@ DigitalTrauma ขอบคุณ แต่ในที่สุดฉันก็สามารถลบคำสั่ง date และทำการพิมพ์รูปแบบใน dc เช่นกัน
seshoumara

1
ตัดออก 44 มีลักษณะเหมือนปกติ 44
Riley

1
@ ไรลีย์ฉันข้ามช่องว่างรอบ 44 ด้วยเพื่อรับผลที่ควรมีในตอนแรก
seshoumara


7

Python 2, 90 87 83 80 ไบต์

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

ลองออนไลน์



คุณสามารถใช้ list comprehension เพื่อบันทึกหลายไบต์:a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
Felipe Nardi Batista

ถ้าฉันไม่ผิดคุณสามารถบันทึกตัวละครทั้งสามเพิ่มเติมเปลี่ยนสองบรรทัดสุดท้ายโดยprint'%d:%02d'%divmod(b-a,60):)
Morwenn


5

แบตช์ 74 ไบต์

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

การแทนที่:ในเวลาด้วย*60+1แปลงเป็นนิพจน์ที่คำนวณจำนวนวินาที แบทช์ตีความเลขศูนย์นำหน้าเป็นเลขฐานแปดดังนั้นฉันจึงบวก a เป็น1วินาทีเพื่อให้แน่ใจว่ามีการแปลงทศนิยม โชคดีที่ทั้งสอง1ยกเลิก


5

C, 112 100 ไบต์

ขอบคุณ @betseg สำหรับการบันทึก 11 ไบต์และขอบคุณ @Johan du Toit สำหรับการบันทึกหนึ่งไบต์!

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

ลองออนไลน์!


1
คุณสามารถเปลี่ยน%s%dกับและลบ%02d ลองออนไลน์! ?:
betseg

1
scanf()เป็นเพื่อนของคุณที่อ่านจำนวนเต็มหลายจำนวน
บาดเจ็บทางดิจิทัล

1
คุณสามารถบันทึก 1 ไบต์โดยใช้: j <0? i ++, j + = 60: 0;
Johan du Toit

@DigitalTrauma Nononono มักใช้เวลาในการโต้แย้งที่สั้นลง
Matthew Roh


4

ยูทิลิตี Bash + GNU, 43

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

ลองมันออนไลน์

คำอธิบาย

         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

สังเกตว่าdcนิพจน์หารด้วย 60 เพราะdateอ่านอินพุตเป็น H: MM แทน M: SS


4

ECMAScript 6, 99 91 85 ไบต์

แถวเดียว:

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

รูปแบบเล็กน้อย:

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

ฉันรู้สึกว่าอาจมีเงินออมอยู่บ้าง .. แต่ฉันไม่เห็นพวกเขาในปัจจุบัน

แก้ไข - คำแนะนำที่ยอดเยี่ยมในความคิดเห็น


sคุณสามารถลบวงเล็บรอบ
Arjun

และแทนที่จะคุณสามารถใช้ไวยากรณ์ใหม่:s.split(":") s.split<backtick>:<backtick>
Arjun

4

PHP, 55 53 ไบต์

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง


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

4

C #, 72 ไบต์

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

รับอินพุตเป็นสตริง b="3:15" a="1:45".

คำอธิบาย:

เพราะDateTime.Parse()ผลตอบแทนที่วันที่ในhh:mm:ssรูปแบบที่ผมก็สามารถที่จะแยกผลเป็นสตริงใช้แล้วตัดต่อท้าย+"":00

ใช้ได้กับhh:mmเพราะมีทั้ง 60 วินาทีในหนึ่งนาทีและ 60 นาทีในหนึ่งชั่วโมง

0:01 0:00 ผลตอบแทน 0:01

1:00 0:55 ผลตอบแทน 0:05

3:15 1:45 ผลตอบแทน 1:30


3
น่าเสียดายที่DateTime.Parse()การใช้อินพุต - เช่น1:45- เป็นhh:mmและไม่mm:ssส่งผลให้เกิดผลลัพธ์ตามมา - สำหรับA 1:45และB 3:15 - [01:30:00]( hh:mm:ss) ( แม้จะมีการCultureInfo.InvariantCultureระบุไว้ ) คุณอาจต้องเพิ่ม"0:" + a/bเมื่อแยกวิเคราะห์
auhmaan

@auhmaan Ah จับได้ดี :00ฉันสิ้นสุดขึ้นตัดต่อท้าย
Oliver

ผมเชื่อว่าคุณต้องมี;ในท้ายที่สุดแล้วคุณสามารถใช้ currying คือa=>b=>คุณจะต้องมีคุณสมบัติอย่างเต็มที่หรือรวมDateTime using System;
TheLethalCoder

3

Rebol ขนาด 5 ไบต์

b - a

สมมติว่าฉันไม่พลาดกฎใด ๆ ..

Rebol มีเลขคณิตในตัวสำหรับชนิดข้อมูลตามตัวอักษรจำนวนหนึ่ง นอกจากนี้ยังใช้กับลูกหลานของมันเช่นสีแดง


ฉันรู้น้อยมากเกี่ยวกับภาษานี้
Magic Octopus Urn


2

Pyth, 47 45 44 40 Bytes

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

นำอินพุตแยกจากกันโดยขึ้นบรรทัดใหม่

Pyth ไม่มีเวลาในตัวที่มีประโยชน์สำหรับสิ่งนี้ ฉันลองสิ่งที่แฟนซี eval () แต่ Pyth เห็นได้ชัดว่าไม่สามารถพิสูจน์ได้ด้วย*หรือนำเลขศูนย์ใด ๆ สิ่งนี้นานกว่าที่ฉันคาดไว้มาก ค่อนข้างบางไบต์ใช้ในการเพิ่มศูนย์นำไปสู่การส่งออก อย่างน้อยฉันก็สั้นกว่าทุบตี จะเพิ่มคำอธิบายถ้าถาม

ลองนี้สิ!

ทางเลือกอื่น 48 ไบต์

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

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

ลองออนไลน์!

แต่ฉันสงสัยว่ามีฟังก์ชั่นห้องสมุดสำหรับนี้หรือไม่

แก้ไข: ลบการนำเข้ายังแก้ไขข้อผิดพลาดที่แสดง m: s แทน m: ss

นอกจากนี้เวอร์ชันที่มีรูปแบบดี:

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

แก้ไข 2: Golfed off (30?) ไบต์ขอบคุณ Laikoni! นอกจากนี้ยังเคยตีกอล์ฟอื่น ๆ อีกมากมาย ไบต์


1
คุณควรบอกเราว่าภาษานี้คืออะไรและมีกี่ไบต์ที่ใช้
Josh

2
ใช่ฉันไม่ได้ตั้งใจจะกดโพสต์ (ใครจะรู้ว่าแท็บ + ป้อนจากกล่องข้อความโพสต์คำตอบของคุณ?)
ชื่อที่แสดงทั่วไป

วิธีการเดียวกัน 86 ไบต์: ลองออนไลน์!
Laikoni

ฉันไม่คิดว่าจะใช้ความเข้าใจในรายการ ขอบคุณ :)
ชื่อที่แสดงทั่วไป

2

T-SQL ขนาด 238 ไบต์

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

การใช้งาน:

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

เมื่อเห็นตัวอย่าง PostGres ก่อนหน้านี้ฉันรู้ว่าฉันไม่เคยเห็นความพยายามตีกอล์ฟหลายครั้งใน SQL ดังนั้นฉันจึงลองใช้ T-SQL ตอนนี้ฉันรู้แล้วว่าทำไมคุณไม่เห็นการเล่นกอล์ฟใน SQL: D


2

CJam , 34 33 25 ไบต์

บันทึก 8 ไบต์ด้วย Martin Ender!

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

ลองออนไลน์!

คำอธิบาย

{             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


2

Python ขนาด 160 ไบต์

ฉันยังใหม่กับรหัสกอล์ฟดังนั้นหากใครมีคำแนะนำฉันจะขอบคุณมัน

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

1
สวัสดีและยินดีต้อนรับสู่เว็บไซต์ของเรา ดูเหมือนว่าคุณกำลังรับอินพุตสำหรับโปรแกรมของคุณจากตัวแปรที่มีค่าเริ่มต้น อย่างไรก็ตามเรื่องนี้ไม่ได้รับอนุญาตภายใต้ออกค่าเริ่มต้นสำหรับ IO raw_input()ผมอยากจะแนะนำสำหรับกรณีเฉพาะนี้จะมีการป้อนข้อมูลผ่านทาง
ข้าวสาลีตัวช่วยสร้าง



1

Java 7, 164 ไบต์

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

คำอธิบาย:

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

รหัสทดสอบ:

ลองที่นี่

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

เอาท์พุท:

0:01
0:05
1:30

1

TXR Lisp, 101 ไบต์

$ 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

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


คุณต้องมีจำนวนเงินและฉันไม่คิดว่ามันจะเป็นกอล์ฟอย่างเต็มที่
Rɪᴋᴇʀ

1

Ruby , 91 ไบต์

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

ลองออนไลน์!

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง

ภาวนา:

ruby outatime.rb $A $B

ตัวอย่าง:

ruby outatime.rb 1:45 3:15

เอาท์พุท:

01:30


ยินดีต้อนรับสู่เว็บไซต์!
DJMcMayhem

1

PowerShell 47 ไบต์

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

คณิตศาสตร์ timespan ง่ายและครอบคลุมถึงชั่วโมงและวินาที


0

JavaScript, 88 ไบต์

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}

ลองออนไลน์!

คำอธิบาย:

แยกอินพุตในลำไส้ใหญ่

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

แปลงสตริงเป็น int

+c[0]

รับค่านาที

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

รับค่าที่สอง

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

ส่งคืนสตริงนาที: วินาที

return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.