Ecrivez un programme qui se télécharge tout seul


66

Ecrivez un programme qui se connecte à ce site, télécharge la réponse même dans laquelle il est posté, extrait son propre code source et l’imprime. La sortie doit être identique au code source. Le code le plus court (en octets) l'emporte.

Règles:

  • Aucun raccourcisseur d'URL autorisé.
  • La réponse doit avoir un format standard - un en-tête avec le nom et la taille de la langue, une description facultative, un bloc de code, une description facultative et une explication. Aucun délimiteur non naturel n'est autorisé.
  • La sortie doit provenir du bloc de code affiché sur le site.
  • La fonctionnalité ne doit pas dépendre de la position dans la liste de réponses; cela devrait fonctionner même s'il y a plusieurs pages et que la réponse ne soit pas la première.
  • Nouveau: remarque spéciale pour les réponses supposées être exécutées dans un navigateur: il est correct d’exiger de les exécuter sur le domaine codegolf (pour obéir à la politique de même origine), mais le domaine et le chemin doivent être inclus dans la solution afin de: rendez-le juste.

39
Catch-22: Comment suis-je censé tester ma soumission?
Martin Ender

9
J'imagine que des personnes postent des réponses et les suppriment afin de pouvoir tester leur code.
Justin

4
Les réponses @ m.buettner peuvent être testées sur d’autres réponses (à d’autres questions) d’abord, puis postées, puis modifiées pour changer l’URL :)
aditsu

8
@hexafraction Si les commentaires peuvent interférer avec une réponse, la réponse n'est pas très bonne ...
aditsu

17
Une question qui me trottait dans la tête: comment écrire un tweet qui se lie à lui-même sans utiliser de raccourcisseur d’URL, mais en estimant le tweet et votre tweet?
Ming-Tang

Réponses:


34

Navigateur Bash + coreutils + Lynx, 61 octets

Merci à @FDinoff pour les astuces:

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

4
Et que se passe-t-il si je tape le mot magique recherché par grep?
Ombre

3
lynx lynx lynx lynx. Ce commentaire sera annulé (et le titre aussi)
ζ--

1
@hexafraction Awww. Tu devais y aller et le ruiner!
Ombre

8
Cette URL devrait fonctionner. codegolf.stackexchange.com/posts/28164/bodyEt ça ignore les commentaires. Je pense aussi que c'est dans les règles que vous pouvez l'utiliser ...
FDinoff

3
@ DigitalTrauma awww ... zut.
haneefmubarak

22

Ruby, 155 186 195 148 138 110 97 caractères

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

Je devais en faire une ligne, car sinon, les nouvelles lignes seraient générées au \nlieu des nouvelles lignes réelles.

  • +31 caractères parce que je n'avais pas remarqué que certains caractères étaient échappés.
  • +9 caractères pour se débarrasser de la barre oblique inverse agaçante.
  • Merci à Nathan Osman pour la sauvegarde de 2 caractères et à Ventero pour la sauvegarde de 55 (!!!) en supprimant le besoin de la plupart des correctifs répertoriés ci-dessus.

L'explication

Embellissons ceci un peu en premier. Cependant, je vais devoir utiliser une notation un peu ... intéressante dans ce code. Je ne peux pas utiliser de points-virgules du tout dans cet article, pour des raisons expliquées plus tard, je vais donc les {SEMI}remplacer par des points-virgules.

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

Bon, passons maintenant à travers cela. Les deux premières lignes sont assez explicites - elles récupèrent le texte HTML de cette réponse.

La dernière ligne est celle qui est intéressante ici. Vous voyez ce point-virgule apparemment inutile à la fin du code? C'est absolument nécessaire, et voici pourquoi.

Tout d'abord, resp.matchextrait le code à imprimer. L'expression rationnelle utilise pour cela est l'affaire: /req.+{SEMI}/. Il saisit le début du code REQuire'net/http', en cherchant req( reprendrait mon REputation). Ensuite, il trouve la fin du code en recherchant un point-virgule! Puisque +est glouton par défaut, il continuera jusqu'à ce qu'il trouve le point-virgule qui signifie la fin du code. Voyez pourquoi je ne peux plus utiliser de point-virgule?

Après cela, je n'ai plus rien à enlever grâce à la solution de Ventero qui consiste à ne plus utiliser \du tout. Tout ce que j'ai à faire est de corriger le {AMPERSAND}changement en {AMPERSAND}amp{SEMI}, ce qui peut être réalisé simplement en retirant la amp{SEMI}pièce. Plus besoin de ça à cause d'une nouvelle URL. Après cela, le code original a été récupéré! (Remarque: je ne peux pas utiliser l'esperluette non plus, car le code HTML utilisé est codé, ce qui entraîne la création d'un point-virgule.)


Certains personnages se sont échappés ..
Aditsu

1
@aditsu Gah; n'a pas remarqué cela. Fixé.
Poignée de porte

Tu vas détester ça ... une barre oblique inverse est en train de se dupliquer. Il y a aussi une différence de nouvelle ligne, mais c'est une chose mineure.
Aditsu

@aditsu Argh! : P fixe aussi. La nouvelle ligne est à cause de puts; il pourrait être résolu avec printmais meh. Imaginez qu'il y ait une fin de ligne dans le code, même si SE ne pourra pas le montrer.
Poignée de porte

1
Pour le lien, http://codegolf.stackexchange.com/a/28159donnerait le même résultat que le vôtre et économiserait des caractères.
Mhmd

20

PowerShell - 69 62

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

DOM dans un shell. Agréable!
Fregante

Ne nécessite-t-il pas Azure Rights Management? Sans ce module, je pense que vous pourriez le faire avec Invoke-WebRequest.
Scott Leadley

@ScottLeadley irmest l'alias de Invoke-RestMethodPowerShell v3 core et a été introduit avec celui-ci. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Sainte merde. Une réponse de golf au code PowerShell avec une longueur du même ordre de grandeur que les réponses principales. +1
Adam Maras

@AdamMaras Ha, je sais ce que vous voulez dire! Cela arrive parfois cependant. codegolf.stackexchange.com/a/26811/4565 et codegolf.stackexchange.com/a/21982/4565 n'étaient pas très loin de la tête.
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))

S'exécute dans la console de votre navigateur Web sur cette page. Testé sur les derniers Chrome et Firefox .

edit: +28 octets pour ajouter le domaine complet.

Firefox n'aime plus mon tour d'URL Regex avec cette mise à jour :(

Voici la solution révolutionnaire de 86 octets:

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

Cela m'a fait peur. Plusieurs fois.
Fregante

1
@ bfred.it Je viens de couper un octet en utilisant une regex intéressante. J'espère que cela vous rend impressionné une fois de plus.
nderscore

Si l’impression sur la console est une méthode de sortie acceptable, vous pouvez réduire de 7 caractères en supprimant l’alerte.
Tejas Kale

En outre, selon la nouvelle règle, vous devez ajouter codegolf.stackexchange.com/à l'URL.
Tejas Kale

1
@TejasKale D'après ce que j'ai vu, les gens désapprouvent les solutions qui n'alerte pas réellement / document.write / console.log la réponse.
nderscore

10

Ruby + wget + gunzip , 159 86 82 71

Utiliser la pointe de @FDinoff à utiliser http://codegolf.stackexchange.com/posts/28173/body.

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

Testé. Merci à @ace et @Bob pour l'optimisation en ligne de commande.


2
Vous pouvez combiner les drapeaux dans wget, comme dans wget -qO- url. De plus, dans bash, vous n'avez pas besoin des guillemets doubles pour l'URL, cela peut donc également fonctionner pour vous.
ace_HongKongIndependence

Vous pouvez laisser le http://.
Bob

6

CJam - 53

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

Je fais ce wiki de communauté depuis que je réponds à ma propre question et que je ne veux pas vraiment concurrencer: p
Crédits à FDinoff pour le choix de l'URL.


Woot, +1 pour le smiley dans le code
Cruncher

1
@Cruncher );n'a pas l'air trop souriant pour moi ...
MD XF

5

Rebmu, 91 caractères

En raison du Catch-22, je dois poster pour obtenir l'URL de cette réponse. :-/ OK, j'ai compris.

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

Rebmu est un dialecte de Rebol et vous pouvez tout lire à ce sujet . L'équivalent de Rebol serait ici:

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

PARSE de Rebol est une sorte de réponse hautement alphabétisée à RegEx. Il commence une position d'analyse de l'entrée (qui peut être n'importe quelle série, y compris les blocs structurels ... données binaires ... ou les types de chaîne) . Les règles sont une langue pour la façon dont la position d'analyse se déplace.

Les balises et les URL ne sont en réalité que des chaînes cachées dans la langue. Mais ils sont "parfumés", et comme Rebol est typé dynamiquement, vous pouvez vérifier ce type. READ, par exemple, sait que si vous lui donnez une chaîne de caractères à base d'URL, il devrait alors être envoyé à un gestionnaire de schéma pour effectuer la lecture. (Dans ce cas, celui enregistré pour HTTP). Vous récupérez les octets UTF-8 par défaut. Nous utilisons donc to-string pour le décoder et obtenir une série de points de code dans une chaîne Unicode normale.

Dans le cas du dialecte d'analyse, la recherche d'un type de balise correspond simplement à une chaîne ressemblant à la balise. THRU est une instruction qui signifie "sauter jusqu'à ce que la règle suivante soit mise en correspondance, puis placez la position du match à la fin de ce que vous venez de faire correspondre". (TO est l'analogue qui correspond, mais laisse la position d'analyse avant l'élément).

Nous passons donc le long de la <a name="28154">. Nous passons ensuite à la prochaine occurrence de <code>, notre position d’analyse étant maintenant située juste après le >. La commande COPY de PARSE nous permet ensuite de copier les données dans une autre règle. Dans ce cas, cette règle est [TO </code>]... nous introduisons donc dans la variable C tout jusqu'à maintenant <.

Cool , hein? :-)

Techniquement, je pourrais en TO "</"économiser plus, par exemple en cherchant et en sauvegardant trois caractères - il n'est pas nécessaire de faire correspondre la </code>balise de fin entière quand cela </conviendrait. Des arguments similaires pourraient me être faits pour la balise de début. Mais Rebmu concerne le golf lettré ... même si vous pensez que ça a l'air bizarre au début!

UPDATE : le /bodytruc est sorti du sac, mais je vais pareillement le laisser tel quel ... parce que je pense que c'est plus éducatif de cette façon.


5

Java maintenant 634 852, était 1004

Le code a été mis à jour. merci pour les suggestions. Golfé: remplace maintenant & gt par>

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

En soumettant pour le test, je vais éditer et essayer de jouer au golf sous peu. Nécessaire pour changer x> 1 en x> 2 car la chaîne de test est également dans mon code. Remarque: le code golf remplace le symbole> par & 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
Comment gérez-vous les commentaires contenant //bacchus?
ζ--

3
Vous pouvez intégrer beaucoup de choses, essayer des ressources et utiliser les *importations pour économiser beaucoup de code.
Simon Kuang

@SimonKuang - Je laisserais simplement les flux ouverts plutôt que de fermer des choses. Aussi, throws Exceptionplutôt que d'essayer de gérer quoi que ce soit. De plus, je pense que l'utilisation d'un scanner plutôt que d'un lecteur BufferedReader serait plus simple, d'autant plus que vous pouvez définir le délimiteur sur //bacchus, ce qui faciliterait un peu les choses ...
Jules

5

Python, 175 167 octets

Cela utilise deux bibliothèques externes; Je n'ai pas lu que c'était non autorisé.

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

Code plus long, mais plus joli:

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
Le questionsdans l'URL peut être remplacé par q:http://codegolf.stackexchange.com/q/28154
Justin

1
L'espace dans bs4, requests(ligne 1) peut être supprimé pour réduire 1 octet.
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()

Fonctionne sur cette page.


Comment le dirigez-vous?
Aditsu

@aditsu Il est supposé être exécuté sur la console JavaScript d'un navigateur. Mais je suis toujours en train de le tester (et de le réparer), veuillez patienter
ace_HongKongIndependence

@aditsu Cela devrait fonctionner maintenant. Ouvrez la console de votre navigateur (appuyez sur F12) et collez ce code là.
ace_HongKongIndependence

vous monsieur, besoin d'un if(this.readyState == this.DONE)dans la fonction.
Fabricio

1
@ace je vois :) je n'ai pas vu l'autre js répondre jusqu'à maintenant. Alors prenez ce vote positif de moi
C5H8NNaO4

4

Haskell, 563 613 octets

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é. Possède un support de page via la fonctionnalité "messages les plus anciens". Utilise une structure en quine-lignes pour trouver les éléments à imprimer. Le import Control.Monadest seulement parce que >>=génère &gt;en HTML.


4

Javascript + jQuery, 87 , 67

Je ne suis pas sûr de pouvoir utiliser jQuery, mais:

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

Javascript + jQuery, si exécuté dans cette page: 27 , 25

Pour le plaisir, si cela devait être exécuté ici:

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

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


1
Cela génère plus que le code source.
nderscore

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

Vous avez raison, j'ai faussement assumé toute la réponse à la place du code
Martijn


3

Dart, 164

Je pensais que j'essayerais cela dans Dart, c'est assez amusant d'utiliser imo.

Ceci peut être exécuté dans la console dans DartEditor, mais nécessite le package http ajouté dans 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));});}

Version non-golfée:

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 caractères

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

Pas de vraie magie ici: il prend la valeur du champ entre les balises html <code></code>. Utilise la bibliothèque XML(comme on peut le voir dans le code bien évidemment). Affiche le résultat en tant que sortie standard.


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

Une version améliorée de la réponse de bacchusbeale qui:

  • ne ferme pas les ressources inutilement
  • ne déclare pas de variables inutiles
  • utilise un Scannerpour éviter d'avoir à boucler l'entrée
  • utilise une expression rationnelle qui ne correspond pas à elle-même pour éviter d'avoir à sauter une occurrence moyenne du marqueur de début / fin.

Mis à jour:

  • Utilisez une URL directe pour le message, nous n'avons donc pas besoin d'un commentaire unique pour identifier le début / la fin du code; utilise maintenant <code>[...]</code>comme délimiteurs à rechercher (en utilisant en fait l'expression régulière "./?[c]ode\W", afin d'éviter de devoir décoder &lt;et &gt;- le "\ W" est nécessaire plutôt que le plus court "." pour éviter de faire correspondre une partie de l'URL à la publication, ce qui coûte malheureusement 2 caractères, et les crochets entourant c empêchent la regex de se correspondre).

1
Vous avez un tas d'espaces inutiles. De plus, votre classe n'a pas besoin d'être publique.
Aditsu

1
openConnection (). getInputStream () peut également être abrégé en openStream ()
aditsu

1

w3m 55 octets

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

Basé sur @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

Bien sûr, vous pouvez supprimer quelques espaces ici et là pour économiser quelques octets.
MisterBla

@richard qui se soucie je ne vais pas gagner de toute façon.
Mhmd

1
Faites-le pour les lols, pas pour gagner.
MisterBla

@RichardA fait, et j'ai aussi enlevé quelques caractères de l'expression rationnelle.
Mhmd

1

Traitement, 90

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

Edit: enfin obtenu!


1

bash + awk, 71 octets

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

2
Cela ne semble pas fonctionner - il génère beaucoup d'autres choses avec cette réponse.
Riking

@Riking vrai, il semble dépendre de la position (enfreindre la dernière règle)
dimanche

Vous pouvez laisser le http://.
Bob

@ user155406: notez que chaque réponse a une URL - celle-ci est 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)

Cela fonctionne en supposant que la page se charge en moins de 99 ms. Il doit également être exécuté via une console ouverte sur une page codegolf.SE, en raison de la même stratégie d'origine.


Juste une remarque: vous n'avez pas besoin du slug dans l'URL, et les questions peuvent être remplacées par q.
Schisme

1
Notez que vous pourriez faire http://codegolf.stackexchange.com/a/28160au lieu dehttp://codegolf.stackexchange.com/a/28160/12551
Justin

Chrome n'aime pas ceci: "TypeError non capturé: impossible de lire la propriété 'document' d'un indéfini"
Spedwards

@Spedwards vous devriez désactiver le bloqueur de popup.
nderscore

0

Perl 5.10, 155 127 122 117 octets

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

Utilisation XML::LibXML.


0

Shell et xmllint, 82 octets

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

0

Python, 164

Fonctionne en extrayant le texte entre les balises de code. Il est assez long mais il fonctionnera toujours correctement à moins que la page html ne soit directement modifiée ou qu'un nouveau bloc de code ne soit ajouté avant celui ci-dessous (un bloc de code après ne devrait avoir aucun effet sur la sortie du programme).

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]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.