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.