Temukan mayat kita yang hilang


19

Tantangan

Peter telah bangkit kembali untuk menyelamatkan kita dari tantangan ganda!

Peter Taylor sudah mati , dan tidak ada keraguan tentang itu (baik, terlepas dari sejumlah besar keraguan yang kita miliki ... tapi abaikan saja itu). Dalam ingatannya, Anda harus menulis sebuah program yang menentukan apakah pengguna yang diberikan hidup atau mati.

Informasi lebih lanjut

Seorang pengguna mati jika mereka tidak terlihat lebih dari satu hari, kurang dari itu maka mereka masih hidup. Periksa bagian yang terakhir terlihat di sini:

Lokasi yang terakhir terlihat

Input akan menjadi id pengguna (misalnya, milik saya adalah 30525, dan Peter Taylor adalah 194). Asumsikan semua input adalah ID PPCG yang valid.

Jika pengguna masih hidup, Anda harus menampilkan:

[User name] is alive!

Di mana Anda mengganti [Nama pengguna] untuk nama pengguna mereka, bukan ID pengguna mereka.

Jika pengguna mati, Anda harus menampilkan:

 Sadly, [User name] is dead.

Peserta T-SQL yang menggunakan SE Data Explorer tidak diizinkan.

Kemenangan

Program terpendek dalam byte menang.

Papan peringkat

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
Mengapa melarang T-SQL / SEDE?
Geobits

1
Membutuhkan deskripsi di mana menemukan nomor untuk "terakhir terlihat".
feersum

@feersum Ini adalah tag judul dari nilai terakhir yang terlihat.
mınxomaτ

@feersum Cukup bagus?
Beta Decay

1
Saya pikir parsing lebih relevan untuk ini daripada internet .
mınxomaτ

Jawaban:


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%

Idenya sama dengan jawaban Bash saya , kecuali bahwa jawaban ini tidak menggunakan ekspresi reguler, karena CJam tidak memiliki ekspresi reguler ...

Penerjemah online tidak melakukan permintaan web, jadi ini hanya akan bekerja dari baris perintah.


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

Seperti biasa, output ke STDERR diabaikan .

Contoh dijalankan

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

Ide

Kode ini menangkap garis-garis yang mengandung s="ryang belum ada >sebelumnya. Sebagai contoh:

Last seen <span title="2015-09-17 12:00:00Z" class="relativetime">just now</span>
  • Jika kecocokan diikuti oleh string da, itu berisi kata yesterdayatau days(seperti dalam2 days ago ).
  • Jika pertandingan diikuti oleh huruf besar, itu berisi nama satu bulan.
  • Dalam semua kasus lain, pengguna adalah mayat hidup hidup.

Nama pengguna diekstrak dari tag meta Twitter. Contoh:

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

3
Saya telah memperbarui profil saya, dan tiba-tiba saya mati. :(
TessellatingHeckler

5
Kamu tidak lagi mati bagiku.
Dennis

1
Itu melegakan!
TessellatingHeckler 615

Siapa yang mendaftarkan domain itu?
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>`)

Versi beranotasi

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

Gagal mengurai apostrof dalam nama saya, namun dengan benar mem-parsing setiap karakter lainnya. XD +1 untuk pengujian di dalam browser
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sialan entitas API menyandikannya.
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."}

misalnya

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

(Maaf, Keith Randall, Anda hanya akun pertama yang saya temukan dengan> 1 hari sejak tanggal terakhir terlihat).

Saya senang dengan 209 byte yang solid dan dapat diandalkan yang memanggil API, tetapi layar-gesekan adalah cara untuk bermain golf.

  • Ini sekarang menarik nama pengguna dari URI yang dialihkan - tetapi itu adalah nama daripada ID numerik, seperti yang diperlukan.

  • Dan itu cocok dengan garis Last seen <span title="2015-10-03 13:15:38Z" class="relativetime">2 days ago</span>dengan n <... [nr]s ago<mencoba menangkap detik yang lalu, min lalu, jam lalu, dan baru saja, dan ketinggalan "hari minggu, bulan" lalu, atau tanggal jangka panjang + kali. Dan mencoba menangkap 'yang terakhir terlihat' dan bukan relativitas lain. (Terima kasih, Dennis).

NB. curladalah alias default untuk Invoke-WebRequest, itu bukan program ikal standar porting ke Windows.


2
Ada juga secs ago, 1 min ago(tidak s), dan saya pikir saya sudah melihatnya just now.
Dennis

@ Dennis Saya pikir itu sudah diperbaiki sekarang, terima kasih. (dengan biaya jatuh di belakang jawaban Bash Anda; mungkin saya harus mencoba tanpa malu-malu menggunakan kecocokan pola Anda ...).
TessellatingHeckler

5

R, 384 byte

Yang ini untukmu, 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!")

Perhatikan bahwa ini memerlukan httr danjsonlite paket paket yang harus diinstal, meskipun mereka tidak harus diimpor agar kode ini dapat berfungsi karena kita merujuk ruang nama secara eksplisit.

Tidak Disatukan:

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

Disimpan 5 byte pada pendekatan saya sebelumnya dan mengoreksi kesalahan dalam pendekatan saya saat ini berkat minxomat!


Saya tidak tahu tentang R, tetapi tidak dapat menyimpan beberapa byte dengan menempatkan string literal "/users/"ke dalam variabel?
mınxomaτ

@ minxomat Tentu bisa, terima kasih!
Alex A.

\ n dan; ambil jumlah byte yang sama. Jadi kode Anda tidak harus terlihat seperti itu
OganM

@ OganM Sebenarnya, di R, scan()akan berpikir baris berikutnya adalah hal-hal yang ingin Anda masukkan dari STDIN (siapa yang tahu mengapa), sehingga titik koma diperlukan dalam kasus ini. Tetapi secara umum Anda benar.
Alex A.

5

AutoIt, 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!'))

_DateDiffmenghitung perbedaan dalam hari ( 'D'). Ini akan menjadi 0 jika perbedaannya kurang dari 1 hari, sehingga kita dapat menggunakannya sebagai nilai boolean. Tag judul dari nilai "terakhir dilihat" berisi cap waktu standar (hampir).


2
Saya belum melihat otomatis dalam lebih dari satu dekade. Tuhan, terima jawabanku.
Qix

1

PHP, 187 byte

Pendekatan yang cukup sederhana, menggunakan domain codegolf.xyz, hanya item yang sedikit berbeda di sini adalah bahwa saya berusaha untuk mendapatkan kedua variabel sekaligus. Diuji pada beberapa pengguna dengan hasil yang benar, beri tahu saya jika ada beberapa masalah!

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

Pemakaian:

php 59763.php 30525

$m[1] is muncul dua kali. Bukankah lebih murah untuk mencetak ini dulu dan menggunakan ternary hanya untuk bagian yang mati / hidup?
mınxomaτ

@ minxomat Saya memang bermain dengan itu, tetapi Sadly, ...bagian itu menghalangi ... Sepertinya saya tidak bisa mengatasinya!
Dom Hastings

Echo the Sadly first, lalu tetapkan hasilnya dari time()-strtotime($m[2])ke variabel single-char. Lalu gema $m[1] is dan terakhir yang mati / hidup. Begitulah cara saya melakukannya - tidak tahu apakah ini akan bekerja dalam PHP :)
mınxomaτ

@ minxomat Ahhh, sangat sederhana, Tapi aku tidak bisa melupakannya! Terima kasih! Saya akan memperbarui segera setelah saya dapat menguji lagi!
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!"

Sumber terkompresi

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

Anda dapat menyimpan 42 byte (menurunkannya menjadi 313 byte) jika Anda baru saja melakukan groovy.json.JsonSlurper baru dan java.util.zip.GZIPInputStream baru alih-alih impor. Mengimpor hanya bermanfaat jika Anda sering menggunakan kelas.
spaghetto
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.