Sudah berapa lama ini?


9

Sudah berapa lama ini?

Aturan

  • Setiap pengajuan harus merupakan program lengkap.
  • Program harus mengambil input sebagai dua tanggal yang dipisahkan koma dalam formulir YYYY-MM-DD, dan mencetak jumlah hari yang telah berlalu sejak tanggal kedua ke STDOUT seolah-olah hari ini adalah tanggal pertama (jika tanggal kedua akan di masa depan, output a angka negatif) ditambah baris baru tambahan opsional, dan tidak ada yang lain. Asumsikan kedua tanggal dalam kalender Gregorian.
  • Program tidak boleh menulis apa pun kepada STDERR.

    Perhatikan bahwa harus ada penerjemah agar pengajuan dapat diuji.

  • Kiriman dinilai dalam byte , dalam penyandian yang sesuai (sudah ada), biasanya (tetapi tidak harus) UTF-8. Beberapa bahasa, seperti Folder , agak sulit untuk dinilai - jika ragu, silakan tanyakan di Meta .
  • Ini , jadi kode terpendek menang

    Contohnya

Memasukkan:

2015-12-03,2015-12-01

Keluaran:

2

Memasukkan:

2015-12-03,2014-12-01

Keluaran:

367

Memasukkan:

2015-12-03,2013-12-03

Keluaran:

730

Cuplikan

Cuplikan Stack di bagian bawah posting ini menghasilkan katalog dari jawaban a) sebagai leaderboard dan b) sebagai daftar pemenang per bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

## Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

## Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=65989,OVERRIDE_USER=46167;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>



1
Apakah kami diizinkan menggunakan perpustakaan eksternal? Orang yang umum dalam ekosistem tertentu tetapi bukan bagian dari lib standar? (Misalnya, tidak ada yang menggunakan JDK's Date APIs tetapi JodaTime sebagai gantinya, meskipun secara teknis perpustakaan eksternal).
Ruslan

Saya berasumsi semuanya menggunakan UTC, karena di zona waktu saya perbedaan antara 2015-11-01T00: 00: 00 dan 2015-11-02T00: 00: 00 hanya ~ 0,96 hari (23 jam) karena penghematan siang hari. Anda tidak menyebutkan apa pun tentang pembulatan hari pecahan, jadi Anda mungkin ingin memperjelas ini dalam pertanyaan. (Saya pikir banyak pustaka datetime menggunakan waktu lokal secara default.)
ThisSuitIsBlackNot

1
Apa yang terjadi selama tahun kabisat?
TheCoffeeCup

@TheCoffeeCup, mereka harus ditangani
ev3commander

Jawaban:


1

TeaScript , 24 byte

((a=D.parse)×-a(y©/864e5

Menggunakan Date.parseuntuk menguraikan tanggal, lalu dapatkan perbedaannya dan bagi.

Cobalah online

Penjelasan && Tidak Disatukan

((a=D.parse)(x)-a(y))/864e5

               // Implicit: x is first date
               // y is second date
(
 (a=D.parse)   // Assign Date.parse to 'a'
 (x)           // Run Date.parse with first date
 -a(y)         // Subtract Date.parse run with second date
)/864e5        // Divide by 86,400,000

13

Utilitas Bash + GNU, 37

tr , \\n|date -f- +%s|dc -e??-86400/p

trmengganti koma dengan baris baru. datemembaca baris baru yang dipisahkan tanggal dan menampilkan jumlah detik sejak zaman Unix yang diwakili oleh tanggal masuk. Angka-angka ini kemudian diletakkan di dctumpukan. Maka ini adalah masalah pengurangan dan pembagian sederhana oleh (24 * 60 * 60). Dalam hal ini, dcevaluasi aritmatika RPN berbasis stack lebih baik daripada bcatau bash $( ), sebagian besar karena subrraksi-sebelum-divisi tidak memerlukan tanda kurung.

Masukan melalui STDIN:

$ echo 2015-12-3,2015-12-1 | ./longago.sh
2
$ echo 2015-12-3,2014-12-1 | ./longago.sh
367
$ echo 2015-12-3,2013-12-3 | ./longago.sh
730
$ 

4

Julia, 67 byte

print(Int(-diff(map(i->Date(i,"y-m-d"),split(readline(),",")))[1]))

Tidak Disatukan:

# Read a line from STDIN
r = readline()

# Split it into two character dates
s = split(r, ",")

# Convert each to a Date object
d = map(i -> Date(i, "y-m-d"), s)

# Compute the difference in dates (first-second)
f = diff(d)[1]

# Convert the Base.Date.Day object to an integer
# Negate to get second-first
i = Int(-f)

# Print to STDOUT
print(i)

Alih-alih -diff(d)[1]Anda dapat menggunakan -(d...)untuk menyimpan beberapa byte. Omong-omong, apa versi Julia yang Anda gunakan? Pada 1.2, saya harus mengimpor secara eksplisit Datesdan saya juga tidak bisa mengonversi hari menjadi bilangan bulat seperti ini.
Simeon Schaub

Jawaban ini diposting pada tahun 2015, jadi mungkin paling lambat Julia 0.3 atau 0.4.
Alex A.

4

Scala, 166 139 120 116 92 byte

print(args(0).replace('-','/').split(",").map(java.util.Date.parse(_)/86400000).reduce(_-_))

Pemakaian: scala [source filename].scala [date1],[date2]

Catatan: Versi ketiga (120 byte) dan aktif menggunakan API yang tidak digunakan lagi. Itu masih mengkompilasi dan berfungsi dengan baik. Note2: Terima kasih kepada para komentator di bawah ini untuk saran hebatnya!


Sejak trailing baris baru adalah opsional Anda bisa menggunakan printbukan println.
Marth

Anda dapat menghapus Object A extends App{...}bagian dan menyimpannya sebagai a.scaladan menjalankannya dengan scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genius! Terima kasih!!
Ruslan

3

Ruby, 69 66 65 57 55 byte

a=->l{Time.gm *$F[l,3]};p (a[0]-a[3]).div 86400

47 byte + 8 byte untuk opsi baris perintah. Terima kasih kepada Dane Anderson, menyelamatkan 2 byte.

57 byte

p (Time.gm(*$F[0,3])-Time.gm(*$F[3,3])).div 86400

49 byte kode + 8 byte untuk opsi baris perintah. Disimpan 8 byte dengan saran manatwork.

65 byte

a,b=gets.split(?,).map{|i|Time.gm *i.split(?-)};p (a-b).div 86400

66 byte

a,b=gets.split(?,).map{|i|Time.new *i.split(?-)};p (a-b).div 86400

69 byte

a,b=gets.split(',').map{|i|Time.new *i.split('-')};p (a-b).to_i/86400

Uji secara online

Tidak disatukan

a = -> l {
  Time.gm *$F[l,3]       # Anonymous method to parse time
}
p (a[0]-a[3]).div 86400  # Subtracts two times and divides by 24*60*60

Pemakaian:

ruby -naF[,-] -e 'a=->l{Time.gm *$F[l,3]};p (a[0]-a[3]).div 86400' <<< '2015-12-3,2013-12-3'

=> 730

Tiga karakter kecil: ','?,, '-'?-, to_i/div .
manatwork

Menggunakan beberapa opsi baris perintah dapat mengurangi lebih banyak: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'adalah 59 karakter ketika saya menghitungnya.
manatwork

@manatwork Tidak yakin apakah itu dibolehkan.
Vasu Adari

Aturannya adalah bahwa kebutuhan minimum yang diperlukan untuk lulus kode (dalam kasus Ruby -e) adalah gratis, semua yang lain harus dimasukkan dalam hitungan. Ada beberapa pendapat berbeda tentang apa tepatnya yang lainnya. Sebagai contoh, beberapa anggota menyertakan karakter pemisah opsi ruang dan kutipan di sekitar nilai parameter. Dalam pandangan saya hanya harus dihitung apa yang sebenarnya diteruskan ke penerjemah, karakter tambahan yang diperlukan oleh sintaks shell tidak. Tetapi tidak dapat mengingat suara apa pun yang diangkat untuk melarang penggunaan opsi.
manatwork

2
hampir tidak layak disebut, tetapi Anda dapat mencukur satu byte dengan memindahkan kode yang diulang menjadi proc:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen

2

Japt , 41 byte

A=K$.parse)(($B=Uq',  g0)-$A($Bg1))/864e5

Sejauh ini adalah yang terbaik yang bisa saya dapatkan karena semua variabel dan $dan kurung benar-benar membunuh jumlah byte.

Cobalah online

Penjelasan

             // Implicit: U is set to input
A=K$.parse)  // Set variable A to date parsing function
(($B=Uq',    // Set B to input split by ,
  g0)        // Get the first date and parse
-            // Subtract...
$A(          // Parse this date...
   $Bg1      // Get's second date
))/864e5     // Divides by 86,400,000

2

MATLAB, 41 31 byte

disp(-diff(datenum(input(''))))
{'2015-12-03', '2014-12-22'}
   346  

Input harus berupa larik sel yang dipisahkan koma. datenummengubah sel input menjadi array numerik 2x1 dengan cap waktu. diffmengambil perbedaan antara keduanya.


Solusi lama, 41 byte :

disp(-diff(datenum(strsplit(input('')))))

Input harus berupa string yang dipisahkan koma:

disp(-diff(datenum(strsplit(input('')))))
'2015-12-03, 2014-12-22'
   346

Cara pemrograman yang aneh. Ini berfungsi karena casting implisit MATLAB antara tipe data.

Output dari strsplit(input(''))adalah sel string. Anda tidak dapat menggunakan diffsel, tetapi untungnya, datenumberfungsi, dan itu benar-benar memasukkan input sel kembali ke array numerik 2x1, diffmemungkinkan untuk digunakan.

Anda dapat menentukan banyak pembatas di strsplit, tetapi koma adalah default. Juga, input default datenumadalah pada format yyyy-mm-dd. Karena alasan itu, banyak spesifikasi seperti: datenum (s, 'yyyy-mm-dd') dihindari, sehingga menghemat banyak byte.

Sebagai catatan, ini akan menjadi 21 byte jika saya bisa menggunakan fungsi:

@(s)-diff(datenum(s))

1
Bagaimana saya bisa melupakan diff ... Mungkin juga hanya menghapus kiriman saya, karena pada dasarnya sama, tetapi dengan 2 panggilan ke datenum sebagai gantinya.
slvrbld

1
Pilihan format input yang bagus!
Luis Mendo

2

Javascript ES6, 63 byte

Diuji dalam chrome.

alert(((p=Date.parse)((a=prompt().split`,`)[0])-p(a[1]))/864e5)

dipisahkan koma dari pertanyaan
ev3commander

@ ev3commander Ya, saya baru saja memperbaikinya.
SuperJedi224

2
@ SuperJedi224 Huh. Firefox memberikan tanggal Tidak Valid , sementara chrome dengan senang hati melanjutkan.
Conor O'Brien

5
Saya akan menandai ini khusus Chrome karena sepertinya hanya berfungsi di chrome. Saya pikir cara yang sesuai adalah dengan menggunakan Date.parsedan mengganti -dengan/
Downgoat

1
Sebagian besar browser membutuhkan tanggal untuk diisi sehingga 2015-12-03akan berfungsi tetapi 2015-12-3tidak akan (kecuali di Chrome). Pertanyaannya memang mengatakan bahwa tanggal akan dalam format YYYY-MM-DDjadi jika input benar-benar mengikuti bahwa itu akan kompatibel lintas-browser, namun contoh-contoh tampaknya mengatakan sebaliknya. Bagaimanapun, Anda dapat menggunakan Date.parsealih-alih new Datemenyimpan 2 byte:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 byte

Menemukan bahwa pendekatan klasik lebih pendek daripada yang OOP:

$x=fgetcsv(STDIN);$s=strtotime;echo($s($x[0])-$s($x[1]))/86400;

Membaca string yang dipisahkan koma STDIN.


Cara OOP lurus ke depan ( 77 byte ):

$x=fgetcsv(STDIN);echo(new DateTime($x[0]))->diff(new DateTime($x[1]))->days;

Suntingan

  • Disimpan 13 byte dengan menggunakan strtotimebukan DateTime.
  • Disimpan 1 byte dengan menyimpan strtotimedalam suatu variabel. Berkat Blackhole .

-3 byte: pindahkan penugasan ke penggunaan pertama mereka dalam tanda kurung (masing-masing -1 byte) dan Anda dapat menggunakan <?=sebagai gantinya echo.
Titus


1

psql, 75 byte

(74 karakter kode + 1 opsi baris perintah karakter)

\prompt i
select split_part(:'i',',',1)::date-split_part(:'i',',',2)::date

psqladalah terminal interaktif PostgreSQL. Untuk menghormati "Setiap pengajuan harus merupakan program lengkap." aturan, kode membaca input itu sendiri.

Contoh dijalankan:

bash-4.3$ psql -tf how-long-was-this.sql <<< '2015-12-3,2013-12-3'
      730

1

MATL, 5 byte

iPYOd

Ini adalah sama dengan jawaban StewieGriffin, kecuali saya menggunakan flipkemudian diffdaripada diffkemudian meniadakan hasilnya.

Penjelasan lengkap, dengan fungsi Matlab yang sesuai:

i   %// input(''), get input
P   %// flip, flips the array
YO  %// datenum, converts date string into an integer
d   %// diff, finds the difference between dates

2
Catatan: Sementara MATL hanya dirilis pada 12 Desember, setelah tantangan ini diposting, saya datang dengan jawaban ini pada 9 Desember menggunakan kompiler MATL pra-rilis, yang hampir identik dengan kompiler yang dirilis, kode ini sama.
David

2
Juga, ini sama sekali bukan dukungan perangkat musik portabel Apple yang populer: P
David

1
Saya seharusnya menggunakan ountuk datenumfungsi :-D
Luis Mendo

Itu akan luar biasa!
David

1
@ ev3commander, sebagian besar jawaban pada PPCG sama dengan jawaban lainnya, terutama dalam kasus seperti ini di mana 4 perintah sudah mencukupi.
David

1

PowerShell v2 +, 50 44 Bytes

$a,$b=$args-split','|%{date $_};($a-$b).Days

Membawa argumen input sebagai string, membaginya pada koma, lalu mem-pipe array melalui built-in alias datekependekan untuk Get-Datemengonversi string kami ke dalam format .NET datetime. Kedua tanggal tersebut kemudian disimpan secara bersamaan ke dalam $adan $b. Kami kemudian menggunakan operator-pengurangan-kelebihan untuk mengurangi yang kedua dari yang pertama, dan output.Days daripadanya.

Golf 6 byte berkat TessellatingHeckler .

Secara teknis tidak bersaing, karena tidak memiliki juru bahasa online yang tersedia, karena implementasi FOSS dari PowerShell, Pash , ada di sekitar PowerShell v0.5. Itu belum mendukung -split, apalagi fungsionalitas .NET date.


1

Excel, 25 byte

=LEFT(A1,10)-RIGHT(A1,10)

Excel secara otomatis menangani string sebagai tanggal.


0

Jolf , 33 byte

Hanya berfungsi di Chrome. Tidak bersaing, karena bahasa memperbarui pertanyaan pascatanggal. Saya akan menambahkan penjelasan yang lebih menyeluruh nanti.

$S=$viGi', mDN~DH r}/m4SmeP"864"5

"Penjelasan"

$S=$viGi', mDN~DH r}
$S=$                 sets S equal to
    viGi',           take string input and reassign it to the comma-split input
           mD      } map with this function 
             N~DH r  return the time of the date of H (element)

/m4SmeP"864"5
/             divide
 m4S           subtraction applied to S (S[0] - S[1])
    meP"864"5  and 864 * 10 ^ 5 (thanks to Super Jedi for his nice constant)
              implicit output

Bagaimana kalau Anda memasukkan "tidak bersaing" di header Anda?
ev3commander

0

MATLAB, 59 byte

s=strsplit(input(''),',');disp(datenum(s{1})-datenum(s{2}))

Pendekatan yang sangat mudah: input harus diberikan sebagai string dari jendela perintah. String input kemudian dibagi dan jumlah hari antara tanggal (dan tidak ada yang lain) dihitung dari nomor tanggal seri. Saya cukup yakin ada cara untuk menghindari kebutuhan untuk memanggil datenum dua kali ...


0

Python 2, 109 113 byte

import datetime as d 
j=[d.date(*[int(k) for k in g.split('-')]) for g in raw_input().split(',')]
print j[0]-j[1]

0

T-SQL + SQLCMD, 51 byte

PRINT DATEDIFF(D,RIGHT('$(i)',10),LEFT('$(i)',10))

Diuji dengan SQL Server 2008R2. $ (I) diganti dengan input yang disediakan sebagai argumen baris perintah.

Contoh dijalankan:

sqlcmd -i script.sql -v i="2015-12-08,2016-01-01"
-24

0

Mathematica, 61 byte

Print@First[#-#2&@@DateObject/@InputString[]~StringSplit~","]

Pengurangan tanggal dasar.


0

Perl, 91 86 + 2 untuk bendera np, 88 byte

gunakan Date :: Calc qw (Delta_Days); ($ a, $ b) = split (/, /); $ _ = Delta_Days (split (/ - /, $ b), split (/ - /, $ a))

use Date::Parse;$_=str2time((split(/,/,$_))[0])-str2time((split(/,/,$_))[1]);$_/=86400

Contoh

$ echo 2015-12-3,2015-12-1 | perl -npe 'use Date::Parse;$_=str2time((split(/,/,$_))[0])-str2time((split(/,/,$_))[1]);$_/=86400'
2

0

jq, 50 byte

(49 karakter kode + 1 opsi baris perintah karakter)

./","|map(.+"T0:0:0Z"|fromdate)|(.[0]-.[1])/86400

Contoh dijalankan:

bash-4.3$ ~/bin/jq -R './","|map(.+"T0:0:0Z"|fromdate)|(.[0]-.[1])/86400' <<< '2015-12-3,2013-12-3'
730

Tes online (Melewati -RURL tidak didukung - jadi input dilewatkan sebagai string "2015-12-3,2013-12-3").


0

Mathematica, 56 byte

Print@#&@@-DateDifference@@InputString[]~StringSplit~","

Sebagian besar (semua?) Fungsi tanggal akan mencoba mengurai input string ke dalam tanggal secara otomatis.



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.