Bu tarih biçimi nedir?


11

Gregoryen takvimler için tarih biçimi ülkeden ülkeye değişir. Tanınan üç ana biçim vardır:

  1. YY-MM-DD (Big-endian)
  2. DD-MM-YY (Küçük endian)
  3. MM-DD-YY (Ara-endian)

Göreviniz, bir tarihi temsil eden bir giriş dizesi verildiğinde, bu dizenin tarih olarak yorumlanabileceği tüm olası tarih biçimlerini çıktılayan bir program yazmaktır.

kurallar

  • Giriş tarihi, xx-xx-xxher alanın iki basamaklı ve sıfır dolgulu olduğu biçimdedir .
  • Tarih her zaman geçerlidir (bu nedenle 14-13-17 gibi şeyler alamazsınız)
  • Tarih her zaman yukarıdaki biçimlerden en az biridir (bu nedenle 17-14-11 gibi şeyler elde edemezsiniz)
  • Aslında paralel bir dünyada olduğumuz için , yılın her ayı için 31 gün var ve bu nedenle artık yıllar yok
  • Tarih 01 Ocak 2001 ve 31 Aralık 2099 arasında
  • Tarih için yalnızca bir biçim varsa, kod yalnızca yazdırmalıdır (yalnızca son satırlara izin verilir)
  • Tarih için çeşitli biçimler varsa, bunların virgülle, boşlukla, yeni satırla veya bunların birleşimiyle ayrılması gerekir.
  • Biçimlerin tam adlarını vermelisiniz. Ayrı keyfi değerlerin kullanılmasına izin verilmez.
  • Sondaki boşluktan başka önde gelen veya sondaki karakterlere izin verilmez
  • Çıktı küçük harf olmalıdır
  • Yerleşik tarih veya takvim işlevlerini kullanmanıza izin verilmiyor
  • Çıktı biçimlerinin sıralanması gerekmez

Örnekler

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

Bu yani bayt en kısa kodu kazanır. Açıklamalar teşvik edilir.


3
Yanıtların garip bir durumu desteklediğinden emin olmak için muhtemelen 31 Şubat'ı kullanarak bir test örneği eklemelisiniz: P
— ETHproductions 30:17

Üç geçerli biçim için üç farklı değer çıkarabilir miyiz, yoksa bu üç kesin dizgi olmalı mı?
— ETHproductions

3
there are 31 days for every month of the year, and consequently no leap yearsYani bu, herhangi bir tarih kütüphanesinin bunun için etkili bir şekilde yararsız olduğu anlamına mı geliyor?
— TheLethalCoder

1
@TheLethalCoder Evet, çoğu tarih kitaplığı muhtemelen kullanılamaz.
— Jim

1
Orada daha birçok format var.
— ugoren

Yanıtlar:


3

05AB1E , 40 bayt

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

Çevrimiçi deneyin!

açıklama

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

Python 2 , 123 bayt

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

Çevrimiçi deneyin!


Python 2 , daha az girdi ayrıştırma, 123 bayt

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

Çevrimiçi deneyin!


Yeni satırlarla ayırmanıza izin verilir, böylece sondaki işareti kaldırabilirsiniz ,.
— Jonathan Allan

4

JavaScript (ES6), 121 119 118 112 bayt

Sonunda boşluk olan, boşlukla ayrılmış bir dize döndürür.

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

Nasıl?

Girişi a , b ve c'ye böldük . Tarih geçerli olması sağlanır Çünkü, Emin olduğumuz b Dolayısıyla az 32, ister testine 's yeterli bir orta endian biçimi doğrulamak için 13'ten az olduğunu. Little-endian ve big-endian formatları , günü doğrulamak için b'nin 13'ten küçük olmasını ve a ve c üzerinde başka bir test yapılmasını gerektirir .

Bu nedenle 3 test:

  • Big-endian: b <13 ve c <32
  • Little-endian: b <13 ve a <32
  • Orta-endian: a <13

Test senaryoları


3

Bash 240 125 116 112 bayt

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

Golfed.

Bazı ipuçları için el işçiliği sayesinde

Arnauld cevabında orta-endian follwing'in 32'den azına yönelik doğrulama kaldırılarak 9 bayt kaydedildi

Dizi yerine farklı değişkenler kullanarak 4 bayt kaydedildi

Dene!


Bir çift vardır aritmetik ilgili ipuçları içinde Bash golf için ipuçları . Biraz azaltabilirsiniz: Çevrimiçi deneyin!
— manatwork

Teşekkür ederim @manatwork Ben yer imi bu soru çok yararlı var, onun tarafından golf olacak
— DrnglVrgs

1

C #, 180 bayt

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

Yalnızca boşlukla ayrılmış değerlere sahip çıktılar, ön ve arka boşluklara da sahip olabilir. Gerekirse OP bu noktada açıklığa kavuştuğunda güncellenir.

Tam / Biçimlendirilmiş sürüm:

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

Kuralı daha açık bir şekilde ifade ettim:No leading or trailing characters others than a trailing space are allowed
— Jim

1

PHP, 151 Bayt

[$a,$b,$c]=sscanf($argn,"%d-%d-%d");$z="-endian ";echo($m=$b&&$b<13)&&$c&&$c<32?big.$z:"",$m&&$a&&$a<32?little.$z:"",$a&&$a<13&&$b&&$b<32?middle.$z:"";

testcases


1

Toplu, 138 bayt

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

Belirsizce @ ovs'un cevabına dayanıyor.


1

Java 232 bayt

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

İşte daha güzel bir versiyon

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

Bu kısmı nasıl biçimlendireceğimi bilmiyordum ...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
Çok fazla endians: String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
— manatwork

İyi bir nokta, bunu yapmamaya karar verdiğimde bayt sayımda fazladan bir "String" ekliyordum. @manatwork
— cheemcheem

1

PHP, 131 bayt

[$a,$b,$c]=explode('-',$argn);foreach([[big,b,c],[little,b,a],[middle,a,b]]as[$t,$x,$y])echo$$x*$$y&&$$x<13&$$y<32?"$t-endian ":"";
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.