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.
Aditsu
la source
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
Trauma numérique
la source
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.)

Poignée de porte
la source
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
Rynant
la source
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))
Nderscore
la source
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.

dtldarek
la source
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.

vitesse
la source
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.

Dr. Rebmu
la source
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
bacchusbeale
la source
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)
MeldSnake
la source
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.

ace_HongKongIndependence
la source
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.

dtldarek
la source
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()

Martijn
la source
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
4

w3m 45 caractères

w3m codegolf.stackexchange.com/a/28336|grep ☻
gnibbler
la source
1
☺. Est-ce que ça marche encore? Edit: On dirait que c'est le cas.
ace_HongKongIndependence
@ace je reçois votre commentaire quand je le lance
FDinoff
Fixé :) Quelqu'un d'autre? 😁
gnibbler
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));
  });
}
MisterBla
la source
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.

planificateur
la source
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).
Jules
la source
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

Moop
la source
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
Mhmd
la source
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!

segfaultd
la source
1

bash + awk, 71 octets

curl -sL codegolf.stackexchange.com/q/28154 |awk -F\> '/\#/ {print $3}'
utilisateur155406
la source
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.

Zaq
la source
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.

Nwellnhof
la source
0

Shell et xmllint, 82 octets

xmllint --xpath 'string(//pre)' http://codegolf.stackexchange.com/posts/28333/body
Nwellnhof
la source
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]
icedvariables
la source