Trova i nostri morti scomparsi


19

Sfida

Peter è risorto per salvarci dalle doppie sfide!

Peter Taylor è morto e non ci sono dubbi (beh, a parte l'enorme quantità di dubbi che abbiamo ... ma ignoralo). Nella sua memoria, è necessario scrivere un programma che determina se un determinato utente è vivo o morto.

Ulteriori informazioni

Un utente è morto se non è stato visto per più di un giorno, almeno così è vivo. Controlla l'ultima sezione visualizzata qui:

Posizione dell'ultima vista

L'input sarà un ID utente (ad esempio, il mio è 30525 e Peter Taylor è 194). Supponiamo che tutti gli input siano ID PPCG validi.

Se l'utente è vivo, dovresti produrre:

[User name] is alive!

Dove si sostituisce [Nome utente] per il loro nome utente e non il loro ID utente.

Se l'utente è morto, dovresti produrre:

 Sadly, [User name] is dead.

I partecipanti T-SQL che utilizzano SE Data Explorer non sono consentiti.

vincente

Vince il programma più breve in byte.

Classifica

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>


2
Perché non consentire T-SQL / SEDE?
Geobits il

1
È necessaria una descrizione di dove trovare il numero di "ultimo accesso".
feersum

@feersum È il tag del titolo dell'ultimo valore visualizzato.
mınxomaτ,

@feersum Abbastanza buono?
Decadimento beta

1
Penso che l' analisi sia più rilevante in questo rispetto a Internet .
mınxomaτ,

Risposte:


4

CJam, 115 byte

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

L'idea è la stessa della mia risposta Bash , tranne per il fatto che questa risposta non usa espressioni regolari, perché CJam non ha espressioni regolari ...

L'interprete online non esegue le richieste Web, quindi funzionerà solo dalla riga di comando.


8

Bash, 151 byte

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!"

Come al solito, l' output su STDERR viene ignorato .

Esempio di esecuzione

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

Idea

Questo codice viene utilizzato per le righe s="rche non hanno >prima della sua occorrenza. Per esempio:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Se la corrispondenza è seguita dalla stringa da, contiene la parola yesterdayo days(come in 2 days ago).
  • Se la corrispondenza è seguita da una lettera maiuscola, contiene il nome di un mese.
  • In tutti gli altri casi, l'utente è non morto vivo.

Il nome dell'utente viene estratto da un meta tag Twitter. Esempio:

<meta name="twitter:title" property="og:title" itemprop="title name" content="User Dennis">

3
Ho aggiornato il mio profilo e improvvisamente sono morto. :(
TessellatingHeckler,

5
Non sei più morto per me.
Dennis,

1
Che sollievo!
Tessellating Heckler,

Chi ha registrato quel dominio?
jimmy23013,

@ jimmy23013 minxomat
Dennis,

7

Javascript ES6, 234 byte

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

Versione annotata

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

Non riesce a analizzare l'apostrofo nel mio nome, ma analizza correttamente ogni altro personaggio. XD +1 per i test nel browser
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Dannazione l'entità API la codifica.
George Reith,

7

PowerShell (v4), 228 217 209 , 157 byte

$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."}

per esempio

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!"}}

(Mi dispiace, Keith Randall, sei stato il primo account che ho trovato con> 1 giorno dall'ultima data vista).

Sono stato contento del solido, affidabile 209 byte uno che chiama l'API, ma lo screen-scraping è la strada da percorrere per il golf.

  • Questo ora estrae il nome utente dall'URI reindirizzato, ma è un nome anziché un ID numerico, come richiesto.

  • E corrisponde alla linea Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>con il n <... [nr]s ago<tentativo di catturare sec (s) fa, min (s) fa, ora (s) fa, e proprio ora, e perdere "giorni settimane, mesi" fa, o le date a lungo termine + volte. E cercando di catturare "l'ultima volta" e non le altre volte relative. (Grazie Dennis).

NB. curlè un alias predefinito per Invoke-WebRequest, non è il programma standard di arricciatura portato su Windows.


2
C'è anche secs ago, 1 min ago(no s), e penso di aver visto just now.
Dennis,

@Dennis Penso che sia stato risolto ora, grazie. (a costo di rimanere dietro la tua risposta di Bash; forse dovrei provare spudoratamente a usare i tuoi pattern match ...).
Tessellating Heckler,

5

R, 384 350 byte

Questo è per te, 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!")

Si noti che ciò richiede l' installazione dei pacchetti httre jsonlite, sebbene non debbano essere importati per far funzionare questo codice poiché ci riferiamo esplicitamente agli spazi dei nomi.

Ungolfed:

# 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!")
}

Ho salvato 5 byte sul mio approccio precedente e corretto un errore nel mio approccio attuale grazie a minxomat!


Non so di R, ma non puoi salvare alcuni byte mettendo la stringa letterale "/users/"in una variabile?
mınxomaτ,

@minxomat Certo, grazie!
Alex A.

\ n e; accetta la stessa quantità di byte. Quindi il tuo codice non deve apparire così
OganM,

@OganM In realtà, in R, scan()penseranno che le righe successive siano le cose che vuoi inserire da STDIN (chissà perché), quindi i punti e virgola sono richiesti in questo caso. Ma in generale hai ragione.
Alex A.

5

AutoIt, 320 316 308 byte

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

_DateDiffcalcola la differenza in giorni ( 'D'). Sarà 0 se la differenza è inferiore a 1 giorno, quindi possiamo usarlo come valore booleano. Il tag del titolo del valore "Ultimo accesso" contiene un timestamp (quasi) standard.


2
Non lo vedo da più di un decennio. Signore, prendi il mio voto.
Qix,

1

PHP, 187 byte

Approccio abbastanza semplicistico, usando il dominio codegolf.xyz, solo un elemento leggermente diverso qui è che cerco di ottenere entrambe le variabili contemporaneamente. Testato su alcuni utenti con risultati corretti, per favore fatemi sapere se ci sono alcune aree problematiche!

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

$m[1] is appare due volte. Non sarebbe più economico stamparlo prima e usare il ternario solo per la parte morta / viva?
mınxomaτ,

@minxomat Ci ho giocato, ma la Sadly, ...parte si è messa in mezzo ... Non riesco a pensarci bene!
Dom Hastings,

Fai eco prima a Sadly, quindi assegna il risultato time()-strtotime($m[2])a una variabile a carattere singolo. Quindi riecheggia $m[1] is e infine i morti / vivi. È così che ho fatto - non so se funzionerà in PHP :)
mınxomaτ

@minxomat Ahhh, così semplice, ma non ci sono riuscito! Grazie! Aggiornerò non appena posso provare di nuovo!
Dom Hastings,

1

Groovy, 355 byte

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!"

Fonte non compressa

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!"
}

Puoi salvare 42 byte (riducendolo a 313 byte) se esegui semplicemente groovy.json.JsonSlurper e new java.util.zip.GZIPInputStream anziché le importazioni. L'importazione in genere paga solo se usi molto una classe.
uno spaghetto l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.