Finde unsere vermissten Toten

19

Herausforderung

Peter ist wieder aufgestanden, um uns vor den doppelten Herausforderungen zu retten!

Peter Taylor ist tot , und daran besteht kein Zweifel (abgesehen von den vielen Zweifeln, die wir haben ... aber ignorieren Sie das einfach). In seinem Gedächtnis müssen Sie ein Programm schreiben, das feststellt, ob ein bestimmter Benutzer lebt oder tot ist.

Weitere Informationen

Ein Benutzer ist tot, wenn er länger als einen Tag nicht gesehen wurde, und danach lebt er noch. Überprüfen Sie den zuletzt gesehenen Abschnitt hier:

Ort des zuletzt gesehenen

Die Eingabe ist eine Benutzer-ID (meine ist beispielsweise 30525 und die von Peter Taylor ist 194). Angenommen, alle Eingaben sind gültige PPCG-IDs.

Wenn der Benutzer am Leben ist, sollten Sie Folgendes ausgeben:

[User name] is alive!

Wenn Sie [Benutzername] durch ihren Benutzernamen ersetzen, nicht durch ihre Benutzer-ID.

Wenn der Benutzer tot ist, sollten Sie Folgendes ausgeben:

 Sadly, [User name] is dead.

T-SQL-Einträge, die den SE Data Explorer verwenden, sind nicht zulässig.

Gewinnen

Das kürzeste Programm in Bytes gewinnt.

Bestenliste

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>

Beta-Zerfall
quelle
2
Warum T-SQL / SEDE nicht zulassen?
Geobits
1
Benötigt eine Beschreibung, wo die Nummer für "zuletzt gesehen" zu finden ist.
Feersum
@feersum Dies ist der Titel des zuletzt gesehenen Wertes.
Mittwoch,
@feersum Gut genug?
Beta Decay
1
Ich denke, Parsing ist dafür relevanter als das Internet .
Mittwoch,

Antworten:

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%

Die Idee ist die gleiche wie in meiner Bash-Antwort , außer dass diese Antwort keine regulären Ausdrücke verwendet, da CJam keine regulären Ausdrücke hat ...

Der Online-Interpreter führt keine Webanforderungen aus, daher funktioniert dies nur über die Befehlszeile.

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

Die Ausgabe an STDERR wird wie gewohnt ignoriert .

Beispiellauf

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

Idee

Dieser Code sucht nach Zeilen, s="rdie >vor ihrem Auftreten keine haben . Beispielsweise:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Wenn der Übereinstimmung die Zeichenfolge folgt da, enthält sie das Wort yesterdayoder days(wie in 2 days ago).
  • Wenn der Übereinstimmung ein Großbuchstabe folgt, enthält er den Namen eines Monats.
  • In allen anderen Fällen ist der Benutzer lebend untot .

Der Name des Benutzers wird aus einem Twitter-Meta-Tag extrahiert. Beispiel:

<meta name="twitter:title" property="og:title" itemprop="title name" content="User Dennis">
Dennis
quelle
3
Ich habe mein Profil aktualisiert und bin plötzlich tot. :(
TessellatingHeckler
5
Du bist nicht länger tot für mich.
Dennis
1
Das ist eine Erleichterung!
TessellatingHeckler
Wer hat diese Domain registriert?
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>`)

Kommentierte Version

// 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
quelle
Kann das Apostroph in meinem Namen nicht analysieren, analysiert jedoch alle anderen Zeichen korrekt. XD +1 für In-Browser-Tests
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Verdammt, die API-Entität kodiert es.
George Reith
7

PowerShell (Version 4), 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."}

z.B

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

(Entschuldigung, Keith Randall, Sie waren nur der erste Account, den ich mit> 1 Tag seit dem letzten Sehtermin gefunden habe.)

Ich war mit dem soliden, zuverlässigen 209-Byte-1-Prozessor, der die API aufruft, zufrieden, aber Screen-Scraping ist der richtige Weg zum Golfen.

  • Dadurch wird der Benutzername nun aus der umgeleiteten URI abgerufen, es handelt sich jedoch nicht um eine numerische ID, sondern um einen Namen.

  • Und es passt zur Linie Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>mitn <... [nr]s ago< Versuch , vor Sekunden, vor Minuten, vor Stunden und gerade jetzt zu fangen und "Tage Wochen, Monate" vor oder die langfristigen Daten + Zeiten zu verpassen. Und versuchen, "zuletzt gesehen" und nicht die anderen relativen Zeiten zu fangen. (Danke Dennis).

NB. curlist ein Standard-Alias ​​für Invoke-WebRequest, es ist nicht das Standard-Curl-Programm, das auf Windows portiert ist.

TessellatingHeckler
quelle
2
Es gibt auch secs ago, 1 min ago(keine s), und ich denke , die ich gesehen habe just now.
Dennis
@Dennis Ich denke, das ist jetzt behoben, danke. (auf Kosten Ihrer Bash-Antwort; vielleicht sollte ich schamlos versuchen, Ihre Musterübereinstimmungen zu verwenden ...).
TessellatingHeckler
5

R, 384.350 Bytes

Das ist für dich, 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!")

Beachten Sie, dass hierfür die httr und jsonlitePakete installiert werden, obwohl sie für diesen Code zu der Arbeit nicht importiert werden müssen , da wir verweisen explizit Namensraum sind.

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

Sparte 5 Bytes auf meinem vorherigen Ansatz und korrigierte einen Fehler in meinem aktuellen Ansatz dank minxomat!

Alex A.
quelle
Ich weiß nicht über R, aber können Sie nicht ein paar Bytes sparen, indem Sie das String-Literal "/users/"in eine Variable setzen?
Mittwoch,
@minxomat Sicher kann, danke!
Alex A.
\ n und; nehmen Sie die gleiche Anzahl von Bytes. Ihr Code muss also nicht so aussehen
OganM
@OganM Tatsächlich wird in R angenommen, scan()dass nachfolgende Zeilen das Zeug sind, das Sie von STDIN eingeben möchten (wer weiß warum), daher sind in diesem Fall die Semikolons erforderlich. Aber im Allgemeinen hast du recht.
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!'))

_DateDiffberechnet die Differenz in Tagen ( 'D'). Wenn die Differenz weniger als 1 Tag beträgt, ist sie 0, sodass wir sie als Booleschen Wert verwenden können. Das Titel-Tag des Werts "Zuletzt gesehen" enthält einen (fast) Standard-Zeitstempel.

mınxomaτ
quelle
2
Ich habe es seit über einem Jahrzehnt nicht mehr gesehen. Herr, nimm meine Stimme an.
Qix
1

PHP, 187 Bytes

Ein ziemlich simpler Ansatz, der die Domain codegolf.xyz verwendet, ist, dass ich versuche, beide Variablen gleichzeitig abzurufen. Getestet auf einigen Benutzern mit korrekten Ergebnissen, lassen Sie mich bitte wissen, wenn es einige Problembereiche gibt!

<?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.";

Verwendung:

php 59763.php 30525
Dom Hastings
quelle
$m[1] is erscheint zweimal. Wäre es nicht billiger, das zuerst auszudrucken und das Ternär nur für den toten / lebendigen Teil zu verwenden?
Mittwoch,
@minxomat Ich habe damit gespielt, aber der Sadly, ...Teil hat mir im Weg gestanden.
Dom Hastings
Geben Sie zuerst "Traurig" zurück und weisen Sie dann das Ergebnis time()-strtotime($m[2])einer einzelnen Zeichenvariablen zu. Dann hall $m[1] is und endlich die Toten / Lebenden. So habe ich es gemacht - keine Ahnung, ob das in PHP funktioniert :)
Mittwoch,
@minxomat Ahhh, so einfach, aber ich konnte es nicht verstehen! Vielen Dank! Ich werde aktualisieren, sobald ich es erneut testen kann!
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!"

Nicht komprimierte Quelle

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
quelle
Sie können 42 Bytes einsparen (auf 313 Bytes), wenn Sie statt der Importe nur den neuen groovy.json.JsonSlurper und den neuen java.util.zip.GZIPInputStream ausführen. Importieren zahlt sich normalerweise nur aus, wenn Sie eine Klasse häufig verwenden.
ein Spaghetto