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


33

Я знаю, що перед "двома найкращими гольф-кодами у світі" було багато викликів, але цей є трохи більш унікальним, будучи 1-м раундом у ряді (майбутніх) викликів із залученням цих двох.


Ваше завдання полягає в тому, щоб написати програму або функцію, яка повертає два різних рядки ASCII, що не мають пробілу, відповідних тому, хто має більше репутації в момент запуску програми, між Деннісом ♦ та Мартіном Ендером ♦ . Хитра частина полягає в тому, що ви повинні вивести точний рядок "краватка" у випадку, якщо репутація однакова (невірогідна), і два різних рядки ASCII, що не пробіли, згадані вище, повинні відрізнятися від "прив'язувати" * .

Не можна приймати дані, такі як імена користувачів або ідентифікатори користувачів. Як зазвичай, скорочувачі 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то змініть ідентифікатори в ньому на тих, хто має два користувачі, яких ви знаєте, що вони пов'язані. Докладнішу інформацію див. У цій публікації на Meta .

* Я думаю, ніхто б не скористався цим


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
I didn't know that 05AB1E can access internet APIs, this answer kind surprises me => +1
Mr. Xcoder

I always like how you and others come up with ways to get a certain number. :) +1 Btw, is the part "second element (with 1è) and keep the first **100 characters** (with т£." supposed to be completely in code-blocks, or should it be "second element (with ) and keep the first 100 characters (with т£)." instead? I guess a typo, but if it's supposed to be like this I'm confused..
Kevin Cruijssen

@KevinCruijssen Huh, I have no idea how that happened, but it's fixed now. Thanks for the heads up! :)
Adnan

it seems incorrect (I don't know how to correct this kind of code, sorry), Dennis: 140,033; Martin: 140,003, but I tried your code here tio.run/nexus/05ab1e#@/…, it yield tie. Shouldn't it ouput D instead?
Eddie

@Eddie .w requires web access, which is restricted on TIO (it runs 05AB1E in safe mode). In the offline interpreter, it should work.
Adnan

19

PowerShell v3+, 147 123 119 103 101 96 Bytes

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

Saved 24 bytes using true/false output instead of the names.

Saved another 4 by restructuring the final checks.

saved 16 by getting only the reputations of the two users from the request, saves having to use the |% r*n more than once, also means we can get rid of like a million brackets, and two useless variables.

-2 thanks to TessellatingHeckler - using an escape char instead of two doublequotes for the url, also removed the @ from the array which was un-needed (oopsie)

used a weird .ToString trick I never knew existed until now reccomended by TessellatingHeckler -5, and finally below 100.


Version which returns names:

$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]}

this looks pretty messy due to the shortening of parameter names.

anywhere |% r*n appears we're getting the ReputatioN, and |% d* is the Display_name

uses Invoke-RestMethod (alias irm) to query the API, stores the result named Items (gotten using |% I*), into the two variables $a & $b, one for each pro golfer's, the ToString (|% T*g) trick results in one of the values D,M or Tie if the number is odd/even/zero.


I did not expect powershell to be the shortest. +1
Rɪᴋᴇʀ

@Riker Pyth would've presumably been, but it has a horrible bug.
Erik the Outgolfer

1
Fine, you win; no way I'm going to beat this now!
Shaggy

9
So your code is 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163 bytes long..? :P
totallyhuman

1
@TessellatingHeckler check the answer for the last bit, you got it below 100! - never knew ToString worked like that with +/- numbers, will remember for future.
colsw

16

Python 2, 160 bytes

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'

Not the shortest Python answer, but the shortest one so far that doesn't make any assumptions.

Prints 1 if Martin has more rep, -1 if I do.


14

JavaScript (ES6), 167 156 146 144 141 132 103 bytes

Stupid fetch and its stupid, expensive Promise chaining!

Assumes, as currently allowed, that Dennis & Martin will always be the 2 top ranked users. Needs to be run from the root level of api.stackexchange.com. Returns a Promise object (as is now permitted by consensus) containing tie or the JSON object for whoever has the most rep at the time. If the JSON object isn't considered valid output then add 5 bytes for .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Saved 11 bytes thanks to Kevin suggesting I return the profile link rather than the first letter of the display_name, which also provide better future-proofing against them changing their usernames to start with the same letter!
  • 5 bytes saved adapting a tip from kamoroso94 on a another solution of mine.

Try It

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)


Alternative

If a time comes that Dennis & Martin aren't at the top and we still want to know who has the most rep between them then we'd need the following, at a cost of an additional 10 bytes.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)

2
You can change .display_name[0] to .display_name, or an even shorter alternative that is still unique for both of them: .link. ;) Or just the entire JSON, but I'm not sure if it fits in the alert-popup.
Kevin Cruijssen

Thanks, @KevinCruijssen; I had to use an extract of the username as Martin's contains a space, which isn't allowed. Good shout on using link, though, I was using a filtered API query to only return the info I needed.
Shaggy

@KevinCruijssen I've dumped whole HTML pages into alert popups when dealing with AJAX returns. It can handle it.
Draco18s

@Draco18s, alerting a JSON object, though, will just display [object Object].
Shaggy

@Shaggy True, true, it would.
Draco18s

9

Python 3, 160 157 151 bytes

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 bytes thanks to @KevinCruijssen

Prints a link to the user having more reputation

Assumes they are on #1 and #2


Without making any assumptions, Python 2, 157 bytes:

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

Python, 226 225 221 bytes

I feel like this is too long.

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

Prints "True" if Martin has more rep than Dennis, "False" if Dennis has more rep than Martin, and "tie" if they have the same (theoretically. I can't test this :P).

https -> http for 1 byte thanks to @KevinCruijssen! re as r, r.sub -> re, re.sub for 4 bytes thanks to @ovs!


I'm not entirely sure, but is it possible to change https to http? I know PPCG is completely https now, but perhaps it auto-directs to HTTPS when you navigate to HTTP in Python, just as it does in a browser?
Kevin Cruijssen

@KevinCruijssen Ah yes, I don't know what I was thinking there. Thanks!
HyperNeutrino

1
You don't need re as R. Just use import requests as r,re and re.sub
ovs

@ovs Heh, my original approach was different Thanks!
HyperNeutrino

I think you can use the cmp function to save some bytes by replacing the last three lines with something like print['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo

6

PHP, 167 Bytes

prints -1 for Dennis , 1 for Martin Ender. tie in case of a tie

<?=($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 bytes

I did this on a mobile hotspot so... it's not great... Assumes both of them will always be in the same hundred thousand. Doesn't assume anything now. :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]

Prints True if Dennis has more reputation than Martin, False otherwise and Tie if they are... tied.


4

Bash + jq, 140 133 bytes

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

Formatted and explained

First, we curl w3m the API (and use --compressed, or short --com to un-gzip):

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

That's some JSON. Notice the order ist stable, not based on reputation. JQ then processes the JSON, which is what it's made for.

.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

We use 1/x above to generate an division-by-zero error when min==max, so in a tie situation. The ||echo tie in bash catches that.

Note that a warning is printed on stderr by JQ in that case, but we consider only stdout the actual result of the program ;)


1
You can use w3m instead of curl --com to save a few bytes. Also, I think it's worth mentioning that this requires jq 1.5, as jq 1.4 didn't raise an error for division by zero.
Dennis

True, thanks for the hint. W3m is exactly what I was looking for.
opatut

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.