İptal Tarihini Yasallaştır


18

Giriş:

Bir tarihi içeren ( dd, MMve yyyy). Tarih nesnesi veya üç ayrı tamsayı da giriş olarak geçerlidir.

Çıktı:

Her bölüm ( dd, MMve yyyy) ayrı ayrı döndürülür ve en yakın geçerli tarihe yuvarlanır.

Örneğin (biçimde dd-MM-yyyy):
21-10-2016olur12-01-6102

Zorluk kuralları:

  • Sadece dd, MM, yyyygeçerli, ancak düzen ve kullanmak ayrı semboller kendi seçimdir.
    Yani bunlar bazı geçerli format örnekleri dd-MM-yyyy:; MM/dd/yyyy; yyyy MM dd; ddMMyyyyVb
    Ve bunlar bazı geçersiz biçim örnekler: dd MMM yyyy; dd-MM-'yy; vb.
  • Ayrıca, diliniz tarafından destekleniyorsa veya bir tarihi temsil eden dize yerine üç ayrı tamsayı parametresi varsa bir Date nesnesi girmeyi de seçebilirsiniz.
  • Lütfen hangi tarih biçimini kullandığınızı belirtin! (Ve giriş ve çıkış aynı formatta olmalıdır.) Tüm test senaryolarını ve aşağıdaki meydan okuma kuralını işleyebildiği sürece bir Date nesnesi çıktısına da izin verilir.
  • Bu meydan okuma için Julian'dan Gregoryen Takvimi'ne geçiş yok sayılır. Bu 1582sadece geçerli bir ters yıl 2851.
    Geçerli tüm yıllar, aylar ve günler için Zorluk bilgileri / ipuçlarına bakın.
  • Şubat ayını başka bir ayın tersine çeviremeyeceğiniz için artık yıllar hakkında endişelenmenize gerek yok.

Tüm ters yıllar, aylar ve günler:

  • Yıl her zaman sorunsuz bir şekilde tersine çevrilebilir, 0001'den (tersine çevrilmiş 1000) 9999'a (kalıntılar 9999) ulaşır . (Dolayısıyla 0000geçerli bir girdi değildir ve bunun için test durumu da yoktur.)
  • Tersine çevireceğiniz tek ay şunlardır: Ocak (Ekim / Ekim ayından itibaren ters 10); Ekim (Ocak ayından itibaren tersine döndü / 01); Kasım ( Kasım kalır / 11); ve Aralık (diğer her ayın ters / 02- 09, 12).
  • Tersine çevireceğiniz tek gün: 01 (geri alındı 10), 02 (geri alındı 20), 03 (geri alındı 30), 10 (geri alındı 01), 11 (kalıntı 11), 12 (geri alındı 21), 13 (geri alındı 31) , 20 (tersine çevrilir 02,) 21 (tersine çevrilir 12,) 22 (kalıntıları 22), 30 (tersine çevrilir 03ya da aynı 31 Kasım!), 31 den ters ( 04- 09/ 13-19/ 23- 29).

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş ifadeleri / çıktı, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, gerekirse bir açıklama ekleyin.

Test senaryoları ( dd-MM-yyyyformat olarak):

21-07-2016   ->   12-12-6102
12-11-1991   ->   21-11-1991
01-01-2000   ->   10-10-0002
27-08-1875   ->   31-12-5781
18-12-2010   ->   31-12-0102
13-01-1981   ->   31-10-1891
04-11-1671   ->   30-11-1761  // Semi-tricky case, since November has 30 days
28-11-2036   ->   30-11-6302  // Semi-tricky case, since November has 30 days
14-06-1855   ->   31-12-5581
30-10-9999   ->   03-01-9999
01-01-2851   ->   10-10-1582

LegionMammal978 No @, 21-07-2016döndürüldü 12-70-6102yuvarlatılmış olan 12-12-6102. ##-10-6107
Sonucu

@KevinCruijssen Tamam, bu ayın 70, yıl artışı ile sarıldığını düşündüm .
LegionMammal978

10-10-2Üçüncü durumda geçerli çıktı mı ?
Luis Mendo

@LuisMendo Evet, kesinlikle. Diğer insanların da yaptığını gördüm. Zorluk, tarihleri ​​içeri veya çıktı biçiminden daha doğru şekilde tersine çevirmek ve yuvarlamakla ilgilidir.
Kevin Cruijssen

Üç karakter dizisi alıp baştaki sıfırları beklemek kabul edilebilir mi?
JustinM - Monica'yı eski durumuna döndür

Yanıtlar:


3

Dışbükey , 23 bayt

Bayt sayısı CP-1252 kodlamasını varsayar.

qS/Wf%_1=:=31^sCs¶.e<S*

G / Ç biçimidir dd mm yyyy.

Çevrimiçi deneyin!

Bu benim CJam cevabımın doğrudan bir limanı . Dışbükey büyük ölçüde CJam'a dayanır ve bu nedenle tek fark, Convex'in bir üstteki iki yığın öğesini bir baytı saran ve bir bayt tasarruf eden operatörün kullanılmasıdır [...].


8

CJam, 24 bayt

qS/Wf%[_1=:=31^sCs].e<S*

G / Ç biçimidir dd mm yyyy.

Çevrimiçi deneyin!

Aynı bayt sayısı, G / Ç formatı mm dd yyyy:

qS/Wf%_0=:=1231^s2/.e<S*

Çevrimiçi deneyin!

açıklama

qS/     e# Read input, split around spaces.
Wf%     e# Reverse each component.
[       e# Set marker for new list.
  _1=   e#   Duplicate reversed strings, extract reversed month.
  :=    e#   Check for equality of the characters. This gives 1 for
        e#   November (11) and 0 for everything else.
  31^   e#   XOR the result with 31, giving 30 for November and 31
        e#   for everything else.
  s     e#   Convert the result to a string, "30"/"31".
  Cs    e#   Push 12, convert to string, "12".
]       e# Wrap "30"/"31" and "12" in a list.
.e<     e# Element-wise minimum. This clamps the day and month to their
        e# respective maxima.
S*      e# Join the result with spaces.

Diğer versiyon biz tamsayı başlamak dışında benzer şekilde çalışır 1230veya 1231dönüştürmeden önce ["12" "30"] veya ["12" "31"].



1
@LeakyNun Bu yerleşik bir tarih kullanmaz ve nasıl yardımcı olacağını görmüyorum.
Martin Ender

Peki Kasım ayında 30 gün olduğunu nereden biliyorsunuz?
Leaky Nun

2
@LeakyNun Daha sonra bir açıklama ekleyeceğim, ancak 1=geri döndürülen ayı alır, :=basamaklarının eşit olup olmadığını kontrol eder ve ^sonucu 31'e xors eder, ay için 30 11ve diğer her şey için 31 verir.
Martin Ender

Oh, özellikleri okumadım ...
Leaky Nun

5

Pyth, 55 53 46 43 41 bayt

APJ_Mczd = HhS, 12sH = GhS, sGC @. "❤❤ó» î "H%"% 02d% 02d% s "[GHeJ 
APJ_Mczd = hS, 12sH = hS, sGC @." ❤❤ó »î" H% "% 02d% 02d% s" [GHeJ 
APJ_Mcz \ -% "% 02d% 02d% s" [hS, sGx31q11sHhS, 12sHeJ 
APJ_Mczdjd [> 2+ \ 0hS, sGx31q11sH> 2+ \ 0hS, 12sHeJ
APJ_Mczdjd. [L \ 02 [ 'HS, sGx31q11sH`hS, 12sHeJ

burada ❤❤iki yazdırılamaz, sırasıyla U + 001C ve U + 001F idi.

Test odası.


3

Python 3, 82 bayt

lambda x:[min(x[0][::-1],['31','30'][x[1]=='11']),min(x[1][::-1],'12'),x[2][::-1]]

Bağımsız değişken aracılığıyla, formun dizelerin bir listesi olarak tarih girdisini alan ['dd', 'mm', 'yyyy']ve onaylanmış tersine çevrilmiş tarihi aynı biçimde döndüren anonim bir işlev .

Nasıl çalışır

Python, karakterleri ve karakter dizilerini Unicode kod noktalarıyla karşılaştırır. Bu, iki veya daha fazla tamsayı üzerindeki herhangi bir karşılaştırmanın, bu tamsayıların dize olarak karşılaştırmasıyla aynı şekilde döndüğü anlamına gelir. Bu nedenle, miniki tamsayı dize olarak çağırmak , en küçük tamsayıyı dize olarak döndürür; ters tarih bölümünü bir argüman olarak ve maksimum değeri başka bir argüman olarak alarak, gün ve ay istenen aralığa sabitlenir. Tarih-parçaları arasında adımlarla endeksleme ile ters çevrilmiş -1( [::-1]) ve ay için maksimum değer değiştirilir '31'için '30'ay şartlı Bool sonucu ile bir listeye endeksleme tarafından Kasım ise.

Ideone üzerinde deneyin


2

Dyalog APL , 32 33 bayt

⍕¨{⍵-3↑31 11≡2↑⍵}31 12 1E4⌊⍎∊⍕⌽¨⎕

G / Ç üç dizenin ( 'dd' 'mm' 'yyyy') listesidir .

TryAPL , ancak, çevrimiçi testin etkinleştirilmesi için (giriş istemi) ile değiştirildi ve tüm satırın {... içine yerleştirildiğini ve rastgele kodun yürütülmesi engellendiğinden (ifadeyi çalıştır) (girişi doğrula ve düzelt) ile değiştirildiğini unutmayın. .}2⊃⎕VFI


2

C # 314 305 299 249 232 223 bayt

using System.Linq;string f(int d,int m,int y){Func<int,string>r=i=>string.Concat((""+i).PadLeft(2,'0').Reverse());Func<string,int,string>x=(j,k)=>int.Parse(j)>k?""+k:j;return x(r(d),m==11?30:31)+"-"+x(r(m),12)+"-"+r(y);}

@KevinCruijssen, değişken bildirimi kısaltabileceğime işaret ettiği için teşekkür etti, bu da takma dizenin bazı baytları kaydedebilmesini sağladı.

Değişken bildirimlerin yuvarlanması ve kaldırılması için aynısını yaparak geri alma işlevini ve diğer 13'ü saklayan 50 bayt sakladı.

Son güncelleme, takma dizeyi artık bayt koruyucu yapmaz.

Ungolfed Sürümü:

using System.Linq;
    string dateReverse(int day, int month, int year)
{
    //setup a resuable function to reverse
    Func<int, string> reverse = intToReverse => string.Concat((""+intToReverse).PadLeft(2, '0').Reverse());

    //another function for rounding
    Func<string, int, string> round = (strToRound, maxVal) => int.Parse(strToRound) > maxVal ? "" + maxVal : strToRound;

    //Join the strings into the "dd-mm-yyyy" date format
    return 
        //Round down the day value, if november cap to 30 otherwise cap to 31
        round(reverse(day), month == 11 ? 30 : 31) + "-" +

        //Round the month down
        round(reverse(month), 12) + "-" +

        //we can use the reverse function here too and pad left just won't do anything
        reverse(year);
}

Burada test edin


İle using System.Linq;fonksiyon arasındaki boşluğu yok sayabilirsiniz , yani -1 bayt. Ayrıca, var n=...;var e=...;bunun yerine 1 bayt tarafından golf edilebilir: string n=...,e=...;Çok değil, ama yine de -2 bayt. ;)
Kevin Cruijssen

Bu alandaki güzel yakalama, bayt sayım aslında saymadı gibi görünüyor, bu yüzden bir kopyala yapıştır sorunu kadar hasta takoz. Ayrıca bu değişken bildirim stilini kullanarak dize takma ile birkaç bayt kazanmak mümkün olacağını düşünüyorum.
JustinM - Monica'yı

2

JavaScript, 106 105 94 bayt

d=>d.split`,`.map((a,b,r)=>(e=[...a].reverse().join``,f=!b?r[1]==11^31:b<2&&12,f&&f<e?f:e))+''

Test takımı (rev.3)


açıklama

d=>d.split`,`                 // split into sections by `,`

.map((a,b,r)=>(               // map each section

e=[...a].reverse().join``,    // spread a date section into array and reverse and 
                              // join with `` to get string result

f=!b?r[1]==11^31              // if section being mapped is day (section 0), 
                              // then max (f) is 30 for November(month 11) or else 31

:b<2&&12,                     // if part being mapped is month (section 1), then max (f) is 12

f&&f<e?f:e))                  // if there is a max (f)
                              // and the max (f) is less than the reversed string (e),
                              // then return the max (f), 
                              // else return the reversed string (e)

+''                           // join all the sections back together with `,` 
                              // (concatenating [] with a string will do this)

Teşekkür için 1 bayt kaydetmek için @KevinCruijssen b==1için b<2. ESNe şablon değişmez ve ,ayırıcı önererek 11 bayt kaydettiğiniz için @Neil teşekkürler .


JS'de oldukça kötüyüm, yanlış bir şey söylersem beni düzeltin, ancak bir bayt kurtarmak b==1için golf oynayamazsınız b<2? !b?Kodun bir kısmında zaten kontrol ettiğiniz için artık 0 olamaz . Değiştirdiğimde test takımınızda çalışıyor gibi görünüyor.
Kevin Cruijssen

@KevinCruijssen evet, haklısın, teşekkürler! Sadece gözden kaçırdım. Javascript'te çok fazla golf
oynamadım

* 'Çok uzun süre' demek istedim, 'çok bakmak için' değil
CShark

2
- Eğer ES6 hedefliyorsanız gibi, kodunuzu kısaltmak için şablon dizeleri kullanabilirsiniz join``yerine join('')örneğin - ancak kullanarak biraz daha kaydedebilir ,kullanmak sağlar ayırıcı olarak +''birlikte üç değer katılmak.
Neil

@ Ne girişte ,ayırıcı demek istiyorsun ?
CShark

1

Yakut, 92 84 + 1 ( -pbayrak) = 93 85 bayt

-Seperatör olarak kullanır .

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-

1

Pyke, 29 bayt

F_bw-o^tDI]SX(mhj_Xjth~%R@]Sh

Burada deneyin!

Bunun golf edilebilir olduğunu kesinlikle görebiliyorum


0

Python 2, 154 bayt

z=input().split("-");r=[x[::-1]for x in z];z[1]=r[1]if r[1]<'12'else '12';z[0]=r[0]if r[0]<'31'else '30'if z[1]=='11'else '31';z[2]=r[2];print "-".join(z)

Girdiyi bir dize olarak alır, bu nedenle girdide tırnak işaretleri belirtilmelidir, örneğin "11-04-2016".


Ben bir Python golfçü değilim çünkü sadece temel gelişme: z=[x[::-1]for x in z];z[1]=min(z[1],'12');z[0]=min(z[0],['31','30'][z[1]=='11']);print"-".join(z). Temel olarak, hiç kullanmanıza gerek yoktur rve minyapmak istediğiniz birçok şeyi başarır.
Değer Mürekkebi

0

05AB1E , 24 bayt

#íÐÅsË31^12‚øεßт+¦}sθªðý

Port @MartinEnder'in CJam cevabı , bu yüzden ayrıca formatta bir dize olarak giriş ve çıkışlardd MM yyyy .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

#                         # Split the (implicit) input by spaces
                          #  i.e. "04 11 1671" → ["04","11","1671"]
                          #  i.e. "20 01 2000" → ["20","01","2000"]
 í                        # Reverse each string
                          #  i.e. ["04","11","1671"] → ["40","11","1761"]
                          #  i.e. ["20","01","2000"] → ["02","10","0002"]
  Ð                       # Triplicate this list
   Ås                     # Pop one of them, and push it's middle element (the months)
                          #  i.e. ["40","11","1761"] → "11"
                          #  i.e. ["02","10","0002"] → "10"
     Ë                    # Check if the digits are the same (1 for 11; 0 otherwise)
                          #  i.e. "11" → 1 (truthy)
                          #  i.e. "10" → 0 (falsey)
      31^                 # Bitwise-XOR with 31 (30 for November, 31 for other months)
                          #  i.e. 1 → 30
                          #  i.e. 0 → 31
         12              # Pair it with 12
                          #  i.e. 30 → [30,12]
                          #  i.e. 31 → [31,12]
            ø             # Zip/transpose; swapping rows and columns
                          # (implicitly removes year)
                          #  i.e. ["40","11","1761"] and [30,12] → [["40",30],["11",12]]
                          #  i.e. ["02","10","0002"] and [31,12] → [["02",31],["10",12]]
             ε    }       # Map each pair to:
              ß           # Get the minimum (implicitly converts to integer unfortunately)
                          #  i.e. [["40",30],["11",12]] → [30,11]
                          #  i.e. [["02",31],["10",12]] → [2,10]
               т+         # Add 100
                          #  i.e. [30,11] → [130,111]
                          #  i.e. [2,10] → [102,110]
                 ¦        # Remove the first character
                          #  i.e. [130,111] → ["30","11"]
                          #  i.e. [102,110] → ["02","10"]
                   s      # Swap so the triplicated list is at the top of the stack again
                    θ     # Pop and only leave it's last element (the year)
                          #  i.e. ["40","11","1761"] → "1761"
                          #  i.e. ["02","10","0002"] → "0002"
                     ª    # Append it to the list
                          #  i.e. ["30","11"] and "1761" → ["30","11","1761"]
                          #  i.e. ["02","10"] and "0002" → ["02","10","0002"]
                      ðý  # Join the list by spaces (and output implicitly)
                          #  i.e. ["30","11","1761"] → "30 11 1761"
                          #  i.e. ["02","10","0002"] → "02 10 0002"
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.