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ł


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, 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 (z1è ) 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.


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 1è) 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.


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.


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)

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

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!


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;

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.


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.