Determinar si vale la pena responder a un desafío


21

Soy un muy jugador de código informal, y no veo publicaciones con frecuencia hasta que aparecen en la barra lateral de "Preguntas de la red activa" en StackOverflow. Por lo general, llego tarde al juego, y dado que el único lenguaje que conozco es Python, no tengo mucho sentido para responder ya que ya hay varias respuestas de Python. Su desafío es averiguar si vale la pena responder una pregunta.

Entrada:

  • Su código (función o programa) tomará un parámetro de entrada i

Salida:

  • Verdad o valor de Falsey para la identificación de la pregunta i. Salida Verdad si la pregunta tiene más de 5 respuestas, una puntuación de más de 3 preguntas y una o menos respuestas en Python (sin distinción entre versiones).

Reglas / Aclaraciones:

  • El formato de entrada puede ser razonable (stdin, archivo, línea de comando), pero debe especificarse en su respuesta. Los tipos de datos y los espacios en blanco iniciales / finales no importan.
  • Suponga que la identificación de la pregunta es válida para codegolf.stackexchange.com.
  • Ignorar los requisitos de preguntas específicas del idioma. (es decir, si una pregunta cumple con los votos y las respuestas, y no tiene respuestas de Python porque es solo Java, todavía da como resultado Truthy).
  • Una respuesta califica como una respuesta de Python si "python" (sin distinción entre mayúsculas y minúsculas) aparece en cualquier lugar antes de la primera línea nueva de la publicación.
  • Este es el código de golf, por lo que gana el código más corto en bytes.

Casos de muestra *

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)

* Verificado al momento de la publicación, puede haber cambiado


También solo sé Python ...
R. Kap

También conozco Python, principalmente.
user48538

Tengo que empezar a aprender otros idiomas.
R. Kap

55
@ R.Kap, ¡este desafío sería un buen momento para comenzar!
wnnmaw

2
Parece que vale la pena responder a este desafío.
Rɪᴋᴇʀ

Respuestas:


8

05AB1E , 167 160 159 158 156 154 143 bytes

Maldición, casi tanto como un lenguaje normal ...

Mierda ... ya no supera la respuesta de Ruby en 1 byte.

Ahora más largo que la respuesta de Ruby, ¡argh! .

Probablemente debería irme a la cama ahora mismo.

Gracias a @wnnmaw por guardar 1 byte y gracias a @R. ¡Kap para guardar otros 2 bytes!

Código:

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

O con más legibilidad:

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

Explicación:

En primer lugar, se está comprimiendo una gran cantidad de texto aquí, lo que se traduce en un buen Python. La versión sin comprimir es:

"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

Esta parte:

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

en realidad muestra un valor de pila, lo copia en la url y obtiene todos los datos HTML. Los datos HTML se insertan en la parte superior de la pila usando #.append(f.read()).

Contamos el número de respuestas , contando el número de ocurrencias de class="answer".

Para contar el número de votos, simplemente dividimos los datos en "útil y claro" y mantenemos solo los valores de dígitos de [0:99]uso ®"useful and clear"¡`99£þ. Este es el número de votos a favor.

Eventualmente, debemos verificar cada respuesta si el texto "Python"existe antes del texto del encabezado de cierre. Para obtener todas las respuestas, simplemente dividimos los datos class="post-text"y dividimos cada uno de ellos nuevamente <. Eliminamos los dos primeros elementos para obtener la parte en la que se muestra el idioma y verificamos si la versión en minúscula está en esta cadena.

Entonces, ahora nuestra pila se ve así para id = 79273:

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

Esto también se puede ver con la -dbandera de ebug en el intérprete.

Entonces, solo es cuestión de procesar los datos:

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

Utiliza la codificación CP-1252 . Puede descargar el intérprete aquí .


12
Me gusta la versión "más legible"; ¡esos saltos de línea adicionales realmente marcan la diferencia! ;)
Comodín

@Wildcard Realmente hacen la diferencia;)
Erik the Outgolfer

¿Podría guardar bytes usando la ppcg.lol/q/idcompresión?
wnnmaw

@wnnmaw Gracias, ahora estoy a solo 1 byte de la respuesta de Ruby: p.
Adnan

1
¡Oh no! No creo que pueda cortar suficientes esquinas para guardar los 7 bytes que necesito para avanzar de nuevo ... Supongo que solo tengo que conformarme con el segundo lugar
Value Ink

5

Python 3.5, 280 272 260 242 240 bytes:

Gracias a Adnan por el truco sobre el uso del *operador en las comparaciones que resultan en 2 bytes guardados! )

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)

Suficientemente simple. Utiliza la urllibbiblioteca integrada de Python para ir al sitio de la pregunta, y luego usa expresiones regulares para encontrar el recuento de votos, el recuento de respuestas y el recuento de respuestas específicas de Python en el texto descodificado devuelto desde el sitio web. Finalmente, estos valores se comparan con las condiciones requeridas para devolver un truthyvalor, y si satisfacen todas las condiciones, Truese devuelven. De Falselo contrario es.

Lo único que me puede preocupar aquí es que las expresiones regulares dan mucho margen en términos de la cantidad de respuestas específicas de Python para guardar bytes, por lo que a veces puede ser un poco inexacto, aunque probablemente sea lo suficientemente bueno para Los propósitos de este desafío. Sin embargo, si desea uno mucho más preciso, he agregado uno a continuación, aunque es más largo que el anterior. El que se muestra a continuación tiene actualmente 298 bytes, ya que utiliza una expresión regular mucho más larga, una que no podría saber cuánto tiempo tardé en descubrir, para contar las respuestas de Python que mi función original en aras de la precisión. Este debería funcionar durante al menos 80% a 90% de todos los casos de prueba que se le presenten.

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)

Pero, ¿qué pasa con esas preguntas con múltiples páginas de respuestas? Ninguno de los anteriores funcionará muy bien en esa situación, si, por ejemplo, 1 respuesta de Python está en la primera página y otra está en la segunda. Bueno, me tomé la libertad de solucionar este problema creando otra versión de mi función (que se muestra a continuación) que verifica cada página de respuestas, si existen varias, para las respuestas de Python, y ha funcionado bastante bien en muchos de los casos de prueba que Lo he tirado. Bueno, sin más preámbulos, aquí está la función nueva y actualizada:

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

Bastante largo, ¿no es así? Realmente no iba mucho por el golf de código con esto, aunque, si quieres, puedo jugar un poco más. De lo contrario, me encanta y no podría estar más feliz. Oh, casi lo olvido, como un bono adicional, esto también genera el número total de respuestas de Python en la pregunta, el total de votos en la pregunta y el número total de respuestas en la pregunta si la pregunta idcorresponde a una pregunta con más de 1 página de respuestas De lo contrario, si la pregunta solo consta de una sola página de respuestas, solo genera el truthy/falsyvalor. Realmente me dejé llevar por este desafío.

Cada uno de ellos toma la pregunta iden forma de cadena .

Pondría Try It Online!enlaces aquí para cada función, pero desafortunadamente, repl.itni Ideonepermitir ni buscar recursos a través de la urllibbiblioteca de Python .


Puedes usar http://codegolf.stackexchange.com/q/para buscar la pregunta. Además, ¿es http://obligatorio?
Marv

Ideone y repl.it no permiten obtener recursos externos a la urllib.
Mego

@Mego Dang ... bueno, supongo que la gente tendrá que confirmar que funciona con sus propios intérpretes de Python.
R. Kap

@Marv Sí, aparentemente lo es. De lo contrario, me sale un unknown url typeerror.
R. Kap

66
ppcg.lol/q/idtambién funciona
eliminado

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

Esta es una función que acepta un entero y devuelve un booleano. Se conecta a la API de Stack Exchange y cada ejecución de la función realiza 2 solicitudes de API, así que no la ejecutes demasiadas veces o agotarás tu cuota de 300 solicitudes / día.

Sin golf:

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

¡No conocía el filtro API "withbody"! +1. Si guarda bytes en mi respuesta de Ruby, ¿puedo usar ese truco también?
Value Ink

1
@ KevinLau-notKenny ¡Por supuesto! Haz lo que tengas que hacer en nombre del golf. : P
Alex A.

No quería plagiar = 3 pero, por desgracia, después de ppcg.lolenterarme como un breve enlace a todo lo relacionado con codegolf, la versión API simplemente no era suficiente
Value Ink,

4

Raqueta, 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))

Todavía hay mucho para jugar al golf.


1
¡Golpéame! : P
gato

TODO: haz una raqueta que sea apta para el golf. :)
Winny

1
339 bytes de los cuales 68 son parens ... por lo que un LISP para golf necesitaría identificadores cortos y no parens. No muy LISPy :(
gato

4

Rubí + HTTParty , 170 146 145 142 139 138 + 11 ( -rhttpartyflag) = 181 157 156 153 150 149 bytes

No creo que haya casos extremos que puedan romper mis patrones de expresiones regulares, espero ...

Actualizado al enlace corto proporcionado por @WashingtonGuedes y descubriendo que HTTParty no se queja si empiezo con en //lugar de http://.

Actualizado para expresiones regulares un poco más seguras. De todos modos, guardé bytes descubriendo que los objetos de respuesta HTTParty heredan de String, lo que significa que ni siquiera necesito usarlos .bodypara hacer coincidir la expresión regular.

@manatwork señaló una adición accidental de caracteres que me quedaba, y por el bien del golf, idebe ser aceptada como una Cadena ahora.

Regexes actualizados. Mismo largo. -1 byte cortando un par.

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

Notas adicionales:

  • La primera línea de una respuesta (que debe contener el lenguaje de acuerdo con la especificación) es dos líneas después de la etiqueta HTML con clase "post-text", con la que coincidimos st.*xt". Una versión más segura habría agregado un espacio después, pero estamos sacrificando eso por el bien del golf.
  • HTTParty se utiliza sobre los net/httpmódulos nativos debido al manejo de redireccionamiento adecuado para la URL dada.
  • "up*?\dfue la secuencia más corta que encontré que correspondía con el número de votos. Solo necesitamos el primero, así que afortunadamente las respuestas no afectan esto.

3
ppcg.lol/q/#{i}también funciona
eliminado

@WashingtonGuedes ppcg.ga/q#{i}tal vez? (No sé Ruby)
Erik the Outgolfer

@ ΈρικΚωνσταντόπουλος ppcg.ga no es un redireccionamiento comodín, pruébelo usted mismo - ppcg.ga/q/79273
Timtech

@Timtech Entonces, ¿ ppcg.lol/q#{i}es aplicable, creo? ( a/#bes lo mismo que a#b)
Erik the Outgolfer

1
El "está arruinando la /"e-c.*?(\d+)/expresión regular. Por cierto, el requisito decir sobre la entrada que “Tipos de datos (...) no importa.” Así que mejor pasar el parámetro i como cadena, por lo que puede sustituir a la sustitución con la concatenación: "//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}

Gracias a Timtech 17 caracteres guardados.

La palabra clave def tampoco es necesaria.


Puede reemplazar codegolf.stackexchange.com con ppcg.lol
Timtech

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.