Escribe un programa que se descargue solo


66

Escriba un programa que se conecte a este sitio, descargue la respuesta en la que está publicado, extraiga su propio código fuente y lo imprima. La salida debe ser idéntica al código fuente. El código más corto (en bytes) gana.

Reglas:

  • No se permiten acortadores de URL.
  • La respuesta debe tener un formato regular: un encabezado con el nombre y tamaño del idioma, descripción opcional, bloque de código, descripción opcional y explicación. No se permiten delimitadores no naturales.
  • El resultado debe originarse en el bloque de código real publicado en el sitio.
  • La funcionalidad no debe depender de la posición en la lista de respuestas; debería funcionar incluso si hay varias páginas y la respuesta no está en la primera.
  • Nuevo: nota especial para las respuestas que se supone que deben ejecutarse en un navegador: está bien exigir que se ejecuten en el dominio codegolf (para obedecer la política del mismo origen), pero el dominio y la ruta deben incluirse en la solución para hazlo justo.

39
Catch-22: ¿Cómo se supone que debo probar mi presentación?
Martin Ender

9
Veo a las personas que publican respuestas y las eliminan, para que puedan probar su código.
Justin

44
Las respuestas de @ m.buettner se pueden probar en otras respuestas (a otras preguntas) primero, luego publicadas, luego editadas para cambiar la URL :)
aditsu

8
@hexafraction si los comentarios pueden interferir con una respuesta, entonces la respuesta no es muy buena ...
aditsu

17
Una pregunta atascada en mi cabeza: ¿Cómo escribir un tweet que se vincule a sí mismo sin usar ningún acortador de URL, pero estimando el tweet id tu tweet?
Ming-Tang

Respuestas:


34

Bash + coreutils + navegador Lynx, 61 bytes

Gracias a @FDinoff por los consejos:

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

44
¿Y qué sucede si escribo esa palabra mágica que grep está buscando?
Sombra

3
lynx lynx lynx lynx. Este comentario será eliminado (y también el encabezado)
ζ--

1
@hexafraction Awww. ¡Tenías que ir y arruinarlo!
Sombra

8
Esta url debería funcionar. codegolf.stackexchange.com/posts/28164/bodyE ignora los comentarios. También creo que está dentro de las reglas que puedes usarlo ...
FDinoff

3
@DigitalTrauma awww ... maldición.
haneefmubarak

22

Rubí, 155 186 195 148 138 110 97 caracteres

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

Tuve que hacerlo una línea, porque de lo contrario, generaría nuevas líneas como en \nlugar de nuevas líneas reales.

  • +31 caracteres porque no noté que algunos personajes se estaban escapando.
  • +9 personajes para deshacerte de la molesta barra invertida.
  • Gracias a Nathan Osman por guardar 2 caracteres, y Ventero por guardar 55 (!!!) al eliminar la necesidad de la mayoría de las correcciones enumeradas anteriormente.

La explicación

Vamos a embellecer esto un poco primero. Sin embargo, voy a tener que usar una notación algo ... interesante en este código. No puedo usar punto y coma en absoluto en esta publicación, por razones explicadas más adelante, por lo que usaré {SEMI}en lugar de punto y coma.

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

Muy bien, ahora pasemos por esto. Las primeras dos líneas se explican por sí mismas: obtienen el texto HTML de esta respuesta.

Ahora, la última línea es la interesante aquí. ¿Ves ese punto y coma aparentemente inútil al final del código? Es absolutamente necesario, y he aquí por qué.

Primero, resp.matchextrae el código a imprimir. La expresión regular se utiliza para esto es el truco: /req.+{SEMI}/. Toma el inicio del código REQuire'net/http', al buscar req( retomaría mi REputation). Luego, encuentra el final del código buscando un punto y coma. Como +es codicioso por defecto, continuará hasta que encuentre el punto y coma que significa el final del código. ¿Ves por qué ya no puedo usar punto y coma?

Después de eso, no tengo que escapar de nada gracias a la solución de Ventero de no usar \más. Todo lo que tengo que hacer es arreglar el {AMPERSAND}cambio {AMPERSAND}amp{SEMI}, lo que se puede lograr simplemente quitando la amp{SEMI}pieza. Ya no hay necesidad de esto debido a la nueva URL. ¡Después de eso, el código original ha sido recuperado! (Nota: tampoco puedo usar el ampersand, porque eso se codifica en HTML, lo que hace que se cree un punto y coma).


Algunos personajes se están escapando ...
Aditsu

1
@aditsu Gah; No me di cuenta de eso. Fijo.
Pomo de la puerta

Vas a odiar esto ... una barra invertida se está duplicando. También hay una diferencia de nueva línea, pero eso es algo menor.
aditsu

@aditsu Argh! : P Corregido también. Lo de la nueva línea es por puts; se podría arreglar con printpero meh. Solo finja que hay una nueva línea final en el código, aunque SE no podrá mostrarlo.
Pomo de la puerta

1
Para el enlace, http://codegolf.stackexchange.com/a/28159daría el mismo resultado que el suyo y ahorraría algunos caracteres.
Mhmd

20

PowerShell - 69 62

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

DOM en una concha. ¡Agradable!
fregante

¿Irm no requiere Azure Rights Management? Sin ese módulo, creo que podría hacerlo con Invoke-WebRequest.
Scott Leadley

@ScottLeadley irmes el alias Invoke-RestMethody se introdujo con PowerShell v3 core. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Santo cielo. Una respuesta de golf de código de PowerShell con una longitud en el mismo orden de magnitud que las respuestas principales. +1
Adam Maras

@AdamMaras Ja, sé lo que quieres decir! Sin embargo, sucede ocasionalmente. codegolf.stackexchange.com/a/26811/4565 y codegolf.stackexchange.com/a/21982/4565 no estaban demasiado lejos del liderazgo.
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))

Se ejecuta en la consola de su navegador web en esta página. Probado en los últimos Chrome y Firefox .

editar: +28 bytes para agregar el dominio completo.

A Firefox ya no le gusta mi truco de URL de Regex con esta actualización :(

Aquí está la solución de 86 bytes que rompe las reglas:

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

Eso me asombró. Varias veces.
fregante

1
@ bfred.it Acabo de cortar un byte usando una expresión regular interesante. Espero que te asuste una vez más.
nderscore

Si imprimir en la consola es un método aceptable de salida, puede acortar 7 caracteres eliminando la alerta.
Tejas Kale

Además, de acuerdo con la nueva regla, debe agregarla codegolf.stackexchange.com/a la URL.
Tejas Kale

1
@TejasKale Por lo que he visto, la gente desaprueba las soluciones que en realidad no alertan / document.write / console.log la respuesta.
nderscore

10

Ruby + wget + gunzip , 159 86 82 71

Usando la punta de @FDinoff para usar http://codegolf.stackexchange.com/posts/28173/body.

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

Probado Gracias a @ace y @Bob por la optimización de la línea de comandos.


2
Puede combinar las banderas en wget, como en wget -qO- url. Además, en bash no necesita las comillas dobles para la URL, por lo que esto también puede funcionar para usted.
ace_HongKongIndependence

Puedes dejar de lado el http://.
Bob

6

CJam - 53

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

Estoy haciendo este wiki de la comunidad ya que estoy respondiendo mi propia pregunta y realmente no quiero competir: p
Créditos a FDinoff para la elección de URL.


Woot, +1 por cara sonriente en código
Cruncher

1
@Cruncher );no me parece muy sonriente ...
MD XF

5

Rebmu, 91 caracteres

Debido al Catch-22, tengo que publicar para obtener la URL de esta respuesta. :-/ Ok, lo tengo.

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

Rebmu es un dialecto de Rebol, y puedes leer todo sobre él . El Rebol equivalente aquí sería:

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 es una especie de respuesta altamente alfabetizada a RegEx. Comienza una posición de analizador de la entrada (que puede ser cualquier serie, incluidos bloques estructurales ... datos binarios ... o tipos de cadena) . Las reglas son un lenguaje sobre cómo se mueve la posición de análisis.

Las etiquetas y las URL son realmente solo cadenas debajo del capó en el idioma. Pero tienen "sabor", y como Rebol se escribe dinámicamente, puede verificar ese tipo. READ, por ejemplo, sabe que si le da una cadena con sabor a URL, debe enviarla a un controlador de esquema para que realice la lectura. (En este caso, el registrado para HTTP). Obtiene los bytes UTF-8 de forma predeterminada, por lo que usamos to-string para decodificar eso y obtener una serie de puntos de código en una cadena Unicode normal.

En el caso del dialecto de análisis, encontrar un tipo de etiqueta solo coincide como si fuera una cadena que se parecía a la etiqueta. THRU es una instrucción que significa "omitir hasta que coincida la regla resultante, y luego colocar la posición de coincidencia al final de lo que acaba de coincidir". (TO es el análogo que coincide, pero deja la posición de análisis antes del elemento).

Así que corremos más allá del <a name="28154">. Luego pasamos rápidamente a la siguiente aparición de <code>, con nuestra posición de análisis ahora ubicada justo después de >. El comando COPY de PARSE nos permite copiar datos a otra regla, en este caso esa regla es [TO </code>]... así que ingresamos a la variable C todo hasta justo antes de eso <.

Genial , ¿eh? :-)

Técnicamente, podría ahorrar más, por ejemplo, al buscar TO "</"y eso ahorra tres caracteres: no hay necesidad de hacer coincidir toda la </code>etiqueta final cuando </lo haría. Argumentos similares podrían hacerse para la etiqueta de inicio. Pero Rebmu tiene que ver con el golf alfabetizado ... ¡aunque parezca extraño al principio!

ACTUALIZACIÓN : el /bodytruco está fuera de la bolsa, pero igualmente lo dejaré como está ... porque creo que es más educativo de esta manera.


5

Java ahora 634, 852, era 1004

El código ha sido actualizado; Gracias por las sugerencias. Golfizado: ahora reemplaza & 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

Sometiéndome a prueba, lo editaré e intentaré jugar golf en breve. Necesitaba cambiar x> 1 a x> 2 porque la cadena de prueba también está en mi código. Nota: El código de golf reemplaza> símbolo a & 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

77
¿Cómo manejas los comentarios que contienen //bacchus?
ζ--

3
Podría incorporar muchas cosas, probar con recursos y usar *importaciones para guardar una gran cantidad de código.
Simon Kuang

@SimonKuang: también dejaría las transmisiones abiertas en lugar de cerrar cosas. Además, en throws Exceptionlugar de tratar de manejar cualquier cosa. Además, creo que usar un escáner en lugar de un BufferedReader sería más simple, especialmente porque podría establecer el delimitador //bacchus, lo que facilitaría las cosas ...
Julio

5

Python, 175 167 bytes

Esto usa dos bibliotecas externas; No leí que no estaba autorizado.

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

Código más largo pero más bonito:

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
El questionsen la url se puede reemplazar con q:http://codegolf.stackexchange.com/q/28154
Justin

1
El espacio en bs4, requests(línea 1) se puede eliminar para reducir 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()

Se ejecuta en esta página.


¿Cómo lo ejecutas?
aditsu

@aditsu Se supone que debe ejecutarse en la consola JavaScript de un navegador. Pero todavía lo estoy probando (y arreglando), por favor espere
Ace_HongKongIndependence

@aditsu Debería funcionar ahora. Abra la consola de su navegador (presione F12) y pegue este código allí.
ace_HongKongIndependence

Señor, necesita una if(this.readyState == this.DONE)función dentro.
Fabricio

1
@ace Ya veo :) No vi la respuesta de otros js hasta ahora. Entonces toma este
voto positivo

4

Haskell, 563613 bytes

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"

Probado Tiene soporte de página a través de la función "publicaciones más antiguas". Utiliza una estructura de línea de quine para encontrar qué imprimir. El import Control.Monades solo porque se >>=genera &gt;en HTML.


4

Javascript + jQuery, 87 , 67

No estoy seguro de si puedo usar jQuery, pero:

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

Javascript + jQuery, si se supera en esta página: 27 , 25

Por diversión, si se superaría aquí:

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

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


1
Esto genera más que el código fuente.
nderscore

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

Tienes razón, erróneamente asumí toda la respuesta en lugar del código
Martijn


3

Dart, 164

Pensé que probaría esto en Dart, es bastante divertido de usar imo.

Esto se puede ejecutar en la consola en DartEditor, pero requiere el paquete http agregado en 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ón sin golf:

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 caracteres

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

No hay magia real aquí: toma el valor del campo entre las etiquetas html <code></code>. Utiliza la biblioteca XML(como se puede ver en el código, obviamente). Emite el resultado como 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 versión mejorada de la respuesta de bacchusbeale que:

  • no cierra recursos innecesariamente
  • no declara variables innecesarias
  • usa a Scannerpara evitar tener que pasar por la entrada
  • usa una expresión regular que no coincide para evitar tener que omitir una aparición intermedia del marcador de inicio / finalización.

Actualizado:

  • Utilice una URL directa a la publicación, por lo que no necesitamos un comentario único para identificar el inicio / final del código; ahora se usa <code>[...]</code>como delimitador para buscar (en realidad usando la expresión regular "./?[cfont>ode\W", para evitar tener que decodificar &lt;y &gt;- la "\ W" es necesaria en lugar de la más corta "." para evitar que una parte de la URL coincida con la publicación, desafortunadamente, que cuesta 2 caracteres, y los corchetes alrededor de c evitan que la expresión regular coincida).

1
Tienes un montón de espacios innecesarios. Además, tu clase no necesita ser pública.
Aditsu

1
openConnection (). getInputStream () también se puede acortar a openStream ()
aditsu

1

w3m 55 bytes

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

Basado en @DigitalTrauma


1

Rubí, 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

Estoy bastante seguro de que puede eliminar algunos espacios aquí y allá para guardar algunos bytes.
MisterBla

@richard a quien le importa No voy a ganar de todos modos.
Mhmd

1
Hazlo por los lols, no por ganar.
MisterBla

@RichardA hecho, y también eliminé algunos caracteres de la expresión regular.
Mhmd

1

Procesamiento, 90

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

Editar: ¡ Finalmente lo tengo!


1

bash + awk, 71 bytes

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

2
No parece funcionar, emite muchas otras cosas junto con esta respuesta.
Riking

@Riking verdad, parece ser dependiente de la posición (romper la última regla)
Aditsu

Puedes dejar de lado el http://.
Bob

@ user155406: tenga en cuenta que cada respuesta tiene una URL: esta es 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)

Esto funciona suponiendo que la página se cargue en menos de 99 ms. También debe ejecutarse a través de una consola abierta en una página codegolf.SE, debido a la misma política de origen.


Solo una nota: no necesita la babosa en la URL, y las preguntas se pueden reemplazar por q.
Cisma

1
Tenga en cuenta que podría hacerlo en http://codegolf.stackexchange.com/a/28160lugar dehttp://codegolf.stackexchange.com/a/28160/12551
Justin

A Chrome no le gusta esto: "Error de tipo no capturado: no se puede leer la propiedad 'documento' de indefinido"
Spedwards

@Spedwards deberías deshabilitar el bloqueador de ventanas emergentes.
nderscore

0

Perl 5.10, 155 127 122 117 bytes

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

Utilizando XML::LibXML.


0

Shell y xmllint, 82 bytes

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

0

Pitón, 164

Funciona extrayendo el texto entre las etiquetas de código. Es bastante largo, pero siempre funcionará correctamente a menos que la página html se edite directamente o se agregue un nuevo bloque de código antes del siguiente (tener un bloque de código después no debería tener ningún efecto en la salida del programa).

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]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.