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.