Encontre nossos mortos desaparecidos

19

Desafio

Peter ressuscitou para nos salvar dos desafios duplicados!

Peter Taylor está morto , e não há dúvida sobre isso (bem, além da enorme quantidade de dúvida que temos ... mas apenas ignore isso). Na memória dele, você deve escrever um programa que determine se um determinado usuário está vivo ou morto.

Outras informações

Um usuário está morto se não for visto por mais de um dia, a menos que esteja vivo. Confira a última seção vista encontrada aqui:

Localização da última visualização

A entrada será uma identificação de usuário (por exemplo, a minha é 30525 e a de Peter Taylor é 194). Suponha que todas as entradas sejam IDs PPCG válidas.

Se o usuário estiver vivo, você deve gerar:

[User name] is alive!

Onde você substitui [Nome do usuário] pelo nome de usuário e não pelo ID do usuário.

Se o usuário estiver morto, você deverá gerar:

 Sadly, [User name] is dead.

Os participantes do T-SQL que usam o SE Data Explorer não são permitidos.

Ganhando

O programa mais curto em bytes vence.

Entre os melhores

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
fonte
2
Por que não permitir o T-SQL / SEDE?
Geobits
11
Precisa de uma descrição de onde encontrar o número para "visto pela última vez".
feersum
@feersum É a tag de título do último valor visto.
mınxomaτ 5/10/2015
@feersum Bom o suficiente?
Decay Beta
11
Eu acho que a análise é mais relevante para isso do que a internet .
mınxomaτ 5/10/2015

Respostas:

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%

A ideia é a mesma da minha resposta do Bash , exceto que essa resposta não usa expressões regulares, porque o CJam não tem expressões regulares ...

O intérprete online não executa solicitações da Web, portanto, isso funcionará apenas na linha de comando.

Dennis
fonte
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 costume, a saída para STDERR é ignorada .

Exemplo de execução

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

Idéia

Esse código greps para linhas contendo s="rque não têm >antes de sua ocorrência. Por exemplo:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Se a correspondência for seguida pela sequência da, ela conterá a palavra yesterdayou days(como em2 days ago ).
  • Se a correspondência for seguida por uma letra maiúscula, ela conterá o nome de um mês.
  • Em todos os outros casos, o usuário está morto- vivo.

O nome do usuário é extraído de uma metatag no Twitter. Exemplo:

<meta name="twitter:title" property="og:title" itemprop="title name" content="User Dennis">
Dennis
fonte
3
Atualizei meu perfil e de repente estou morto. :(
TessellatingHeckler
5
Você não está mais morto para mim.
Dennis
11
Isso é um alívio!
TessellatingHeckler
Quem registrou esse domínio?
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>`)

Versão 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
fonte
Não consegue analisar o apóstrofo em meu nome, mas analisa corretamente todos os outros caracteres. XD +1 para testes no navegador
Conor O'Brien
11
@ CᴏɴᴏʀO'Bʀɪᴇɴ Droga, a entidade da API o 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."}

por exemplo

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

(Desculpe, Keith Randall, você foi apenas a primeira conta que encontrei com> 1 dia desde a última data vista).

Fiquei feliz com o sólido e confiável bloco de 209 bytes que chamava de API, mas a captura de tela é o caminho a seguir para o golfe.

  • Agora isso puxa o nome de usuário do URI redirecionado - mas é um nome e não um ID numérico, conforme necessário.

  • E corresponde à linha Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>com a n <... [nr]s ago<tentativa de capturar segundos (s), minutos (s) atrás, horas (s) atrás e agora e perder "dias semanas, meses" atrás ou as datas + horas de longo prazo. E tentando pegar 'visto pela última vez' e não os outros às vezes. (Obrigado Dennis).

NB curlé um alias padrão para Invoke-WebRequest, não é o programa de curvatura padrão portado para o Windows.

TessellatingHeckler
fonte
2
Há também secs ago, 1 min ago(não s), e eu acho que eu já vi just now.
Dennis
@ Dennis Eu acho que está resolvido agora, obrigado. (ao custo de ficar para trás da sua resposta do Bash; talvez eu deva tentar descaradamente usar suas correspondências de padrões ...).
TessellatingHeckler
5

R, 384 350 bytes

Este é para você, 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!")

Observe que isso requer o httrejsonlite pacotes a serem instalados, embora eles não têm de ser importados para este código para o trabalho, já que estamos namespaces referenciando explicitamente.

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

Salvei 5 bytes na minha abordagem anterior e corrigi um erro na minha abordagem atual graças ao minxomat!

Alex A.
fonte
Eu não sei sobre R, mas você não pode salvar alguns bytes colocando a string literal "/users/"em uma variável?
mınxomaτ 5/10/2015
@minxomat Claro que sim, obrigado!
Alex A.
\ n e; pegue a mesma quantidade de bytes. Portanto, seu código não precisa se parecer com isso?
OganM 5/15
@OganM Na verdade, em R, as scan()linhas seguintes são as que você deseja inserir no STDIN (quem sabe o porquê); portanto, o ponto e vírgula é necessário neste caso. Mas, em geral, você está certo.
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 a diferença em dias ( 'D'). Será 0 se a diferença for menor que 1 dia, para que possamos usá-lo como um valor booleano. A tag title do valor "visto pela última vez" contém um carimbo de data / hora (quase) padrão.

mınxomaτ
fonte
2
Não o vejo há mais de uma década. Senhor, aceite meu voto.
Qix
1

PHP, 187 bytes

Uma abordagem bastante simplista, usando o domínio codegolf.xyz, apenas um item ligeiramente diferente aqui é que tento obter as duas variáveis ​​ao mesmo tempo. Testado em alguns usuários com resultados corretos, informe-me se houver algumas á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
fonte
$m[1] is aparece duas vezes. Não seria mais barato imprimir isso primeiro e usar o ternário apenas para a parte morta / viva?
mınxomaτ 6/10/2015
@minxomat Eu brinquei com isso, mas a Sadly, ...parte ficou no caminho ... Parece que não consigo entender!
Dom Hastings
Faça eco o primeiro, e depois atribua o resultado time()-strtotime($m[2])a uma variável de caractere único. Então ecoam $m[1] is e finalmente os mortos / vivos. Isso é como eu fiz isso - não sei se isso vai funcionar em PHP :)
mınxomaτ
@minxomat Ahhh, tão simples, mas eu não conseguia entender! Obrigado! Vou atualizar assim que puder testar novamente!
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!"

Fonte não compactada

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
fonte
Você pode salvar 42 bytes (reduz para 313 bytes) se apenas fizer o novo groovy.json.JsonSlurper e o novo java.util.zip.GZIPInputStream em vez das importações. A importação normalmente compensa se você usa muito uma aula.
a spaghetto