Мартин против Денниса - Раунд 1: у кого больше представителей?

33

Я знаю, что было много проблем с «двумя лучшими игроками в коде в мире», но этот является немного более уникальным, будучи первым раундом в серии (будущих) испытаний с участием двух из них.


Ваша задача - написать программу или функцию, которая возвращает две разные непробельные строки ASCII, соответствующие той, которая имеет больше репутации в момент запуска программы, между Деннисом ♦ и Мартином Эндером ♦ . Сложность заключается в том, что вы должны вывести точную строку «tie» в случае, если репутация идентична (маловероятно), и две разные непробельные строки ASCII, упомянутые выше, должны отличаться от «tie» * .

Нельзя вводить данные, такие как имена пользователей или идентификаторы пользователей. Как обычно, сокращения URL запрещены, как и обычные лазейки.

Примеры:

Let the chosen string for Dennis be "D" and the chosen one for Martin Ender be "M" (should be specified)

If Dennis' rep > Martin Ender's rep => D
If it's the other way around => M
If it's a tie => tie 

ВАЖНЫЙ! Голосование по сообщениям Dennis & Martin с единственной целью повлиять на ничью, чтобы протестировать решения, представленные ниже, представляет собой целевое голосование, которое запрещено в сети Stack Exchange. Если вы хотите проверить правильность вывода решения, tieизмените идентификаторы в нем на идентификаторы двух пользователей, которых вы знаете, что они связаны. Смотрите этот пост Мета для более подробной информации.

* Я думаю, что никто бы не использовал это, в любом случае

Мистер Xcoder
источник
33
"... два лучших код-гольфиста в мире ..." [цитата-необходимость]
Мартин Эндер
9
Можем ли мы предположить, что они всегда будут № 1 и № 2 в этом сообществе?
овс
7
Дружеское напоминание: целевое голосование запрещено во всей сети Stack Exchange. Голосовать за Мартина и за мои посты только для проверки подачи заявок на этот конкурс не разрешается.
Деннис
2
@ Shaggy Здорово, что ты добавил эту заметку. Надеемся, что вовлеченные пользователи перестанут это делать
г-н Xcoder
1
Для @MartinEnder вверху цитаты не нужны для общеизвестных фактов.
Грифон - Восстановить Монику

Ответы:

20

05AB1E , 65 64 байта

Код:

•в=6{•5ôvy’ƒËŠˆ.‚‹º.ŒŒ/†š/ÿ’.w’„Ö="ˆ"’¡1èт£þ}})ZQā*O<“D M·‡“#è

Использует кодировку 05AB1E .


Объяснение:

•в=6{•преобразует число в=6{из базы 255 в базу 10, в результате чего получается 1201208478 . Первая половина - удостоверение личности Денниса (12012), а вторая половина - удостоверение личности Мартина (8478). Разделить на части по 5, используя для получения следующего массива:

['12012', '08478']

К счастью, мы можем оставить начальный ноль от идентификатора Мартина, так как это все еще будет работать (проверьте ссылку, прежде чем щелкнуть на начальный ноль).

Теперь мы перебираем этот массив, используя vyи строим следующую строку из этого кода 05AB1E:

’ƒËŠˆ.‚‹º.ŒŒ/†š/ÿ’  -->  codegolf.stackexchange.com/users/ÿ

Принимая во внимание ÿ, что текущий элемент итератора (с использованием интерполяции строк) попробуйте онлайн!

После построения ссылки .wсчитывает все данные из ссылки, в результате чего получается огромное количество текста. Чтобы очистить репутацию от этого, нам нужно разделить на строку title="reputation". Или в более сжатой версии ’„Ö="ˆ"’. Разбейте этот фрагмент строки (с ¡) и получите второй элемент (с ) и оставьте первые 100 символовт£).

Теперь наш очищенный текст выглядит примерно так:

>
        139,883 <span class="label-uppercase">reputation</span>
   </div>

<div class="ba

Эта часть проста, мы просто удаляем все, кроме цифр, чтобы остаться номером репутации, для которого у нас есть встроенная функция ( þ). Мы заканчиваем цикл и упаковываем все в массив }}).

Наконец, мы можем перейти к обработке чисел репутации:

ZQā*O<“D M·‡“#è   -   On stack: an array in the format [Dennis rep, Martin rep]

Z                 # Get the maximum of the array
 Q                # Check for equality with the array
  ā*              # Multiply by it's index (1-indexed)
    O<            # Sum and decrement by 1
      “D M·‡“#    # Push the array ['D', 'M', 'tie']
              è   # Get the element on the index of the sum

Что приводит либо к D, Mлибо tie.

Аднан
источник
2
Я не знал, что 05AB1E может получить доступ к интернет-API, такой ответ удивляет меня => +1
г-н Xcoder
Мне всегда нравится, как вы и другие находите способы получить определенное число. :) +1 Кстати, часть « второй элемент (с 1è) and keep the first **100 characters** (with т£. » Должна быть полностью в кодовых блоках, или она должна быть « вторым элементом (с ) и содержатьт£ вместо этого первые 100 символов) »? опечатка, но если это должно быть так, я в замешательстве ..
Кевин Круйссен
@KevinCruijssen Да, я понятия не имею, как это произошло, но сейчас это исправлено. Спасибо за головы! :)
Аднан
это кажется неправильным (я не знаю, как исправить этот вид кода, извините) Dennis: 140,033,; Martin: 140,003, но я попробовал ваш код здесь tio.run/nexus/05ab1e#@/… , это даст tie. Разве это не должно быть Dвместо этого?
Эдди
@Eddie .wтребует веб-доступа, который ограничен для TIO (он работает 05AB1E в безопасном режиме). В оффлайновом переводчике он должен работать.
Аднан
19

PowerShell v3 +, 147 123 119 103 101 96 байт

$a,$b=irm api.stackexchange.com/users/12012`;8478?site=codegolf|% I*|% r*n;$a-$b|% T*g "D;M;Tie"

Сохранено 24 байта с использованием вывода true / false вместо имен.

Сохранено еще 4 путем реструктуризации финальных проверок.

Сохранено 16, получая из запроса только репутацию двух пользователей, |% r*nизбавляя от необходимости использовать более одного раза, также означает, что мы можем избавиться от миллиона скобок и двух бесполезных переменных.

-2 благодаря TessellatingHeckler - используя escape-символ вместо двух двойных кавычек для URL, также удалили @из массива ненужный (упс)

использовал странный .ToStringтрюк, о котором я даже не подозревал, существовал до сих пор, рекомендуется TessellatingHeckler -5 и, наконец, ниже 100.


Версия, которая возвращает имена:

$a,$b=irm "api.stackexchange.com/users/12012;8478?site=codegolf"|% I*
if(($c=$a|% r*n)-eq($d=$b|% r*n)){"tie"}else{@(($a|% d*),($b|% d*))[$c-lt$d]}

это выглядит довольно грязно из-за сокращения имен параметров.

где-нибудь |% r*nпоявляется, мы получаем ReputatioN, и |% d*этоDisplay_name

использует Invoke-RestMethod(псевдоним irm) для запроса API, сохраняет результат с именем Items(получен с использованием |% I*) в две переменные $a& $b, по одной для каждого игрока в гольф, трюк ToString( |% T*g) приводит к одному из значений D, MилиTie если число четное / нечетное / нуль.

colsw
источник
Я не ожидал, что PowerShell будет самым коротким. +1
Rɪᴋᴇʀ
@Riker Pyth, вероятно, был бы, но у него ужасная ошибка.
Эрик Outgolfer
1
Хорошо, ты выиграл; Я ни за что не побью это сейчас!
Лохматый
9
Итак, ваш код длиной в 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163байты ..? : P
полностью человек
1
@TessellatingHeckler проверьте ответ на последний бит, вы получили его ниже 100! - никогда не знал, ToStringработал так с +/- номера, буду помнить на будущее.
colsw
16

Python 2 , 160 байт

from requests import*
print cmp(*[get('http://api.stackexchange.com/users/12012;8478?%ssite=codegolf&filter=!9aK21rboZ'%s).text for s in'order=asc&',''])or'tie'

Не самый короткий ответ Python, но самый короткий до сих пор, который не делает никаких предположений.

Печатает, 1если у Мартина больше представителей, -1если у меня есть.

Деннис
источник
14

JavaScript (ES6), 167 156 146 144 141 132 103 байт

Глупо fetchи глупо, дорогоPromise цепочка!

Предполагается, что в настоящее время разрешено, что Деннис и Мартин всегда будут двумя пользователями с самым высоким рейтингом. Необходимо запустить с корневого уровня api.stackexchange.com. Возвращает Promiseобъект (как это теперь разрешено консенсусом ), содержащий tieобъект JSON для тех, кто имеет наибольшее количество повторений в данный момент. Если объект JSON не считается допустимым выводом, добавьте 5 байтов для .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Сохранено 11 байтов благодаря Кевину, предложившему мне вернуть профиль, linkа не первую буквуdisplay_name , что также обеспечивает лучшую защиту для будущего, когда они меняют свои имена пользователей, начиная с одной буквы!
  • 5 байтов сохранено, адаптируя наконечник от kamoroso94 к другому моему решению.

Попытайся

f=
_=>fetch`//api.stackexchange.com/users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
f().then(console.log)


альтернатива

Если придет время, когда Деннис и Мартин не на вершине, и мы все еще хотим знать, у кого больше представителей между ними, нам понадобится следующее, что обойдется в дополнительные 10 байтов.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
мохнатый
источник
2
Вы можете изменить .display_name[0]к .display_name, или еще короче альтернатива , которая по - прежнему уникален для них обоих: .link. ;) Или просто весь JSON, но я не уверен, подходит ли он в всплывающем окне.
Кевин Круйссен
Спасибо, @KevinCruijssen; Мне пришлось использовать выдержку из имени пользователя, так как у Мартина есть пробел, что недопустимо. Хороший крик об использовании link, хотя, я использовал фильтрованный запрос API, чтобы только вернуть информацию, в которой я нуждался.
Лохматый
@KevinCruijssen Я выгрузил целые HTML-страницы во всплывающие окна с предупреждениями при работе с возвратами AJAX. Он может справиться с этим.
Draco18s
@ Draco18s, alertиспользующий объект JSON, будет просто отображаться [object Object].
Лохматый
@ Shaggy Правда, правда, так и будет.
Draco18s
9

Python 3, 160 157 151 байт

from requests import*
a,b,*c=get('http://api.stackexchange.com/users?site=codegolf').json()['items']
r='reputation'
print(['tie',a['link']][a[r]>b[r]])

-3 байта благодаря @KevinCruijssen

Печатает ссылку на пользователя с большей репутацией

Предполагается, что они на # 1 и # 2


Не делая никаких предположений, Python 2, 157 байт :

from requests import*
a,b=get('http://api.stackexchange.com/users/8478;12012?site=codegolf').json()['items']
r='reputation'
print['tie',a['link']][a[r]>b[r]]
овс
источник
6

Питон, 226 225 221 байт

Я чувствую, что это слишком долго.

import requests as r,re
def f(i):d=re.sub('[, ]','',r.get('http://codegolf.stackexchange.com/users/'+i).text);D=d.index('"reputation">')+14;return int(d[D:d.index('<',D)])
a=f('8478')
b=f('12012')
print([a>b,'tie'][a==b])

Печатает, "True"если у Мартина больше представителей, чем у Дениса, "False"если у Денниса больше представителей, чем у Мартина, и"tie" если они имеют одинаковое (теоретически. Я не могу проверить это: P).

https-> httpза 1 байт благодаря @KevinCruijssen! re as r, r.sub-> re, re.subза 4 байта благодаря @ovs!

HyperNeutrino
источник
Я не совсем уверен, но можно ли перейти httpsна http? Я знаю, что PPCG теперь полностью https, но, возможно, он автоматически перенаправляется на HTTPS, когда вы переходите к HTTP в Python, так же, как в браузере?
Кевин Круйссен
@KevinCruijssen Ах да, я не знаю, о чем я там думал. Благодарность!
HyperNeutrino
1
Вам не нужно re as R. Просто используйте import requests as r,reиre.sub
овс
@ovs Хех, мой оригинальный подход был другим Спасибо!
HyperNeutrino
Я думаю, что вы можете использовать cmpфункцию, чтобы сохранить несколько байтов, заменив последние три строки чем-то вродеprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo
6

PHP, 167 байт

печатает -1 для Денниса, 1 для Мартина Эндера. галстук в случае галстука

<?=($b=($t=json_decode(gzdecode(join(file('http://api.stackexchange.com/users/12012;8478?site=codegolf&order=asc'))))->items)[0]->reputation<=>$t[1]->reputation)?:tie;
Йорг Хюльсерманн
источник
4

Python 2 , 228 223 204 199 байтов

Я сделал это на мобильной точке доступа, так что ... это не здорово ... Предполагается, что они всегда будут в одной сотне тысяч. Сейчас ничего не предполагает. : D

import urllib as l,re
f=lambda i:int(re.search('n">\s*([\d,]+)',l.urlopen('http://codegolf.stackexchange.com/users/%d'%i).read()).group(1).replace(',',''))
d,m=f(12012),f(8478)
print[d>m,'Tie'][d==m]

Печатает, Trueесли у Денниса больше репутации, чем у Мартина,False противном случае и Tieесли они ... связаны.

totallyhuman
источник
4

Bash + JQ , 140 133 байта

w3m 'api.stackexchange.com/users/12012;8478?site=codegolf&sort=name'|jq '.items|map(.reputation)|1/(index(min)-index(max))'||echo tie

Отформатировано и объяснено

Сначала мы свернем w3m API (и используем --compressedили сокращаем --comдо gzip) :

w3m 'api.stackexchange.com/users/12012;8478?site=codegolf&sort=name'

Это какой-то JSON. Обратите внимание, что заказ стабильный, не основанный на репутации. Затем JQ обрабатывает JSON, для чего он и создан.

.items                          # take the items array
| map(.reputation)              # extract only the reputations
| 1 / 
  (index(min)-index(max))       # This checks if the bigger value is first (1) or last (-1) in array

Мы используем 1/xвыше, чтобы генерировать ошибку деления на ноль, когда min == max, поэтому в ситуации связывания. В ||echo tieBash ловит это.

Обратите внимание, что в этом случае JQ выводит предупреждение на stderr, но мы рассматриваем только stdout фактический результат программы;)

опатут
источник
1
Вы можете использовать w3mвместо того, curl --comчтобы сохранить несколько байтов. Кроме того, я думаю, что стоит упомянуть, что для этого требуется jq 1.5, так как jq 1.4 не вызывал ошибку деления на ноль.
Денис
Правда, спасибо за подсказку. W3m это именно то, что я искал.
Опатут
1

Stackexchange API Data Explorer , 184 180 байт

Спасибо @Kevin Cruijssen за -4 байта

DECLARE @M int,@D int;SELECT @M=reputation from users where id=8478;SELECT @D=reputation from users where id=12012;IF @D=@M PRINT('tie')ELSE BEGIN;IF @D>@M PRINT(1)ELSE PRINT(2)END

Принты 1 для Денниса и 2 для Мартина

Так как я только вчера узнал о SEADE это должно быть очень хорошо.

Попробуй здесь

Роман Греф
источник
Вы можете изменить 'D'и 'M'на 0и 1.
Кевин Круйссен