Martin vs Dennis - Runda 1: Kto ma więcej przedstawicieli?

33

Wiem, że pojawiło się wiele wyzwań związanych z „dwoma najlepszymi golfistami na świecie”, ale ten jest nieco bardziej wyjątkowy, ponieważ jest w rundzie 1 w serii (przyszłych) wyzwań z udziałem tych dwóch.


Twoim zadaniem jest napisanie programu lub funkcji, która zwraca dwa różne ciągi znaków ASCII niebiałych, odpowiadające temu, który ma większą reputację w momencie uruchomienia programu, między Dennis ♦ a Martinem Enderem ♦ . Problem polega na tym, że musisz podać dokładny ciąg „remis” w przypadku, gdy reputacja jest identyczna (mało prawdopodobna), a dwa różne ciągi znaków ASCII niebiałych białych znaków powinny być inne niż „remis” * .

Nie można pobierać danych wejściowych, takich jak nazwy użytkowników lub identyfikatory użytkowników. Jak zwykle, skracacze adresów URL są zabronione, podobnie jak typowe luki.

Przykłady:

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 

WAŻNY! Głosowanie na posty Dennis & Martin wyłącznie w celu wpłynięcia na remis w celu przetestowania poniższych rozwiązań stanowi ukierunkowane głosowanie, które jest zabronione w sieci Stack Exchange. Jeśli chcesz sprawdzić, czy rozwiązanie poprawnie wyświetla dane wyjściowe, tiezmień w nim identyfikatory na 2 użytkowników, o których wiesz, że są powiązani. Zobacz ten post Meta, aby uzyskać więcej informacji.

* Myślę, że i tak nikt by tego nie użył

Pan Xcoder
źródło
33
„... dwóch najlepszych golfistów na świecie ...” [potrzebne źródło]
Martin Ender
9
Czy możemy założyć, że w tej społeczności zawsze będą oni numerem 1 i 2?
ovs
7
Przyjazne przypomnienie: ukierunkowane głosowanie jest zabronione w całej sieci Stack Exchange. Głosowania na Marcina i moje posty tylko do twierdzeń testowych na to wyzwanie jest nie dozwolone.
Dennis
2
@Shaggy To świetnie, że dodałeś tę notatkę. Mamy nadzieję, że zaangażowani użytkownicy przestaną to robić
pan Xcoder,
1
Do @MartinEnder na górze cytaty nie są potrzebne dla faktów, które są powszechnie znane.
Gryphon - Przywróć Monikę

Odpowiedzi:

20

05AB1E , 65 64 bajtów

Kod:

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

Wykorzystuje kodowanie 05AB1E .


Wyjaśnienie:

•в=6{•konwertuje liczbę в=6{z bazy 255 na bazę 10, co daje 1201208478 . Pierwsza połowa to ID Dennisa (12012), a druga połowa to ID Martina (8478). Podziel na kawałki po 5, aby uzyskać następującą tablicę:

['12012', '08478']

Na szczęście od tego czasu możemy pozostawić wiodące zero z identyfikatora Martina to nadal będzie działać (sprawdź link przed kliknięciem, aby zobaczyć wiodące zero).

Teraz zapętlamy tę tablicę, używając vyi konstruujemy następujący ciąg z tego kodu 05AB1E:

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

Natomiast ÿjest bieżącym elementem iteratora (wykorzystującym interpolację łańcuchów) Wypróbuj online!

Po zbudowaniu linku .wodczytuje wszystkie dane z linku, co powoduje powstanie ogromnej ilości tekstu. Aby z tego zrzucić reputację, musimy rozdzielić sznurek title="reputation". Lub w wersji bardziej skompresowanego: ’„Ö="ˆ"’. Podziel na ten kawałek sznurka (z ¡) i uzyskaj drugi element (z ) i zachowaj pierwszych 100 znaków (z т£).

Teraz nasz zeskrobany tekst wygląda trochę tak:

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

<div class="ba

Ta część jest łatwa, usuwamy tylko cyfry aby pozostać numerem reputacji, dla którego mamy wbudowane (þ ). Kończymy pętlę i zawijamy wszystko do tablicy }}).

Wreszcie możemy przejść do przetwarzania numerów reputacji:

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

Co powoduje albo D, Malbo tie.

Adnan
źródło
2
Nie wiedziałem, że 05AB1E może uzyskiwać dostęp do internetowych interfejsów API, ta odpowiedź mnie zaskakuje => +1
Mr. Xcoder
Zawsze podoba mi się, jak ty i inni wymyślacie sposoby na uzyskanie określonej liczby. :) +1 Btw, czy część „ drugi element (z 1è) and keep the first **100 characters** (with т£. ”) Powinna znajdować się całkowicie w blokach kodu, czy powinna być „ drugim elementem (z ) i zachować pierwsze 100 znaków (z т£). ” Zamiast tego? literówka, ale jeśli tak ma być, to jestem zdezorientowany ..
Kevin Cruijssen
@KevinCruijssen Huh, nie mam pojęcia, jak to się stało, ale teraz zostało to naprawione. Dzięki za heads-up! :)
Adnan
wydaje się niepoprawny (przepraszam, nie wiem jak poprawić tego rodzaju kod) Dennis: 140,033; Martin: 140,003, ale próbowałem tutaj twojego kodu tio.run/nexus/05ab1e#@/… , to daje tie. Czy Dzamiast tego nie powinien wypływać ?
Eddie
@Eddie .wwymaga dostępu do sieci, co jest ograniczone w TIO (działa w trybie awaryjnym 05AB1E). W tłumaczu offline powinien on działać.
Adnan
19

PowerShell v3 +, 147 123 119 103 101 96 bajtów

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

Zapisano 24 bajty przy użyciu danych wyjściowych true / false zamiast nazw.

Uratował kolejne 4, restrukturyzując końcowe kontrole.

zapisano 16, uzyskując tylko reputację dwóch użytkowników z żądania, oszczędzając konieczności korzystania z |% r*n więcej niż raz, oznacza to również, że możemy pozbyć się miliona nawiasów i dwóch bezużytecznych zmiennych.

-2 dzięki TessellatingHeckler - użycie znaku ucieczki zamiast dwóch podwójnych cudzysłowów dla adresu URL również usunęło@ z tablicy niepotrzebną (oopsie)

zastosowałem dziwną .ToStringsztuczkę, o której istnieniu nie wiedziałem, do tej pory polecaną przez TessellatingHeckler -5, a ostatecznie poniżej 100.


Wersja zwracająca nazwy:

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

wygląda to dość niechlujnie z powodu skrócenia nazw parametrów.

gdziekolwiek się |% r*npojawia, otrzymujemy ReputatioNi |% d*jestDisplay_name

zastosowania Invoke-RestMethod(alias irm) do kwerendy API, sklepy wynik nazwie Items(dostał za pomocą |% I*), do dwóch zmiennych $ai $b, po jednym dla każdego pro golfa, The ToString( |% T*g) Wyniki trick w jednej z wartości D, Mlub Tiejeśli liczba jest nieparzysta / parzysta / zero.

colsw
źródło
Nie spodziewałem się, że PowerShell będzie najkrótszy. +1
Rɪᴋᴇʀ
@Riker Pyth byłby prawdopodobnie, ale ma straszny błąd.
Erik the Outgolfer,
1
Dobrze, wygrywasz; nie ma mowy, żebym to teraz pokonał!
Kudłaty
9
Więc twój kod ma 103! = 9.902900716486180407546715254581773349090165822114492483005280554699... × 10^163długość bajtów ..? : P
totalnie ludzki,
1
@TessellatingHeckler sprawdź ostatnią odpowiedź, masz ją poniżej 100! - nigdy nie wiedziałem, że ToStringdziałał tak z liczbami +/-, zapamięta na przyszłość.
colsw
16

Python 2 , 160 bajtów

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'

Nie najkrótsza odpowiedź w języku Python, ale jak dotąd najkrótsza, która nie przyjmuje żadnych założeń.

Drukuje, 1jeśli Martin ma więcej przedstawicieli, -1jeśli tak.

Dennis
źródło
14

JavaScript (ES6), 167 156 146 144 141 132 103 bajtów

Głupi fetchi jego głupi, drogiPromise łańcuch!

Zakłada, jak obecnie dozwolone, że Dennis & Martin zawsze będzie 2 najwyżej ocenianymi użytkownikami. Musi być uruchamiany z poziomu katalogu głównego api.stackexchange.com. Zwraca Promiseobiekt (co jest teraz dozwolone przez konsensus ) zawierający tielub obiekt JSON dla tego, kto ma w tej chwili najwięcej powtórzeń. Jeśli obiekt JSON nie jest uważany za prawidłowy wynik, dodaj 5 bajtów dla .link.

_=>fetch`users/?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
  • Zaoszczędziłem 11 bajtów dzięki Kevinowi sugerującemu zwrócenie profilu linkzamiast pierwszej literydisplay_name , co zapewnia lepszą ochronę przed zmianami nazw użytkowników, zaczynając od tej samej litery!
  • 5 bajtów zaoszczędzonych, dostosowując końcówkę z kamoroso94 do innego mojego rozwiązania.

Spróbuj

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)


Alternatywny

Jeśli przyjdzie czas, że Dennis i Martin nie są na szczycie i nadal chcemy wiedzieć, kto ma najwięcej powtórzeń między nimi, potrzebowalibyśmy następujących, kosztem dodatkowych 10 bajtów.

_=>fetch`users/12012;8478?site=codegolf`.then(r=>r.json()).then(({items:[j,i]})=>j[r="reputation"]==i[r]?"tie":j)
Kudłaty
źródło
2
Można zmienić .display_name[0]na .display_name, albo nawet krócej alternatywa, która nadal jest unikalny dla obu z nich: .link. ;) Lub tylko cały JSON, ale nie jestem pewien, czy pasuje do wyskakującego okienka.
Kevin Cruijssen
Dzięki, @KevinCruijssen; Musiałem użyć wyciągu z nazwy użytkownika, ponieważ Martin zawiera spację, co jest niedozwolone. Dobry krzyk przy użyciu link, ale użyłem filtrowanego zapytania API, aby zwrócić tylko potrzebne informacje.
Kudłaty
@KevinCruijssen Zrzuciłem całe strony HTML na wyskakujące okienka podczas obsługi zwrotów AJAX. Poradzi sobie.
Draco18s,
@ Draco18s, alerting obiekt JSON, po prostu się wyświetli [object Object].
Kudłaty
@Shaggy Prawda, prawda, tak.
Draco18s,
9

Python 3, 160 157 151 bajtów

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 bajty dzięki @KevinCruijssen

Drukuje link do użytkownika mającego lepszą reputację

Zakłada, że ​​są na numerach 1 i 2


Nie przyjmując żadnych założeń, Python 2, 157 bajtów :

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]]
ovs
źródło
6

Python, 226 225 221 bajtów

Czuję, że to jest za długie.

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

Drukuje, "True"jeśli Martin ma więcej przedstawicieli niż Dennis, "False"jeśli Dennis ma więcej przedstawicieli niż Martin i "tie"jeśli mają takie same (teoretycznie. Nie mogę przetestować: P).

https-> httpza 1 bajt dzięki @KevinCruijssen! re as r, r.sub-> re, re.subdla 4 bajtów dzięki @ovs!

HyperNeutrino
źródło
Nie jestem do końca pewien, ale czy to możliwe, aby zmienić httpssię http? Wiem, że PPCG jest teraz całkowicie https, ale może automatycznie przekierowuje do HTTPS, kiedy nawigujesz do HTTP w Pythonie, tak jak robi to w przeglądarce?
Kevin Cruijssen
@KevinCruijssen Ach tak, nie wiem o czym tam myślałem. Dzięki!
HyperNeutrino,
1
Nie trzeba re as R. Wystarczy użyć import requests as r,reire.sub
ovs
@ovs Heh, moje oryginalne podejście było inne Dzięki!
HyperNeutrino,
Myślę, że możesz użyć tej cmpfunkcji, aby zaoszczędzić trochę bajtów, zastępując ostatnie trzy wiersze czymś takimprint['tie',0,1][cmp(f('8478'),f('12012'))]
Loovjo,
6

PHP, 167 bajtów

drukuje -1 dla Dennisa, 1 dla Martina Endera. remis w przypadku remisu

<?=($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;
Jörg Hülsermann
źródło
4

Python 2 , 228 223 204 199 bajtów

Zrobiłem to na mobilnym hotspocie, więc ... to nie jest świetne ... Zakładam, że oba będą zawsze w tej samej setce tysięcy. Teraz nic nie zakłada. :RE

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]

Drukuje, Truejeśli Dennis ma większą reputację niż Martin, w Falseprzeciwnym razie i Tiejeśli są ... związani.

całkowicie ludzki
źródło
4

Bash + jq , 140 133 bajtów

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

Sformatowane i wyjaśnione

Po pierwsze, curl w3m API (i wykorzystania --compressedlub zwarcie --comdo UN-gzip) :

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

To trochę JSON. Zauważ, że kolejność jest stabilna, a nie oparta na reputacji. Następnie JQ przetwarza JSON, do czego został stworzony.

.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

Używamy 1/xpowyżej, aby wygenerować błąd dzielenia przez zero, gdy min == max, więc w sytuacji remisu. ||echo tiePołowów że bash.

Zauważ, że w tym przypadku ostrzeżenie jest drukowane na stderr przez JQ, ale bierzemy pod uwagę tylko rzeczywisty wynik programu;)

opatut
źródło
1
Możesz użyć w3mzamiast curl --comzapisać kilka bajtów. Ponadto uważam, że warto wspomnieć, że wymaga to jq 1.5, ponieważ jq 1.4 nie zgłosił błędu podziału przez zero.
Dennis
To prawda, dziękuję za podpowiedź. W3m jest dokładnie tym, czego szukałem.
opatut
1

Stackexchange API Data Explorer , 184 180 bajtów

Dzięki @Kevin Cruijssen za -4 bajty

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

Drukuje 1 dla Dennisa i 2 dla Martina

Ponieważ dopiero wczoraj dowiedziałem się o SEADE powinno to być bardzo .

Wypróbuj tutaj

Roman Gräf
źródło
Możesz zmienić 'D'i 'M'do 0i 1.
Kevin Cruijssen