우리의 실종자를 찾아라


19

도전

베드로는 우리에게 중복 된 도전에서 우리를 구원하기 위해 다시 일어났습니다!

피터 테일러는 죽었고 그것에 대해 의심의 여지가 없습니다. 그의 기억 속에는 주어진 사용자가 살아 있는지 아니면 죽었는지 결정하는 프로그램을 작성해야합니다.

추가 정보

사용자가 하루 이상 보지 않으면 사망 한 것입니다. 여기에서 마지막으로 본 섹션을 확인하십시오.

마지막으로 본 위치

입력은 사용자 ID가됩니다 (예 : 내 것은 30525이고 Peter Taylor는 194입니다). 모든 입력이 유효한 PPCG ID라고 가정하십시오.

사용자가 살아있는 경우 다음을 출력해야합니다.

[User name] is alive!

사용자 ID가 아닌 사용자 이름으로 [사용자 이름]을 바꾸는 경우 .

사용자가 사망 한 경우 다음을 출력해야합니다.

 Sadly, [User name] is dead.

SE Data Explorer를 사용하는 T-SQL 참가자 는 허용되지 않습니다.

승리

바이트 단위의 최단 프로그램이 이깁니다.

리더 보드

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
왜 T-SQL / SEDE를 허용하지 않습니까?
Geobits

1
"마지막 본"번호를 찾을 수있는 위치에 대한 설명이 필요합니다.
feersum

@feersum 마지막으로 본 값의 제목 태그입니다.
mınxomaτ

@feersum 충분합니까?
Beta Decay

1
파싱인터넷 보다 이것과 더 관련이 있다고 생각 합니다.
mınxomaτ

답변:


4

CJam, 115 바이트

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

CJam에는 정규 표현식이 없기 때문에이 답변은 정규 표현식을 사용하지 않는다는 점을 제외하면 아이디어는 Bash 답변 과 동일합니다.

온라인 통역사는 웹 요청을 수행하지 않으므로 명령 줄에서만 작동합니다.


8

배쉬, 151 바이트

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

평소와 같이 STDERR 로의 출력은 무시 됩니다.

예제 실행

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

생각

이 코드 는 발생하기 전에 포함 s="r되지 않은 행을 포함 합니다 >. 예를 들면 다음과 같습니다.

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • 경기가 문자열 뒤에 경우 da,이 단어가 포함 yesterday또는 days(같이를 2 days ago).
  • 일치에 대문자가 오는 경우 월 이름이 포함됩니다.
  • 다른 모든 경우에는 사용자가 언데드 입니다.

사용자 이름은 Twitter 메타 태그에서 추출됩니다. 예:

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

3
내 프로필을 업데이트했는데 갑자기 죽었습니다. :(
TessellatingHeckler

5
당신은 더 이상 나에게 죽지 않았습니다.
Dennis

1
안심입니다!
TessellatingHeckler

누가 그 도메인을 등록 했습니까?
jimmy23013

@ jimmy23013 minxomat
데니스

7

자바 스크립트 ES6, 234 바이트

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

주석이 달린 버전

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

내 이름으로 아포스트로피를 구문 분석하지 못하지만 다른 모든 문자를 올바르게 구문 분석합니다. 브라우저 내 테스트를위한 XD +1
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ API 엔티티가 그것을 인코딩합니다.
George Reith

7

PowerShell (v4), 228217209 , 157 바이트

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

예 :

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

(죄송합니다, Keith Randall, 당신은 내가 마지막으로 본 날짜 이후> 1 일 동안 찾은 첫 번째 계정이었습니다).

API를 호출하는 견고하고 안정적인 209 바이트 하나에 만족했지만 화면 스크래핑이 골프를가는 길입니다.

  • 이제 리디렉션 된 URI에서 사용자 이름을 가져옵니다. 그러나 필요에 따라 숫자 ID가 아닌 이름입니다.

  • 그리고 그것은 라인을 일치 Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>n <... [nr]s ago<, 분 (들) 전 (들) 전에 캐치 초에 노력, 시간 (들) 전, 그리고 지금, 미스 "일 주, 월"전 또는 장기 날짜 + 시간. 그리고 다른 상대 시간이 아닌 '최근에 본 것'을 잡으려고 노력했습니다. 고마워.

NB. curl의 기본 별칭이며 Invoke-WebRequestWindows로 포팅되는 표준 curl 프로그램이 아닙니다.


2
이 또한 없다 secs ago, 1 min ago(없음 s), 내가 생각하는 내가 본 just now.
Dennis

@ 데니스 나는 그것이 고쳐 졌다고 생각합니다. 감사합니다. (Bash 답변에 뒤지지 않는 비용으로; 아마도 패턴 일치를 사용하여 부끄럽게 시도 해야합니다 ...).
TessellatingHeckler

5

R, 384350 바이트

이건 너를위한거야, 피터!

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

네임 스페이스를 명시 적으로 참조하기 때문에이 코드가 작동 하기 위해 httrjsonlite패키지를 가져와야 할 필요는 없지만 패키지를 설치해야합니다.

언 골프 드 :

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

이전 접근 방식에서 5 바이트를 절약하고 minxomat 덕분에 현재 접근 방식의 오류를 수정했습니다!


나는 R에 대해 몰랐지만 문자열 리터럴 "/users/"을 변수 에 넣어서 바이트를 절약 할 수는 없습니까?
mınxomaτ

@minxomat 물론 감사합니다!
Alex A.

\ n 및; 같은 양의 바이트를 사용하십시오. 따라서 코드는 그렇게 보일 필요가 없습니다
OganM

@OganM 실제로 R에서는 scan()다음 줄이 STDIN에서 입력하려는 항목이라고 생각합니다 (이유를 아는 사람).이 경우 세미콜론이 필요합니다. 그러나 일반적으로 당신이 맞습니다.
Alex A.

5

AutoIt을, 320 (316) 308 바이트

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

_DateDiff일의 차이를 계산합니다 ( 'D'). 차이가 1 일 미만이면 0이되므로이를 부울 값으로 사용할 수 있습니다. "마지막으로 본"값의 제목 태그에는 (거의) 표준 타임 스탬프가 포함됩니다.


2
나는 10 년 이상 자동차를 보지 못했습니다. 주님, 나의 공감대를 가져 가라.
Qix

1

PHP, 187 바이트

codegolf.xyz 도메인을 사용하는 상당히 단순한 접근 방식은 여기에서 약간 다른 항목만으로 두 변수를 한 번에 가져 오는 것입니다. 올바른 결과를 가진 소수의 사용자를 대상으로 테스트 한 결과 문제가있는 부분이 있으면 알려주십시오.

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

용법:

php 59763.php 30525

$m[1] is 두 번 나타납니다. 먼저 이것을 인쇄하고 죽은 / 살아있는 부분을 위해 삼항을 사용하는 것이 더 저렴하지 않습니까?
mınxomaτ

@ minxomat 나는 그것을 가지고 놀았지만, 그 Sadly, ...부분은 방해가되었습니다 ... 내 머리를 head 수없는 것 같습니다!
Dom Hastings

슬프게 먼저 에코 한 다음 결과를 time()-strtotime($m[2])단일 문자 변수에 지정하십시오. 그런 다음 $m[1] is 죽은 자와 살아있는자를 반향 시키십시오. 이것이 내가 한 방법입니다-PHP에서 작동한다면 dunno :)
mınxomaτ

@ minxomat 아아, 너무 간단하지만, 나는 내 머리를 얻을 수 없었다! 감사! 다시 테스트하자마자 업데이트하겠습니다!
Dom Hastings

1

그루비, 355 바이트

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

비 압축 소스

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

가져 오기 대신 새 groovy.json.JsonSlurper 및 새 java.util.zip.GZIPInputStream을 수행하면 42 바이트를 저장할 수 있습니다 (313 바이트로 줄임). 클래스를 많이 사용하는 경우 일반적으로 가져 오기만 사용하면됩니다.
스파게티
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.