Kendisini indiren bir program yaz


66

Bu siteye bağlanan bir program yazın, gönderildiği cevabı indirir, kendi kaynak kodunu çıkarır ve yazdırır. Çıktı kaynak koduyla aynı olmalıdır. En kısa kod (bayt cinsinden) kazanır.

Kurallar:

  • URL kısaltıcısına izin verilmiyor.
  • Cevap düzenli bir formata sahip olmalıdır - dil adı ve büyüklüğü, isteğe bağlı açıklama, kod bloğu, isteğe bağlı açıklama ve açıklama içeren bir başlık. Doğal olmayan sınırlayıcılara izin verilmez.
  • Çıktı, sitede yayınlanan gerçek kod bloğundan kaynaklanmalıdır.
  • İşlevsellik cevap listesindeki konumuna bağlı olmamalıdır; Birden fazla sayfa olsa ve ilkinde cevap olmasa bile çalışmalı.
  • Yeni: bir tarayıcıda çalıştırılması gereken cevaplar için özel not: Bunların kod kodlama alanında çalıştırılmasının zorunlu olması gerekir (aynı menşe politikasına uymak için) ancak alan ve yolun çözümüne dahil edilmesi gerekir. adil yap.

39
Catch-22: Gönderimimi nasıl test edeceğim?
Martin Ender

9
İnsanların cevap göndermelerini ve silmelerini, böylece kodlarını test edebilmelerini öngörüyorum.
Justin,

4
@ m.buettner cevapları önce diğer cevaplarda (diğer sorulara) test edilebilir, sonra gönderilir, sonra URL'yi değiştirmek için düzenlenir :)
aditsu

8
Eğer yorumlar bir cevabı engelleyebiliyorsa @hexafraction, o zaman cevap çok iyi değil ...
aditsu

17
Kafamın içine sıkışmış bir soru: URL kısaltıcı kullanmadan kendi tweetini nasıl yazacağımı, tweet kimliğinizi tahmin ederek nasıl tweet yazabilirsiniz?
Ming-Tang

Yanıtlar:


34

Bash + coreutils + Lynx tarayıcısı, 61 bayt

İpuçları için @FDinoff'a teşekkürler:

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

4
Ve o grep kelimesinin aradığı sihirli kelimeyi yazarsam ne olur?
Gölge

3
vaşak vaşak vaşak vaşak. Bu yorum açıklanacak (ve aynı zamanda başlık)
ζ--

1
@hexafraction Awww. Gitmek ve mahvetmek zorunda kaldın!
Gölge

8
Bu URL çalışmalı. codegolf.stackexchange.com/posts/28164/bodyVe yorumları görmezden geliyor. Ayrıca onu kullanabileceğin kuralların içinde olduğunu düşünüyorum ...
FDinoff

3
@DigitalTrauma aw ... kahretsin.
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.+;/];

Bir satır yapmak zorundaydım çünkü aksi halde yeni satırlar \nyerine yeni satırlar çıkarırdı.

  • +31 karakter, çünkü bazı karakterlerin kaçtığını farketmedim.
  • Can sıkıcı ters eğik çizgi kurtulmak için +9 karakter.
  • 2 karakter kaydettiği için Nathan Osman'a ve yukarıda listelenen düzeltmelerin çoğuna olan ihtiyacı ortadan kaldırarak 55 (!!!) 'ı kurtardığı için Ventero'ya teşekkür ederiz.

Açıklama

İlk önce bunu biraz daha güzelleştirelim. Ancak, bu kodda biraz ilginç ... bir gösterim kullanmak zorunda kalacağım. Bu yazıda noktalı virgül kullanamıyorum, daha sonra açıklanmamdan dolayı {SEMI}bunun yerine noktalı virgül yerine kullanacağım .

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

Tamam, şimdi bunun üzerinden geçelim. İlk iki satır oldukça açıklayıcıdır - bu cevabın HTML metnini getirirler.

Şimdi, son satır burada ilginç olanı. Kodun sonunda görünüşte işe yaramaz bir noktalı virgül görüyor musunuz? Bu kesinlikle gerekli ve işte neden.

İlk önce, resp.matchyazdırılacak kodu çıkartır. Bunun için kullandığı regexp'in hiledir: /req.+{SEMI}/. Bu kodun başlangıcını kapar, REQuire'net/http'arayarak req( rebenim yerimi alır REputation). Sonra, bir noktalı virgül arayarak kodun sonunu bulur! +Varsayılan olarak açgözlü olduğu için, kodun sonunu belirten noktalı virgül bulana kadar devam eder. Neden artık noktalı virgül kullanamıyorum?

Ondan sonra, Ventero'nun \artık hiç kullanmama fikrinden dolayı hiçbir şeyi kaldırmak zorunda değilim. Tek yapmam gereken , sadece parçanın sökülmesiyle elde edilebilecek olan, {AMPERSAND}değişmekte {AMPERSAND}amp{SEMI}olan düzeltmektir amp{SEMI}. Yeni URL nedeniyle artık buna gerek yok. Bundan sonra, orijinal kod alındı! (Not: Ve işareti kullanamıyorum, çünkü bu noktalı virgül oluşturulmasına neden olan HTML kodlu olur.)


Bazı karakterler
kaçıyor

1
@ aditsu Gah; bunu farketmedim. Sabit.
Doorknob

Bundan nefret edeceksin. Bir ters eğik çizgi kopyalanıyor. Ayrıca yeni bir satır farkı var, ama bu küçük bir şey.
aditsu

@aditsu Argh! : P Ayrıca düzeltildi. Newline meselesi puts; ile sabit olabilir printama meh. SE kodunu gösteremese bile, kodda son bir yeni satır varmış gibi davranın.
Doorknob

1
Bağlantı için, http://codegolf.stackexchange.com/a/28159sizinkiyle aynı sonucu verir ve bazı karakterleri kaydeder.
Mhmd

20

PowerShell - 69 62

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

DOM bir kabukta. Güzel!
fregante

İrm, Azure Rights Management gerektirmiyor mu? Bu modül olmadan, Invoke-WebRequest ile yapabileceğinizi düşünüyorum.
Scott Leadley

@ScottLeadley irm, Invoke-RestMethodPowerShell v3 çekirdeği için takma addır ve tanıtıldı. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Kutsal bok PowerShell kodlu golf yanıtı, önde gelen cevaplarla aynı büyüklükte bir uzunlukta cevap verir. +1
Adam Maras

@AdamMaras Ha, ne demek istediğini biliyorum! Bu arada olsa olur. codegolf.stackexchange.com/a/26811/4565 ve codegolf.stackexchange.com/a/21982/4565 öncüden çok uzak değildi.
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))

Bu sayfada web tarayıcınızın konsolunda çalışır. En son Chrome ve Firefox'ta test edilmiştir .

düzenleme: tam etki alanı eklemek için +28 bayt.

Firefox artık Regex URL numaramı bu güncellemeyle beğenmiyor :(

İşte kuralı kırıcı 86 baytlık çözüm:

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

Bu beni huşu yaptı. Bir kaç sefer.
fregante

1
@ bfred.it Sadece ilginç bir regex kullanarak bir bayt kesti. Umarım seni bir kez daha korkutur.
nderscore

Konsola yazdırmanın kabul edilebilir bir çıkış yöntemi olması durumunda, uyarıyı kaldırarak 7 karakter kısaltabilirsiniz.
Tejas Kale

Ayrıca, yeni kurala göre codegolf.stackexchange.com/, URL’ye eklemeniz gerekir.
Tejas Kale

1
@TejasKale Gördüklerimden itibaren insanlar aslında yanıt vermeyen / belge.write / console.log uyarısı olmayan çözümler üzerine kaşlarını çattı.
nderscore

10

Ruby + wget + gunzip , 159 86 82 71

Kullanılacak @FDinoff ucunun kullanılması http://codegolf.stackexchange.com/posts/28173/body.

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

Test edilmiştir. Komut satırı optimizasyonu için @ace ve @Bob'a teşekkürler.


2
Bayrakları içinde wgetolduğu gibi birleştirebilirsiniz wget -qO- url. Ayrıca, bash'da URL için çift tırnak işaretine gerek duymazsınız, bu yüzden bu sizin için de işe yarayabilir.
ace_HongKongIndependence

Dışarıda bırakabilirsiniz http://.
Bob

6

CJam - 53

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

Bu topluluğu wiki yapıyorum çünkü kendi soruma cevap veriyorum ve gerçekten rekabet etmek istemiyorum: p
URL seçimi için FDinoff'a Kredi.


Woot, koddaki gülen yüz için +1
Cruncher

1
@ Crruncher );bana çok gülen gözükmüyor ...
MD XF

5

Rebmu, 91 karakter

Catch-22 nedeniyle bu cevabın URL’sini almak için göndermem gerekiyor. :-/ Tamam anladım.

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

Rebmu, Rebol'un lehçesidir ve hepsini okuyabilirsiniz . Buradaki eşdeğer Rebol şöyle olurdu:

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

Rebol's PARSE, RegEx'e bir tür okuryazar cevaptır. Girişin ayrıştırıcı pozisyonunu başlatır (yapısal bloklar ... ikili veri ... veya string tipleri dahil olmak üzere herhangi bir seri olabilir) . Kurallar, ayrıştırma konumunun nasıl hareket edeceğine ilişkin bir dildir.

Etiketler ve URL'ler gerçekten de sadece başlıktaki dizedir. Ama onlar "aromalı" ve Rebol dinamik olarak yazıldığından, bu tipi kontrol edebilirsiniz. Mesela READ, URL aromalı bir dize verirseniz, okumayı yapmak için bir şema işleyicisine göndermesi gerektiğini bilir. (Bu durumda, bir HTTP için kayıtlı). UTF-8 baytlarını varsayılan olarak geri alırsınız, bu yüzden bunu çözmek ve normal bir Unicode dizesinde bir dizi kod noktası almak için to-string kullanırız.

Ayrıştırma lehçesi durumunda, bir etiket türüyle karşılaşmak, etikete benzeyen bir dizemiş gibi eşleştirilir. THRU, "takip eden kural eşleşene kadar atla ve daha sonra eşleştiğin konumu eşleştiğin sonuna yerleştir" anlamına gelen bir talimattır. (TO, eşleşen, ancak ayrıştırma öğesini öğenin önünde bırakan analogdur).

Bu yüzden biz geçmiş boyunca zip <a name="28154">. Sonra <code>ayrıştırma konumumuzu hemen sonra bulunan , sonraki oluşumunu geçiyoruz >. PARSE'ın COPY komutu daha sonra verileri başka bir kurala kopyalamamıza izin verir, bu durumda bu kuraldır [TO </code>]... bu yüzden C değişkenine, her şeyden önceye kadar her şeyi alırız <.

Harika , ha? :-)

Teknik olarak, örneğin arayarak TO "</"ve üç karakterden tasarruf ederek daha fazla traş olabilirim - </code>sadece </ne zaman yapılacağına tüm son etiketiyle eşleşmeye gerek yok. Benzer etiketler start etiketi için de yapılabilir. Ama Rebmu okuryazar golf hakkında ... ilk başta garip göründüğünü düşünseniz bile!

GÜNCELLEME : /bodyHile çantadan çıktı, ama benzer şekilde bırakacağım ... çünkü bu şekilde daha eğitici olduğunu düşünüyorum.


5

Java şimdi 634, 852, 1004 idi

Kod güncellendi; önerileriniz için teşekkürler. Golf: şimdi & gt ile değiştirir>

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

Teste geçtikten sonra, kısa bir süre sonra onu düzenleyip golf oynamayı deneyeceğim. X> 1 ila x> 2'yi değiştirmek gerekiyor, çünkü test dizesi de kodumda. Not: Kod golf,> sembolünü> gt ile değiştirir.

//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
İçerdiği yorumları nasıl kullanırsınız //bacchus?
ζ--

3
Birçok şeyi satır içine alabilir, kaynakları deneyebilir ve *çok sayıda kod kaydetmek için içe aktarma özelliğini kullanabilirsiniz .
Simon Kuang

@SimonKuang - Akışları kapatmak yerine akışları açık bırakırdım. Ayrıca, throws Exceptionherhangi bir şeyi ele almaya çalışmak yerine. Ayrıca, BufferedReader yerine bir Tarayıcı kullanmak, özellikle sınırlayıcıyı ayarlayabileceğinizden daha kolay olacağını düşünüyorum //bacchus, bu da işleri biraz daha kolaylaştıracaktır ...
Jules

5

Python, 175 167 bayt

Bu iki harici kütüphaneyi kullanır; Yetkisiz olduğunu okumamıştım.

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

Daha uzun, ancak daha hoş görünümlü kod:

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 ile değiştirilebilir q:http://codegolf.stackexchange.com/q/28154
Justin

1
bs4, requests1 baytı azaltmak için (satır 1) içindeki alan kaldırılabilir.
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()

Bu sayfada çalışır.


Nasıl çalıştırıyorsun?
aditsu

@aditsu Bir tarayıcının JavaScript konsolunda çalıştırılması gerekiyordu. Ama hala test ediyorum (ve
düzeltiyorum

@aditsu Şimdi çalışması gerekiyor. Tarayıcı konsolunuzu açın (F12 tuşuna basın) ve bu kodu buraya yapıştırın.
ace_HongKongIndependence

Siz bayım, if(this.readyState == this.DONE)fonksiyonun içine ihtiyacınız var.
Fabricio

1
@ ace görüyorum :) Şimdiye kadar diğer js cevap görmedim. Sonra bu benden benden almak
C5H8NNaO4

4

Haskell, 563 613 bayt

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"

Test edilmiştir. "Eski mesajlar" özelliği ile sayfa desteği var. Ne yazdırılacağını bulmak için ince çizgi yapısını kullanır. Bunun import Control.Monadnedeni sadece HTML'de >>=üretilmesidir &gt;.


4

Javascript + jQuery, 87 , 67

JQuery kullanmama izin verip vermediğimden emin değilim, ancak:

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

Javascript + jQuery, bu sayfada belirtilmemişse: 27 , 25

Eğlenmek için burada beklenirse:

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

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


1
Bu kaynak kodundan daha fazla çıktı verir.
nderscore

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

Haklısın, yanlış olarak kodun yerine tüm cevabı verdim
Martijn


3

Dart, 164

Bunu Dart'da deneyeceğimi düşündüm, imo kullanmak oldukça eğlenceli.

Bu, DartEditor'da konsolda çalıştırılabilir ancak pubspec.yaml dosyasına eklenen http paketini gerektirir.

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

Ungolfed versiyonu:

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

Burada gerçek sihir yok: html etiketleri arasındaki alanın değerini alır <code></code>. Kütüphaneyi kullanır XML(kodda açıkça görüldüğü gibi). Sonucu stdout olarak verir.


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

Bacchusbeale'ın cevabının geliştirilmiş bir versiyonu:

  • gereksiz yere kaynakları kapatmaz
  • gereksiz değişkenler bildirmez
  • a Scannerüzerinde giriş yapmak zorunda kalmamak için
  • başlangıç ​​/ bitiş işaretleyicisinin orta kez üstünden atlamak zorunda kalmaktan kaçınmak için kendi eşleşmeyen bir regexp kullanır.

Güncellenmiş:

  • Gönderi için doğrudan bir URL kullanın, bu nedenle kodun başlangıcını / bitişini tanımlamak için benzersiz bir yoruma gerek yoktur; Şimdi kullanır <code>[...]</code>çözmek zorunda kalmamak amacıyla, aslında normal ifadeyi "./?[c]ode\W" kullanarak (aramak için sınırlayıcı olarak &lt;ve &gt;- '\ W' yerine daha kısa gereklidir "" URL'nin yazıyla eşleşmesini engellemek için, ne yazık ki 2 karaktere mal olan ve c etrafındaki köşeli ayraçlar regex eşleşmesini engeller).

1
Bir sürü gereksiz yere sahipsin. Ayrıca sınıfınızın herkese açık olması gerekmez.
aditsu

1
openConnection (). getInputStream () ayrıca openStream ()
aditsu

1

w3m 55 bayt

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

@DigitalTrauma dayanarak


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

Birkaç baytı kurtarmak için burada ve orada birkaç alanı kaldırabileceğinizden emin olun.
MisterBla

@ richard kimin umrunda bile kazanmayacağım.
Mhmd

1
Lols için yap, kazanmak için değil.
MisterBla

@RichardA bitti ve ben de regexp'den birkaç karakter çıkardım.
Mhmd

1

İşleme, 90

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

Düzenleme: Sonunda anladım!



0

Javascript, 138

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

Bu, sayfanın 99 msn altına yüklendiği varsayılarak çalışır. Ayrıca, aynı kaynak kodlu politika nedeniyle, bir codegolf.SE sayfasında açılan bir konsol aracılığıyla da çalıştırılmalıdır.


Sadece bir not: URL'deki sümüklü böcek gerekmez ve sorular q ile değiştirilebilir.
Schism

1
http://codegolf.stackexchange.com/a/28160Bunun yerine yapabileceğinizi unutmayınhttp://codegolf.stackexchange.com/a/28160/12551
Justin

Chrome bundan hoşlanmıyor: "Yakalanmamış TypeError: tanımsız" belge "özelliği okunamıyor"
Spedwards

@Spedwards, açılır pencere engelleyicisini devre dışı bırakmalısınız.
nderscore

0

Perl 5,10, 155 127 122 117 bayt

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

Kullanarak XML::LibXML.


0

Kabuk ve xmllint, 82 bayt

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

0

Python, 164

Kod etiketleri arasındaki metni ayıklayarak çalışır. Oldukça uzun, ancak html sayfası doğrudan düzenlenmemiş veya aşağıdakinden önce yeni bir kod bloğu eklenmemişse (programın çıktısını etkilememesi gereken bir kod bloğuna sahip olmadıkça) her zaman doğru çalışacaktır.

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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.