Belirli bir süre için, joker kullanarak en küçük tarih listesini almak


13

Biçimlendirilmiş bir tarih düşünün YYYY-MM-DD. Joker'i *tarih dizesinin sonunda kullanabilirsiniz . Örneğin 2016-07-2*tüm tarihleri açıklar 2016-07-20için 2016-07-29.

Şimdi, başlangıç ​​tarihi ve bitiş tarihi ile temsil edilen bir dönemi düşünün.

Algoritma, dönemi temsil eden mümkün olan en küçük tarih listesini bulmalıdır.

Bir örnek kullanalım. Aşağıdaki dönem için:

  • Başlangıç ​​tarihi: 2014-11-29
  • bitiş tarihi: 2016-10-13

Algoritma, aşağıdaki tarih listesini içeren bir dizi döndürmelidir:

  • 2014-11-29
  • 2014-11-30
  • 2014-12-*
  • 2015-*
  • 2016-0*
  • 2016-10-0*
  • 2016-10-10
  • 2016-10-11
  • 2016-10-12
  • 2016-10-13

1
Kazanan hedef (ler) belirsiz. Ben codegolf için değiştirilmesini öneririz (yani görevi mümkün olan en az bayt içinde çözmek) ve her zaman en küçük tarih listesini çıkarmak için cevap gerektirir.
Billywob

Belki de bunun için en iyi site değil, "eğlence için" bir meydan okuma daha bir soru (yani "Ruby on Rails bu algoritma bulamıyorum"). Burada oldukça yeniyim ...
Raphael

Stackoverflow'u denemenizi ve daha sonra bir meydan okuma yerine bir soru olarak sormanızı öneririm . Yeniden ifade edilirse, meydan okuma hala ilginç ve bence bir şansı hak ediyor (kod golf olarak).
Billywob

6
Evet, algoritmayı bulmak hala eğlenceli ve zorlu, ama kod-golf tarafı ile ilgilenmedim ... Eh, onu yeniden yazdım, etiketleri değiştirdim ve şimdi bu yazıyı takip ederken stackoverflow'a soracağım. Teşekkürler!
Raphael

1
Takip: Dün Stackoverflow'da yayınladım, ancak bugün Ruby'de bir çalışma kodum vardı (aylar "jokerize" değil, neredeyse orada): stackoverflow.com/questions/40506639/…
Raphael

Yanıtlar:


1

PHP, 541334 bayt

Algoritmayı ilk etapta çalıştırmak istedim; ancak golf aşağı aslında beklediğimden çok daha eğlenceliydi (özellikle desteklenen tarih ve saat biçimlerini tarama ).

Üç büyük eylem yaklaşık 130 bayt kurtardı; ancak küçük golflerden gelen 70 bayt
(bu da büyük adımlardan birini eski haline getirdi) çok eğlenceli geçti.

for($a=($f=strtotime)($argv[1]);!$p=$a>$z=$f($argv[2]);$a+=86400){$x=$z<$e=$f(Dec31,$a);(101<$q=date(md,$a))?$q-1001|$x?:$a=$e+$p="1*":($x?($t=$f(IX30,$a))>$z?:$a=$t+$p="0*":$a=$e+$p="*");$p?:($q%100>1|$z<($t=$f(date(Ymt,$a)))?$q%10>0&$q%100>1|$z<($t=min($t,$a+777600))?:$a=$t+$p="m-$q[2]*":$a=$t+$p="m-*");echo date("Y-".($p?:"m-d"),$a),"
";}

komut satırı bağımsız değişkenlerinden girdi alır. Çevrimiçi olarak çalıştırın -nrveya test edin .

notlar

  • baskılar Y-m-3*için Y-m-30; Düzeltme için 7 bayt ekleyin: Ekle |$a==$tsonra 777600)).
  • PHP 7.1'de uyarılar atar; Düzeltme için 5 bayt ekleyin: Değiştir +$pile +!$p.
  • Bir arıza ve açıklanan bazı golfler kaydedilmeye hazırdır;
    ama şımartmadan önce başka birinin gönderip göndermediğini görmek için biraz bekleyeceğim.
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.