챌린지가 응답 할만한 가치가 있는지 확인


21

나는 매우 평범한 코드 골퍼이며 StackOverflow의 "핫 네트워크 질문"사이드 바에 표시 될 때까지 게시물을 자주 보지 않습니다. 보통, 나는 게임에 늦었고, 내가 아는 유일한 언어는 파이썬이기 때문에, 이미 몇 가지 파이썬 답변이 있기 때문에 대답 할 점이 거의 없습니다. 당신의 도전은 질문에 대답 할 가치가 있는지 알아내는 것입니다.

입력:

  • 코드 (기능 또는 프로그램)는 하나의 입력 매개 변수를 사용합니다. i

산출:

  • 질문 id에 대한 Truthy 또는 Falsey 값 i. 질문에 5 개 이상의 답변, 3 개 이상의 질문 점수 및 Python에서 하나 이상의 답변이있는 경우 Truthy를 출력하십시오 (버전 간 구별 없음).

규칙 / 설명 :

  • 입력 형식은 합리적인 것 (stdin, file, command line)이 될 수 있지만 답에 지정해야합니다. 데이터 유형과 선행 / 후행 공백은 중요하지 않습니다.
  • 질문 ID가 유효하다고 가정합니다 codegolf.stackexchange.com.
  • 언어 별 질문 요구 사항을 무시하십시오. (즉, 질문이 투표 및 답변을 충족하고 Java 전용이기 때문에 Python 답변이없는 경우 여전히 Truthy가 발생합니다).
  • 게시물의 첫 줄 바꿈 이전에 "python"(대소 문자 구분)이 발생하면 답변은 Python 답변으로 간주됩니다.
  • 이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

샘플 케이스 *

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)

* 게시 시점에 인증되었으며 변경되었을 수 있습니다


나도 파이썬 만 알고있다.
R. Kap

나는 또한 파이썬을 주로 알고 있습니다.
user48538

다른 언어를 배우기 시작했습니다.
R. Kap

5
@ R.Kap,이 도전은 시작하기 좋은 시간입니다!
wnnmaw

2
이 도전은 분명히 대답 할 가치가 있습니다.
Rɪᴋᴇʀ

답변:


8

05AB1E , 167 160 159 158 156 154 143 바이트

젠장, 거의 일반 언어만큼 ...

Crap ... 더 이상 현재 Ruby 응답1 바이트 꺾고 있습니다.

이제 루비 답변보다 길다. 아아! .

아마 지금 자러 가야 겠어

1 바이트를 절약 한 @wnnmaw와 @R 덕분에. 다른 2 바이트를 저장해 주신 Kap!

암호:

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

또는 더 가독성 :

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

설명:

우선, 여기에 많은 텍스트가 압축되어 있으며, 이는 오래된 파이썬으로 변환됩니다. 압축되지 않은 버전은 다음과 같습니다.

"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

이 부분:

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

실제로 스택 값을 팝하여 URL에 복사하고 모든 HTML 데이터를 가져옵니다. 를 사용하여 HTML 데이터가 스택 맨 위에 푸시됩니다 #.append(f.read()).

우리 는 답변수를 센다 는 발생 횟수를 세어 센다 class="answer".

투표 수를 세려면 데이터를 "유용하고 명확하게"나누고 숫자 값만 유지하십시오. [0:99] 사용 하면 ®"useful and clear"¡`99£þ됩니다. 업 보트 수입니다.

결과적으로 텍스트 "Python"가 닫는 헤더 텍스트보다 앞에 있는지 모든 답을 확인해야 합니다. 모든 답변을 얻으려면 데이터를 분할하십시오.class="post-text" 분할하고 각 다시 분할하십시오 <. 언어가 표시되는 부분을 얻기 위해 처음 두 요소를 제거하고 소문자 버전이이 문자열에 있는지 확인합니다.

이제 우리 스택은 id = 79273:

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

이것은 또한 볼 수 있습니다 -d인터프리터에서 ebug 플래그를 .

따라서 데이터 처리의 문제입니다.

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

CP-1252 인코딩을 사용합니다 . 여기서 통역사를 다운로드 할 수 있습니다 .


12
"더 읽기 쉬운"버전을 좋아합니다. 여분의 줄 바꿈은 실제로 차이를 만듭니다! ;)
와일드 카드

@Wildcard 그들은 실제로 차이를 만들;)
아웃 골퍼 Erik

ppcg.lol/q/id압축 을 사용하여 바이트를 절약 할 수 있습니까?
wnnmaw

@wnnmaw 고마워, 이제 Ruby 답변에서 1 바이트 떨어져 있습니다 : p.
Adnan

1
아뇨! 난 그냥 두 번째 장소 정착이 생각 ... 내가 앞으로 다시 얻을 필요가 7 바이트를 저장하기에 충분한 모서리를 잘라 수 있다고 생각하지 않습니다
값 잉크

5

파이썬 3.5 280 272 260 242 240 바이트 :

( 2 개의 저장 바이트를 생성하는 비교 에서 연산자를 사용하는 방법에 대한 트릭에 대해 Adnan 에게 감사드립니다 !* )

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)

충분히 간단합니다. Python의 내장 urllib라이브러리를 사용 하여 질문 사이트로 이동 한 다음 정규식을 사용하여 웹 사이트에서 반환 된 디코딩 된 텍스트에서 투표 수, 답변 수 및 Python 특정 답변 수를 찾습니다. 마지막으로 이러한 값은 값을 반환하는 데 필요한 조건과 비교 truthy되며 모든 조건을 만족하면 True반환됩니다. 그렇지 않으면False 이다.

내가 여기서 걱정할 수있는 유일한 것은 정규 표현식이 바이트를 절약하기위한 파이썬 특정 답변의 수와 관련하여 많은 방법을 제공한다는 것입니다. 이 도전의 목적. 그러나 훨씬 정확한 것을 원한다면 위의 것보다 길지만 아래에 하나를 추가했습니다. 아래에 표시된 것은 현재보다 298 바이트입니다. 정확성을 위해 원래 함수보다 Python 답변을 계산하는 데 훨씬 더 긴 정규 표현식을 사용하므로 발견하는 데 걸리는 시간을 알 수 없었습니다. 이것은 모든 테스트 사례의 약 80 %-90 %에서 작동합니다.

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)

그러나 여러 페이지의 답변이있는 질문은 어떻습니까? 예를 들어, 1 개의 파이썬 답변이 첫 번째 페이지에 있고 다른 하나는 두 번째 페이지에있는 경우 위의 상황 중 어느 것도 잘 작동하지 않습니다. 글쎄, 나는 모든 페이지 를 검사하는 다른 버전의 함수 (아래 그림 참조)를 만들어서이 문제를 해결하기 위해 자유를 얻었습니다. 파이썬 답변에 대해 여러 가있는 경우 답변 많은 테스트 사례에서 꽤 잘 수행되었습니다. 그것에 던져졌다. 더 이상 고민하지 않고 새롭고 업데이트 된 기능은 다음과 같습니다.

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

꽤 길지 않습니까? 원하는 경우 코드 골프를 조금 더 내릴 수는 있지만 코드 골프에는별로 도움이되지 않았습니다. 그렇지 않으면 나는 그것을 좋아하고 더 행복 할 수 없었다. 아, 추가 보너스로 질문에 대한 총 파이썬 답변 수, 질문에 대한 총 투표 수 및 질문에 대한 질문에 대한 총 답변 수를 거의 잊어 버렸습니다.id 질문이 1 페이지 이상의 해당하는 . 답변. 그렇지 않으면 질문이 단일 페이지의 답변으로 만 구성된 경우truthy/falsy 값만 됩니다. 나는이 도전 과제에 약간 빠져 들었다.

이들은 각각 질문의 id형태로 문자열 .

Try It Online!각 함수에 대한 링크를 여기에 넣었 지만 불행히도 Python 라이브러리 를 통한 리소스 가져 오기는 허용 되지 repl.it않습니다 .Ideoneurllib


http://codegolf.stackexchange.com/q/질문을 가져 오는 데 사용할 수 있습니다 . 또한 http://필수입니까?
Marv

Ideone과 repl.it는 외부 리소스를 la urllib로 가져올 수 없습니다.
Mego

@ Mego Dang ... 그렇다면 사람들은 자신의 Python 인터프리터를 사용하여 작동하는지 확인해야한다고 생각합니다.
R. Kap

@Marv 네, 분명히 그렇습니다. 그렇지 않으면 unknown url type오류가 발생합니다.
R. Kap

6
ppcg.lol/q/id또한 작동
제거

4

줄리아, 275 바이트

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

정수를 받아들이고 부울을 리턴하는 함수입니다. Stack Exchange API에 연결되며 각 함수 실행마다 2 회의 API 요청이 발생하므로 너무 많이 실행하지 마십시오. 300 회 요청 / 일 할당량을 소진합니다.

언 골프 드 :

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

"withbody"API 필터를 몰랐습니다! +1. Ruby 응답에 바이트를 저장하면 해당 트릭도 사용할 수 있습니까?
Value Ink

1
@ KevinLau-notKenny 물론입니다! 골프의 이름으로해야 할 일을하십시오. : P
Alex A.

나는 표절 = 3을 원치 않았지만 슬프게도, ppcg.lol모든 코드 골프에 대한 짧은 링크로 학습 한 후에 API 버전으로는 충분하지 않았습니다.
Value Ink

4

라켓, 339 바이트

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

아직도 골프가 많이 있습니다.


1
날 이길! : P
고양이

TODO : 골프를 할 수있는 라켓과 같은 것을 만드십시오. :)
Winny

1
339 바이트 중 68 개가 파 렌스입니다. 따라서 골프 용 LISP에는 짧은 식별자가 있고 파 렌스가 필요하지 않습니다. 별로 LISPy :(
cat

4

루비 + HTTParty , 170 146 145 142 139 138 + 11 ( -rhttparty플래그) = 181 157 156 153 150 149 바이트

정규식 패턴이 깨지는 가장자리 사례가 없다고 생각합니다.

@WashingtonGuedes가 제공하는 짧은 링크로 업데이트되었고 내가 //대신 시작할 때 HTTParty가 불평하지 않는 것을 발견했습니다.http:// .

좀 더 안전한 정규 표현식으로 업데이트되었습니다. 어쨌든 HTTParty 응답 객체가 String에서 상속된다는 것을 발견하여 바이트를 절약했습니다. 즉, 사용할 필요조차 없습니다..body 정규 표현식과 일치 할 때도 !

@manatwork는 내가 남긴 우연한 캐릭터 추가를 지적하고 골프를 위해 i 지금 문자열로 받아 들여 져야합니다.

정규식을 업데이트했습니다. 같은 길이입니다. 파렌을 잘라 -1 바이트.

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

추가 메모 :

  • 답변의 첫 번째 줄 (사양에 따라 언어를 포함해야 함)은 class가있는 HTML 태그 다음에 나오는 두 줄 "post-text"입니다.st.*xt" . 보다 안전한 버전은 그 뒤에 공간을 추가했을 것입니다. 그러나 우리는 골프를 위해 그것을 희생하고 있습니다.
  • net/http지정된 URL에 대한 올바른 리디렉션 처리로 인해 HTTParty가 기본 모듈에서 사용됩니다 .
  • "up*?\d내가 찾은 가장 짧은 순서는 투표 수에 해당합니다. 우리는 첫 번째 것만 필요하므로 감사하게 대답해도 영향을 미치지 않습니다.

3
ppcg.lol/q/#{i}또한 작동
제거

@WashingtonGuedes ppcg.ga/q#{i}어쩌면? (나는 루비를 모른다)
Outgolfer Erik

@ ppr.ga는 와일드 카드 리디렉션이 아니므로 직접 시도해보십시오. ppcg.ga/q/79273
Timtech

@Timtech ppcg.lol/q#{i}적용 가능한 것 같아요? ( a/#b과 동일 a#b)
에릭 Outgolfer

1
"파괴되는 /"e-c.*?(\d+)/정규 표현식. 그건 그렇고, 요구 사항은“데이터 유형 (…)은 중요하지 않습니다.”라는 입력에 대해 말합니다. 따라서 i 매개 변수를 문자열로 전달하는 것이 더 좋으므로 대체를 연결로 대체 할 수 있습니다 "//ppcg.lol/q/"+i.
manatwork

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.