Напишіть програму, яка сама завантажує


66

Напишіть програму, яка підключається до цього сайту, завантажує ту саму відповідь, у якій вона розміщена, витягує власний вихідний код і роздруковує його. Вихід повинен бути ідентичним вихідному коду. Найкоротший код (у байтах) виграє.

Правила:

  • Заборонено забороняти URL-адреси.
  • Відповідь повинна мати звичайний формат - заголовок з назвою мови та розміром мови, необов'язковий опис, блок коду, необов'язковий опис та пояснення. Не дозволяються неприродні роздільники.
  • Вихід повинен походити з фактичного блоку коду, розміщеного на сайті.
  • Функціональність не повинна залежати від позиції у списку відповідей; він повинен працювати навіть за наявності декількох сторінок, а відповідь - не на першій.
  • Нове: спеціальна примітка для відповідей, які повинні запускатися в браузері: нормально вимагати запуску їх у домені codegolf (для дотримання політики того самого походження), але домен і шлях повинні бути включені в рішення, щоб зробити це справедливим.

39
Catch-22: Як я повинен перевірити свою заявку?
Мартін Ендер

9
Я забуваю, щоб люди публікували відповіді та видаляли їх, щоб вони могли перевірити свій код.
Джастін

4
@ m.buettner відповіді можна перевірити на інші відповіді (на інші запитання) спочатку, потім опубліковані, потім відредаговані, щоб змінити URL :)
aditsu

8
@hexafraction якщо коментарі можуть перешкоджати відповіді, то відповідь не дуже хороша ...
aditsu

17
Питання застрягло в моїй голові: Як написати твіт, який посилається на себе, не використовуючи жодних скорочувачів URL-адрес, але, оцінивши ідентифікатор твіт, який ви твітте?
Мінг-Тан

Відповіді:


34

Bash + coreutils + браузер Lynx, 61 байт

Дякуємо @FDinoff за поради:

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

4
А що станеться, якщо я набираю це чарівне слово grep?
Тінь

3
рись рись рись рись. Цей коментар буде вимкнено (а також заголовок)
ζ--

1
@hexafraction Awww. Вам довелося піти і погубити це!
Тінь

8
Ця URL-адреса має працювати. codegolf.stackexchange.com/posts/28164/bodyІ ігнорує коментарі. Я також думаю, що це в межах правил, якими ви можете користуватися ...
FDinoff

3
@DigitalTrauma awww ... чорт.
haneefmubarak

22

Рубі, 155 186 195 148 138 110 97 97 символів

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

Мені довелося зробити це одним рядком, бо в іншому випадку він виводитиме нові рядки як \nзамість фактичних нових рядків.

  • +31 символ, тому що я не помітив, що деякі символи рятуються.
  • +9 символів, щоб позбутися від дратівливої ​​косої риски.
  • Дякуємо Натану Осману за збереження 2 символів та Вентеро за економію 55 (!!!), усунувши потребу в більшості перелічених вище виправлень.

Пояснення

Давайте трохи спочатку розберемо це. Однак мені доведеться використовувати дещо ... цікаві позначення в цьому коді. Я не можу використовувати крапки з комою взагалі в цій публікації з причин, пояснених пізніше, тому {SEMI}замість крапки з комою я буду використовувати .

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

Добре, тепер давайте пройдемося по цьому. Перші два рядки досить зрозумілі - вони отримують текст цієї відповіді в HTML.

Тепер останній рядок тут цікавий. Ви бачите той, здавалося б, марний крапку з комою в кінці коду? Це абсолютно потрібно, і ось чому.

Спочатку resp.matchвитягує код для друку. Регулярний вираз він використовує для цього трюк: /req.+{SEMI}/. Він захоплює початок коду, REQuire'net/http'шукаючи req( reсхопив би мого REputation). Потім він знаходить кінець коду, шукаючи крапку з комою! Оскільки +за замовчуванням жадібний, він продовжуватиме роботу, поки не знайде крапку з комою, що означає кінець коду. Подивіться, чому я більше не можу використовувати крапки з комою?

Після цього мені більше не доведеться знімати пейзаж завдяки виправленню Вентеро більше не використовувати \. Все, що мені потрібно зробити, це {AMPERSAND}змінити виправлення {AMPERSAND}amp{SEMI}, що можна досягти, просто знявши amp{SEMI}деталь. У цьому немає необхідності через нову URL-адресу. Після цього вихідний код було отримано! (Примітка. Я також не можу використовувати амперсанд, тому що він кодується HTML, що спричиняє створення крапки з комою.)


Деякі персонажі рятуються втечею ..
aditsu

1
@aditsu Gah; цього не помічав. Виправлено.
Дверна ручка

Ви будете ненавидіти це. Зворотна косого кута стає дублюватися. Існує також різниця в новому рядку, але це незначна річ.
адіцу

@aditsu Argh! : P Виправлено також. Нова річ - через puts; це можна було б виправити, printале мех. Просто зробіть вигляд, що в коді є зворотний новий рядок, навіть якщо SE не зможе його показати.
Дверна ручка

1
Для посилання http://codegolf.stackexchange.com/a/28159це дало б такий самий результат, як і ваш, і зберегло б деякі характеристики.
Mhmd

20

PowerShell - 69 62

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

DOM в оболонці. Приємно!
fregante

Не вимагає управління правами Azure? Без цього модуля, я думаю, ви могли б зробити це за допомогою Invoke-WebRequest.
Скотт Лідлі

@ScottLeadley irm- псевдонім для Invoke-RestMethodі був представлений з ядром PowerShell v3. computerperformance.co.uk/powershell/powershell3-alias.htm
Rynant

10
Святе гімно. Відповідь коду PowerShell на гольф із довжиною в тому ж порядку, що й ведучі. +1
Адам Марас

@AdamMaras Ха, я знаю, що ти маєш на увазі! Однак це трапляється іноді. codegolf.stackexchange.com/a/26811/4565 та codegolf.stackexchange.com/a/21982/4565 були не надто далеко від ведучих.
Рінант

15

JavaScript - 123 122 101 95 92 91 87 87 114

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

Працює в консолі веб-браузера на цій сторінці. Тестовано на останніх Chrome і Firefox .

редагувати: +28 байт, щоб додати повний домен.

Firefox більше не любить мій трюк URL-адрес Regex із цим оновленням :(

Ось 86-байтне рішення щодо порушення правил:

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

Це викликало в мене побоювання. Кілька разів.
fregante

1
@ bfred.it Я просто вирізав байт, використовуючи цікавий регулярний вираз. Я сподіваюся, що це змусить вас побоятися ще раз.
nderscore

Якщо друк на консолі є прийнятним способом виводу, ви можете скоротити його на 7 символів, знявши попередження.
Техас Кале

Крім того, згідно з новим правилом ви повинні додати codegolf.stackexchange.com/URL-адресу.
Техас Кале

1
@TejasKale З того, що я бачив, люди нахмурилися на рішення, які насправді не насторожують / document.write / console.log відповіді.
nderscore

10

Ruby + wget + gunzip , 159 86 82 71

Використовуючи підказку @FDinoff для використання http://codegolf.stackexchange.com/posts/28173/body.

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

Випробуваний. Дякуємо @ace та @Bob за оптимізацію командного рядка.


2
Ви можете комбінувати прапори wget, як і в wget -qO- url. Крім того, в bash вам не потрібні подвійні лапки для URL-адреси, тому це може працювати і для вас.
ace_HongKongIndependence

Ви можете залишити їх http://.
Боб

6

CJam - 53

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

Я роблю цю вікі спільноти, оскільки відповідаю на власне запитання і не хочу дуже конкурувати: p
Кредити FDinoff для вибору URL-адреси.


Вут, +1 для смайлика в коді
Cruncher

1
@Cruncher );не виглядає дуже смайливим для мене ...
MD XF

5

Ребму, 91 персонаж

Через Catch-22 я маю повідомлення, щоб отримати URL-адресу цієї відповіді. : - / Гаразд, зрозумів.

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

Ребму - це діалект Ребола, і ви можете прочитати все про нього . Еквівалент Rebol тут був би:

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

PARSE Rebol - це свого роду високограмотна відповідь на RegEx. Він починає синтаксичний аналіз вхідного сигналу (який може бути будь-якої серії, включаючи структурні блоки ... двійкові дані ... або типи рядків) . Правила - це мова про те, як рухається позиція розбору.

Теги та URL-адреси насправді є лише рядками під капотом мови. Але вони "ароматизовані", і як динамічно набирається Rebol, ви можете перевірити цей тип. Наприклад, "READ" знає, що якщо ви дасте йому рядок з ароматизованою URL-адресою, тоді він повинен відправити обробник схеми для читання. (У цьому випадку той, який зареєстрований на HTTP). Ви отримуєте назад байти UTF-8 за замовчуванням, тому ми використовуємо to-string для його декодування та отримання серії кодових точок у звичайному рядку Unicode.

У випадку з діалектом розбору, зустрічаючи тип тегу, просто узгоджується так, ніби це був рядок, схожий на тег. THRU - це інструкція, що означає "пропустити, поки відповідне правило, а потім розташувати позицію матчу в кінці того, що ти щойно відповідав". (TO - аналог, який відповідає, але залишає позицію розбору перед елементом).

Тож ми прошиваємо повз повз <a name="28154">. Тоді ми прошиваємо повз наступне виникнення <code>, і наше положення розбору тепер знаходиться відразу після >. Команда PARSE COPY потім дозволяє нам копіювати дані до іншого правила, в цьому випадку це правило є [TO </code>]... тому ми потрапляємо в змінну C все до прямо до цього <.

Класно , так? :-)

Технічно я міг би більше відголити його, наприклад, шукаючи, TO "</"і це економить три символи - немає потреби узгоджувати весь </code>кінцевий тег, коли </це робиться. Подібні аргументи я міг би зробити для стартового тегу. Але Ребму - це грамотний гольф ... навіть якщо вам здається, що це спочатку дивно!

ОНОВЛЕННЯ : /bodyтрюк вийшов із сумки, але я аналогічно збираюся залишити його таким, який є ... тому що я вважаю, що це більш навчально.


5

Яві зараз 634, 852, було 1004

Код оновлено; дякую за пропозиції Golfed: тепер замінює & gt на>

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

Подавши тестування, я незабаром відредагую і спробую гольф. Потрібно змінити x> 1 на x> 2, оскільки тестовий рядок також є в моєму коді. Примітка: Код гольфу замінює> символ на & 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
Як ви обробляєте коментарі, що містять //bacchus?
ζ--

3
Ви можете вбудувати багато матеріалів, спробувати ресурси і використовувати *імпорт, щоб зберегти багато коду.
Саймон Куанг

@SimonKuang - Я також просто залишаю потоки відкритими, а не закривати речі. Крім того, throws Exceptionа не намагатися впоратися з чим-небудь. Крім того, я думаю, що використання сканера, а не BufferedReader було б простіше, тим більше, що ви можете встановити роздільник //bacchus, що полегшить дещо легше ...
Jules

5

Пітон, 175 167 байт

Для цього використовуються дві зовнішні бібліотеки; Я не читав, що це було несанкціоновано.

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

Більш довгий, але приємніший код:

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
questionsВ URL можна замінити q:http://codegolf.stackexchange.com/q/28154
Джастін

1
Простір у bs4, requests(рядок 1) можна видалити, щоб зменшити 1 байт.
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()

Працює на цій сторінці.


Як ти це запускаєш?
aditsu

@aditsu Він повинен працювати на консолі JavaScript браузера. Але я все ще тестую (і виправляю) це, будь ласка, зачекайте
ace_HongKongIndependence

@aditsu Це має працювати зараз. Відкрийте консоль браузера (натисніть F12) і вставте цей код туди.
ace_HongKongIndependence

ви, сер, потребуєте if(this.readyState == this.DONE)всередині функції.
Fabricio

1
@ace Я бачу :) Досі я не бачив відповіді інших js. Тоді візьміть цю заяву від мене
C5H8NNaO4

4

Haskell, 563 613 байт

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"

Випробуваний. Має підтримку сторінки за допомогою функції "найстаріші повідомлення". Використовує структуру лінії-лінії, щоб знайти, що друкувати. Це import Control.Monadлише тому, що >>=генерується &gt;в HTML.


4

Javascript + jQuery, 87 , 67

Я не впевнений, що мені дозволяється використовувати jQuery, але:

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

Javascript + jQuery, якщо викладені на цій сторінці: 27 , 25

Для розваги, якби тут було виправдано:

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

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


1
Це виводить більше, ніж вихідний код.
nderscore

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

Ви маєте рацію, я неправильно припустив всю відповідь замість коду
Martijn


3

Дарт, 164

Я думав, що спробую це у Dart, користуватися imo досить весело.

Це можна запустити в консолі в DartEditor, але для цього потрібно http-пакет, доданий у 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));});}

Негольована версія:

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 символів

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

Тут немає ніякої реальної магії: вона приймає значення поля між html-тегами <code></code>. Використовує бібліотеку XML(як це очевидно в коді). Виводить результат як stdout.


1

Ява, 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());}}

Удосконалена версія відповіді бакхусбіла, яка:

  • не закриває ресурси без потреби
  • не оголошує зайвих змінних
  • використовує a, Scannerщоб уникнути необхідності перемикання на вхід
  • використовує регулярний вираз, який не відповідає собі, щоб уникнути необхідності пропускати над середнім появою маркера початку / кінця.

Оновлено:

  • Використовуйте пряму URL-адресу до публікації, тому нам не потрібен унікальний коментар, щоб визначити початок / кінець коду; тепер використовує в <code>[...]</code>якості роздільників для пошуку ( на насправді , використовуючи регулярний вираз «./?[c]ode\W», з тим , щоб уникнути необхідності декодувати &lt;і &gt;- символ "\ W" необхідно , а не коротше «» щоб уникнути відповідності частини URL-адреси до публікації, на жаль, яка коштує 2 символи, а квадратні дужки навколо c запобігають відповідності регулярного виразу).

1
У вас є купа непотрібних пробілів. Також ваш клас не повинен бути загальнодоступним.
aditsu

1
openConnection (). getInputStream () також можна скоротити до openStream ()
aditsu

1

w3m 55 байт

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

На основі @DigitalTrauma


1

Рубі, 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

Напевно, ви можете видалити кілька місць тут і там, щоб зберегти кілька байтів.
МістерБла

@richard кого байдуже я все одно не виграю.
Mhmd

1
Зробіть це для лолів, а не для виграшу.
МістерБла

@RichardA зробив, і я також видалив кілька символів з регулярного виразу.
Mhmd

1

Обробка, 90

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

Редагувати: Нарешті зрозумів!


1

bash + awk, 71 байт

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

2
Це, здається, не працює - разом з цією відповіддю виводиться багато іншого.
Рікінг

@ Як правило, це здається залежним від позиції (порушення останнього правила)
aditsu

Ви можете залишити їх http://.
Боб

@ user155406: зауважте, що кожна відповідь має URL-адресу - це 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)

Це працює за умови, що сторінка завантажується менше ніж 99 мс. Її також потрібно запустити через консоль, відкриту на сторінці codegolf.SE, через ту саму політику походження.


Лише зауваження: в URL-адресі вам не потрібна слизька, а питання можна замінити на q.
Схизм

1
Зауважте, що ви могли зробити це http://codegolf.stackexchange.com/a/28160замістьhttp://codegolf.stackexchange.com/a/28160/12551
Джастін

Chrome не любить цього: "Uncaught TypeError: Неможливо прочитати" документ "властивості" невизначеного "
Spedwards

@Spedwards слід вимкнути блокувальник спливаючих вікон.
nderscore

0

Perl 5.10, 155 127 122 117 байт

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

Використання XML::LibXML.


0

Shell і xmllint, 82 байти

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

0

Пітона, 164

Працює шляхом вилучення тексту між кодовими тегами. Він досить довгий, але він завжди буде функціонувати правильно, якщо тільки сторінку HTML не буде відредаговано безпосередньо або не буде додано новий код коду перед тим, що наведено нижче (наявність блоку коду після не повинна впливати на вихід програми).

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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.