Retrouver nos morts disparus

19

Défi

Peter s'est de nouveau levé pour nous sauver des défis en double!

Peter Taylor est mort , et cela ne fait aucun doute (enfin, à part l'énorme quantité de doute que nous avons ... mais ignorez cela). Dans sa mémoire, vous devez écrire un programme qui détermine si un utilisateur donné est vivant ou mort.

Plus d'informations

Un utilisateur est mort s'il n'a pas été vu depuis plus d'une journée, moins que cela, alors il est vivant. Vérifiez la dernière section vue ici:

Lieu de la dernière vue

L'entrée sera un identifiant d'utilisateur (par exemple, le mien est 30525 et celui de Peter Taylor est 194). Supposons que toutes les entrées sont des ID PPCG valides.

Si l'utilisateur est vivant, vous devez afficher:

[User name] is alive!

Où vous remplacez [Nom d'utilisateur] pour son nom d'utilisateur non leur identifiant d'utilisateur.

Si l'utilisateur est mort, vous devez sortir:

 Sadly, [User name] is dead.

Entrants T-SQL utilisant SE Data Explorer ne sont pas autorisés.

Gagnant

Le programme le plus court en octets gagne.

Classement

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 Decay
la source
2
Pourquoi interdire T-SQL / SEDE?
Geobits
1
Besoin d'une description de l'endroit où trouver le numéro de la dernière fois.
feersum
@feersum C'est la balise de titre de la dernière valeur vue.
mınxomaτ
@feersum Assez bien?
Beta Decay
1
Je pense que l' analyse est plus pertinente à ce sujet qu'Internet .
mınxomaτ

Réponses:

4

CJam, 115 octets

"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'idée est la même que dans ma réponse Bash , sauf que cette réponse n'utilise pas d'expressions régulières, car CJam n'a pas d'expressions régulières ...

L'interpréteur en ligne n'effectue pas de requêtes Web, cela ne fonctionnera donc qu'à partir de la ligne de commande.

Dennis
la source
8

Bash, 151 octets

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

Comme d'habitude, la sortie vers STDERR est ignorée .

Exemple d'exécution

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

Idée

Ce code recherche les lignes s="rqui n'en contiennent pas >avant son occurrence. Par exemple:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Si la correspondance est suivie de la chaîne da, elle contient le mot yesterdayou days(comme dans2 days ago ).
  • Si la correspondance est suivie d'une lettre majuscule, elle contient le nom d'un mois.
  • Dans tous les autres cas, l'utilisateur est mort- vivant.

Le nom de l'utilisateur est extrait d'une balise META Twitter. Exemple:

<meta name="twitter:title" property="og:title" itemprop="title name" content="User Dennis">
Dennis
la source
3
J'ai mis à jour mon profil et soudain je suis mort. :(
TessellatingHeckler
5
Tu n'es plus mort pour moi.
Dennis
1
C'est un soulagement!
TessellatingHeckler
Qui a enregistré ce domaine?
jimmy23013
@ jimmy23013 minxomat
Dennis
7

Javascript ES6, 234 octets

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

Version annotée

// 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
la source
N'analyse pas l'apostrophe en mon nom, mais analyse correctement tous les autres caractères. XD +1 pour les tests dans le navigateur
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Merde l'entité API l'encode.
George Reith
7

PowerShell (v4), 228 217 209 , 157 octets

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

par exemple

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

(Désolé, Keith Randall, vous n'étiez que le premier compte que j'ai trouvé avec> 1 jour depuis la dernière date vue).

J'étais content du solide et fiable 209 octets qui appelle l'API, mais le grattage d'écran est la voie à suivre pour le golf.

  • Cela extrait maintenant le nom d'utilisateur de l'URI redirigé - mais c'est un nom plutôt qu'un ID numérique, comme requis.

  • Et cela correspond à la ligne Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>avecn <... [nr]s ago< essayer d'attraper il y a sec (s), min (s), heure (s), et juste maintenant, et manquer "jours semaines, mois" il y a, ou les dates + heures à long terme. Et essayer d'attraper «dernière vue» et non les autres temps relativet. (Merci Dennis).

NB. curlest un alias par défaut pour Invoke-WebRequest, ce n'est pas le programme curl standard porté sur Windows.

TessellatingHeckler
la source
2
Il y a aussi secs ago, 1 min ago(non s), et je pense avoir vu just now.
Dennis
@Dennis Je pense que c'est réglé maintenant, merci. (au prix de prendre du retard sur votre réponse Bash; peut-être devrais -je essayer sans vergogne d'utiliser vos correspondances de motifs ...).
TessellatingHeckler
5

R, 384 350 octets

Celui-ci est pour toi, 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!")

Notez que cela nécessite que les packages httret jsonlitesoient installés, bien qu'ils n'aient pas besoin d'être importés pour que ce code fonctionne, car nous référençons explicitement les espaces de noms.

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

Sauvegardé 5 octets sur mon approche précédente et corrigé une erreur dans mon approche actuelle grâce à minxomat!

Alex A.
la source
Je ne sais pas pour R, mais ne pouvez-vous pas enregistrer quelques octets en mettant le littéral de chaîne "/users/"dans une variable?
mınxomaτ
@minxomat Bien sûr, merci!
Alex A.
\ n et; prendre le même nombre d'octets. Donc, votre code n'a pas à ressembler à ça
OganM
@OganM En fait, dans R, vous scan()penserez que les lignes suivantes sont les éléments que vous souhaitez saisir depuis STDIN (qui sait pourquoi), donc les points-virgules sont requis dans ce cas. Mais en général, vous avez raison.
Alex A.
5

AutoIt, 320 316 308 octets

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

_DateDiffcalcule la différence en jours ( 'D'). Ce sera 0 si la différence est inférieure à 1 jour, nous pouvons donc l'utiliser comme valeur booléenne. La balise de titre de la valeur "dernière vue" contient un horodatage (presque) standard.

mınxomaτ
la source
2
Je ne l'ai pas vu depuis plus d'une décennie. Seigneur, prends mon vote positif.
Qix
1

PHP, 187 octets

Approche assez simpliste, utilisant le domaine codegolf.xyz, seul élément légèrement différent ici est que j'essaie d'obtenir les deux variables à la fois. Testé sur quelques utilisateurs avec des résultats corrects, faites-moi savoir s'il y a des problèmes!

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

Usage:

php 59763.php 30525
Dom Hastings
la source
$m[1] is apparaît deux fois. Ne serait-il pas moins cher d'imprimer cela en premier et d'utiliser le ternaire juste pour la partie morte / vivante?
mınxomaτ
@minxomat J'ai joué avec ça, mais le Sadly, ...rôle m'a gêné ... Je n'arrive pas à comprendre ce que j'en pense !
Dom Hastings du
Faites d'abord écho au Tristement, puis affectez le résultat de time()-strtotime($m[2])à une variable à caractère unique. Puis faites écho $m[1] is et enfin les morts / vivants. Voilà comment je l'ai fait - ne sais pas si cela fonctionnera en PHP :)
mınxomaτ
@minxomat Ahhh, si simple, mais je n'ai pas réussi à m'en sortir! Merci! Je mettrai à jour dès que je pourrai tester à nouveau!
Dom Hastings du
1

Groovy, 355 octets

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

Source non compressée

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
la source
Vous pouvez économiser 42 octets (le ramène à 313 octets) si vous faites simplement de nouveaux groovy.json.JsonSlurper et de nouveaux java.util.zip.GZIPInputStream au lieu des importations. L'importation n'est généralement rentable que si vous utilisez beaucoup une classe.
un spaghetto du