残り時間はどれくらいですか?


31

プログラム

ABの 2つの文字列が与えられます。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では入力が誤って読み取られます。代わりにスペースを使用できますか、またはこれに答えるために他の言語を見つける必要がありますか?
seshoumara

1
ある01:30有効な出力は?(先頭ゼロ)
ルイスメンドー

2
はい、それを有効なものとして受け入れます。説明を編集します。
ジョシュ

1
@seshoumara入力にはコロンが含まれている必要があります。
ジョシュ

mに期待される最大値は何ですか?
デジタル外傷

回答:


92

Excel、6バイト

=B1-A1

Aがセル内にA1あり、Bがセル内にあると仮定しますB1


37
いいえ...いいえ...私は勝つことはできません。+1よこしまな個人。
魔法のタコUr

2
それをキャンセルし、|vy':¡05AB1E にブートストラップされて、私にできることは何もありません...私はExcelが正直にこれに勝つかもしれないと思います。
魔法のタコUr

7
どうやって?どうやって?Excelはどのように勝利していますか?私の脳は今explo ...しなければならない
coinheringaahing caird

2
mが23より大きい場合、フォーマットは機能していないようです。私が入力した場合たとえば、45:45A1にし、22:22B1で、その後、結果は23:23:00 編集ネヴァーマインド-の最大期待値mが 9である
デジタルトラウマ

4
@EngineerToastデフォルトのフォーマットが何であれ、私にとってはうまくいきます。入力を入力し、別のセルに移動し、数式を入力してEnterキーを押しました。
ライリー


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のように見えます。–
ライリー

1
@Riley 44を囲むスペースも消し去り、そもそもそこにあったはずの効果を得ました。
seshoumara


7

パイソン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)

オンラインで試す



あなたは、いくつかのバイトを保存するために、リストの内包表記を使用することができますa,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
フェリペ・ナルディバティスタ

間違っていなければ、最後の2行を3文字追加して保存できます。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%

:時間をinに置き換えると、*60+1秒数を計算する式に変換されます。バッチは先行ゼロを8進数として解釈するので1、10進数の変換を確実にするために秒の前にaを追加します。幸いなことに、2つは1キャンセルされます。


5

C、112バイト

11バイトを保存してくれた@betsegと、1バイトを保存してくれた@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
また、j <0?i ++、j + = 60:0;を使用して1バイトを保存することもできます。
ヨハンデュトワ

@DigitalTrauma Nononono、彼がやった引数を使う方が通常は短いです。
マシュー盧

5

MySQL、13 22バイト

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

との時間を期待しAていBます。


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

入力はM:SSではなくH:MMとして読み取られるdcため、式は60で除算されることに注意してくださいdate


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ます。
アルジュン

そして代わりにs.split(":")、新しい構文を使用できます:s.split<backtick>:<backtick>
アルジュン

4

PHP、55 53バイト

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

コマンドライン引数から入力を取ります


1
53バイト:<?=date('i:s',($x=strtotime)($argv[2])-$x($argv[1]));
イスマエルミゲル

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は、1分に60秒と1時間に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:45B 3:15 - ()([01:30:00] 偶数で指定します)。解析時にaを追加する必要がある場合があります。hh:mm:ssCultureInfo.InvariantCulture"0:" + a/b
-auhmaan

@auhmaanああ、いいキャッチ。最終的に後端をトリミングしました:00
オリバー

私はあなたが;最後に必要であると信じています、あなたはカリーを使用することができますa=>b=>、すなわち、あなたは完全に修飾するDateTimeか、含める必要がありますusing System;
TheLethalCoder


2

Pyth、47 45 44 40バイト

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

入力を改行で区切ります。

Pythにはこれに役立つ組み込みの時間はありませんでした。私はいくつかの派手なeval()のものを試しましたが、Pythは*何もまたは先行ゼロを評価できません。これは思っていたよりずっと長くなりました。出力に先行ゼロを追加するのにかなりのバイトが費やされます。少なくとも私はbashより短い。質問があれば説明を追加します。

これを試して!

代替ソリューション、48バイト

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

2

Haskell、98 127 86バイト

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:ssではなくm:sを表示するエラーも修正しました。

また、適切にフォーマットされたバージョン:

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:Laikoniのおかげで、ゴルフ(30?)バイトができました!また、いくつかの他のゴルフをした。バイト。


1
これがどの言語で、どのくらいのバイトを使用しているかを教えてください。
ジョシュ

2
ええ、私は投稿を押すつもりはありませんでした(誰がテキストボックスからtab + enterを知っていたのですか?)
一般的な表示名

同じアプローチ、86バイト:オンラインで試してみてください!
ライコニ

リスト内包表記を使用することは考えていませんでした。ありがとう:)
一般的な表示名

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

CJam34 33 25バイト

Martin Enderのおかげで8バイト節約されました!

{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

T-SQL、82バイト

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

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

REXX、79バイト

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

1

Pyth、28

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

やってみてください

説明

                   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

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

PowerShell 47バイト

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

時間と秒の文字列に変換する単純なタイムスパンの数学。


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

2番目の値を取得します

(+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.