Czy Dennis mnie przeraził?

15

Według legendy , niemal wszyscy outgolfed przez Dennisa . Jeśli nie, to będą.

Teraz jestem ciekawy, czy jestem jednym z tych „prawie wszystkich”.

Otrzymasz link do odpowiedzi w formacie /codegolf/[QUESTION ID]/[QUESTION NAME]/#[ANSWER ID].

Znajdź długość kodu, który przyjmiemy jako ostatni numer w pierwszym wierszu (pod względem przeceny) odpowiedzi w łączu.

Następnie wyszukaj odpowiedzi Dennisa i zrób to samo.

Teraz porównaj długość kodu danych wejściowych i odpowiedzi Dennisa, a jeśli nie jest w golfie (co oznacza, że ​​jedna lub więcej odpowiedzi Dennisa jest krótsza niż odpowiedź wejściowa), wypisz prawdziwą wartość, a jeśli nie, wartość fałsz.

Jeśli nie ma odpowiedzi należącej do Dennisa na to samo pytanie, co odpowiedź, wpisz wartość fałszowania.

Przykłady

  • Link :true
  • Link : false(Przynajmniej na razie powiedz, kiedy się zmieni)

Zasady

  • Możesz użyć dowolnej wartości prawdziwej / fałszywej.
  • Pytanie, na które otrzymasz odpowiedź, zawsze będzie polegać na grze w .
  • Pytanie może nie zawierać odpowiedzi Dennisa, ale wprowadzona odpowiedź nigdy nie będzie należeć do Dennisa.

  • Możesz założyć, że w pierwszym wierszu odpowiedzi zawsze znajduje się liczba.

Matthew Roh
źródło
3
Czy możemy założyć, że Dennis zawsze będzie udzielał odpowiedzi na dane pytanie i że udzielona odpowiedź nie będzie odpowiedzią Dennisa?
Skidsdev,
@Mayube Nie i tak.
Matthew Roh,
Czy musimy obsługiwać stronicowanie, czy możemy założyć, że obie odpowiedzi będą na tej samej stronie, jeśli istnieje wiele stron odpowiedzi?
Kudłaty
@Shaggy były.
Matthew Roh,
@SIGSEGV Jeśli Dennis nie ma odpowiedzi, czy wysyłamy fałsz, ponieważ Dennis nie opublikował odpowiedzi?
Skidsdev,

Odpowiedzi:

1

Python 3.6 + żądania + bs4 - 363 358 bajtów

import bs4,re,requests
u,n=input().split("/#");i=1;d=y=float("inf")
while i:
 A=bs4.BeautifulSoup(requests.get(u+f"?page={i}").text,"html.parser")(class_="answer")
 for a in A:
  c=int(re.findall("\d+",(a("h1")+a("h2")+a("p"))[0].text)[-1])
  if "Dennis"in a(class_="user-details")[-1].text:d=min(c,d)
  if a["data-answerid"]==n:y=c
 i=A and i+1;
print(d<y)

Odbitki Truelub False.

Uwaga: obecnie nie działa na drugim łączu z powodu nieprawidłowego kodu HTML wygenerowanego przez tę odpowiedź ( znaczniki emi strongsą kończone w niewłaściwej kolejności na końcu drugiego wiersza i powodują, że parser nie pamięta bloku nazwy użytkownika). Zamiast tego wypróbuj ten link .

Korzystanie z interfejsu API - 401 380 bajtów

import requests,re
q,A=re.findall("\d+",input());i=1;d=y=float("inf")
while i:
 r=requests.get(f"https://api.stackexchange.com/2.2/questions/{q}/answers?site=codegolf&filter=withbody&page={i}").json();i=r["has_more"]and i+1
 for a in r["items"]:
  c=int(re.search("(\d+)\D+$",a["body"]).group(1))
  if a["owner"]["user_id"]==12012:d=min(d,c)
  if a["answer_id"]==A:y=c
print(d<y)

Zauważ, że to również zawiedzie w przypadku drugiego linku, ale ponieważ jedna odpowiedź rozpoczęła się This may be foul play.od nagłówka ...

matsjoyce
źródło
Zastanów się nad użyciem interfejsu API wymiany stosu, aby zamiast tego uzyskać dane odpowiedzi za pomocą analizatora składni JSON , po prostu upewnij się, że filter=withbodyznajduje się w żądaniu GET, aby uzyskać treść odpowiedzi w celu pobrania liczby bajtów
wartość tuszu
W wersji API używałeś adwa razy (raz, aby ustawić identyfikator odpowiedzi, a drugi podczas iteracji r["items"], co doprowadziłoby do nieprawidłowego zachowania. Ponadto nie musisz ustawiać pagesize(domyślnie 30). c=int(re.search(r'(\d+) bytes').group(1))Powinien dać ci dokładniejsze pobieranie bajtecount i jest krótsze, a jeśli nadal się nie powiedzie, (\d+)\s*bytesrobi lewę, ale jest nieco dłuższe. Wreszcie i=r["has_more"]and i+1jest krótsze niż warunkowe trójskładnikowe
Wartość Ink
Właściwie zapomnij o dopasowaniu wyrażenia regularnego. Zapomniałem wziąć pod uwagę dodanie treści odpowiedzi w wywołaniu funkcji, aby ta część była dłuższa. Pozostałe sugestie są jednak nadal aktualne.
Wartość tuszu
@ValueInk Dzięki, teraz trochę krócej. Wygląda na to, że potrzebujemy języka golfowego tylko dla API, jego połączenia są bardzo długie ...
matsjoyce
Być może. Ale szczerze mówiąc, istnieje również fakt, że masz ładny parser HTML, a także to, że domyślnie dostajesz adres URL pytania. Gdyby dane wejściowe składały się z dwóch liczb, nałożenie strony dla pytania o kodegolfa byłoby dość duże.
Wartość tuszu
1

Rubinowy, 314 315 308 + 20 = 334 335 328 bajtów

Używa flag -n -rjson -ropen-uri. +1 bajt od naprawienia drobnego błędu.

-7 bajtów, odkrywając open-uridomyślną bibliotekę Ruby.

~/(\d+)\D+(\d+)/
u="http://api.stackexchange.com/2.2/questions/#$1/answers?site=codegolf&filter=withbody&page=%s"
n=eval$2
a="answer_id"
j=1
o=[]
(o+=r=JSON.parse(open(u%j).read)["items"]
j=r!=[]&&j+1)while j
p o.select{|e|e["owner"]["user_id"]==12012||e[a]==n}.min_by{|e|e["body"][/\d+\s*bytes/].to_i}[a]!=n
Wartość tuszu
źródło