タイムゾーンを変更する


20

チャレンジ

入力として時間とタイムゾーンを指定し、そのタイムゾーンの時間を出力します。

時間

時刻は次のような24時間形式で表示されます。

hh:mm

hhは2桁の時間、mmは2桁の分です。次のように、時間と分には常にゼロが埋め込まれることに注意してください。

06:09

指定された時間はすべてUTC + 00:00です。

出力の時間をゼロで埋める必要はありませんが、時間は24時間形式である必要があります

タイムゾーン

タイムゾーンは次の形式で提供されます。

UTC±hh:mm

ここで、±は+または-であり、hhは2桁の時間で、mmは2桁の分です(ここでも、ゼロが埋め込まれます)。

そのタイムゾーンの時間を見つけるには、入力された時間からUTC±の後の時間を加算(シンボルが+の場合)または減算(シンボルが-の場合)します。

たとえば、入力が24:56との場合、UTC-02:5024:56から2時間50分を減算します。

24:56
02:50 -
-----
22:06

出力はになります22:06

シカゴ

Input:  08:50 and UTC-06:00
Output: 02:50

カトマンズ

Input:  09:42 and UTC+05:45
Output: 15:27

サモア

Input:  06:42 and UTC+13:00
Output: 19:42

ハワイ

Input:  02:40 and UTC-10:00
Output: 16:40

これは前日に行ったことに注意してください。

東京

Input:  17:25 and UTC+09:00
Output: 02:25

これは翌日になっていることに注意してください。

ルール

組み込みの日付関数またはライブラリを使用しないでください。

すべての入力が有効な時間と時間オフセットになると仮定します。

タイムゾーンはUTC-24:00UTC+24:00包括的範囲になります。

午前0時半の場合では、正しい表現はそう00:30はなく 、あるべき24:30です。

勝ち

バイト単位の最短コードが優先されます。


TimeSpan / Durationのメソッド/クラスはどうですか?それらも除外されると
思います-pinkfloydx33

また、入力値は常に有効な時間ですか?すなわち26:0208:74表示されないでしょうか?UTCオフセットについても同じですか?
pinkfloydx33

@ pinkfloydx33 1)はい、すべて除外されます。2)すべての入力が有効であると仮定
ベータ崩壊

出力にゼロを埋め込む必要がありますか?(例:最後のテストケースを出力できます2:25
Loovjo

1
出力をパディングする必要がない場合は1:51:05?時間だけを埋めるべきではないと思います。また、あなたの例は、午前0時半のシナリオで範囲を述べ、同様のことを表現したので、そうではあり24:56ませんか?00:5624:00
pinkfloydx33

回答:


2

APL(Dyalog APL)、45 バイト

表現

正しい引数として2つの文字列を取ります。

24 60⊤∘⍎∘⍕('+-'∩⍕),'/',(0 602':'VFI ¯5∘↑)¨

オンラインでお試しください!

説明

24 60⊤数値から基数へのa 24 b 60変換

評価

フォーマット済み(つまり、スペースで区切ってフラット化)

('+-'∩⍕) 「+-」とフォーマットされた入力の交差点(これによりプラスまたはマイナスが抽出されます)

, に続く

(... 各入力(時間とオフセット)について次の

0 60⊥B 60の-to-数変換

2⊃ の2番目の要素

':'⎕VFI、フィールドセパレータとしてコロンを使用して、Vは erified及びFは ixed IをのNPUT

¯5∘↑ 最後の5文字( "hh:mm")

「17:25」および「UTC + 09:00」のステップバイステップ

右側のデータの左側の式は、次の行のデータを提供します。

                       「17:25」「UTC + 09:00」
                      / / \ \
(...)¨関数トレインを両方の入力に適用します
                    / / \ \
¯5∘↑'17:25 '' UTC + 09:00 '
':'⎕VFI'17:25 ''09:00' 
2⊃(1 1)(17 25)(1 1)(9 0)
060⊥17 25 9 0
                      1045 540
                       \ \ / /
¨が停止し、結果のリストで実行が継続します
                         \ \ / /
「/」、1045 540
( '+-'∩⍕)、 '/' 1045 540
⍕ '+' '/' 1045 540
⍎ '+ / 1045 540'
2460⊤1585
                              2 25

3

C、109バイト

a,b,c;f(char*t,char*z){for(c=0;z[3];t=z+=3)sscanf(t,"%d:%d",&a,&b),c+=b+a*60;printf("%d:%02d",c/60%24,c%60);}

次のように呼び出します。

int main() { f("17:25", "UTC+09:00"); }

1
これは負の時間オフセットに対してどのように機能しUTC-03:30ますか?
ニール

おっと、私はそれらについて忘れていましたが、ありがたいことに、それは簡単な修正です。
リン

3

JavaScript(ES6)、101バイト

(t,z,g=s=>+(s[3]+s[7]+s[8])+s.slice(3,6)*60,m=g('UTC+'+t)+g(z)+1440)=>(m/60%24|0)+':'+(m/10%6|0)+m%10

時間を埋めると121バイトになります。


3

Python 2、129バイト

def T(t,a):f=[int.__add__,int.__sub__]["-"in a];m=f(int(t[3:5]),int(a[7:9]));print`f(int(t[0:2])+m/60,int(a[4:6]))%24`+":"+`m%60`

として呼び出す T("02:45", "UTC-05:33")


1
フォーマットされた出力に先行ゼロがない。見出しにPython 2と書かれているはずです。で1行関数に減らすことができ;ます。
ジョナサンアラン


ああ、かっこいい、そのビットを見逃した!ありがとう
ジョナサンアラン


2

Java 201バイト

String T(String t,String z){return(24+Integer.valueOf(t.substring(0,2))+Integer.valueOf((String)z.subSequence(3,6)))%24+":"+(60+Integer.valueOf(t.substring(3,5))+Integer.valueOf(z.substring(7,9)))%60;}

T( "12:00"、 "UTC + 02:40")として呼び出されます

論理的には、

String T(String t, String z) { 
    int i = (24 + Integer.valueOf(t.substring(0, 2)) + Integer.valueOf((String) z.subSequence(3, 6))) % 24;
    int j = (60 + Integer.valueOf(t.substring(3, 5)) + Integer.valueOf(z.substring(7, 9))) % 60;
    return i + ":" + j;
}

200未満にするための助けをいただければ幸いです!


これには欠陥があります。2番目のテスト(時間を増分する)を満たしていません。また、減らすために、部分文字列の代わりにsubSequenceを使用するのはなぜですか?ゴルフにより、宣言Integer i=1;および他のすべてを置き換えるIntegerことにより、iあなたが持っているので、i.valueOf代わりにInteger.valueOf
オリビエグレゴワール

@OlivierGrégoireえ?2回目のテストについて詳しく説明してください。
ウォンバ

カトマンズのテストケースでは、の14:27代わりに出力します15:27
オリビエグレゴワール

@OlivierGrégoire良い点
ウォンバ

またはjava.util.function.Function v=Integer::valueOf。それが実際に多くを節約するかどうかはわかりません。
ロバートフレイザー

1

ルビー、95バイト

g=->s{"60*"+s.scan(/\d+/).map(&:to_i)*?+}
f=->t,z{r=eval(g[t]+z[3]+g[z]);print r/60%24,?:,r%60}

使用法

f[gets,gets]

入力(例)

08:50
UTC-06:00

1

Javascript(ES6)、93 92バイト

t=>((t=eval(t.replace(/.*?(.)?(..):(..)/g,'$1($2*60+$3)+720')))/60%24|0)+':'+(t/10%6|0)+t%10

テストケース

let f =
t=>((t=eval(t.replace(/.*?(.)?(..):(..)/g,'$1($2*60+$3)+720')))/60%24|0)+':'+(t/10%6|0)+t%10

console.log(f("08:50 UTC-06:00")); //  2:50
console.log(f("09:42 UTC+05:45")); // 15:27
console.log(f("06:42 UTC+13:00")); // 19:42
console.log(f("02:40 UTC-10:00")); // 16:40
console.log(f("17:25 UTC+09:00")); //  2:25


0

Java 156 150 149 147 142バイト

t->z->{Integer H=100,T=H.valueOf(t.replace(":","")),Z=H.valueOf(z.replace(":","").substring(3)),c=(T/H+Z/H+24)*60+T%H+Z%H;return c/60%24+":"+c%60;}

テストケースと未使用

import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {

        BiFunction<String,String,String> f = (t,z)->{
            Integer H = 100, // Hundred, used several times, shorter as variable
                    T = H.valueOf(t.replace(":","")), // as int (HHMM)
                    Z = H.valueOf(z.replaceAll("[UTC:]","")), // as int (-HHMM)
                    c = (T/H + Z/H + 24) * 60 + T%H + Z%H; // transform into minutes
            return c/60%24+":"+c%60;
        };

        test(f, "08:50", "UTC-06:00", "02:50");
        test(f, "09:42", "UTC+05:45", "15:27");
        test(f, "03:42", "UTC-05:45", "21:57");
        test(f, "06:42", "UTC+13:00", "19:42");
        test(f, "02:40", "UTC-10:00", "16:40");
        test(f, "17:25", "UTC+09:00", "02:25");
    }

    private static void test(BiFunction<String,String,String> f, String time, String zone, String expected) {
        // Padding is allowed. Make sure the padding is skipped for the test, then.
        String result = String.format("%2s:%2s", (Object[])f.apply(time, zone).split(":")).replace(" ","0");
        if (result.equals(expected)) {
            System.out.printf("%s + %s: OK%n", time, zone);
        } else {
            System.out.printf("%s + %s: Expected \"%s\", got \"%s\"%n", time, zone, expected, result);
        }

    }
}

削り屑

  • 150-> 149:a/H*60+b/H*60->(a/H+b/H)*60
  • 149-> 147:(T/H+Z/H)*60+1440-> (T/H+Z/H+24)*60
  • 147-> 142:z.replace(":","").substring(3)->z.replaceAll("[UTC:]","")

0

C#214 205の 183バイト

string f(char[]t,char[]u){int s=~(u[3]-45),z=48,m=(t[3]-z)*10+t[4]-z+((u[7]-z)*10+u[8]-z)*s,h=(t[0]-z)*10+t[1]-z+((u[4]-z)*10+u[5]-z)*s+m/60+(m>>8)+24;return$"{h%24}:{(m+60)%60:D2}";}

205バイトバージョン

string f(string t,string u){Func<string,int>P=int.Parse;var T=t.Split(':');int s=u[3]<45?1:-1,m=P(T[1])+P(u.Substring(7))*s,h=P(T[0])+P($"{u[4]}"+u[5])*s+m/60+(m<0?-1:0)+24;return$"{h%24}:{(m+60)%60:D2}";}

非ゴルフ

string f(char[] t, char[] u)
{
    int s = ~(u[3]-45),
        z = 48,
        m = (t[3] - z) * 10 + t[4] - z + ((u[7] - z) * 10 + u[8] - z) * s,
        h = (t[0] - z) * 10 + t[1] - z + ((u[4] - z) * 10 + u[5] - z) * s + m / 60 + (m>>8) + 24;
    return $"{h % 24}:{(m + 60) % 60:D2}";
}

オリジナル214:

string f(string t,string u){Func<string,int>P=int.Parse;var T=t.Split(':');int h=P(T[0]),m=P(T[1]),s=u[3]<45?1:-1;m+=P(u.Substring(7))*s;h+=P($"{u[4]}"+u[5])*s+m/60+(m<0?-1:0)+24;return$"{h%24:D2}:{(m+60)%60:D2}";}

0

CJam、40バイト

r{':/60b}:F~r3>(\F\~1440,=60b{s2Te[}%':*

オンラインでお試しください!(テストスイートとして。)

説明

r           e# Read first input (time).
{':/60b}:F  e# Define a function F, which splits a string around ':' and
            e# treats the two elements as base-60 digits.
~           e# Run that function on the first input.
r3>         e# Read the second input and discard the 'UTC'.
(           e# Pull off the +-.
\F          e# Apply F to the timezone offset.
\~          e# Execute the + or - on the two amounts of minutes.
1440,=      e# Modulo 1440 to fit everything into the 24-hour format.
60b         e# Obtain base 60 digits again.
{s2Te[}%    e# Convert each digit to a string and pad it to 2 decimal digits.
':*         e# Join them with a ':'.

0

網膜、100バイト

:
59$*:,
+`(\d+):
$1,$1
\d+
$*
T`1`0`-.+
^
1440$*
+`10|\D

1{1440}

^(1{60})*(.*)
$#1:$.2
\b\d\b
0$&

オンラインでお試しください!

説明

:
59$*:,

それぞれ:を59個の区切り文字とコンマで置き換えます。

+`(\d+):
$1,$1

の前の番号を繰り返し複製し:ます。したがって、最初の2つの段階では、時間値に60を掛けます。

\d+
$*

各数値を単項に変換します。

T`1`0`-.+

入力にマイナス記号が含まれている場合、この音訳段階では、その後のすべての1sがsに変換され0ます。ここでは基本的に0単項-1数字として使用しています。

^
1440$*

1440 1秒(つまり1日)を挿入します。これは、時間がマイナスにならないようにするためです。

+`10|\D

これを繰り返し、すべての非数字(すなわちスペース、削除UTC+または-、だけでなく、すべての,私たちが挿入した)と10組み合わせ、それによって、正と負の数字をキャンセルします。これは基本的に、負の場合は最初の数値から2番目の数値を減算し、そうでない場合は加算します。

1{1440}

1可能な場合は1440を削除します(基本的に1440を法として結果を取得し、単一の24時間に適合させます)。

^(1{60})*(.*)
$#1:$.2

できるだけ多くの60桁のチャンクを一致させ(でチャンクをカウント$#1)、その後に残りの数字(その長さはでカウントされます$.2)を一致させることで、数値を時間と分に分解します。

\b\d\b
0$&

結果に1桁の数字がある場合は、ゼロを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.