Encuentra a nuestros muertos desaparecidos

19

Desafío

¡Peter ha resucitado para salvarnos de los desafíos duplicados!

Peter Taylor está muerto , y no hay duda al respecto (bueno, aparte de la gran cantidad de dudas que tenemos ... pero solo ignórenlo). En su memoria, debe escribir un programa que determine si un usuario determinado está vivo o muerto.

Más información

Un usuario está muerto si no ha sido visto por más de un día, menos que eso, entonces está vivo. Verifique la última sección vista aquí:

Ubicación de la última vista

La entrada será una identificación de usuario (por ejemplo, la mía es 30525 y la de Peter Taylor es 194). Suponga que todas las entradas son ID de PPCG válidas.

Si el usuario está vivo, debe generar:

[User name] is alive!

Donde reemplaza [Nombre de usuario] por su nombre de usuario, no su ID de usuario.

Si el usuario está muerto, debe generar:

 Sadly, [User name] is dead.

Los participantes de T-SQL que usan el Explorador de datos SE no están permitidos.

Victorioso

El programa más corto en bytes gana.

Tabla de clasificación

var QUESTION_ID=59763;OVERRIDE_USER=30525;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>

Decaimiento Beta
fuente
2
¿Por qué no permitir T-SQL / SEDE?
Geobits
1
Necesita una descripción de dónde encontrar el número de "visto por última vez".
feersum
@feersum Es la etiqueta del título del último valor visto.
mınxomaτ
@feersum ¿Suficientemente bueno?
Beta Decay
1
Creo que el análisis es más relevante para esto que internet .
mınxomaτ

Respuestas:

4

CJam, 115 bytes

"codegolf.xyz/u/"r+g_N/{"s=\"r"/_0='>&!*1>s_"da"#)\_el=!|}#)"Sadly, %s is dead.""%s is alive!"?\"\"User "/1='"/1<e%

La idea es la misma que en mi respuesta Bash , excepto que esta respuesta no usa expresiones regulares, porque CJam no tiene expresiones regulares ...

El intérprete en línea no realiza solicitudes web, por lo que solo funcionará desde la línea de comandos.

Dennis
fuente
8

Bash, 151 bytes

r="curl -L codegolf.xyz/u/$1";u=`$r|grep -Pom1 '(?<="User )[^"]*'`
$r|grep -Pq '^[^>]*s="r.*(da|[A-Z])'&&echo "Sadly, $u is dead."||echo "$u is alive!"

Como de costumbre, se ignora la salida a STDERR .

Ejecución de ejemplo

$ ./is-dead 30525 2>&-
Beta Decay is alive!
$ ./is-dead 44935 2>&-
Sadly, Alpha Decay is dead.

Idea

Este código greps para líneas s="rque contienen que no tienen >antes de su aparición. Por ejemplo:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Si la cadena sigue a la coincidencia da, contiene la palabra yesterdayo days(como en 2 days ago).
  • Si la coincidencia es seguida por una letra mayúscula, contiene el nombre de un mes.
  • En todos los demás casos, el usuario está muerto viviente.

El nombre del usuario se extrae de una metaetiqueta de Twitter. Ejemplo:

<meta name="twitter:title" property="og:title" itemprop="title name" content="User Dennis">
Dennis
fuente
3
He actualizado mi perfil, y de repente estoy muerto. :(
TessellatingHeckler
55
Ya no estás muerto para mí.
Dennis
1
¡Eso es un alivio!
TessellatingHeckler
¿Quién registró ese dominio?
jimmy23013
@ jimmy23013 minxomat
Dennis
7

Javascript ES6, 234 bytes

document.write(`<script src="//api.stackexchange.com/users/${prompt(a=d=>{n=(x=d.items[0]).display_name,alert((Date.now()/1e3)-x.last_access_date>86400?`Sadly, ${n} is dead.`:n+' is alive!')})}?site=codegolf&callback=a">\x3C/script>`)

Versión anotada

// Inserts a script tag to perform a JSONP callback request on the stackexchange API
document.write(`
  <script src="//api.stackexchange.com/users/${
    prompt( // interpolate user input into url
      a = d =>{ // declare a in global scope
        n = (x = d.items[0]).display_name, // alias the user object and name
        alert(
          (Date.now() / 1e3) - x.last_access_date > 86400 
          ? `Sadly, ${n} is dead.` // a day or less since last seen
          : n + ' is alive!' // more than a day since last seen
        )
      }
    )
  }?site=codegolf&callback=a">\x3C/script>` // escaping that prevents early termination of enclosing script tag
)
George Reith
fuente
No analiza el apóstrofe en mi nombre, pero analiza correctamente todos los demás caracteres. XD +1 para pruebas en el navegador
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Maldición, la entidad API lo codifica.
George Reith
7

PowerShell (v4), 228 217 209 , 157 bytes

$u=($x=curl "codegolf.xyz/u/$args").BaseResponse.ResponseURI.Segments[-1]
if($x-match'n <(.*?)((c|n|ur)s* ago|w)<'){"$u is alive!"}else{"Sadly, $u is dead."}

p.ej

PS C:\> test.ps1 30525
beta-decay is alive!

C:\> test.ps1 67
Sadly, keith-randall is dead.


#Previous 209 byte version:
$f={$u=((curl "api.stackexchange.com/2.2/users/$($args)?&site=codegolf"
)|ConvertFrom-Json).Items;$d=$u.display_name;if((get-date -U %s)-
$u.last_access_date-gt86400){"Sadly, $d is dead."}else{"$d is alive!"}}

(Lo siento, Keith Randall, fuiste solo la primera cuenta que encontré con> 1 día desde la última vez que vi)

Estaba contento con el sólido y confiable byte uno de 209 que llama a la API, pero el raspado de pantalla es el camino a seguir para el golf.

  • Esto ahora extrae el nombre de usuario del URI redirigido, pero es un nombre en lugar de una identificación numérica, según sea necesario.

  • Y coincide con la línea Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>con el n <... [nr]s ago<intento de capturar hace segundos, hace minutos, hace horas, y justo ahora, y omite "días semanas, meses" o las fechas a largo plazo + veces. Y tratando de atrapar 'visto por última vez' y no los otros tiempos relativos (Gracias Dennis)

NÓTESE BIEN. curles un alias predeterminado para Invoke-WebRequest, no es el programa curl estándar portado a Windows.

TessellatingHeckler
fuente
2
También hay secs ago, 1 min ago(sin s), y yo creo que he visto just now.
Dennis
@ Dennis Creo que ya está arreglado, gracias. (a costa de quedarse atrás de su respuesta Bash; tal vez debería intentar usar descaradamente sus coincidencias de patrones ...).
TessellatingHeckler
5

R, 384 350 bytes

¡Este es para ti, Peter!

u=scan();D=as.POSIXlt;J=jsonlite::fromJSON(gsub("/\\*\\*/a|[()]|;$","",httr::content(httr::GET(paste0("http://api.stackexchange.com/2.2/users/",u,"?site=codegolf&callback=a")),,"text")))$items;l=D(J$last_access_date,z<-"UTC","1970-01-01");n=D(Sys.time(),z);U=J$display_name;if(as.Date(n)-as.Date(l)>1)cat("Sadly,",U,"is dead.")else cat(U,"is alive!")

Tenga en cuenta que esto requiere que se instalen los paquetes httry jsonlite, aunque no es necesario importarlos para que este código funcione, ya que estamos haciendo referencia explícitamente a espacios de nombres.

Sin golf:

# Read a user ID from STDIN
u <- scan()

# Create a request object using the SE API v2.2
request <- httr::GET(paste0("http://api.stackexchange.com/2.2/users/", u,
                            "?site=codegolf&callback=a"))

# Read the contents of the request into a ill-formed JSON string
body <- httr::content(request, type = "text")

# Parse out a valid string and get the associated fields
J <- jsonlite::fromJSON(gsub("/\\*\\*/a|[()]|;$", "", body))$items

# Get the last accessed date as a POSIX datetime object
l <- as.POSIXlt(J$last_access_date, "UTC", "1970-01-01")

# Get the current date
n <- as.POSIXlt(Sys.time(), "UTC")

# Extract the username
U <- J$display_name

# Determine whether the user has died
if (as.Date(n) - as.Date(l) > 1) {
    cat("Sadly," U, "is dead.")
} else {
    cat(U, "is alive!")
}

¡Ahorré 5 bytes en mi enfoque anterior y corregí un error en mi enfoque actual gracias a minxomat!

Alex A.
fuente
No sé sobre R, pero ¿no puedes guardar algunos bytes poniendo el literal de cadena "/users/"en una variable?
mınxomaτ
@minxomat Claro que sí, gracias!
Alex A.
\ n y; tomar la misma cantidad de bytes. Para que su código no tenga que verse así
OganM
@OganM En realidad, en R, scan()pensará que las líneas siguientes son las cosas que desea ingresar desde STDIN (quién sabe por qué), por lo que los puntos y comas son necesarios en este caso. Pero en general tienes razón.
Alex A.
5

AutoIt, 320 316 308 bytes

#include<String.au3>
#include<Date.au3>
$0=_StringBetween
$1=BinaryToString(InetRead('http://codegolf.xyz/u/'&ClipGet()))
$2=_DateDiff('D',StringReplace($0($1,'Last seen <span title="',' ')[0],'-','/'),@YEAR&'/'&@MON&'/'&@MDAY)
ConsoleWrite(($2?'Sadly, ':'')&$0($1,'r ','- P')[0]&'is '&($2?'dead.':'alive!'))

_DateDiffcalcula la diferencia en días ( 'D'). Será 0 si la diferencia es inferior a 1 día, por lo que podemos usarlo como un valor booleano. La etiqueta del título del valor "visto por última vez" contiene una marca de tiempo (casi) estándar.

mınxomaτ
fuente
2
No he visto auto en más de una década. Señor, toma mi voto.
Qix
1

PHP, 187 bytes

Enfoque bastante simplista, usando el dominio codegolf.xyz, solo un elemento ligeramente diferente aquí es que intento obtener ambas variables a la vez. Probado en algunos usuarios con resultados correctos, ¡avíseme si hay algunas áreas problemáticas!

<?preg_match('/"User ([^"]+)".+?"([^"]+)" class="r/s',file_get_contents("http://codegolf.xyz/u/$argv[1]"),$m);echo time()-strtotime($m[2])<86400?"$m[1] is alive!":"Sadly, $m[1] is dead.";

Uso:

php 59763.php 30525
Dom Hastings
fuente
$m[1] is aparece dos veces ¿No sería más barato imprimir esto primero y usar el ternario solo para la parte muerta / viva?
mınxomaτ
@minxomat Jugué con eso, pero la Sadly, ...parte se interpuso ... ¡Parece que no puedo entenderlo!
Dom Hastings
Echo the Sadly primero, luego asigna el resultado time()-strtotime($m[2])a una variable de un solo carácter. Luego eco $m[1] is y finalmente los muertos / vivos. Así es como lo hice - no sé si esto funcionará en PHP :)
mınxomaτ
@minxomat Ahhh, tan simple, ¡pero no pude entenderlo! ¡Gracias! ¡Actualizaré tan pronto como pueda volver a probar!
Dom Hastings
1

Groovy, 355 bytes

import groovy.json.JsonSlurper;import java.util.zip.GZIPInputStream;def d = new JsonSlurper().parseText(new GZIPInputStream(new URL("http://api.stackexchange.com/2.2/users/${args[0]}?site=codegolf").newInputStream()).getText()).items[0];def n = d.display_name;println d.last_access_date*1000l<new Date().time-8.64E7?"Sadly, ${n} is dead.":"${n} is alive!"

Fuente sin comprimir

import groovy.json.JsonSlurper;
import java.util.zip.GZIPInputStream;

def rawText = new GZIPInputStream(new URL("http://api.stackexchange.com/2.2/users/${args[0]}?site=codegolf").newInputStream()).getText()
def json = new JsonSlurper().parseText(rawText).items[0]
def name = json.display_name
//We have to correct for java date returning in millis
def lastAccess = json.last_access_date * 1000l
def yesterday = new Date().time - 86400000
if (lastAccess < yesterday) {
    println "Sadly, ${name} is dead."
} else {
    println "${name} is alive!"
}
Mike Clark
fuente
Puede guardar 42 bytes (lo reduce a 313 bytes) si solo hace new groovy.json.JsonSlurper y new java.util.zip.GZIPInputStream en lugar de las importaciones. Importar solo normalmente vale la pena si usa mucho una clase.
un spaghetto