스스로 다운로드하는 프로그램 작성


66

이 사이트에 연결하고 게시 된 답변을 다운로드하고 자체 소스 코드를 추출하여 인쇄하는 프로그램을 작성하십시오. 출력은 소스 코드와 동일해야합니다. 가장 짧은 코드 (바이트)가 이깁니다.

규칙 :

  • URL 단축기는 허용되지 않습니다.
  • 대답은 언어 이름과 크기, 선택적 설명, 코드 블록, 선택적 설명 및 설명과 같은 제목 형식이어야합니다. 부 자연스러운 분리 문자는 허용되지 않습니다.
  • 출력은 사이트에 게시 된 실제 코드 블록에서 시작되어야합니다.
  • 기능은 답변 목록의 위치에 의존해서는 안됩니다. 여러 페이지가 있고 첫 페이지에 대답하지 않아도 작동합니다.
  • 새로운 : 브라우저에서 실행되도록되어 있습니다 답변에 대한 특별 참고 사항 : (동일 출처 정책을 순종하는)을 codegolf 도메인에 그들을 실행 요구하는 확인하지만 도메인과 경로는 순서 솔루션에 포함되어야한다 공정하게 만드십시오.

39
Catch-22 : 제출물을 어떻게 테스트해야합니까?
마틴 엔더

9
사람들이 답변을 게시하고 삭제하여 코드를 테스트 할 수 있습니다.
저스틴

4
@ m.buettner 답변은 다른 답변 (다른 질문에 대해) 먼저 테스트 한 다음 게시 한 다음 URL을 변경하도록 편집 할 수 있습니다 :)
aditsu

8
@hexafraction 만약 의견이 답변을 방해 할 수 있다면, 그 답변은 그리 좋지 않습니다 ...
aditsu

17
질문은 내 머리 속에 갇혔다 : URL 단축기를 사용하지 않고 자신의 링크를 만드는 트윗을 작성하는 방법, 그러나 트윗 ID를 추정하여 트윗을 작성하는 방법은 무엇입니까?
Ming-Tang

답변:


34

Bash + coreutils + Lynx 브라우저, 61 바이트

팁에 대한 @FDinoff에게 감사드립니다.

lynx -dump codegolf.stackexchange.com/posts/28164/body|grep 2

4
그리고 grep이라는 매직 단어를 입력하면 어떻게됩니까?
Shade

3
스라소니 스라소니 스라소니 스라소니. 이 의견은
잘릴

1
@hexafraction Awww. 당신은 가서 그것을 망쳐 야했다!
Shade

8
이 URL이 작동합니다. codegolf.stackexchange.com/posts/28164/body그리고 주석을 무시합니다. 나는 또한 당신이 그것을 사용할 수있는 규칙 내에서 생각합니다 ...
FDinoff

3
@DigitalTrauma awww ... 젠장.
haneefmubarak

22

루비 155 186 195 148 138 110 97 문자

require'open-uri';puts open('http://codegolf.stackexchange.com/posts/28159/body').read[/req.+;/];

그렇지 않으면 \n실제 줄 바꿈 대신 줄 바꿈을 출력하기 때문에 한 줄로 만들어야했습니다 .

  • 일부 문자가 이스케이프되는 것을 보지 못하여 +31 자
  • 성가신 백 슬래시를 제거하기 위해 +9 문자.
  • 위에 나열된 대부분의 수정 사항을 제거하여 2 개의 문자를 저장 한 Nathan Osman과 55 (!!!)를 절약 한 Ventero에게 감사합니다.

설명

이것을 먼저 아름답게합시다. 그러나이 코드에서 다소 흥미로운 흥미로운 표기법을 사용해야합니다. 이 게시물에서 세미콜론을 전혀 사용할 수 없으므로 나중에 설명하는 이유로 {SEMI}세미콜론 대신 사용할 것입니다.

require 'open-uri'
resp = open('http://codegolf.stackexchange.com/posts/28159/body').read
puts resp.match(/req.+{SEMI}/){SEMI}

자 이제이 과정을 살펴 보겠습니다. 처음 두 줄은 설명이 필요 없습니다.이 답변의 HTML 텍스트를 가져옵니다.

마지막 줄은 여기서 흥미로운 것입니다. 코드 끝에 쓸모없는 세미콜론이 보입니까? 절대적으로 필요하며 그 이유는 다음과 같습니다.

먼저 resp.match인쇄 할 코드를 추출합니다. 이것을 사용하는 정규 표현식은 트릭 /req.+{SEMI}/입니다. 그것은 코드의 시작을 잡고 REQuire'net/http', 검색하여 req( re내를 잡아 것이다 REputation). 그런 다음 세미콜론을 검색하여 코드의 끝을 찾습니다! +기본적으로 탐욕 스러우 므로 코드 끝을 나타내는 세미콜론을 찾을 때까지 계속 진행됩니다. 세미콜론을 더 이상 사용할 수없는 이유는 무엇입니까?

그 후, \더 이상 사용하지 않는 Ventero의 수정 덕분에 아무것도 탈출 할 필요가 없습니다. 내가해야 할 일은로 {AMPERSAND}변경 {AMPERSAND}amp{SEMI}하는 것 amp{SEMI}입니다. 이 부분 을 제거하면 간단히 얻을 수 있습니다 . 새로운 URL로 인해 더 이상 필요하지 않습니다. 그 후, 원래 코드가 검색되었습니다! (참고 : 앰퍼샌드도 사용할 수 없습니다. 세미콜론이 생성되도록 HTML로 인코딩되기 때문입니다.)


일부 캐릭터가 탈출하고 있습니다 ..
aditsu

1
@ 아디 츠가; 눈치 채지 못했습니다. 결정된.
Doorknob

당신은 이것을 싫어할 것입니다. 백 슬래시가 복제되고 있습니다. 줄 바꿈 차이도 있지만 사소한 일입니다.
aditsu

@aditsu Argh! : P 고정. 줄 바꿈은 puts; 그것은 printmeh 로 고정 될 수 있습니다 . SE가 표시 할 수 없지만 코드에 줄 바꿈이있는 것처럼 가장하십시오.
Doorknob

1
링크의 경우 http://codegolf.stackexchange.com/a/28159귀하와 동일한 결과를 제공하고 일부 문자를 저장합니다.
Mhmd

20

PowerShell- 69 62

(irm codegolf.stackexchange.com/posts/28236/body).div.pre.code

쉘의 DOM. 좋은!
fregante

irm에 Azure Rights Management가 필요하지 않습니까? 해당 모듈이 없으면 Invoke-WebRequest로 할 수 있다고 생각합니다.
Scott Leadley

@ScottLeadley irmInvoke-RestMethodPowerShell v3 코어 의 별칭 으로 도입되었습니다. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
이런 세상에. PowerShell 코드 골프 답변은 선행 답변과 동일한 크기의 길이로 답변합니다. +1
Adam Maras

@AdamMaras Ha, 무슨 말인지 알 겠어! 그래도 가끔 발생합니다. codegolf.stackexchange.com/a/26811/4565codegolf.stackexchange.com/a/21982/4565 는 그다지 앞서 있지 않았습니다.
Rynant

15

자바 스크립트 - 123 122 101 95 92 91 87 86 114

with(new XMLHttpRequest)send(open(0,/\codegolf.stackexchange.com\posts\28175\body/,0)),alert(/w.*/.exec(response))

이 페이지의 웹 브라우저 콘솔에서 실행됩니다. 최신 Chrome 및 Firefox 에서 테스트되었습니다 .

편집 : 전체 도메인을 추가하려면 +28 바이트.

Firefox는이 업데이트로 내 Regex URL 트릭을 더 이상 좋아하지 않습니다 :(

규칙을 깨는 86 바이트 솔루션은 다음과 같습니다.

with(new XMLHttpRequest)send(open(0,/posts\28175\body/,0)),alert(/w.*/.exec(response))

그것은 나를 경 외롭게 만들었습니다. 여러 번.
fregante

1
@ bfred.it 흥미로운 정규 표현식을 사용하여 바이트를 자릅니다. 한 번 더 경외심을 가지길 바랍니다.
nderscore

콘솔로 인쇄하는 것이 허용되는 출력 방법 인 경우 경고를 제거하여 7자를 줄일 수 있습니다.
Tejas Kale 2014 년

또한 새로운 규칙에 따라 codegolf.stackexchange.com/URL에 추가 해야합니다.
Tejas Kale

1
@TejasKale 내가 본 것에서 사람들은 실제로 경고 /document.write/console.log를하지 않는 솔루션에 눈살을 찌푸 렸습니다.
nderscore

10

루비 + wget + gunzip , 159 86 82 71

@FDinoff의 팁을 사용하여 사용 http://codegolf.stackexchange.com/posts/28173/body.

puts `wget -qO- codegolf.stackexchange.com/posts/28173/body`[/pu.*\]/]

테스트했습니다. 커맨드 라인 최적화를위한 @ace와 @Bob에게 감사드립니다.


2
에서 wget와 같이에 플래그를 결합 할 수 있습니다 wget -qO- url. 또한 bash에서는 URL에 큰 따옴표가 필요하지 않으므로 이것이 효과적 일 수 있습니다.
ace_HongKongIndependence 10

를 생략 할 수 있습니다 http://.

6

CJam-53

"codegolf.stackexchange.com/posts/28184/body"g54/1=);

나는 내 자신의 질문에 대답하고 있기 때문에이 커뮤니티 위키를 만들고
있습니다.


Woot, 코드에서 웃는 얼굴 +1
Cruncher

1
@Cruncher );는 나에게 너무 웃는 것처럼 보이지 않습니다 ...
MD XF

5

Rebmu, 91 자

Catch-22로 인해이 답변의 URL을 얻으려면 게시해야합니다. :-/ 알았어요.

paTSrd http://codegolf.stackexchange.com/a/28154[th<a name="28154">th<code>cpCto</code>]prC

Rebmu는 Rebol의 방언이며 모두 읽을 수 있습니다 . 여기에 해당하는 Rebol은 다음과 같습니다.

parse to-string read http://codegolf.stackexchange.com/a/28154 [
    thru <a name="28154">
    thru <code>
    copy c to </code>
]
print c

Rebol의 PARSE는 RegEx에 대한 일종의 문맹 퇴치입니다. 입력의 파서 위치를 시작합니다 (구조 블록 ... 이진 데이터 ... 또는 문자열 유형을 포함한 모든 시리즈 일 수 있음) . 규칙은 구문 분석 위치가 이동하는 방식에 대한 언어입니다.

태그와 URL은 실제로 언어에서 문자열입니다. 그러나 그들은 "맛이 나는"것이며, ​​Rebol이 동적으로 입력되면 그 유형을 확인할 수 있습니다. 예를 들어 READ는 URL 맛이있는 문자열을 제공하면 스키마 처리기로 보내서 읽기를 수행해야한다는 것을 알고 있습니다. (이 경우 HTTP에 등록 된 것). 기본적으로 UTF-8 바이트를 반환하므로 to-string을 사용하여이를 디코딩하고 일반 유니 코드 문자열로 일련의 코드 포인트를 얻습니다.

구문 분석 방언의 경우 태그 유형이 발생하는 것은 마치 태그처럼 보이는 문자열 인 것처럼 일치합니다. THRU는 "다음 규칙이 일치 할 때까지 건너 뛰고 일치 위치의 끝에 일치 위치를 배치합니다"를 의미하는 명령입니다. (TO는 일치하는 유사체이지만 요소 앞에 구문 분석 위치를 남겨 둡니다).

그래서 우리는 과거를 따라 압축합니다 <a name="28154">. 그런 다음의 다음 어커런스를 지나서 압축 <code>위치는 이제 바로 다음에 위치합니다 >. 그런 다음 PARSE의 COPY 명령을 사용하면 데이터를 다른 규칙으로 복사 할 수 있습니다.이 경우 규칙은 [TO </code>]...이므로 변수 C에 들어가기 직전까지 모든 것을 처리합니다 <.

? :-)

기술적으로는 예를 들어 TO "</"3 문자를 절약 하여 더 많은 것을 면도 할 수 있습니다. </code>단지 끝 태그 와 일치 할 필요가 없습니다 </. 시작 태그에 대해서도 비슷한 주장을 할 수있었습니다. 그러나 Rebmu는 문맹 골프 에 관한 것입니다. 처음에는 이상하게 생각될 지라도!

업데이트 : /body트릭은 가방에서 벗어 났지만 비슷하게 그대로 두겠습니다. 왜냐하면 이것이 교육 방식이 더 교육적이라고 생각하기 때문입니다.


5

Java 634, 852는 1004였습니다.

코드가 업데이트되었습니다. 제안 해 주셔서 감사합니다. 골프 : 이제 & gt를>

//bacchus
package golf;
import java.net.*;
import java.util.*;
public class G{
public static void main(String[] a) throws Exception {
Scanner z;
URL u;
int x=0;
String s;
u=new URL("http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself");
z=new Scanner(u.openConnection().getInputStream());
z.useDelimiter("\\s*//bacchus\\s*");
while(z.hasNext())
{
s=z.next();
s=s.replace("&gt;", ">");
if(x>0)System.out.println("//bacchus\n"+s);
x++;
if(x>2)break;
}
System.out.println("//bacchus\n");
}
}
//bacchus

테스트를 위해 제출 한 후 곧 편집하고 골프를칩니다. 테스트 문자열도 내 코드에 있으므로 x> 1을 x> 2로 변경해야했습니다. 참고 : 코드 골프는> 기호를 & gt.

//bacchus
package golf;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Golf {

    public static void main(String[] args) throws IOException {
        URL u;
        URLConnection c;
        InputStream i;
        InputStreamReader r;
        BufferedReader b;
        String s;
        int x=0;
        try {
            u=new URL("http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself");
            c=u.openConnection();
            i=c.getInputStream();
            r=new InputStreamReader(i);
            b=new BufferedReader(r);
            while((s=b.readLine())!=null)
            {
                if(s.contains("//bacchus")) x++;
                if(x>0)System.out.println(s);
                if(x>2) break;
            }
            i.close();
            b.close();
        } catch (MalformedURLException ex) {

        }
    }

}
//bacchus

7
포함 된 주석은 어떻게 처리 //bacchus합니까?
ζ--

3
많은 것들을 인라인하고 리소스를 사용하여 시도하고 *가져 오기를 사용하여 많은 코드를 저장할 수 있습니다.
Simon Kuang

@SimonKuang-나는 또한 물건을 닫는 대신 스트림을 열어 둡니다. 또한, throws Exception무엇이든 처리하려고하지 않습니다. 또한 BufferedReader가 아닌 Scanner를 사용하는 것이 더 간단 할 것이라고 생각합니다. 특히 구분 기호를로 설정하면 //bacchus작업이 다소 쉬워집니다.
Jules

5

파이썬, 175 167 바이트

이것은 두 개의 외부 라이브러리를 사용합니다. 나는 그것이 무단으로 읽히지 않았다.

import bs4,requests
print(bs4.BeautifulSoup(requests.get('http://codegolf.stackexchange.com/q/28154').text).select('#answer-28171')[0].select('pre > code')[0].string)

길지만 더 멋진 코드 :

import bs4, requests
request = requests.get('http://codegolf.stackexchange.com/q/28154')
soup = bs4.BeautifulSoup(request.text)
answer = soup.select('#answer-28171')[0]
code = answer.select('pre > code')[1].string
print(code)

1
questionsURL에은으로 대체 할 수있다 q:http://codegolf.stackexchange.com/q/28154
저스틴

1
bs4, requests1 행을 줄이려면 (행 1) 의 공백을 제거 할 수 있습니다.
ace_HongKongIndependence 10

5

자바 스크립트, 228

r=new XMLHttpRequest()
c='code'
r.open('GET','//'+c+'golf.stackexchange.com/posts/28157/body')
r.onreadystatechange=function(){this.readyState==4&&alert((a=r.responseText).substr(i=a.indexOf(c)+5,a.indexOf('/'+c)-i-1))}
r.send()

이 페이지에서 실행됩니다.


어떻게 운영합니까?
aditsu

@aditsu 브라우저의 JavaScript 콘솔에서 실행되어야합니다. 그러나 나는 아직도, 기다려주십시오 테스트 (고정)하고
ace_HongKongIndependence

@aditsu 지금 작동합니다. 브라우저 콘솔을 열고 (F12 누름)이 코드를 붙여 넣으십시오.
ace_HongKongIndependence

당신은 if(this.readyState == this.DONE)내부 기능이 필요 합니다.
Fabricio

1
@ace 나는 본다 :) 나는 지금까지 다른 js 대답을 보지 못했다. 그럼에서이 upvote에 걸릴
C5H8NNaO4

4

하스켈, 563 613 바이트

import Control.Monad
import Data.List
import Network.HTTP
m%f=join(fmap f m)
q s=(simpleHTTP(getRequest"http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself?answertab=oldest#tab-top"))%getResponseBody%(putStrLn.head.filter((==)(s++show s)).map(take 613).tails)
main=q"import Control.Monad\nimport Data.List\nimport Network.HTTP\nm%f=join(fmap f m)\nq s=(simpleHTTP(getRequest\"http://codegolf.stackexchange.com/questions/28154/write-a-program-that-downloads-itself?answertab=oldest#tab-top\"))%getResponseBody%(putStrLn.head.filter((==)(s++show s)).map(take 613).tails)\nmain=q"

테스트했습니다. "가장 오래된 게시물"기능을 통해 페이지를 지원합니다. quine-line 구조를 사용하여 인쇄 할 내용을 찾습니다. 이 import Control.Monad때문에 아니라 >>=생성 &gt;HTML에.


4

자바 스크립트 + jQuery, 87 , 67

jQuery를 사용할 수 있는지 확실하지 않지만 다음을 수행하십시오.

$('body').load('//codegolf.stackexchange.com/posts/28268/body pre')

이 페이지에서 발췌 된 경우 Javascript + jQuery : 27 , 25

재미있게 여기에 실례가된다면 :

$('[id$=268] pre').html()

$('[id$=28268] pre').html()


1
이것은 소스 코드보다 더 많은 것을 출력합니다.
nderscore

1
67 :$('body').load('//codegolf.stackexchange.com/posts/28268/body pre')
nderscore

당신은 맞습니다, 나는 코드 대신에 전체 답장을 잘못 가정했습니다
Martijn


3

다트, 164

나는 다트에서 이것을 시도한다고 생각했는데, imo를 사용하는 것은 꽤 재미 있습니다.

DartEditor의 콘솔에서 실행할 수 있지만 pubspec.yaml에 추가 된 http 패키지가 필요합니다.

import"package:http/http.dart"as h;h.read("http://codegolf.stackexchange.com/posts/28215/body").then((s){print(new RegExp(r"im.+(?:})").firstMatch(s).group(0));});}

언 골프 버전 :

import "package:http/http.dart" as h;

void main()
{
  h.read("http://codegolf.stackexchange.com/posts/28215/body").then((s)
  {
    print(new RegExp(r"im.+(?:})").firstMatch(s).group(0));
  });
}

2

R 114 자

library(XML);cat(xpathSApply(xmlParse("http://codegolf.stackexchange.com/posts/28216/body"),'//code',xmlValue)[1])

여기에 실제 마술은 없습니다 : html 태그 사이의 필드 값을 가져옵니다 <code></code>. 라이브러리를 사용합니다 XML(코드에서 분명히 알 수 있듯이). 결과를 stdout으로 출력합니다.


1

자바, 300 294

import java.net.*;import java.util.*;public class G{public static void main (String [] a) throws Exception{Scanner s=new Scanner(new URL("http://codegolf.stackexchange.com/posts/28189/body").openConnection().getInputStream()).useDelimiter("./?[c]ode\\W");s.next();System.out.print(s.next());}}

Bacchusbeale의 답변에 대한 개선 된 버전 :

  • 불필요하게 자원을 닫지 않습니다
  • 불필요한 변수를 선언하지 않습니다
  • a Scanner를 사용 하여 입력을 반복하지 않아도됩니다.
  • 시작 / 종료 마커의 중간 발생을 건너 뛰지 않기 위해 자신과 일치하지 않는 정규 표현식을 사용합니다.

업데이트 :

  • 게시물에 직접 URL을 사용하므로 코드의 시작 / 끝을 식별하기 위해 고유 한 주석이 필요하지 않습니다. 현재 사용하고 <code>[...]</code>디코딩하는 것을 피하기 위해, 실제로 정규식 "./?[c]ode\W"을 사용하여 (검색 할 구분자로 &lt;&gt;-은 "\의 W"는 오히려 미만 필요하다 "." 불행히도 2 자의 비용이 드는 URL의 일부와 게시물이 일치하지 않도록하고 c 주위의 대괄호는 정규 표현식 자체와 일치하지 않습니다.

1
불필요한 공간이 많이 있습니다. 또한 수업은 공개 할 필요가 없습니다.
aditsu

1
. 대해서 openConnection는 ()는 getInputStream () 또한 대해서 openStream ()로 단축 할 수
aditsu

1

w3m 55 바이트

w3m codegolf.stackexchange.com/posts/28242/body|grep x

@DigitalTrauma 기반


1

루비 237 215 146 132

require'mechanize'
a=Mechanize.new
puts a.get('http://codegolf.stackexchange.com/a/28159').search('.lang-rb code:nth-child(1)').text

여기 저기 몇 개의 공백을 제거하여 몇 바이트를 절약 할 수 있습니다.
MisterBla

걱정하는 @richard 어쨌든 이길 수는 없습니다.
Mhmd

1
이기는 것이 아니라 사탕을 위해하십시오.
MisterBla

@RichardA가 완료되었으며 정규 표현식에서 몇 개의 문자를 제거했습니다.
Mhmd

1

가공, 90

print(loadStrings("http://codegolf.stackexchange.com/posts/28657/body")[2].substring(11));

편집 : 마침내 그것을 얻었다!


1

bash + awk, 71 바이트

curl -sL codegolf.stackexchange.com/q/28154 |awk -F\> '/\#/ {print $3}'

2
작동하지 않는 것 같습니다-이 답변과 함께 많은 다른 것들을 출력합니다.
Riking

@Riking 사실, 그것은 위치 의존적 인 것 같습니다 (마지막 규칙 위반)
aditsu

를 생략 할 수 있습니다 http://.

@ user155406 : 각 답변에는 URL이 있습니다. 이것은 codegolf.stackexchange.com/a/28179/14710
Phil H

0

자바 스크립트, 138

a=window.open("http://codegolf.stackexchange.com/posts/28160/body");setTimeout('alert(a.document.body.innerHTML.match(/a=.*9\\)/)[0])',99)

이것은 페이지가 99ms 미만으로로드되는 것으로 가정합니다. 또한 동일한 출처 정책으로 인해 codegolf.SE 페이지에서 열린 콘솔을 통해 실행되어야합니다.


참고로 URL에 슬러그가 필요하지 않으며 질문은 q로 대체 될 수 있습니다.
Schism

1
당신이 할 수 있습니다 http://codegolf.stackexchange.com/a/28160대신http://codegolf.stackexchange.com/a/28160/12551
저스틴

Chrome은 다음을 좋아하지 않습니다 : "Uncaught TypeError : undefined의 'document'속성을 읽을 수 없습니다"
Spedwards

@Spedwards에서는 팝업 차단기를 비활성화해야합니다.
nderscore

0

펄 5.10 155 127 122 117 바이트

use XML::LibXML;say XML::LibXML->new->parse_file('http://codegolf.stackexchange.com/posts/28330/body')->find('//pre')

사용 XML::LibXML.


0

쉘 및 XMLlint, 82 바이트

xmllint --xpath 'string(//pre)' http://codegolf.stackexchange.com/posts/28333/body

0

파이썬, 164

코드 태그 사이에서 텍스트를 추출하여 작동합니다. 꽤 길지만 html 페이지를 직접 편집하거나 아래 코드 앞에 새 코드 블록을 추가하지 않으면 항상 올바르게 작동합니다 (다음에 코드 블록이 있으면 프로그램 출력에 영향을 미치지 않아야 함).

import urllib2
print urllib2.urlopen("http://codegolf.stackexchange.com/posts/28617/body").read().split(chr(60)+"code"+chr(62))[1].split(chr(60)+"/code"+chr(62))[0]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.