Tìm cái chết mất tích của chúng tôi


19

Thử thách

Peter đã sống lại để cứu chúng ta khỏi những thách thức trùng lặp!

Peter Taylor đã chết , và không còn nghi ngờ gì nữa (ngoài số lượng nghi ngờ khổng lồ mà chúng ta có ... nhưng hãy bỏ qua điều đó). Trong bộ nhớ của anh ấy, bạn phải viết một chương trình xác định xem một người dùng nhất định còn sống hay đã chết.

Thêm thông tin

Một người dùng đã chết nếu họ không được nhìn thấy trong hơn một ngày, ít hơn thế thì họ vẫn còn sống. Kiểm tra phần nhìn thấy cuối cùng được tìm thấy ở đây:

Vị trí nhìn thấy lần cuối

Đầu vào sẽ là id người dùng (ví dụ: của tôi là 30525 và Peter Taylor là 194). Giả sử rằng tất cả các đầu vào là ID PPCG hợp lệ.

Nếu người dùng còn sống, bạn nên xuất:

[User name] is alive!

Nơi bạn thay thế [Tên người dùng] cho tên người dùng của họ chứ không phải id người dùng của họ.

Nếu người dùng đã chết, bạn nên xuất ra:

 Sadly, [User name] is dead.

Người đăng ký T-SQL sử dụng SE Data Explorer không được phép.

Chiến thắng

Chương trình ngắn nhất tính bằng byte thắng.

Bảng xếp hạng

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ại sao không cho phép T-SQL / SEDE?
Geobits

1
Cần một mô tả về nơi để tìm số cho "nhìn thấy lần cuối".
frageum

@feersum Đây là thẻ tiêu đề của giá trị được nhìn thấy lần cuối.
mınxomaτ

@feersum Đủ tốt chưa?
Beta Decay

1
Tôi nghĩ rằng phân tích cú pháp có liên quan đến điều này hơn internet .
mınxomaτ

Câu trả lời:


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%

Ý tưởng này giống như trong câu trả lời Bash của tôi , ngoại trừ câu trả lời này không sử dụng các biểu thức thông thường, bởi vì CJam không có các biểu thức chính quy ...

Trình thông dịch trực tuyến không thực hiện các yêu cầu web, vì vậy điều này sẽ chỉ hoạt động từ dòng lệnh.


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

Như thường lệ, đầu ra cho STDERR bị bỏ qua .

Chạy ví dụ

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

Ý kiến

Mã này greps cho các dòng có chứa s="rmà không có >trước khi nó xuất hiện. Ví dụ:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Nếu khớp được theo sau bởi chuỗi da, nó chứa từ yesterdayhoặc days(như trong 2 days ago).
  • Nếu trận đấu được theo sau bởi một chữ cái viết hoa, nó chứa tên của một tháng.
  • Trong mọi trường hợp khác, người dùng là Undead sống.

Tên người dùng được trích xuất từ ​​thẻ meta Twitter. Thí dụ:

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

3
Tôi đã cập nhật hồ sơ của mình và đột nhiên tôi chết. :(
TessellatingHeckler

5
Bạn không còn chết với tôi.
Dennis

1
Đó là một cứu trợ!
TessellatingHeckler

Ai đã đăng ký tên miền đó?
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>`)

Phiên bản chú thích

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

Không thể phân tích dấu nháy đơn trong tên của tôi, nhưng phân tích chính xác mọi ký tự khác. XD +1 để thử nghiệm trên trình duyệt
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Chết tiệt thực thể API mã hóa nó.
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."}

ví dụ

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

(Xin lỗi, Keith Randall, bạn chỉ là tài khoản đầu tiên tôi tìm thấy với> 1 ngày kể từ ngày nhìn thấy lần cuối).

Tôi rất hài lòng với 209 byte chắc chắn, đáng tin cậy khi gọi API, nhưng quét màn hình là cách để chơi gôn.

  • Điều này bây giờ lấy tên người dùng từ URI được chuyển hướng - nhưng đó là tên chứ không phải ID số, ​​theo yêu cầu.

  • Và nó phù hợp với dòng Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>với n <... [nr]s ago<cố gắng để nắm bắt giây (s) trước, min (s) trước, giờ (s) trước, và ngay bây giờ, và bỏ lỡ "ngày tuần, hàng tháng" trước, hoặc những ngày dài hạn + lần. Và cố gắng để bắt 'nhìn thấy lần cuối' chứ không phải các mối quan hệ tương đối khác. (Cảm ơn Dennis).

Lưu ý curllà một bí danh mặc định cho Invoke-WebRequest, nó không phải là chương trình curl tiêu chuẩn được chuyển sang Windows.


2
Cũng có secs ago, 1 min ago(không s), và tôi nghĩ tôi đã thấy just now.
Dennis

@Dennis Tôi nghĩ rằng nó đã được sửa bây giờ, cảm ơn. (với chi phí giảm sau câu trả lời Bash của bạn; có lẽ tôi nên thử một cách không biết xấu hổ bằng cách sử dụng mô hình khớp của bạn ...).
TessellatingHeckler

5

R, 384 350 byte

Đây là cho bạn, 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!")

Lưu ý rằng điều này đòi hỏi các gói httrjsonlitephải được cài đặt, mặc dù chúng không phải được nhập để mã này hoạt động vì chúng tôi đang tham chiếu không gian tên một cách rõ ràng.

Ung dung:

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

Đã lưu 5 byte theo cách tiếp cận trước đây của tôi và sửa lỗi trong cách tiếp cận hiện tại của tôi nhờ vào minxomat!


Tôi không biết về R, nhưng bạn không thể lưu một số byte bằng cách đặt chuỗi ký tự "/users/"thành một biến?
mınxomaτ

@minxomat Chắc chắn có thể, cảm ơn!
Alex A.

\ n và; lấy cùng một lượng byte. Vì vậy, mã của bạn không phải trông như thế
OganM

@OganM Thật ra, trong R, scan() sẽ nghĩ các dòng thành công là thứ bạn muốn nhập từ STDIN (người biết tại sao), vì vậy dấu chấm phẩy được yêu cầu trong trường hợp này. Nhưng nói chung bạn đúng.
Alex A.

5

Tự động, 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!'))

_DateDiffcalcs sự khác biệt trong ngày ( 'D'). Nó sẽ là 0 nếu chênh lệch ít hơn 1 ngày, vì vậy chúng ta có thể sử dụng nó làm giá trị boolean. Thẻ tiêu đề của giá trị "nhìn thấy lần cuối" chứa dấu thời gian chuẩn (gần như).


2
Tôi đã không thấy nó tự động trong hơn một thập kỷ. Lạy Chúa, xin hãy nâng đỡ con.
Qix 6/10/2015

1

PHP, 187 byte

Cách tiếp cận khá đơn giản, sử dụng tên miền codegolf.xyz, chỉ có một mục hơi khác ở đây là tôi cố gắng lấy cả hai biến cùng một lúc. Đã thử nghiệm trên một vài người dùng với kết quả chính xác, vui lòng cho tôi biết nếu có một số khu vực có vấn đề!

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

Sử dụng:

php 59763.php 30525

$m[1] is xuất hiện hai lần. Sẽ không rẻ hơn khi in cái này trước và sử dụng ternary chỉ cho phần chết / còn sống?
mınxomaτ

@minxomat Tôi đã chơi với nó, nhưng Sadly, ...phần đó đã cản trở ... dường như không thể có được cái đầu của tôi xung quanh nó!
Dom Hastings

Trước tiên, báo lại Sadly, sau đó gán kết quả từ time()-strtotime($m[2])một biến char đơn. Sau đó lặp lại $m[1] is và cuối cùng là người chết / còn sống. Đó là cách tôi đã làm - dunno nếu điều này sẽ hoạt động trong PHP :)
mınxomaτ

@minxomat Ahhh, đơn giản quá, nhưng tôi không thể quay đầu lại được! Cảm ơn! Tôi sẽ cập nhật ngay khi tôi có thể kiểm tra lại!
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!"

Nguồn không nén

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

Bạn có thể lưu 42 byte (giảm xuống còn byte byte) nếu bạn chỉ cần thực hiện Groovy.json.JsonSlurper và java.util.zip.GZIPInputStream mới thay vì nhập. Nhập khẩu thường chỉ trả hết nếu bạn sử dụng một lớp nhiều.
một spaghetto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.