Scrivi un programma che si scarica da solo


66

Scrivi un programma che si collega a questo sito, scarica la risposta in cui è pubblicato, estrae il proprio codice sorgente e lo stampa. L'output deve essere identico al codice sorgente. Vince il codice più breve (in byte).

Regole:

  • Nessun accorciatore di URL consentito.
  • La risposta deve avere un formato regolare: un'intestazione con il nome e le dimensioni della lingua, la descrizione facoltativa, il blocco di codice, la descrizione facoltativa e la spiegazione. Non sono ammessi delimitatori innaturali.
  • L'output deve provenire dal blocco di codice effettivo pubblicato sul sito.
  • La funzionalità non deve dipendere dalla posizione nell'elenco delle risposte; dovrebbe funzionare anche se ci sono più pagine e la risposta non è sulla prima.
  • Novità: nota speciale per le risposte che dovrebbero essere eseguite in un browser: va bene richiederle nel dominio codegolf (per obbedire alla stessa politica di origine) ma il dominio e il percorso dovrebbero essere inclusi nella soluzione per renderlo giusto.

39
Catch-22: Come devo testare la mia richiesta?
Martin Ender,

9
Prevedo che le persone inviino risposte e le cancellino, in modo che possano testare il loro codice.
Giustino

4
Le risposte di @ m.buettner possono essere testate prima su altre risposte (ad altre domande), quindi postate, quindi modificate per cambiare l'URL :)
aditsu,

8
@hexafraction se i commenti sono in grado di interferire con una risposta, allora la risposta non è molto buona ...
aditsu

17
Una domanda incastrata nella mia testa: come scrivere un tweet che si collega a se stesso senza utilizzare alcun accorciatore di URL, ma stimando l'ID tweet del tuo tweet?
Ming-Tang,

Risposte:


34

Bash + coreutils + browser Lynx, 61 byte

Grazie a @FDinoff per i suggerimenti:

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

4
E cosa succede se scrivo quella parola magica che grep sta cercando?
Ombra

3
lynx lynx lynx lynx. Questo commento verrà eliminato (e anche l'intestazione)
ζ--

1
@hexafraction Awww. Dovevi andare a rovinarlo!
Ombra

8
Questo URL dovrebbe funzionare. codegolf.stackexchange.com/posts/28164/bodyE ignora i commenti. Penso anche che sia all'interno delle regole che puoi usarlo ...
FDinoff,

3
@DigitalTrauma awww ... accidenti.
Haneefmubarak,

22

Rubino, 155 186 195 148 138 110 97 caratteri

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

Ho dovuto fare una riga, perché altrimenti avrebbe prodotto nuove righe \ninvece di nuove righe effettive.

  • +31 personaggi perché non avevo notato che alcuni personaggi erano in fuga.
  • +9 personaggi per sbarazzarsi della fastidiosa barra rovesciata.
  • Grazie a Nathan Osman per aver salvato 2 caratteri e Ventero per aver salvato 55 (!!!) rimuovendo la necessità della maggior parte delle correzioni sopra elencate.

La spiegazione

Abbelliamolo un po 'prima. Tuttavia, dovrò usare una notazione un po 'interessante in questo codice. Non posso usare i punti e virgola in questo post, per ragioni spiegate più avanti, quindi userò {SEMI}invece i punti e virgola.

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

Bene, ora passiamo attraverso questo. Le prime due righe sono abbastanza autoesplicative: recuperano il testo HTML di questa risposta.

Ora, l'ultima riga è quella interessante qui. Vedi quel punto e virgola apparentemente inutile alla fine del codice? È assolutamente necessario, ed ecco perché.

Innanzitutto, resp.matchestrae il codice da stampare. Anche l'espressione regolare che utilizza per questo è il trucco: /req.+{SEMI}/. Afferra l'inizio del codice, REQuire'net/http'cercando req( reafferrerebbe il mio REputation). Quindi, trova la fine del codice cercando un punto e virgola! Poiché +è avido per impostazione predefinita, continuerà fino a quando non trova il punto e virgola che indica la fine del codice. Vedi perché non riesco più a usare i punti e virgola?

Dopodiché, non devo annullare la scansione di nulla grazie alla correzione di Ventero di non utilizzare \più. Tutto quello che devo fare è correggere {AMPERSAND}cambiando in {AMPERSAND}amp{SEMI}, che può essere ottenuto semplicemente rimuovendo la amp{SEMI}parte. Non è più necessario a causa del nuovo URL. Successivamente, è stato recuperato il codice originale! (Nota: non riesco nemmeno a usare la e commerciale, perché viene codificato in HTML che provoca la creazione di un punto e virgola.)


Alcuni personaggi stanno scappando ..
Aditsu,

1
@aditsu Gah; non l'ho notato. Fisso.
Maniglia della porta

Lo odierai ... una barra rovesciata si sta duplicando. C'è anche una differenza newline, ma questa è una cosa minore.
aditsu,

@aditsu Argh! : P Risolto anche. La cosa nuova è a causa di puts; potrebbe essere risolto solo con printmeh. Fai solo finta che ci sia una nuova riga finale nel codice, anche se SE non sarà in grado di mostrarlo.
Maniglia della porta

1
Per il collegamento, http://codegolf.stackexchange.com/a/28159darebbe lo stesso risultato del tuo e salverebbe alcuni caratteri.
Mhmd,

20

PowerShell - 69 62

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

DOM in una shell. Bello!
fregante,

IRM non richiede Azure Rights Management? Senza quel modulo, penso che potresti farlo con Invoke-WebRequest.
Scott Leadley,

@ScottLeadley irmè l'alias per Invoke-RestMethoded è stato introdotto con il core PowerShell v3. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Merda santa. Una risposta di golf in codice PowerShell con una lunghezza nello stesso ordine di grandezza delle risposte principali. +1
Adam Maras,

@AdamMaras Ah, so cosa vuoi dire! Succede occasionalmente però. codegolf.stackexchange.com/a/26811/4565 e codegolf.stackexchange.com/a/21982/4565 non erano troppo lontani dal vantaggio.
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))

Viene eseguito nella console del browser Web in questa pagina. Testato sugli ultimi Chrome e Firefox .

modifica: +28 byte per aggiungere l'intero dominio.

A Firefox non piace più il mio trucco Regex URL con questo aggiornamento :(

Ecco la soluzione da 86 byte che infrange le regole:

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

Questo mi ha fatto stupire. Più volte.
fregante,

1
@ bfred.it Ho appena tagliato un byte usando un'interessante regex. Spero che ti faccia meravigliare ancora una volta.
nderscore,

Se la stampa sulla console è un metodo di output accettabile, è possibile accorciare di 7 caratteri rimuovendo l'avviso.
Tejas Kale,

Inoltre, secondo la nuova regola devi aggiungere codegolf.stackexchange.com/all'URL.
Tejas Kale,

1
@TejasKale Da quello che ho visto la gente disapprova le soluzioni che in realtà non avvisano / document.write / console.log la risposta.
nderscore,

10

Ruby + wget + gunzip , 159 86 82 71

Utilizzando la punta di @FDinoff da usare http://codegolf.stackexchange.com/posts/28173/body.

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

Provato. Grazie a @ace e @Bob per l'ottimizzazione della riga di comando.


2
È possibile combinare le bandiere in wget, come in wget -qO- url. Inoltre, in bash non hai bisogno delle doppie virgolette per l'URL, quindi potrebbe funzionare anche per te.
ace_HongKongIndependence,

Puoi tralasciare il http://.
Bob,

6

CJam - 53

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

Sto realizzando questo wiki della comunità da quando rispondo alla mia domanda e non voglio davvero competere: p
Crediti a FDinoff per la scelta dell'URL.


Woot, +1 per la faccina sorridente nel codice
Cruncher,

1
@Cruncher );non mi sembra troppo sorridente ...
MD XF,

5

Rebmu, 91 caratteri

A causa del Catch-22 devo pubblicare per ottenere l'URL di questa risposta. : - / Va bene, capito.

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

Rebmu è un dialetto di Rebol e puoi leggere tutto su di esso . Il Rebol equivalente qui sarebbe:

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

PARSE di Rebol è una sorta di risposta altamente istruita a RegEx. Inizia una posizione parser dell'input (che può essere qualsiasi serie, inclusi blocchi strutturali ... dati binari ... o tipi di stringa) . Le regole sono una lingua per come si muove la posizione di analisi.

Tag e URL sono in realtà solo stringhe nascoste nella lingua. Ma sono "aromatizzati" e dato che Rebol è digitato in modo dinamico puoi controllare quel tipo. READ, ad esempio, sa che se gli dai una stringa basata sull'URL, dovrebbe inviarla a un gestore di schemi per fare la lettura. (In questo caso, quello registrato per HTTP). Si ottengono byte UTF-8 per impostazione predefinita, quindi utilizziamo to-string per decodificarlo e ottenere una serie di punti di codice in una normale stringa Unicode.

Nel caso del dialetto di analisi, l'incontro con un tipo di tag viene semplicemente associato come se fosse una stringa che assomigliava al tag. THRU è un'istruzione che significa "salta fino a quando la regola che segue è abbinata, quindi posiziona la posizione di corrispondenza alla fine di ciò che hai appena abbinato". (TO è l'analogo che corrisponde, ma lascia la posizione di analisi prima dell'elemento).

Quindi passiamo oltre <a name="28154">. Quindi passiamo oltre la prossima occorrenza di <code>, con la nostra posizione di analisi ora situata subito dopo >. Il comando COPY di PARSE ci consente quindi di copiare i dati in un'altra regola, in questo caso quella regola è [TO </code>]... quindi entriamo nella variabile C tutto fino a prima <.

Bene , eh? :-)

Tecnicamente potrei radere di più, ad esempio cercando TO "</"e questo salva tre caratteri - non è necessario abbinare l'intero </code>tag di fine quando </lo farebbe. Argomenti simili potrebbero essere fatti per il tag iniziale. Ma Rebmu riguarda il golf letterato ... anche se all'inizio potresti pensare che sia strano!

AGGIORNAMENTO : il /bodytrucco è fuori dal comune, ma allo stesso modo lo lascerò così com'è ... perché penso che sia più educativo in questo modo.


5

Java ora 634, 852, era 1004

Il codice è stato aggiornato; grazie per i suggerimenti. Golf: ora sostituisce & gt con>

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

Inoltrando per il test, lo modificherò e proverò a giocare a golf a breve. Necessario cambiare x> 1 in x> 2 perché la stringa di test è anche nel mio codice. Nota: il codice golf sostituisce> il simbolo in & 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
Come gestite i commenti contenenti //bacchus?
ζ--

3
Puoi incorporare molte cose, provare con le risorse e utilizzare le *importazioni per risparmiare un sacco di codice.
Simon Kuang,

@SimonKuang - Lascerei aperti anche i flussi piuttosto che chiudere le cose. Inoltre, throws Exceptionpiuttosto che cercare di gestire qualsiasi cosa. Inoltre, penso che usare uno scanner piuttosto che un BufferedReader sarebbe più semplice, soprattutto perché potresti impostare il delimitatore su //bacchus, il che renderebbe le cose un po 'più facili ...
Jules,

5

Python, 175 167 byte

Questo utilizza due librerie esterne; Non ho letto che non era autorizzato.

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

Codice più lungo, ma più bello:

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
L' questionsURL può essere sostituito con q:http://codegolf.stackexchange.com/q/28154
Giustino

1
Lo spazio in bs4, requests(riga 1) può essere rimosso per ridurre 1 byte.
ace_HongKongIndipendenza

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

Funziona su questa pagina.


Come lo esegui?
aditsu,

@aditsu Dovrebbe essere eseguito sulla console JavaScript di un browser. Ma sto ancora testando (e
risolvendolo

@aditsu Dovrebbe funzionare ora. Apri la console del tuo browser (premi F12) e incolla questo codice lì.
ace_HongKongIndependence

signore, ho bisogno di una if(this.readyState == this.DONE)funzione interna.
Fabricio,

1
@ace vedo :) Non ho visto le altre js rispondere fino ad ora. Quindi prendi questo voto da me
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"

Provato. Ha il supporto della pagina tramite la funzione "post più vecchi". Utilizza la struttura a quine righe per trovare cosa stampare. L' import Control.Monadè solo perché >>=genera &gt;in HTML.


4

Javascript + jQuery, 87 , 67

Non sono sicuro di poter utilizzare jQuery, ma:

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

Javascript + jQuery, se eseguito in questa pagina: 27 , 25

Per divertimento, se fosse eseguito qui:

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

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


1
Questo produce più del codice sorgente.
nderscore,

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

Hai ragione, ho erroneamente ipotizzato l'intera risposta invece del codice
Martijn,


3

Dardo, 164

Ho pensato di provarlo in Dart, è piuttosto divertente usare imo.

Questo può essere eseguito nella console in DartEditor, ma richiede il pacchetto http aggiunto in 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));});}

Versione non golfata:

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 caratteri

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

Nessuna vera magia qui: prende il valore del campo tra i tag html <code></code>. Usa la libreria XML(come si vede chiaramente nel codice). Emette il risultato come stdout.


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

Una versione migliorata della risposta di bacchusbeale che:

  • non chiude le risorse inutilmente
  • non dichiara variabili non necessarie
  • usa a Scannerper evitare di dover passare in rassegna l'input
  • usa una regexp che non corrisponde a se stessa per evitare di saltare una ricorrenza intermedia del marcatore inizio / fine.

aggiornato:

  • Usa un URL diretto al post, quindi non abbiamo bisogno di un commento univoco per identificare l'inizio / la fine del codice; ora utilizza <code>[...]</code>come delimitatori per la ricerca (utilizzando effettivamente l'espressione regolare "./?[c[ode\W", in modo da evitare la decodifica &lt;e &gt;- "\ W" è necessario anziché il più corto "." per evitare che corrisponda parte dell'URL al post, sfortunatamente, che costa 2 caratteri, e le parentesi quadre attorno a c impediscono che regex corrisponda a se stesso).

1
Hai un sacco di spazi non necessari. Inoltre, la tua classe non deve essere pubblica.
aditsu,

1
openConnection (). getInputStream () può anche essere abbreviato in openStream ()
aditsu,

1

w3m 55 byte

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

Basato su @DigitalTrauma


1

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

Abbastanza sicuro che puoi rimuovere alcuni spazi qua e là per risparmiare qualche byte.
MisterBla,

@richard a chi importa non vincerò comunque.
Mhmd,

1
Fallo per i lol, non per vincere.
MisterBla,

@RichardA fatto, e ho anche rimosso alcuni caratteri dal regexp.
Mhmd,

1

Elaborazione, 90

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

Modifica: finalmente capito!


1

bash + awk, 71 byte

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

2
Non sembra funzionare - produce molte altre cose insieme a questa risposta.
Riking

@Riking true, sembra essere dipendente dalla posizione (infrangere l'ultima regola)
aditsu,

Puoi tralasciare il http://.
Bob,

@ user155406: nota che ogni risposta ha un URL - questo è 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)

Questo funziona supponendo che la pagina si carichi in meno di 99 ms. Deve anche essere eseguito tramite una console aperta su una pagina codegolf.SE, a causa della stessa politica di origine.


Solo una nota: non è necessario lo slug nell'URL e le domande possono essere sostituite da q.
Scisma,

1
Nota che potresti fare http://codegolf.stackexchange.com/a/28160invece dihttp://codegolf.stackexchange.com/a/28160/12551
Justin

A Chrome non piace questo: "Uncaught TypeError: Impossibile leggere il 'documento' di proprietà di undefined"
Spedwards,

@Spedwards dovresti disabilitare il blocco 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')

Usando XML::LibXML.


0

Shell e xmllint, 82 byte

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

0

Python, 164

Funziona estraendo il testo tra i tag di codice. È piuttosto lungo ma funzionerà sempre correttamente a meno che la pagina html non venga modificata direttamente o venga aggiunto un nuovo blocco di codice prima di quello seguente (avere un blocco di codice dopo non dovrebbe avere alcun effetto sull'output del programma).

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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.