Untuk periode tertentu, dapatkan daftar tanggal terkecil, menggunakan pelawak

13

Pertimbangkan tanggal yang diformat dalam YYYY-MM-DD. Anda dapat menggunakan joker *di akhir string tanggal. Misalnya 2016-07-2*menggambarkan semua tanggal dari 2016-07-20hingga 2016-07-29.

Sekarang, pertimbangkan periode yang diwakili oleh tanggal mulai dan tanggal akhir.

Algoritma harus menemukan daftar tanggal sekecil mungkin yang mewakili periode.

Mari kita gunakan contoh. Untuk periode berikut:

  • mulai tanggal: 2014-11-29
  • tanggal akhir: 2016-10-13

Algoritme harus mengembalikan array yang berisi daftar tanggal berikut:

  • 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
Raphael
sumber
1
Sasaran yang menang tidak jelas. Saya menyarankan untuk mengubahnya menjadi codegolf (yaitu menyelesaikan tugas dalam byte sesedikit mungkin) dan selalu memerlukan jawaban untuk menampilkan daftar tanggal terkecil.
Billywob
Mungkin ini bukan situs terbaik untuk ini, ini lebih merupakan pertanyaan (yaitu "Saya tidak dapat menemukan algoritma ini di Ruby on Rails") daripada tantangan "untuk bersenang-senang". Saya agak baru di sini ...
Raphael
Saya sarankan Anda mencoba stackoverflow dan kemudian menanyakannya sebagai pertanyaan daripada tantangan. Jika diulangi, tantangannya tetap menarik menurut saya dan pantas mendapat kesempatan (seperti golf code).
Billywob
6
Ya, saya pikir menemukan algoritme masih menyenangkan dan menantang, tetapi saya tidak tertarik pada sisi kode-golf ... Yah saya ulang kata-kata itu, mengubah tag, dan sekarang saya akan bertanya stackoverflow sambil tetap mengikuti posting ini. Terima kasih!
Raphael
1
Tindak lanjut: Saya memposting di Stackoverflow kemarin, tapi hari ini saya punya kode yang berfungsi di Ruby (itu tidak "jokerize" bulan, tetapi hampir sampai di sana): stackoverflow.com/questions/40506639/…
Raphael

Jawaban:

1

PHP, 541 343 byte

Saya ingin mendapatkan algoritma yang bekerja di tempat pertama; tetapi menurunkannya sebenarnya jauh lebih menyenangkan dari yang saya harapkan (terutama menelusuri format tanggal & waktu yang didukung ).

Tiga tindakan utama menghemat sekitar 130 byte; tetapi 70 byte dari pegolf kecil
(yang juga menjadikan salah satu langkah besar usang) membawa banyak kesenangan.

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),"
";}

mengambil input dari argumen baris perintah. Jalankan dengan -nratau coba online .

catatan

  • cetakan Y-m-3*untuk Y-m-30; tambahkan 7 byte untuk diperbaiki: Masukkan |$a==$tsetelah777600)) .
  • melempar peringatan di PHP 7.1; tambahkan 5 byte untuk diperbaiki: Ganti +$pdengan+!$p .
  • Rincian dan beberapa golf dijelaskan siap dipasang;
    tapi saya akan menunggu sedikit untuk melihat apakah ada orang lain yang mengirimkan sebelum saya merusak.
Titus
sumber