自分自身をダウンロードするプログラムを書く


66

このサイトに接続し、投稿されたまさにその答えをダウンロードし、独自のソースコードを抽出して印刷するプログラムを作成します。出力はソースコードと同一である必要があります。最短コード(バイト単位)が優先されます。

ルール:

  • URL短縮サービスは許可されていません。
  • 答えは通常の形式である必要があります-言語名とサイズ、オプションの説明、コードブロック、オプションの説明と説明の見出し。不自然な区切り文字は許可されていません。
  • 出力は、サイトに投稿された実際のコードブロックから発信する必要があります。
  • 機能は回答リスト内の位置に依存してはなりません。複数のページがあり、最初のページではなく答えがある場合でも機能するはずです。
  • 新規:ブラウザーで実行することになっている回答に関する特別な注意 codegolfドメインで実行する必要があります(同一生成元ポリシーに従うため)が、ドメインとパスはソリューションに含める必要がありますそれを公平にします。

39
Catch-22:提出物をテストするにはどうすればよいですか?
マーティンエンダー

9
回答を投稿して削除するので、コードをテストできます。
ジャスティン

4
@ m.buettnerの回答は、他の回答(他の質問に対する)で最初にテストされ、次に投稿され、URLを変更するために編集されます:)
aditsu

8
@hexafractionコメントが答えに干渉することができれば、その答えは非常に良いではありません...
aditsu

17
疑問が頭の中に残っています。URL短縮サービスを使用せずに自分自身にリンクするツイートを書く方法ですが、ツイートIDを推定することでツイートを作成できますか?
明唐

回答:


34

Bash + coreutils + Lynxブラウザー、61バイト

ヒントについて@FDinoffに感謝します。

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

4
そして、grepが探している魔法の単語を入力するとどうなりますか?
シェード

3
lynx lynx lynx lynx。このコメントは削除されます(見出しも同様)
–ζ

1
@hexafraction Awww。あなたは行って台無しにしなければなりませんでした!
シェード

8
このURLは機能するはずです。codegolf.stackexchange.com/posts/28164/bodyそして、コメントを無視します。また、私は...あなたがそれを使用することができ、ルール内の思い
FDinoff

3
@DigitalTrauma awww ...いまいましい。
ハネフムバラク

22

ルビー、155 186 195 148 138 110 97文字

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

そうしないと\n、実際の改行の代わりに改行を出力するため、1行にする必要がありました。

  • 一部の文字がエスケープされていることに気づかなかったため、+ 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}

さて、これを見ていきましょう。最初の2行はかなり自明です-この回答のHTMLテキストを取得します。

さて、最後の行はここで興味深いものです。コードの最後に、一見役に立たないセミコロンがありますか?それは絶対に必要です、そして、ここに理由があります。

最初に、resp.match印刷するコードを抽出します。これに使用する正規表現はトリックです/req.+{SEMI}/。(を取得します)をREQuire'net/http'検索して、コードの開始を取得します。次に、セミコロンを検索してコードの末尾を見つけます!デフォルトでは貪欲なので、コードの終わりを示すセミコロンが見つかるまで続けられます。セミコロンを使用できない理由をご覧ください。reqreREputation+

その後、\もう使用しないというVenteroの修正のおかげで、何もエスケープする必要はありません。私がしなければならないのは、に{AMPERSAND}変更を修正する{AMPERSAND}amp{SEMI}だけamp{SEMI}です。新しいURLのため、これはもう必要ありません。その後、元のコードが取得されました!(注:アンパサンドも使用できません。アンパサンドはHTMLエンコードされ、セミコロンが作成されるためです。)


一部の文字をエスケープなっている...
aditsu

1
@aditsu Gah; それに気づかなかった。一定。
ドアノブ

あなたはこれを嫌うでしょう。バックスラッシュが複製されています。改行の違いもありますが、それは些細なことです。
アディツ

@aditsu Argh!:P修正済み。改行の原因はputs; printmeh で修正できます。SEで表示できない場合でも、コードに末尾の改行があるように見せてください。
ドアノブ

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でできると思います。
スコットリードリー

@ScottLeadley irmは、Invoke-RestMethodPowerShell v3コアのエイリアスであり、導入されました。computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
神聖ながらくた。主要な回答と同じ桁の長さのPowerShellコードのゴルフ回答。+1
アダムマラス

@AdamMarasハ、私はあなたの意味を知っています!たまに起こります。codegolf.stackexchange.com/a/26811/4565codegolf.stackexchange.com/a/21982/4565は、リードからそれほど離れていませんでした。
Rynant

15

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

このページのWebブラウザのコンソールで実行されます。最新のChrome およびFirefoxでテスト済み。

編集:+28バイトで完全なドメインを追加します。

Firefoxは、このアップデートで正規表現のURLトリックをもう気に入らなくなりました:(

これが、ルール違反の86バイトソリューションです。

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

それは私をa敬の念にさせました。複数回。
fregante

1
@ bfred.it興味深い正規表現を使用してバイトをカットしました。もう一度a敬の念を起こさせることを願っています。
アンダースコア

コンソールへの出力が許容可能な出力方法である場合、アラートを削除することで7文字短縮できます。
テハスケール

また、新しいルールに従ってcodegolf.stackexchange.com/、URLに追加する必要があります。
テハスケール

1
@TejasKale実際に答えを警告/document.write/console.logしないソリューションに人々が眉をひそめているのを見た。
nderscore

10

Ruby + wget + gunzip159 86 82 71

@FDinoffのtipを使用して使用します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

を省略できhttp://ます。
ボブ

6

CJam-53

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

私は自分の質問に答えているので、このコミュニティwiki
を作成しています。URLの選択については、:p CreditsをFDinoff に競いたくありません。


うわー、コードのスマイリーフェイスに+1
ランチャー

1
@Cruncherは);...私にはあまりにもスマイリーを見ていない
MD XF

5

レブム、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を使用してそれをデコードし、通常のUnicode文字列で一連のコードポイントを取得します。

解析方言の場合、タグタイプに遭遇すると、タグのように見える文字列であるかのように一致します。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
多くのものをインライン化して、リソースを試してみて、*インポートを使用して多くのコードを保存できます。
サイモンクアン

@SimonKuang-また、コンテンツを閉じるのではなく、ストリームを開いたままにしておきます。また、throws Exception何かを処理しようとするのではなく。また、私はスキャナではなく、BufferedReaderのを使用すると、あなたに区切り文字を設定することができ、特にとして、単純なことだと思う//bacchus...物事がいくらか容易になるだろうこれは、
ジュール

5

Python、175 167バイト

これは2つの外部ライブラリを使用します。私はそれが無許可であることを読みませんでした。

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内に置き換えることができますqhttp://codegolf.stackexchange.com/q/28154
ジャスティン

1
bs4, requests(行1)のスペースを削除して、1バイトを減らすことができます。
ace_HongKongIndependence

5

JavaScript、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)は、関数の内部が必要です。
ファブリシオ

1
@ace私は見ます:)私は今まで他のjsの答えを見ていませんでした。そして、私からこのupvoteを取る
C5H8NNaO4

4

Haskell、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"

テスト済み。「最も古い投稿」機能によるページのサポートがあります。印刷するものを見つけるために、クインライン構造を使用します。これimport Control.MonadはHTMLで>>=生成さ&gt;れるためです。


4

Javascriptを+ jQueryの、87、67

jQueryを使用できるかどうかはわかりませんが、次のとおりです。

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

Javascriptを+ jQueryの、このページにexcecuted場合:27、25

楽しみのために、ここで実行される場合:

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

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


1
これは、ソースコード以上のものを出力します。
アンダースコア

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

あなたは、私が誤って代わりに、コードの全体の返信正しいasumedされている
マルタイン

4

w3m 45文字

w3m codegolf.stackexchange.com/a/28336|grep ☻

1
☺。それでも動作しますか?編集:表示されるように見えます。
ace_HongKongIndependence

@ace I私はそれを実行したときにあなたのコメントを取得する
FDinoff

修正:)他の誰か?😁
gnibbler

3

ダーツ、164

Dartでこれを試してみようと思ったのですが、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(コードで明らかなように)。結果を標準出力として出力します。


1

Java、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());}}

バッカスビールの答えの改良版:

  • リソースを不必要に閉じない
  • 不要な変数を宣言しない
  • Scanner入力をループする必要を回避するためにa を使用します
  • 開始/終了マーカーの中間の出現をスキップする必要を避けるために、それ自体に一致しない正規表現を使用します。

更新しました:

  • 投稿への直接URLを使用します。コードの開始/終了を識別するための一意のコメントは不要です。今使用して<code>[...]</code>デコードすることを避けるように、「./?[c]ode\W」(実際には正規表現を使用して検索するために区切り文字として&lt;そして&gt;- 『\ Wは』必要というよりも短くなっています「」残念ながら、URLの一部が投稿に一致するのを避けるために、2文字のコストがかかり、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

とにかく勝つつもりはないことを気にする@リチャード。
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 true、それは位置に依存するようです(最後のルールを破る)
aditsu

を省略できhttp://ます。
ボブ

@ user155406:各回答にはURLがあることに注意してください-これは codegolf.stackexchange.com/a/28179/14710
Phil H

0

Javascript、138

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

これは、ページが99ミリ秒未満でロードされると仮定して機能します。同じ発信元ポリシーのため、codegolf.SEページで開かれたコンソールを介して実行する必要もあります。


注:URLにスラッグは必要ありません。質問はqに置き換えることができます。
分裂

1
http://codegolf.stackexchange.com/a/28160代わりに行うことができることに注意してくださいhttp://codegolf.stackexchange.com/a/28160/12551
ジャスティン

:「プロパティを読み取ることができません未定義の『文書』キャッチされない例外TypeError:」Chromeは、この好きではない
Spedwards

@Spedwardsでは、ポップアップブロッカーを無効にする必要があります。
アンダースコア

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

Python、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.