Знайдіть наших зниклих безвісти


19

Виклик

Петро знову воскрес, щоб врятувати нас від дублюючих викликів!

Пітер Тейлор мертвий , і в цьому немає сумнівів (ну, крім величезної кількості сумнівів, які ми маємо ... але просто ігноруємо це). У його пам’яті потрібно написати програму, яка визначає, чи є даний користувач живим чи мертвим.

Детальна інформація

Користувач мертвий, якщо його не бачили більше дня, ані менше, ніж тоді, вони живі. Перевірте останній знайдений тут розділ:

Місце останнього бачення

Вхід буде ідентифікатором користувача (наприклад, мій - 30525, а Пітер Тейлор - 194). Припустимо, що всі входи є дійсними ідентифікаторами PPCG.

Якщо користувач живий, слід вивести:

[User name] is alive!

Якщо ви заміните [Ім'я користувача] на їх ім’я користувача, а не їх ідентифікатор користувача.

Якщо користувач помер, слід вивести:

 Sadly, [User name] is dead.

Вступникам T-SQL, що використовують провідник даних SE , заборонено.

Перемога

Виграє найкоротша програма в байтах.

Таблиця лідерів

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?
Геобіц

1
Потрібен опис, де можна знайти номер для "востаннє переглянутого".
feersum

@feersum Це тег заголовка останнього баченого значення.
mınxomaτ

@feersum Досить добре?
Бета-розпад

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 немає регулярних виразів ...

Онлайн-перекладач не виконує веб-запити, тому це працюватиме лише з командного рядка.


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
Я оновив свій профіль, і раптом я мертвий. :(
TesselilingHeckler

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 кодує його.
Джордж Рейт

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

(Вибачте, Кіт Рендалл, ви були лише першим обліковим записом, який я знайшов за> 1 день з часу останнього побачення).

Я був задоволений міцним, надійним 209 байтом, який викликав API, але скраптинг екрану - це спосіб поїхати в гольф.

  • Тепер це витягує ім'я користувача з перенаправленого URI - але це ім'я, а не числовий ідентифікатор, як потрібно.

  • І це відповідає лінії 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 Я думаю, що це зараз виправлено, дякую. (ціною відставання від вашої відповіді Баша; можливо, я повинен спробувати безсоромно, використовуючи ваші відповідні шаблони ...).
TessellatingHeckler

5

R, 384 350 байт

Цей для вас, Петре!

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пакети, хоча їх не потрібно імпортувати, щоб цей код працював, оскільки ми чітко посилаємось на простори імен.

Безголівки:

# 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 Звичайно, дякую!
Олексій А.

\ n і; взяти однакову кількість байтів. Тож ваш код не повинен виглядати так
OganM

@OganM Насправді в R scan()подумають, що наступні рядки - це те, що ви хочете ввести з STDIN (хто знає чому), тому крапки з комою потрібні в цьому випадку. Але взагалі ти маєш рацію.
Олексій А.

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'). Буде 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, ...роль перешкоджала ... Здається, я не можу обернутись головою!
Дом Гастінгс

Спочатку відлучіть Сумно, а потім призначте результат з time()-strtotime($m[2])однозначної змінної. Тоді відлуння $m[1] is і нарешті мертві / живі. Ось як я це зробив - не знаю, якщо це працюватиме в PHP :)
mınxomaτ

@minxomat Ahhh, така проста, але я не міг обернути голову! Спасибі! Я оновлюсь, як тільки зможу знову перевірити!
Дом Гастінгс

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. Імпорт зазвичай окупається, лише якщо ви багато використовуєте клас.
спагетто
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.