Bestimmen Sie, ob eine Herausforderung eine Antwort wert ist


21

Ich bin ein sehr gelegentlicher Code-Golfer und sehe nur dann häufig Beiträge, wenn sie in der Seitenleiste "Hot Network Questions" auf StackOverflow angezeigt werden. Normalerweise komme ich zu spät zum Spiel, und da ich nur Python kenne, kann ich kaum antworten, da es bereits mehrere Python-Antworten gibt. Ihre Herausforderung besteht darin, herauszufinden, ob eine Frage es wert ist, von mir beantwortet zu werden.

Eingang:

  • Ihr Code (Funktion oder Programm) nimmt einen Eingabeparameter an i

Ausgabe:

  • Wahrheits- oder Falschwert für Fragen-ID i. Wahrheit ausgeben, wenn die Frage mehr als 5 Antworten, mehr als 3 Fragenpunkte und eine oder weniger Antworten in Python enthält (keine Unterscheidung zwischen Versionen).

Regeln / Erläuterungen:

  • Das Eingabeformat kann beliebig sein (stdin, Datei, Befehlszeile), sollte jedoch in Ihrer Antwort angegeben werden. Datentypen und führende / nachfolgende Leerzeichen spielen keine Rolle.
  • Angenommen, die Fragen-ID ist gültig für codegolf.stackexchange.com.
  • Ignorieren Sie sprachspezifische Fragenanforderungen. (dh wenn eine Frage auf Stimmen und Antworten trifft und keine Python-Antworten hat, weil es nur Java ist, führt dies immer noch zur Wahrheit).
  • Eine Antwort ist eine Python-Antwort, wenn "python" (case insenstive) vor der ersten Zeile des Beitrags steht.
  • Dies ist Code Golf, also gewinnt der kürzeste Code in Bytes.

Musterkoffer *

id = 79082 => True
id = 78591 => False (less than 5 answers, also hella hard)
id = 78410 => True
id = 76428 => False (greater than 1 Python answer)
id = 78298 => False (not high enough question score)

* Zum Zeitpunkt der Veröffentlichung überprüft, möglicherweise geändert


Ich kenne auch nur Python ...
R. Kap

Ich kenne auch hauptsächlich Python.
user48538

Ich muss andere Sprachen lernen.
R. Kap

5
@ R.Kap, diese Herausforderung wäre eine großartige Zeit, um anzufangen!
Wnnmaw

2
Diese Herausforderung ist es anscheinend wert, beantwortet zu werden.
5.

Antworten:


8

05AB1E , 167 160 159 158 156 154 143 Bytes

Verdammt, fast so lange wie eine normale Sprache ...

Mist ... mehr aktuell die die schlagen Ruby - Antwort von 1 Byte.

Jetzt länger als die Ruby-Antwort, gell! .

Ich sollte jetzt wahrscheinlich ins Bett gehen.

Danke an @wnnmaw für das Speichern von 1 Byte und danke an @R. Kap für das Speichern weiterer 2 Bytes!

Code:

’£Ø ˆå§¾.‡¢ as g;#.¾¿„–(g.ˆåƒÛ('·Ç://ÐÏg.´¢/q/'+•œ_#()).‚Ø())’.e©’„à="Ž»"’DU¢®…ƒŠ‡¡`99£þs\®X¡¦vy’„à="‚¬-„¹"’¡¦'>¡¦¦¬l’±¸’¢s\}rUV)O2‹X5›Y3›)P

Oder mit mehr Lesbarkeit:

’£Ø ˆå§¾.‡¢ as g;#.¾¿„–(g.ˆåƒÛ('·Ç://ÐÏg.´¢/q/'+•œ_#()).‚Ø())’
 .e©
’„à="Ž»"’
 DU¢®
“ƒŠ‡“
 ¡`99£þs\®X¡¦
v
 y’„à="‚¬-„¹"’¡¦'>¡¦¦¬l’±¸’¢s\}rUV)O2‹X5›Y3›)P

Erläuterung:

Zunächst wird hier viel Text komprimiert, was sich in gutem alten Python niederschlägt. Die unkomprimierte Version ist:

"import urllib.request as g
 f=g.urlopen('http://ppcg.lol/q/'+pop_#())
 #.append(f.read())"
.e©“class="answer"“¢®"useful and clear"¡`99£þs\®“class="answer"“¡¦vy“class="post-text"“¡¦'>¡¦¦¬l"python"¢s\}rUV)O2‹X5›Y3›)P

Dieser Teil:

import urllib.request as g
stack.append(g.urlopen('http://ppcg.lol/q/'+pop_stack()).read())`

Fügt tatsächlich einen Stapelwert ein, kopiert ihn in die URL und ruft alle HTML-Daten ab. Die HTML-Daten werden mit oben auf den Stapel gelegt #.append(f.read()).

Wir zählen die Anzahl der Antworten und die Anzahl der Vorkommen von class="answer".

Um die Anzahl der Stimmen zu zählen, teilen wir die Daten einfach auf "nützlich und klar" und behalten nur die Ziffernwerte von [0:99]using bei ®"useful and clear"¡`99£þ. Dies ist die Anzahl der Upvotes.

Schließlich müssen wir jede Antwort überprüfen, ob der Text "Python"vor dem schließenden Kopftext vorhanden ist. Um alle Antworten zu erhalten, teilen wir einfach die Daten auf class="post-text"und teilen jede von ihnen erneut auf <. Wir entfernen die ersten beiden Elemente, um den Teil zu ermitteln, in dem die Sprache angezeigt wird, und prüfen, ob die Kleinbuchstabenversion in dieser Zeichenfolge enthalten ist.

So, jetzt sieht unser Stack für id = so aus 79273:

`[6, '14', 0, 0, 0, 1, 0, 0]`
  │    │   └───────┬──────┘
  │    │           │
  │    │   is python answer?
  │    │
  │    └── number of upvotes
  │
  └─── number of answers

Dies ist auch bei eingeschaltetem -debug-Flag im Interpreter zu sehen.

Es geht also nur darum, die Daten zu verarbeiten:

rUV)O2‹X5›Y3›)P

r                # Reverse the stack
 U               # Pop the number of answers value and store into X
  V              # Pop the number of upvotes value and store into Y
   )O            # Wrap everything together and sum it all up
     2‹          # Check if smaller than 2
       X5›       # Push X and check if greater than 5
          Y3›    # Push Y and check if greater than 3
             )P  # Wrap everything into an array and take the product.
                   This results into 1 if and only if all values are 1 (and not 0).

Verwendet die CP-1252- Codierung. Sie können den Dolmetscher hier herunterladen .


12
Ich mag die "lesbarere" Version; Diese zusätzlichen Zeilenumbrüche machen wirklich einen Unterschied! ;)
Wildcard

@Wildcard Sie machen in der Tat einen Unterschied;)
Erik the Outgolfer

Könnten Sie durch ppcg.lol/q/idKomprimierung Bytes sparen ?
wnnmaw

@wnnmaw Danke, jetzt bin ich nur noch 1 Byte von der Ruby-Antwort entfernt: p.
Adnan

1
Ach nein! Ich glaube nicht , kann ich genug Ecken schneiden die 7 Byte speichern Ich brauche wieder nach vorn zu bekommen ... Ich glaube , ich habe gerade zu settle für den zweiten Platz
Wert Ink

5

Python 3.5, 280 272 260 242 240 Bytes:

( Vielen Dank an Adnan für den Trick, den *Operator in Vergleichen zu verwenden, was zu 2 gespeicherten Bytes führt! )

def g(o):import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());print((len(R('(?:<h[0-9]>|<p>).*python',w.lower()))<2)*(int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3)*w.count('answercell">')>5)

Einfach genug. Verwendet die in Python integrierte urllibBibliothek, um zur Website der Frage zu gelangen, und verwendet dann reguläre Ausdrücke, um die Anzahl der Stimmen, die Anzahl der Antworten und die Anzahl der Python-spezifischen Antworten in dem von der Website zurückgegebenen dekodierten Text zu ermitteln. Schließlich werden diese Werte mit den Bedingungen verglichen, die zum Zurückgeben eines truthyWerts erforderlich sind , und wenn sie alle Bedingungen erfüllen, werden sie Truezurückgegeben. Ansonsten Falseist.

Das Einzige, worüber ich mir Sorgen machen könnte, ist, dass die regulären Ausdrücke in Bezug auf die Anzahl der pythonspezifischen Antworten zum Speichern von Bytes viel Spielraum bieten. Daher kann es zuweilen etwas ungenau sein, obwohl dies wahrscheinlich ausreicht die Zwecke dieser Herausforderung. Wenn Sie jedoch ein viel genaueres wünschen, habe ich eines unten hinzugefügt, obwohl es länger ist als das obige. Die unten gezeigte Größe beträgt derzeit 298 Bytes, da für die Zählung von Python-Antworten ein viel längerer regulärer Ausdruck verwendet wird, für den Sie nicht wissen konnten, wie lange ich dafür gebraucht habe, als für meine ursprüngliche Funktion. Dieser sollte für mindestens 80% bis 90% aller Testfälle funktionieren.

def g(o):import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());print(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower()))<2and int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3and w.count('answercell">')>5)

Aber was ist mit diesen Fragen mit mehreren Seiten voller Antworten? Keines der oben genannten Verfahren funktioniert in dieser Situation sehr gut, wenn sich beispielsweise 1 Python-Antwort auf der ersten Seite und eine andere auf der zweiten Seite befindet. Nun, ich habe mir die Freiheit genommen, dieses Problem zu beheben, indem ich eine andere Version meiner Funktion (siehe unten) erstellt habe, die jede Seite mit Antworten, sofern mehrere vorhanden sind, auf Python-Antworten überprüft. Dies hat sich in vielen der von mir beschriebenen Testfälle bewährt habe es geworfen. Nun, ohne weiteres, hier ist die neue und aktualisierte Funktion:

def g(o):
 import urllib.request as u,re;R=re.findall;w=bytes.decode(u.urlopen('http://ppcg.lol/q/'+o).read());t=0if len(re.findall('="go to page ([0-9]+)">',w))<1else max([int(i)for i in re.findall('="go to page ([0-9]+)">',w)])
 if t<1:print(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower(),re.DOTALL))<2and int(R('(?<="vote-count-post ">)[0-9]+',w)[0])>3and w.count('answercell">')>5)
 else:
  P=[];U=[];K=[]
  for i in range(2,t+2):P.append(len(R('(?<=answercell">).*?(?:<h[0-9]>|<strong>)[^\n]*python[^\n]*(?=</h[0-9]>|</strong>)',w.lower(),re.DOTALL)));U.append(int(R('(?<="vote-count-post ">)[0-9]+',w)[0]));K.append(w.count('answercell">'));w=bytes.decode(u.urlopen('http://ppcg.lol/questions/'+o+'/?page='+str(i)).read())
  print(sum(P)<2and U[0]>3and sum(K)>5);print('# Python answers: ',sum(P));print('# Votes: ',U[0]);print('# Answers: ',sum(K))

Ziemlich lange, nicht wahr? Ich habe nicht viel mit Codegolf zu tun, obwohl ich, wenn Sie wollen, ein bisschen mehr Golf spielen kann. Ansonsten liebe ich es und könnte nicht glücklicher sein. Oh, ich hätte fast vergessen, dass dies als zusätzlichen Bonus auch die Gesamtzahl der Python-Antworten auf die Frage, die Gesamtzahl der Stimmen auf die Frage und die Gesamtzahl der Antworten auf die Frage ausgibt, wenn die Frage ideiner Frage mit mehr als einer Seite entspricht von Antworten. Wenn die Frage sonst nur aus einer einzigen Seite mit Antworten besteht, wird nur der truthy/falsyWert ausgegeben . Diese Herausforderung hat mich wirklich ein bisschen mitgerissen.

Diese nehmen jeweils die Frage idin Form einer Zeichenfolge an .

Ich würde Try It Online!hier Links für jede Funktion setzen, aber leider weder das Abrufen von Ressourcen über Pythons Bibliothek erlauben repl.itnoch .Ideoneurllib


Mit können Sie http://codegolf.stackexchange.com/q/die Frage abrufen. Auch ist http://obligatorisch?
Marv

Ideone und repl.it erlauben es nicht, externe Ressourcen a la urllib abzurufen.
Mego

@Mego Dang ... na dann müssen die Leute wohl bestätigen, dass es mit ihren eigenen Python-Interpreten funktioniert.
R. Kap

@Marv Ja, anscheinend ist es das. Ansonsten erhalte ich eine unknown url typeFehlermeldung.
R. Kap

6
ppcg.lol/q/idfunktioniert auch
entfernt

4

Julia, 275 Bytes

using Requests
f(q,p=(s,t)->JSON.parse(readall(get("https://api.stackexchange.com/2.2/questions/$q$s",query=Dict(:site=>"codegolf",:filter=>"$t"))))["items"],x=p("","")[1])=x["answer_count"]>5&&x["score"]>3&&count(i->ismatch(r"python",i["body"]),p("/answers","!9YdnSMKKT"))<2

Dies ist eine Funktion, die eine Ganzzahl akzeptiert und einen Booleschen Wert zurückgibt. Es stellt eine Verbindung zur Stack Exchange-API her und bei jedem Ausführen der Funktion werden 2 API-Anforderungen gestellt. Führen Sie sie daher nicht zu oft aus, da sonst Ihre 300 Anforderungen / Tag-Quote erschöpft sind.

Ungolfed:

using Requests

function f(q)
    # Define a function that takes two strings and returns a Dict
    # that connects to the SE API
    p = (s,t) -> JSON.parse(readall(get("https://api.stackexchange.com/2.2/questions/$q$s",
        query = Dict(:site => "codegolf", :filter=> "$t"))))["items"]

    # Get the question object
    x = p("", "")[1]

    # Get all answers using the `withbody` API filter
    y = p("/answers", "!9YdnSMKKT")

    x["answer_count"] > 3 && x["score"] > 5 &&
        count(i -> ismatch(r"python", i["body"], y) < 2
end

Mir war der API-Filter "withbody" nicht bekannt! +1. Kann ich diesen Trick auch anwenden, wenn dadurch Bytes in meiner Ruby-Antwort gespart werden?
Value Ink

1
@ KevinLau-notKenny Natürlich! Tun Sie, was Sie im Namen des Golfs tun müssen. : P
Alex A.

Ich wollte nicht = 3 plagiieren, aber leider ppcg.lolreichte die API-Version nicht aus , nachdem ich erfahren hatte, dass sie einen kurzen Link zu allem, was mit Codegolf zu tun hat, darstellt
Value Ink

4

Schläger, 339 Bytes

(λ(q)((λ(h)((λ(g)((λ(j)(and(>(h j'score)3)(>(h j'answer_count)5)(<(for/sum([a(g"~a/answers"q)]#:when(regexp-match #rx"(?i:python)"(h a'body)))1)2)))(car(g"~a"q))))(λ(s d)(define-values(x y b)(http-sendrecv"api.stackexchange.com"(format"/2.2/questions/~a?site=codegolf&filter=withbody"(format s d))))(h(read-json b)'items))))hash-ref))

Golf hat noch viel zu bieten.


1
Schlagen Sie mich dazu! : P
Katze

TODO: Machen Sie einen Schläger, der Golf spielen kann. :)
Winny

1
339 Bytes, von denen 68 Parens sind. Ein LISP für Golf benötigt also kurze Bezeichner und keine Parens. Nicht sehr LISPy :(
Katze

4

Ruby + HTTParty , 170 146 145 142 139 138 + 11 ( -rhttpartyFlag) = 181 157 156 153 150 149 Byte

Ich glaube nicht, dass es Kantenfälle gibt, die dazu führen würden, dass meine Regex-Muster brechen. Ich hoffe ...

Auf den von @WashingtonGuedes bereitgestellten Shortlink aktualisiert und festgestellt, dass sich HTTParty nicht beschwert, wenn ich mit //anstatt mit beginne http://.

Aktualisiert für etwas sicherere reguläre Ausdrücke. Ich habe sowieso Bytes gespart, indem ich festgestellt habe, dass HTTParty-Antwortobjekte von String erben, was bedeutet, dass ich sie nicht einmal zum .bodyAbgleichen des regulären Ausdrucks verwenden muss!

@manatwork wies auf eine zufällige Hinzufügung von Charakteren hin, die ich hinterlassen habe und die aus Gründen des Golfspiels ijetzt als Zeichenfolge akzeptiert werden muss.

Regexes aktualisiert. Die gleiche Länge. -1 Byte durch Ausschneiden eines Parens.

->i{/"up.*?(\d+)/=~s=HTTParty.get("//ppcg.lol/q/"+i)
$1.to_i>3&&(a=s.scan /st.*xt".*\n(.*)/).size>5&&a[1..-1].count{|e|e[0]=~/python/i}<2}

Zusätzliche Hinweise:

  • Die erste Zeile einer Antwort (die die Sprache gemäß der Spezifikation enthalten sollte) besteht aus zwei Zeilen nach dem HTML-Tag mit der Klasse "post-text", mit der wir übereinstimmten st.*xt". Eine sicherere Version hätte danach ein Leerzeichen eingefügt, aber das opfern wir für den Golfsport.
  • HTTParty wird für die nativen net/httpModule verwendet, da die angegebene URL ordnungsgemäß umgeleitet wird.
  • "up*?\dwar die kürzeste Sequenz, die ich gefunden habe und die der Anzahl der Stimmen entsprach. Wir brauchen nur den ersten, daher haben die Antworten zum Glück keinen Einfluss darauf.

3
ppcg.lol/q/#{i}funktioniert auch
entfernt

@WashingtonGuedes ppcg.ga/q#{i}vielleicht? (Ich kenne Ruby nicht)
Erik der Outgolfer

@ ΈρικΚωνσταντόπουλος ppcg.ga ist keine Platzhalterumleitung, versuchen Sie es selbst - ppcg.ga/q/79273
Timtech

@ Timtech Also ppcg.lol/q#{i}ist anwendbar, denke ich? ( a/#bist das gleiche wie a#b)
Erik der Outgolfer

1
Das "ruiniert den /"e-c.*?(\d+)/regulären Ausdruck. By the way, die Forderung sagen über den Eingang , dass „Datentypen (...) spielt keine Rolle.“ Also besser den i - Parameter als String übergeben, so dass Sie die Substitution mit Verkettung ersetzen: "//ppcg.lol/q/"+i.
Manatwork

3

Groovy, 179 161 157

{i->t=new URL("http://ppcg.lol/q/$i").text;a=0;p=0;(t=~/"(?i)p.{25}>\n.*python/).each{p++};(t=~/(?m)v.{13}t ">(\d+)/).each{if(it[1].toLong()>3)a++};a>5&&p<2}

Dank Timtech werden 17 Zeichen gespart.

Das Schlüsselwort def ist ebenfalls nicht erforderlich.


Sie können codegolf.stackexchange.com durch ppcg.lol
Timtech

siehe auch: Golftipps in Groovy
cat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.