Tulis program yang mengunduh sendiri


66

Tulis sebuah program yang menghubungkan ke situs ini, unduh jawaban di mana ia diposting, ekstrak kode sumbernya sendiri dan cetaklah. Keluaran harus identik dengan kode sumber. Kode terpendek (dalam byte) menang.

Aturan:

  • Tidak ada penyingkat URL yang diizinkan.
  • Jawabannya harus memiliki format reguler - tajuk dengan nama dan ukuran bahasa, deskripsi opsional, blok kode, deskripsi opsional, dan penjelasan. Pembatas tidak alami diizinkan.
  • Output harus berasal dari blok kode aktual yang diposting di situs.
  • Fungsionalitas tidak boleh bergantung pada posisi dalam daftar jawaban; itu harus bekerja bahkan jika ada beberapa halaman dan jawabannya tidak pada yang pertama.
  • Baru: catatan khusus untuk jawaban yang seharusnya dijalankan di browser: tidak apa-apa untuk menjalankannya di domain codegolf (untuk mematuhi kebijakan asal-sama) tetapi domain dan jalur harus dimasukkan dalam solusi untuk buat itu adil.

39
Catch-22: Bagaimana saya harus menguji kiriman saya?
Martin Ender

9
Saya melihat orang-orang memposting jawaban dan menghapusnya, sehingga mereka dapat menguji kode mereka.
Justin

4
@ m.buettner jawaban dapat diuji pada jawaban lain (untuk pertanyaan lain) terlebih dahulu, kemudian diposting, kemudian diedit untuk mengubah URL :)
aditsu

8
@hexafraction jika komentar dapat mengganggu jawaban, maka jawabannya tidak terlalu baik ...
aditsu

17
Sebuah pertanyaan tersangkut di kepala saya: Bagaimana cara menulis tweet yang terhubung dengan dirinya sendiri tanpa menggunakan penyingkat URL apa pun, tetapi dengan memperkirakan id tweet itu, tweet Anda?
Ming-Tang

Jawaban:


34

Bash + coreutils + browser Lynx, 61 byte

Terima kasih kepada @FDinoff untuk tipsnya:

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

4
Dan apa yang terjadi jika saya mengetikkan kata ajaib yang dicari grep?
Shade

3
lynx lynx lynx lynx. Komentar ini akan dikeluarkan (dan
tajuknya

1
@hexafraction Awww. Anda harus pergi dan merusaknya!
Shade

8
URL ini seharusnya berfungsi. codegolf.stackexchange.com/posts/28164/bodyDan itu mengabaikan komentar. Saya juga berpikir itu dalam aturan yang dapat Anda gunakan ...
FDinoff

3
@DigitalTrauma awww ... sial.
haneefmubarak

22

Ruby, 155 186 195 148 138 110 97 karakter

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

Saya harus membuatnya menjadi satu baris, karena jika tidak maka akan menghasilkan baris baru sebagai \nganti baris baru.

  • +31 karakter karena saya tidak melihat beberapa karakter lolos.
  • +9 karakter untuk menghilangkan backslash yang mengganggu.
  • Terima kasih kepada Nathan Osman karena telah menyimpan 2 karakter, dan Ventero karena telah menyimpan 55 (!!!) dengan menghapus kebutuhan untuk sebagian besar perbaikan yang tercantum di atas.

Penjelasan

Mari kita mempercantik ini sedikit dulu. Namun, saya harus menggunakan notasi yang agak ... menarik dalam kode ini. Saya tidak dapat menggunakan titik koma sama sekali di pos ini, karena alasan yang dijelaskan kemudian, jadi saya akan menggunakan {SEMI}titik koma sebagai gantinya.

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

Baiklah, sekarang mari kita berjalan melalui ini. Dua baris pertama cukup jelas - mereka mengambil teks HTML dari jawaban ini.

Sekarang, baris terakhir adalah yang menarik di sini. Anda melihat bahwa titik koma yang tampaknya tidak berguna di akhir kode? Ini mutlak diperlukan, dan inilah sebabnya.

Pertama, resp.matchekstrak kode yang akan dicetak. Regexp menggunakan untuk ini adalah trik: /req.+{SEMI}/. Itu mengambil awal kode REQuire'net/http',, dengan mencari req( reakan ambil saya REputation). Kemudian, ia menemukan akhir kode dengan mencari titik koma! Karena +serakah secara default, ia akan terus berjalan sampai menemukan titik koma yang menandakan akhir kode. Lihat mengapa saya tidak bisa menggunakan titik koma lagi?

Setelah itu, saya tidak perlu menghapus apa pun berkat perbaikan Ventero yang tidak digunakan \sama sekali. Yang harus saya lakukan adalah memperbaiki {AMPERSAND}perubahan menjadi {AMPERSAND}amp{SEMI}, yang dapat dicapai hanya dengan menghapus amp{SEMI}bagian itu. Tidak perlu lagi karena URL baru ini. Setelah itu, kode asli telah diambil! (Catatan: Saya juga tidak bisa menggunakan ampersand, karena itu mendapatkan HTML-encoded yang menyebabkan titik koma dibuat.)


Beberapa karakter melarikan diri ..
aditsu

1
@aditsu Gah; tidak memperhatikan itu. Tetap.
Gagang Pintu

Anda akan membenci ini .. backslash semakin digandakan. Ada juga perbedaan baris baru, tapi itu hal kecil.
aditsu

@aditsu Argh! : P Tetap juga. Hal baris baru adalah karena puts; itu bisa diperbaiki dengan printtetapi meh. Hanya berpura-pura ada baris baru di kode, meskipun SE tidak akan bisa menunjukkannya.
Gagang Pintu

1
Untuk tautan, http://codegolf.stackexchange.com/a/28159akan memberikan hasil yang sama seperti milik Anda dan akan menghemat beberapa karakter.
Mhmd

20

PowerShell - 69 62

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

DOM dalam sebuah shell. Bagus!
fregante

Tidak irm mengharuskan Manajemen Azure Rights? Tanpa modul itu, saya pikir Anda bisa melakukannya dengan Invoke-WebRequest.
Scott Leadley

@ScottLeadley irmadalah alias untuk Invoke-RestMethoddan diperkenalkan dengan inti PowerShell v3. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Omong kosong Jawaban golf kode PowerShell dengan panjang dalam urutan yang sama besarnya dengan jawaban terkemuka. +1
Adam Maras

@AdamMaras Ha, saya tahu maksud Anda! Itu terjadi sesekali. codegolf.stackexchange.com/a/26811/4565 dan codegolf.stackexchange.com/a/21982/4565 tidak terlalu jauh dari depan.
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))

Berjalan di konsol browser web Anda di halaman ini. Diuji pada Chrome dan Firefox terbaru .

edit: +28 byte untuk menambahkan domain lengkap.

Firefox tidak lagi menyukai trik Regex URL saya dengan pembaruan ini :(

Inilah solusi 86 byte yang melanggar aturan:

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

Itu membuat saya kagum. Beberapa kali.
fregante

1
@ bfred.it Saya baru saja memotong byte menggunakan regex yang menarik. Saya harap itu membuat Anda kagum sekali lagi.
nderscore

Jika mencetak ke konsol adalah metode output yang dapat diterima, Anda dapat mempersingkat 7 karakter dengan menghapus peringatan.
Tejas Kale

Juga, menurut aturan baru Anda harus menambahkan codegolf.stackexchange.com/ke url.
Tejas Kale

1
@TejasKale Dari apa yang saya lihat orang tidak suka solusi yang tidak benar-benar mengingatkan / document.write / console.log jawabannya.
nderscore

10

Ruby + wget + gunzip , 159 86 82 71

Menggunakan tip @FDinoff untuk digunakan http://codegolf.stackexchange.com/posts/28173/body.

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

Diuji. Terima kasih kepada @ace dan @Bob untuk optimasi baris perintah.


2
Anda dapat menggabungkan bendera di wget, seperti di wget -qO- url. Selain itu, dalam bash Anda tidak perlu tanda kutip ganda untuk url, jadi ini juga dapat bekerja untuk Anda.
ace_HongKongIndependence

Anda dapat meninggalkan http://.
Bob

6

CJam - 53

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

Saya membuat wiki komunitas ini karena saya menjawab pertanyaan saya sendiri dan tidak benar-benar ingin bersaing: p
Kredit ke FDinoff untuk pilihan URL.


Woot, +1 untuk wajah smiley dalam kode
Cruncher

1
@Cruncher );tidak terlihat terlalu tersenyum kepada saya ...
MD XF

5

Rebmu, 91 karakter

Karena Catch-22 saya harus memposting untuk mendapatkan URL jawaban ini. :-/ OK saya mengerti.

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

Rebmu adalah dialek Rebol, dan kamu bisa membaca semuanya . Rebol yang setara di sini adalah:

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

PARSE Rebol adalah semacam jawaban yang sangat melek huruf untuk RegEx. Ini memulai posisi pengurai input (yang dapat berupa seri apa saja, termasuk blok struktural ... data biner ... atau tipe string) . Aturan adalah bahasa untuk bagaimana posisi parse bergerak.

Tag dan URL benar-benar hanya string di bawah kap di bahasa. Tapi mereka "beraroma", dan karena Rebol diketik secara dinamis, Anda dapat memeriksa jenis itu. BACA misalnya tahu bahwa jika Anda memberinya string dengan rasa URL, maka itu harus dikirim ke penangan skema untuk melakukan pembacaan. (Dalam hal ini, yang terdaftar untuk HTTP). Anda mendapatkan kembali UTF-8 byte secara default, jadi kami menggunakan to-string untuk memecahkan kode itu dan mendapatkan serangkaian codepoint dalam string Unicode normal.

Dalam kasus dialek parse, menemukan jenis tag hanya cocok seolah-olah itu adalah string yang tampak seperti tag. THRU adalah instruksi yang berarti "lompati sampai aturan berikutnya cocok, dan kemudian tempatkan posisi pertandingan di akhir dari apa yang baru saja Anda cocokkan." (TO adalah analog yang cocok, tetapi meninggalkan posisi parse sebelum elemen).

Jadi kami zip melewati <a name="28154">. Kemudian kami melewati kejadian berikutnya <code>, dengan posisi parse kami sekarang terletak tepat setelah >. Perintah COPY PARSE kemudian memungkinkan kita menyalin data ke aturan lain, dalam hal ini aturannya adalah [TO </code>]... jadi kita masuk ke variabel C semuanya sampai tepat sebelum itu <.

Keren ya :-)

Secara teknis saya bisa mencukur lebih banyak, misalnya dengan mencari TO "</"dan yang menyimpan tiga karakter - tidak perlu mencocokkan seluruh </code>tag akhir ketika hanya </akan dilakukan. Argumen serupa bisa saya buat untuk tag awal. Tetapi Rebmu adalah tentang golf melek huruf ... bahkan jika Anda mungkin berpikir itu terlihat aneh pada awalnya!

UPDATE : /bodytriknya keluar dari tas, tapi saya juga akan membiarkannya apa adanya ... karena saya pikir ini lebih mendidik dengan cara ini.


5

Java sekarang 634, 852, adalah 1004

Kode telah diperbarui; terima kasih atas sarannya. Golfed: sekarang menggantikan & gt dengan>

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

Mengirimkan untuk pengujian, saya akan mengedit dan mencoba golf sebentar lagi. Diperlukan untuk mengubah x> 1 ke x> 2 karena string tes juga dalam kode saya. Catatan: Code golf menggantikan> simbol to & 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
Bagaimana Anda menangani komentar yang mengandung //bacchus?
ζ--

3
Anda dapat menguraikan banyak hal, mencoba sumber daya, dan menggunakan *impor untuk menyimpan banyak kode.
Simon Kuang

@SimonKuang - Saya juga membiarkan aliran terbuka daripada menutup barang. Juga, throws Exceptiondaripada mencoba menangani apa pun. Juga, saya pikir menggunakan Scanner daripada BufferedReader akan lebih mudah, terutama karena Anda dapat mengatur pembatas //bacchus, yang akan membuat segalanya lebih mudah ...
Jules

5

Python, 175 167 byte

Ini menggunakan dua perpustakaan eksternal; Saya tidak membaca bahwa itu tidak sah.

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

Kode yang lebih panjang, tetapi terlihat lebih bagus:

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
Di questionsdalam url dapat diganti dengan q:http://codegolf.stackexchange.com/q/28154
Justin

1
Ruang dalam bs4, requests(baris 1) dapat dihapus untuk mengurangi 1 byte.
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()

Berjalan di halaman ini.


Bagaimana Anda menjalankannya?
aditsu

@aditsu Ini seharusnya dijalankan di konsol JavaScript browser. Tapi saya masih menguji (dan memperbaikinya), harap tunggu
ace_HongKongIndependence

@aditsu Ini seharusnya berfungsi sekarang. Buka konsol browser Anda (tekan F12) dan rekatkan kode ini di sana.
ace_HongKongIndependence

Anda pak, perlu if(this.readyState == this.DONE)di dalam fungsinya.
Fabricio

1
@Aku mengerti :) Aku tidak melihat jawaban js lainnya sampai sekarang. Lalu, ambil alih suara ini dari saya
C5H8NNaO4

4

Haskell, 563 613 byte

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"

Diuji. Memiliki dukungan halaman melalui fitur "posting tertua". Menggunakan struktur garis quine untuk menemukan apa yang akan dicetak. Ini import Control.Monadhanya karena >>=menghasilkan &gt;dalam HTML.


4

Javascript + jQuery, 87 , 67

Saya tidak yakin apakah saya diizinkan menggunakan jQuery, tetapi:

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

Javascript + jQuery, jika dieksekusi di halaman ini: 27 , 25

Untuk bersenang-senang, jika akan dieksekusi di sini:

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

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


1
Ini menghasilkan lebih dari kode sumber.
nderscore

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

Anda benar, saya salah mengasumsikan seluruh balasan alih-alih kode
Martijn


3

Dart, 164

Saya pikir saya akan mencoba ini di Dart, cukup menyenangkan untuk menggunakan imo.

Ini dapat dijalankan di konsol di DartEditor, tetapi membutuhkan paket http yang ditambahkan di pubspec.yaml

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

Versi tidak disatukan:

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 karakter

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

Tidak ada keajaiban nyata di sini: dibutuhkan nilai bidang antara tag html <code></code>. Menggunakan perpustakaan XML(seperti yang terlihat jelas dalam kode). Keluarkan hasilnya sebagai stdout.


1

Jawa, 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());}}

Versi jawaban bacchusbeale yang ditingkatkan yang:

  • tidak menutup sumber daya secara tidak perlu
  • tidak mendeklarasikan variabel yang tidak perlu
  • menggunakan a Scanneruntuk menghindari perulangan input
  • menggunakan regexp yang tidak cocok dengan dirinya sendiri untuk menghindari keharusan melompati kemunculan tengah penanda awal / akhir.

Diperbarui:

  • Gunakan URL langsung ke posting, jadi kami tidak perlu komentar unik untuk mengidentifikasi awal / akhir kode; sekarang digunakan <code>[...]</code>sebagai pembatas untuk mencari (sebenarnya menggunakan ekspresi reguler "./?[c[ode\W", sehingga untuk menghindari keharusan mendekode &lt;dan &gt;- "\ W" diperlukan daripada yang lebih pendek "." untuk menghindarinya mencocokkan bagian dari URL dengan postingan, sayangnya, yang biayanya 2 karakter, dan tanda kurung siku sekitar c mencegah regex cocok dengan dirinya sendiri).

1
Anda memiliki banyak ruang yang tidak perlu. Juga kelas Anda tidak perlu bersifat publik.
aditsu

1
openConnection (). getInputStream () juga dapat disingkat menjadi openStream ()
aditsu

1

w3m 55 byte

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

Berdasarkan @DigitalTrauma


1

Ruby, 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

Cukup yakin Anda dapat menghapus beberapa spasi di sana-sini untuk menghemat beberapa byte.
MisterBla

@ Richard yang peduli saya toh tidak akan menang.
Mhmd

1
Lakukan untuk lol, bukan untuk menang.
MisterBla

@RichardA selesai, dan saya juga menghapus beberapa karakter dari regexp.
Mhmd

1

Memproses, 90

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

Sunting: Akhirnya mendapatkannya!


1

bash + awk, 71 byte

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

2
Tampaknya tidak berfungsi - ini mengeluarkan banyak hal lain bersama dengan jawaban ini.
Bersepeda

@Riking benar, tampaknya tergantung pada posisi (melanggar aturan terakhir)
aditsu

Anda dapat meninggalkan http://.
Bob

@ user155406: perhatikan bahwa setiap jawaban memiliki URL - yang ini adalah 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)

Ini berfungsi dengan asumsi bahwa halaman memuat di bawah 99 ms. Itu juga harus dijalankan melalui konsol yang dibuka pada halaman codegolf.SE, karena kebijakan asal yang sama.


Hanya sebuah catatan: Anda tidak perlu siput di URL, dan pertanyaan dapat diganti dengan q.
Skisma

1
Perhatikan bahwa Anda bisa melakukannya http://codegolf.stackexchange.com/a/28160daripadahttp://codegolf.stackexchange.com/a/28160/12551
Justin

Chrome tidak menyukai ini: "Uncaught TypeError: Tidak dapat membaca properti 'dokumen' yang tidak terdefinisi"
Spedwards

@Sedwards Anda harus menonaktifkan pemblokir popup.
nderscore

0

Perl 5.10, 155 127 122 117 byte

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

Menggunakan XML::LibXML.


0

Shell dan xmllint, 82 byte

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

0

Python, 164

Bekerja dengan mengekstraksi teks di antara tag kode. Itu cukup panjang tetapi akan selalu berfungsi dengan benar kecuali halaman html diedit secara langsung atau blok kode baru ditambahkan sebelum yang di bawah ini (memiliki blok kode setelah seharusnya tidak berpengaruh pada output program).

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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.