ค้นหาคนที่หายไปของเรา


19

ท้าทาย

ปีเตอร์กลับมาอีกครั้งเพื่อช่วยเราให้พ้นจากความท้าทายที่ซ้ำซ้อน!

Peter Taylor ตายแล้วและไม่ต้องสงสัยเลย (นอกเหนือจากข้อสงสัยมากมายที่เรามี ... แต่เพียงแค่เพิกเฉยต่อเรื่องนั้น) ในความทรงจำของเขาคุณต้องเขียนโปรแกรมที่กำหนดว่าผู้ใช้ที่ให้มีชีวิตหรือตาย

ข้อมูลเพิ่มเติม

ผู้ใช้จะตายถ้าพวกเขาไม่ได้เห็นมานานกว่าหนึ่งวันมีน้อยกว่านั้นพวกเขายังมีชีวิตอยู่ ตรวจสอบหัวข้อล่าสุดที่พบที่นี่:

ตำแหน่งที่เห็นล่าสุด

อินพุตจะเป็น ID ผู้ใช้ (ตัวอย่างเช่นของฉันคือ 30525 และ Peter Taylor's คือ 194) สมมติว่าอินพุตทั้งหมดเป็นรหัส PPCG ที่ถูกต้อง

หากผู้ใช้ยังมีชีวิตอยู่คุณควรส่งออก:

[User name] is alive!

ที่ซึ่งคุณแทนที่ [ชื่อผู้ใช้] สำหรับชื่อผู้ใช้ไม่ใช่รหัสผู้ใช้

หากผู้ใช้ตายคุณควรเอาท์พุท:

 Sadly, [User name] is dead.

ผู้ใช้ T-SQL ที่ใช้SE Data Explorerไม่ได้รับอนุญาต

การชนะ

โปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

ลีดเดอร์บอร์ด

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%

แนวคิดนี้เหมือนกับในคำตอบ Bash ของฉันยกเว้นว่าคำตอบนี้ไม่ได้ใช้การแสดงออกปกติเพราะ CJam ไม่มีการแสดงออกปกติ ...

ล่ามออนไลน์ไม่ทำงานตามคำขอของเว็บดังนั้นจะสามารถใช้งานได้จากบรรทัดคำสั่งเท่านั้น


8

Bash, 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.

ความคิด

รหัสนี้ greps สำหรับบรรทัดที่ประกอบด้วย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
คุณจะไม่ตายกับฉันอีกต่อไป
เดนนิส

1
นั่นเป็นการปลดปล่อย!
TessellatingHeckler

ใครลงทะเบียนโดเมนนั้น
jimmy23013

@ jimmy23013 minxomat
Dennis

7

Javascript 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), 228 217 209 , 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 วันนับจากวันที่เห็นครั้งล่าสุด)

ฉันมีความสุขกับความมั่นคงและเชื่อถือได้ 209 ไบต์หนึ่งที่เรียก API แต่การขูดหน้าจอเป็นวิธีที่จะไปเล่นกอล์ฟ

  • ตอนนี้จะดึงชื่อผู้ใช้จาก 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-WebRequestไม่ใช่โปรแกรม curl มาตรฐานที่ส่งไปยัง Windows


2
นอกจากนี้ยังมีsecs ago, 1 min ago(ไม่s) และผมคิดว่าjust nowผมเคยเห็น
Dennis

@Dennis ฉันคิดว่ามันคงที่แล้วขอบคุณ (ด้วยค่าใช้จ่ายที่อยู่เบื้องหลังคำตอบ Bash ของคุณบางทีฉันควรลองใช้รูปแบบการจับคู่ของคุณอย่างไร้ยางอาย ... )
TessellatingHeckler

5

R, 384 350 ไบต์

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

โปรดทราบว่าสิ่งนี้ต้องใช้ httrและjsonliteติดตั้งแพ็กเกจแม้ว่าจะไม่ต้องนำเข้าเพื่อให้รหัสนี้ทำงานเนื่องจากเราอ้างอิงเนมสเปซอย่างชัดเจน

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

บันทึก 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!'))

_DateDiffcalcs ความแตกต่างในวัน ( 'D') มันจะเป็น 0 ถ้าความแตกต่างน้อยกว่า 1 วันดังนั้นเราสามารถใช้มันเป็นค่าบูลีน แท็กชื่อของค่า "เห็นล่าสุด" มีการประทับเวลามาตรฐาน (เกือบ)


2
ฉันไม่ได้เห็นมันอัตโนมัติในรอบทศวรรษ ข้า แต่พระเจ้า
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, ...ส่วนนั้นไปในทาง ... ดูเหมือนจะไม่ได้รับรอบฉัน!
Dom Hastings

Echo the Sadly แรกจากนั้นกำหนดผลลัพธ์จากtime()-strtotime($m[2])ให้กับตัวแปรแบบอักขระเดี่ยว จากนั้นเสียงสะท้อน$m[1] is และความตาย / ในที่สุด นั่นเป็นวิธีที่ฉันทำ - dunno หากสิ่งนี้จะทำงานใน PHP :)
mınxomaτ

@minxomat Ahhh ง่ายมาก แต่ฉันไม่สามารถเอาหัวไปรอบ ๆ มันได้! ขอบคุณ! ฉันจะอัปเดตทันทีที่ฉันสามารถทดสอบได้อีกครั้ง!
Dom Hastings

1

Groovy ขนาด 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!"
}

คุณสามารถบันทึก 42 ไบต์ (ลดลงเหลือ 313 ไบต์) หากคุณเพิ่งสร้าง groovy.json.JsonSlurper และ java.util.zip.GZIPInputStream ใหม่แทนการอิมพอร์ต โดยปกติการนำเข้าจะจ่ายเงินเมื่อคุณใช้คลาสมาก
ปาเก็ตตี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.