¿Hace cuánto tiempo fue esto?


9

¿Hace cuánto tiempo fue esto?

Las normas

  • Cada presentación debe ser un programa completo.
  • El programa debe tomar la entrada como dos fechas separadas por comas en el formulario YYYY-MM-DDe imprimir el número de días que han pasado desde la segunda fecha hasta STDOUT como si hoy fuera la primera fecha (si la segunda fecha sería en el futuro, envíe un número negativo) más una nueva línea final opcional, y nada más. Suponga que ambas fechas están en el calendario gregoriano.
  • El programa no debe escribir nada en STDERR.

    Tenga en cuenta que debe haber un intérprete para que se pueda probar el envío.

  • Las presentaciones se puntúan en bytes , en una codificación apropiada (preexistente), generalmente (pero no necesariamente) UTF-8. Algunos idiomas, como las carpetas , son un poco difíciles de puntuar; si tiene dudas, pregunte por Meta .
  • Este es el , por lo que gana el código más corto

    Ejemplos

Entrada:

2015-12-03,2015-12-01

Salida:

2

Entrada:

2015-12-03,2014-12-01

Salida:

367

Entrada:

2015-12-03,2013-12-03

Salida:

730

El fragmento

El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como tabla de clasificación yb) como una lista de ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

## Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:

## [><>](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
¿Se nos permite usar bibliotecas externas? ¿Los que son comunes en un ecosistema dado pero que no son parte de la biblioteca estándar? (Por ejemplo, nadie usa las API de fecha de JDK, sino JodaTime, aunque técnicamente es una biblioteca externa).
Ruslan

Supongo que todo usa UTC, ya que en mi zona horaria la diferencia entre 2015-11-01T00: 00: 00 y 2015-11-02T00: 00: 00 fue solo ~ 0.96 días (23 horas) debido al horario de verano. No mencionó nada sobre el redondeo de días fraccionales, por lo que es posible que desee aclarar esto en la pregunta. (Creo que una gran cantidad de bibliotecas de fecha y hora por defecto a utilizar hora local.)
ThisSuitIsBlackNot

1
¿Cuál es el caso de los años bisiestos?
TheCoffeeCup

@TheCoffeeCup deben ser manejados
ev3commander

Respuestas:


1

TeaScript , 24 bytes

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

Utiliza Date.parsepara analizar la fecha, luego obtiene la diferencia y divide.

Pruébalo en línea

Explicación && Ungolfed

((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

Bash + GNU utilidades, 37

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

trreemplaza la coma con una nueva línea. datelee las fechas separadas por la nueva línea y genera el número de segundos desde la época de Unix que representa la fecha pasada. Estos números se ponen en la dcpila. Entonces es una simple cuestión de resta y dividir entre (24 * 60 * 60). En este caso, la dcevaluación aritmética RPN basada en pila es mejor bco bash $( ), principalmente porque la subracción antes de la división no necesita paréntesis.

Entrada a través de 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 bytes

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

Sin golf:

# 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)

En lugar de -diff(d)[1]usar, puede -(d...)guardar un par de bytes. ¿Qué versión de Julia estás usando por cierto? En 1.2, tuve que importar explícitamente Datesy tampoco puedo convertir días a enteros como este.
Simeon Schaub

Esta respuesta se publicó en 2015, por lo que probablemente fue Julia 0.3 o 0.4 a más tardar.
Alex A.

4

Scala, 166 139 120 116 92 bytes

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

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

Nota: La tercera versión (120 bytes) y en adelante usa una API en desuso. Todavía se compila y funciona bien. Nota 2: ¡Gracias a los comentaristas a continuación por los excelentes consejos!


Como la nueva línea final es opcional, puede usarla en printlugar de println.
Marth

Puede eliminar la Object A extends App{...}pieza y guardarla como a.scalay ejecutarla con scala a.scala 2015-12-3,2015-12-1;)
Martijn

@MartijnR Genio! ¡¡Gracias!!
Ruslan

3

Ruby, 69 66 65 57 55 bytes

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

47 bytes + 8 bytes para la opción de línea de comando. Gracias a Dane Anderson, ahorró 2 bytes.

57 bytes

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

Código de 49 bytes + 8 bytes para la opción de línea de comando. Guardado 8 bytes con la sugerencia de manatwork.

65 bytes

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

66 bytes

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

69 bytes

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

Pruébelo en línea

Sin golf

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

Uso:

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

=> 730

Tres pequeños caracteres: ','?,, '-'?-, to_i/div .
manatwork

El uso de algunas opciones de línea de comandos puede reducirlo aún más: ruby -naF[,-] -e 'p (Time.new(*$F[0,3])-Time.new(*$F[3,3])).div 86400' <<< '2015-10-11,2015-07-11'es 59 caracteres como lo cuento.
manatwork

@manatwork No estoy seguro si eso está permitido.
Vasu Adari

La regla es que la necesidad mínima necesaria para pasar el código (en el caso de Ruby -e) es gratuita, todo lo demás debe incluirse en el recuento. Hay diferentes opiniones sobre qué es exactamente todo lo demás. Por ejemplo, algunos miembros incluyen el carácter de espacio separador de opciones y comillas alrededor de los valores de los parámetros. En mi opinión, solo se debe contar lo que realmente se pasa al intérprete, no se requieren caracteres adicionales por la sintaxis de shell. Pero no recuerdo ninguna voz levantada para no permitir el uso de opciones.
manatwork

2
casi no vale la pena mencionarlo, pero puede afeitarse un byte moviendo el código repetido a un proceso:t=->l{Time.gm(*$F[l,3])};p (t[0]-t[3]).div 86400
Alexis Andersen

2

Japt , 41 bytes

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

Hasta ahora, esto es lo mejor que puedo obtener, ya que todas las variables $y paréntesis realmente eliminan el recuento de bytes.

Pruébalo en línea

Explicación

             // 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 bytes

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

La entrada debe ser una matriz de celdas separadas por comas. datenumconvierte la celda de entrada en una matriz numérica de 2x1 con la marca de tiempo. difftoma la diferencia entre los dos.


Solución anterior, 41 bytes :

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

La entrada debe ser una cadena separada por comas:

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

Las curiosas formas de programación. Esto funciona debido a la conversión implícita de MATLAB entre tipos de datos.

La salida de strsplit(input(''))es una celda de cadenas. No se puede usar diffen una celda, pero afortunadamente datenumfunciona, y en realidad convierte la entrada de la celda en una matriz numérica de 2x1, lo que hace diffposible su uso.

Puede especificar una gran cantidad de delimitadores strsplit, pero la coma es la predeterminada. Además, la entrada predeterminada a datenumestá en el formato yyyy-mm-dd. Por esas razones, se evitan muchas especificaciones como: datenum (s, 'aaaa-mm-dd'), lo que ahorra una gran cantidad de bytes.

Para el registro, esto sería 21 bytes si pudiera usar una función:

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

1
¿Cómo podría olvidarme de diff ... También podría eliminar mi envío, porque es esencialmente lo mismo, pero con 2 llamadas a datenum en su lugar.
slvrbld

1
¡Gran elección de formato de entrada!
Luis Mendo

2

Javascript ES6, 63 bytes

Probado en cromo.

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

separados por comas de la pregunta
ev3commander

@ ev3commander Sí, acabo de arreglar eso.
SuperJedi224

2
@ SuperJedi224 Huh. Firefox da una fecha inválida , mientras que Chrome felizmente continúa.
Conor O'Brien

55
Marcaría esto como específico de Chrome, ya que solo parece funcionar en Chrome. Creo que la forma de cumplir sería usar Date.parsey reemplazar el -con/
Downgoat

1
La mayoría de los navegadores requieren que se rellene la fecha, por lo 2015-12-03que funcionará, pero 2015-12-3no lo hará (excepto en Chrome). La pregunta dice que la fecha estará en el formato, YYYY-MM-DDpor lo que si la entrada realmente sigue que sería compatible con todos los navegadores, sin embargo, los ejemplos parecen decir lo contrario. De todos modos, podría usar en Date.parselugar de new Dateguardar 2 bytes:alert((p((a=prompt(p=Date.parse).split`,`)[0])-p(a[1]))/864e5)
user81655

2

PHP, 63 64 77 bytes

Descubrí que el enfoque clásico es más corto que el de OOP:

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

Lee la cadena separada por comas de STDIN.


La forma directa de OOP ( 77 bytes ):

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

Ediciones

  • Guardado 13 bytes usando en strtotimelugar deDateTime .
  • Se guardó 1 byte almacenando strtotimeen una variable. Gracias a Blackhole .

-3 bytes: mueve las asignaciones a su primer uso entre paréntesis (-1 byte cada una) y puedes usarlas en <?=lugar de echo.
Titus

1

VBA, 69 bytes

Function x(s)
g=Split(s, ",")
x=CDate(g(0))-CDate(g(1))
End Function

1

psql, 75 bytes

(Código de 74 caracteres + opción de línea de comando de 1 carácter)

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

psqles el terminal interactivo de PostgreSQL. Para respetar el "Cada presentación debe ser un programa completo". regla, el código lee la entrada en sí.

Ejecución de muestra:

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

1

MATL, 5 bytes

iPYOd

Esto es lo mismo que la respuesta de StewieGriffin, excepto que usé flipentonces en difflugar de diffnegar el resultado.

Explicación completa, con las funciones correspondientes de Matlab:

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
Nota: Si bien MATL solo se lanzó el 12 de diciembre, después de que se publicó este desafío, se me ocurrió esta respuesta el 9 de diciembre usando un compilador MATL previo al lanzamiento, que es casi idéntico al compilador lanzado, este código es el mismo.
David

2
Además, esto no es un respaldo del popular dispositivo portátil de música de Apple: P
David

1
Debería haber usado opara la datenumfunción :-D
Luis Mendo

¡Eso hubiera estado asombroso!
David

1
@ ev3commander la mayoría de las respuestas en PPCG son las mismas que otras respuestas, especialmente en casos como este donde 4 comandos son suficientes.
David

1

PowerShell v2 +, 50 44 bytes

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

Toma el argumento de entrada como una cadena, lo divide en la coma, luego canaliza la matriz a través de un alias incorporado datecorto para Get-Dateconvertir nuestras cadenas en formato de fecha y hora .NET. Esas dos fechas se almacenan simultáneamente en $ay $b. Luego usamos un operador de sustracción sobrecargada para restar el segundo del primero y generar el .Daysmismo.

Golfó 6 bytes gracias a TessellatingHeckler .

Técnicamente no compite, ya que no tiene un intérprete en línea disponible, ya que la implementación de FOSS de PowerShell, Pash , se basa en PowerShell v0.5. Todavía no es compatible -split, y mucho menos la compleja funcionalidad de fecha .NET.


1

Excel, 25 bytes

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

Excel maneja automáticamente las cadenas como fechas.


0

Jolf , 33 bytes

Solo funciona en Chrome. Sin competencia, ya que el idioma actualiza la pregunta posterior a la fecha. Agregaré una explicación más detallada más adelante.

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

"Explicación"

$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

¿Qué tal si pones "no compitiendo" en tu encabezado?
ev3commander

0

MATLAB, 59 bytes

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

Enfoque muy sencillo: la entrada debe darse como una cadena desde la ventana de comandos. La cadena de entrada se divide y el número de días entre las fechas (y nada más) se calcula a partir de los números de fecha de serie. Sin embargo, estoy bastante seguro de que hay una manera de evitar la necesidad de llamar a datenum dos veces ...


0

Python 2, 109 113 bytes

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 bytes

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

Probado con SQL Server 2008R2. El $ (i) se reemplaza con la entrada proporcionada como argumento de línea de comando.

Ejecución de muestra:

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

0

Mathematica, 61 bytes

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

Resta de fecha básica.


0

Perl, 91 86 + 2 para banderas np, 88 bytes

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

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

Ejemplo

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

0

jq, 50 bytes

(Código de 49 caracteres + opción de línea de comando de 1 carácter)

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

Ejecución de muestra:

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

Prueba en línea ( -Rno se admite el paso a través de URL; por lo tanto, la entrada se pasa como cadena "2015-12-3,2013-12-3").


0

Mathematica, 56 bytes

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

La mayoría de las funciones de fecha (¿todas?) Intentarán analizar las entradas de cadena en fechas automáticamente.



Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.