เปลี่ยนเขตเวลา


20

ท้าทาย

ให้เวลาและเขตเวลาเป็นอินพุตให้ส่งออกเวลาในเขตเวลานั้น

เวลา

เวลาจะได้รับในรูปแบบ 24 ชั่วโมงดังนี้:

hh:mm

โดยที่ hh คือชั่วโมงสองหลักและ mm คือนาทีสองหลัก โปรดทราบว่าชั่วโมงและนาทีจะเต็มไปด้วยศูนย์เช่น:

06:09

เวลาทั้งหมดที่ให้ไว้คือ UTC + 00: 00

ชั่วโมงในเอาต์พุตของคุณไม่จำเป็นต้องเป็นศูนย์ด้วยเบาะ แต่เวลาของคุณจะต้องอยู่ในรูปแบบ 24 ชั่วโมง

เขตเวลา

เขตเวลาจะได้รับในรูปแบบต่อไปนี้:

UTC±hh:mm

โดยที่±จะเป็น + หรือ a - และ hh คือสองหลักชั่วโมงและ mm คือนาทีสองหลัก (อีกครั้งเหล่านี้จะถูกเติมด้วยศูนย์)

ในการหาเวลาในเขตเวลานั้นคุณสามารถเพิ่ม (ถ้าสัญลักษณ์คือ +) หรือลบ (ถ้าสัญลักษณ์คือ -) เวลาหลังจาก UTC ±จากเวลาที่ป้อน

ตัวอย่างเช่นหากอินพุตเป็น24:56และUTC-02:50คุณจะลบ 2 ชั่วโมง 50 นาทีจาก 24:56:

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:00จะUTC+24:00รวม

ในกรณีของครึ่งเวลาเที่ยงคืนที่ผ่านมาที่เป็นตัวแทนที่ถูกต้องควรจะเป็น00:30, ไม่ 24:30

การชนะ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


สิ่งที่เกี่ยวกับวิธีการ TimeSpan / Duration / คลาส? ฉันคิดว่าสิ่งเหล่านั้นจะถูกยกเว้นด้วย
pinkfloydx33

ค่าอินพุตจะเป็นเวลาที่ถูกต้องเสมอหรือไม่ เช่น26:02และ08:74จะไม่ปรากฏขึ้น? เช่นเดียวกับ UTC ออฟเซ็ต?
pinkfloydx33

@ pinkfloydx33 1) ใช่สิ่งเหล่านั้นถูกยกเว้น 2) สมมติว่าอินพุตทั้งหมดถูกต้อง
สลายตัวของเบต้า

เราต้องปัดเอาท์พุทด้วยศูนย์? (เช่น. สามารถส่งออกกรณีทดสอบล่าสุด2:25)
Loovjo

1
ถ้าเอาท์พุทไม่จำเป็นต้องบุนวมเวลา1:5จะถูกต้องแทนที่จะเป็น1:05? ฉันคิดว่าเพียงไม่กี่ชั่วโมงเท่านั้นที่จะไม่ได้รับการเสริมแรง ตัวอย่างของคุณ24:56ที่ไม่ควรเป็นเช่นนั้น00:56เพราะคุณได้กล่าวถึงช่วง24:00และแสดงคล้ายกันในสถานการณ์ครึ่งเที่ยงคืนที่ผ่านมาของคุณหรือไม่
pinkfloydx33

คำตอบ:


2

APL (Dyalog APL) ขนาด 45 ไบต์

การแสดงออก

รับสองสายเป็นอาร์กิวเมนต์ที่ถูกต้อง

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

ลองออนไลน์!

คำอธิบาย

24 60⊤จำนวนการ base- 24 60แปลง

ของ

การประเมินผล

ของ

การจัดรูปแบบ (เช่นแบนด้วยการแยกช่องว่าง)

('+-'∩⍕) จุดตัดของ "+ -" และอินพุตที่จัดรูปแบบ (ซึ่งจะแยกเครื่องหมายบวกหรือลบ)

, ติดตามโดย

(... ข้อมูลต่อไปนี้สำหรับแต่ละอินพุต (เวลาและออฟเซ็ต)

0 60⊥60แปลง-to- จำนวน

2⊃ องค์ประกอบที่สองของ

':'⎕VFIโดยใช้ลำไส้ใหญ่เป็นตัวคั่นฟิลด์V erified และFคงที่ฉัน nput ของ

¯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)
0 60⊥ ​​17 25 9 0
                      1045 540
                       \ \ / /
นี่คือที่ที่¨หยุดและการดำเนินการต่อในรายการผลลัพธ์
                         \ \ / /
'/', 1045 540
('+ -' ∩⍕), '/' 1045 540
⍕ '+' '/' 1045 540
⍎ '+ / 1045 540'
24 60⊤ 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?
Neil

โอ๊ะฉันลืมเรื่องเหล่านั้น แต่โชคดีที่มันแก้ไขได้ง่าย
ลินน์

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 ในหัวข้อ ;สามารถลดการฟังก์ชั่นหนึ่งที่สอดคล้องกับ
Jonathan Allan


โอ้เยี่ยมมากพลาดหน่อย! ขอบคุณ
Jonathan Allan

2

Python 2, 84 ไบต์

def f(t,z):i=int;r=60*(i(t[:2])+i(z[3:6]))+i(t[3:])+i(z[3]+z[7:]);print r/60%24,r%60

กรณีทดสอบทั้งหมดอยู่ที่ideone

รูปแบบผลลัพธ์ถูกคั่นด้วยช่องว่างโดยไม่มีศูนย์นำหน้า


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

Unglolfed สำหรับตรรกะ

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 แทน substring การกอล์ฟเพิ่มเติมประกาศInteger i=1;และแทนที่อื่น ๆ ทั้งหมดIntegerโดยiเพื่อให้คุณมีแทนi.valueOf Integer.valueOf
Olivier Grégoire

@ OlivierGrégoireฮะเหรอ? คุณช่วยอธิบายการทดสอบครั้งที่สองได้ไหม!
Womba

สำหรับกรณีการทดสอบฐมา ณ ฑุคุณส่งออกแทน14:27 15:27
Olivier Grégoire

@ OlivierGrégoireอาจุดดี
Womba

java.util.function.Function v=Integer::valueOfหรือแม้กระทั่ง ไม่แน่ใจว่าจะประหยัดจริงหรือไม่
Robert Fraser

1

Ruby, 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

ชวา 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}";}

Ungolfed

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

:ซ้ำแล้วซ้ำอีกซ้ำกันจำนวนในด้านหน้าของ ดังนั้นสองขั้นตอนแรกคูณค่าชั่วโมงด้วย 60

\d+
$*

แปลงแต่ละหมายเลขเป็นเอก

T`1`0`-.+

หากมีเครื่องหมายลบในอินพุตขั้นตอนการถอดเสียงนี้จะเปลี่ยนเสียงทั้งหมด1หลังจากที่มันกลายเป็น0s โดยทั่วไปเราใช้0เป็น-1เลขหลักเดียวที่นี่

^
1440$*

แทรก 1440 1วินาที (เช่นเต็มวัน) นี่คือเพื่อให้แน่ใจว่าเวลาจะไม่เป็นลบ

+`10|\D

การทำเช่นนี้จะลบตัวเลขที่ไม่ใช่ตัวเลขทั้งหมด (เช่นช่องว่าง, the UTC, +หรือหรือ-รวมถึงทั้งหมด,เราได้ใส่ไว้) และ10ชุดค่าผสมดังนั้นจึงเป็นการยกเลิกตัวเลขบวกและลบ การทำเช่นนี้จะเป็นการลบจำนวนที่สองจากครั้งแรกถ้ามันเป็นลบหรือเพิ่มเป็นอย่างอื่น

1{1440}

ลบ 1440 1วินาทีถ้าเป็นไปได้ (โดยทั่วไปใช้โมดูโลผลลัพธ์ 1440 เพื่อให้พอดีกับใน 24 ชั่วโมงเดียว)

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

แบ่งตัวเลขออกเป็นชั่วโมงและนาทีโดยจับคู่ชิ้นส่วนจำนวน 60 หลักให้มากที่สุด (นับจำนวนชิ้นด้วย$#1) ตามด้วยตัวเลขที่เหลือ (ซึ่งนับความยาวด้วย$.2 )

\b\d\b
0$&

หากมีตัวเลขใด ๆ ในผลลัพธ์ให้ใส่ศูนย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.