Saat Dilimini Değiştirme


20

Meydan okuma

Girdi olarak bir saat ve bir saat dilimi verildiğinde, saati o saat diliminde girin.

zaman

Zaman 24 saat biçiminde verilecektir:

hh:mm

Hh iki basamaklı saat ve mm ise iki basamaklı dakikadır. Saat ve dakikanın daima şu şekilde sıfırlarla doldurulacağını unutmayın:

06:09

Verilen tüm saatler UTC + 00: 00'dır.

Çıktınızdaki saatlerin sıfırlarla doldurulması gerekmez, ancak saatinizin 24 saat formatında olması gerekir

Saat dilimi

Saat dilimi aşağıdaki biçimde verilir:

UTC±hh:mm

± ya + veya a - ve hh olacaksa, iki basamaklı saat ve mm iki basamaklı dakikadır (yine, bunlar sıfırlarla doldurulur).

Bu saat dilimindeki saati bulmak için, girilen süreden UTC ± 'dan sonraki süreyi toplar (sembol + ise) veya çıkarır (sembol - ise).

Örneğin, giriş 24:56ve ise UTC-02:50, 24: 56'dan 2 saat 50 dakika çıkarırsınız:

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

Çıktı olurdu 22:06.

Örnekler

Chicago

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

Katmandu

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

Samoa

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

Hawaii

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

Bunun bir önceki güne gittiğini unutmayın.

Tokyo

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

Bunun ertesi güne kadar gittiğine dikkat edin.

kurallar

Yerleşik tarih işlevlerini veya kitaplıkları kullanmamalısınız.

Tüm girdilerin geçerli zamanlar ve zaman ofsetleri olacağını varsayalım.

Saat dilimi aralığında olacaktır UTC-24:00için UTC+24:00her şeyi kapsayan.

Durumunda buçuk gece yarısı doğru şekilde temsil etmelidir 00:30, değil 24:30 .

Kazanan

Bayt cinsinden en kısa kod kazanır.


TimeSpan / Süre yöntemleri / sınıfları ne olacak? Bunların da hariç tutulduğunu varsayıyorum
pinkfloydx33

Ayrıca giriş değerleri her zaman geçerli olacak mı? Yani 26:02ve 08:74görünmez mi? UTC ofsetleri için aynı mı?
pinkfloydx33

@ pinkfloydx33 1) Evet, hepsi hariç. 2) Tüm girdilerin geçerli olduğunu varsayalım
Beta Çürümesi

Çıktıyı sıfırlarla doldurmamız gerekiyor mu? (örn. Son test 2:25
senaryosu

1
Çıktının doldurulması gerekmiyorsa, 1:5bunun yerine geçerli bir zaman olur 1:05mu? Sadece saatlerin dolmayacağını düşünürdüm. Ayrıca, yarım gece yarısı senaryolarınızda benzer bir aralık belirttiğinizden ve ifade ettiğinizden bu yana 24:56olmamalı mı? 00:5624:00
pinkfloydx33

Yanıtlar:


2

APL (Dyalog APL) , 45 bayt

ifade

İki dizeyi doğru argüman olarak alır.

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

Çevrimiçi deneyin!

açıklama

24 60⊤tabandan sayıya bir 24 b 60 dönüşüm

arasında

değerlendirme

arasında

biçimlendirilmiş (yani ayırma boşluklarıyla düzleştirilmiş)

('+-'∩⍕) "+ -" ile biçimlendirilmiş girdinin kesişimi (artı veya eksi çıkarır)

, bunu takiben

(... her giriş için aşağıdakiler (zaman ve ofset)

0 60⊥Bir b 60 arasında to-sayısı dönüşüm

2⊃ ikinci unsuru

':'⎕VFIalan ayırıcı olarak kolon kullanılarak, V erified ve F sabitlenebilecektir ı arasında, girişi

¯5∘↑ son beş karakter ("ss: dd")

"17:25" ve "UTC + 09: 00" için adım adım

Sağ taraftaki verilerdeki sol taraftaki ifade, bir sonraki satırın verilerini verir.

                       '17: 25 '' UTC + 09: 00 '
                      / / \ \
(...) ¨ fonksiyon dizisini her iki girişe de uygular
                    / / \ \
¯5∘ ↑ '17: 25 '' UTC + 09: 00 '
':' FVFI '17: 25 ''09: 00' 
2⊃ (1 1) (17 25) (1 1) (9 0)
0 60⊥ ​​17 25 9 0
                      1045 540
                       \ \ / /
Burası ¨ durur ve sonuç listesinde yürütme devam eder
                         \ \ / /
'/', 1045540
('+ -' ∩⍕), '/' 1045 540
⍕ '+' '/' 1045540
⍎ '+ / 1045 540'
24 60⊤ 1585
                              2 25

3

C, 109 bayt

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

Aşağıdaki gibi çağırın:

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

1
Bu negatif zaman ofsetleri için nasıl çalışır UTC-03:30?
Neil

Hata! Bunları unuttum, ama şükür ki, bu kolay bir çözüm.
Lynn

3

JavaScript (ES6), 101 bayt

(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

Eğer saat dolgusu 121 bayt olurdu.


3

Python 2, 129 bayt

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`

Şu şekilde ara: T("02:45", "UTC-05:33")


1
Biçimlendirilmiş çıktıda eksik sıfırlar var. Python 2 başlığında söylemeliyim. İle tek satırlık bir işleve indirgenebilir ;.
Jonathan Allan


Ah, güzel, o parçayı kaçırdın! Teşekkürler
Jonathan Allan

2

Python 2, 84 bayt

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

Tüm test senaryoları ideone'de

Çıktı formatı boşlukla ayrılmıştır ve başında sıfır yoktur.


2

Java 201 bayt

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 olarak adlandırılır ("12:00", "UTC + 02: 40")

Mantık için çözülmedi,

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 altında almak için herhangi bir yardım mutluluk duyacağız!


Bu kusurlu. 2. testi (saatin artırıldığı yerde) yerine getirmez. Ayrıca, azaltmak için neden alt dize yerine subSequence kullanıyorsunuz? Golf için daha beyan Integer i=1;ve diğer tüm değiştirmek Integertarafından isahip böylece i.valueOfyerine Integer.valueOf.
Olivier Grégoire

@ OlivierGrégoire ha? İkinci testi biraz daha açar mısın lütfen!
Womba

Katmandu test senaryosu için çıktı almak 14:27yerine 15:27.
Olivier Grégoire

@ OlivierGrégoire ah iyi bir nokta
Womba

Hatta java.util.function.Function v=Integer::valueOf. Gerçekten fazla tasarruf edip etmeyeceğinden emin değilim.
Robert Fraser

1

Ruby, 95 bayt

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}

kullanım

f[gets,gets]

Girişler (Örnek)

08:50
UTC-06:00

1

Javascript (ES6), 93 92 bayt

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

Test senaryoları

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 bayt

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

Test senaryoları ve desteksiz

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

    }
}

talaş

  • 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 bayt

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 baytlık sürüm

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

Orjinal 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 bayt

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

Çevrimiçi deneyin! (Test paketi olarak.)

açıklama

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

Retina , 100 bayt

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

1{1440}

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

Çevrimiçi deneyin!

açıklama

:
59$*:,

Her birini :59 ve virgülle ayırıcı olarak değiştirir.

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

A'nın önündeki sayıyı tekrar tekrar çoğaltır :. Böylece ilk iki aşama saat değerini 60 ile çarpmaktadır.

\d+
$*

Her sayıyı tekli olarak dönüştürün.

T`1`0`-.+

Girişte eksi işareti varsa, bu harf çevirisi aşaması tüm s'leri 1s'ye dönüştürür 0. Burada temelde 0tek -1rakam olarak kullanıyoruz .

^
1440$*

1440 1sn. (Yani tam gün) ekleyin . Bu, zamanın olumsuz olmamasını sağlamak içindir.

+`10|\D

Bu sürekli olmayan tüm basamak (yani boşluk kaldırır UTC, +ya da -, aynı zamanda, tüm ,yerleştirmiş!) Ve 10kombinasyon, böylece, pozitif ve negatif basamak iptal. Bu, temel olarak, negatifse ikinci sayıyı birinciden çıkarır veya başka türlü ekler.

1{1440}

1Mümkünse 1440 saniyeyi kaldırır (temel olarak sonuç modulo 1440'ı tek bir 24 saate sığdırmak için alınır).

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

Mümkün olan en fazla 60 basamaklı parçaları (parçaları ile sayarak $#1) ve ardından kalan basamakları (uzunluğu ile sayılır $.2) eşleştirerek sayıyı saat ve dakika olarak ayırın .

\b\d\b
0$&

Sonuçta tek bir rakam varsa sıfıra ekleyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.