दुनिया का सबसे छोटा वेब ब्राउज़र


72

पृष्ठभूमि की कहानी:

आप मेगा-कॉरपोरेशन में अपनी नई प्रोग्रामिंग नौकरी का आनंद लेते हैं। हालाँकि, आपको वेब ब्राउज़ करने की अनुमति नहीं है क्योंकि आपके कंप्यूटर में केवल एक CLI है। वे सभी कर्मचारियों की हार्ड ड्राइव के स्वीप भी चलाते हैं, इसलिए आप बस एक बड़े सीएलआई वेब ब्राउज़र को डाउनलोड नहीं कर सकते। आप एक सरल पाठ्य ब्राउज़र बनाने का निर्णय लेते हैं जो जितना संभव हो उतना छोटा हो ताकि आप इसे याद कर सकें और इसे हर दिन एक अस्थायी फ़ाइल में टाइप कर सकें।

चुनौती:

आपका कार्य कमांड लाइन इंटरफ़ेस के भीतर एक गोल्फ वेब ब्राउज़र बनाना है। यह होना चाहिए:

  • Args या stdin के माध्यम से एक ही URL लें
  • URL के घटकों directoryऔर hostघटकों को विभाजित करें
  • hostउक्त अनुरोध करने के लिए एक सरल HTTP अनुरोध भेजेंdirectory
  • किसी भी <p>अनुच्छेद </p>टैग की सामग्री प्रिंट करें
  • और या तो बाहर निकलें या दूसरे पेज के लिए पूछें

और जानकारी:

एक साधारण HTTP अनुरोध इस तरह दिखता है:

GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n

अंत में नई कहानियों पर जोर दिया गया।

एक विशिष्ट प्रतिक्रिया की तरह दिखता है:

HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page

नियम:

  • यह केवल पोर्ट 80 पर काम करने की जरूरत है (कोई SSL की आवश्यकता नहीं)
  • आप netcat का उपयोग नहीं कर सकते हैं
  • जो भी प्रोग्रामिंग भाषा का उपयोग किया जाता है, केवल निम्न-स्तरीय टीसीपी एपीआई की अनुमति है (नेटकैट को छोड़कर)
  • आप GUI का उपयोग नहीं कर सकते हैं , याद रखें, यह एक CLI है
  • आप HTML पार्सर का उपयोग नहीं कर सकते हैं, बिलिन वाले को छोड़कर (सुंदरसुंदर एक बिल्डिन नहीं है)
  • बोनस !! यदि आपका प्रोग्राम वापस लौटता है और बाहर निकलने के बजाय दूसरे URL के लिए कहता है, -40 चार्ट (जब तक आप पुनरावृत्ति का उपयोग नहीं करते हैं)
  • कोई तृतीय-पक्ष कार्यक्रम नहीं। याद रखें, आप कुछ भी स्थापित नहीं कर सकते।
  • , इसलिए सबसे छोटी बाइट गिनती जीतती है

7
पायथन,import webbrowser;webbrowser.open(url)
ब्लू

8
@ मुडफिश ने नियम पढ़े
TheDoctor

4
क्या आप इसे जाँचने के लिए किसी प्रकार का नमूना वेब पेज प्रदान कर सकते हैं? उन स्थानों को ढूंढना मुश्किल है जो <p>: P
एक स्पैगेटो

52
क्या हमें regex का उपयोग करके HTML को पार्स करने की अनुमति है ? ;-)
डिजिटल ट्रॉमा

3
करने के लिए प्रतिबंध निम्न स्तर सॉकेट इंटरफेस जो टीसीपी स्तरीय एपीआई है सबसे भाषाओं के टीसीपी स्तरीय एपीआई प्रतिबंधित करने के लिए लगता है।
पीटर टेलर

जवाबों:


63

शुद्ध बैश (कोई उपयोगिता नहीं), 200 बाइट्स - 40 बोनस = 160

while read u;do
u=${u#*//}
d=${u%%/*}
exec 3<>/dev/tcp/$d/80
echo "GET /${u#*/} HTTP/1.1
host:$d
Connection:close
">&3
mapfile -tu3 A
a=${A[@]}
a=${a#*<p>}
a=${a%</p>*}
echo "${a//<\/p>*<p>/"
"}"
done

मुझे लगता है कि यह कल्पना पर निर्भर है, हालांकि रीजेक्स का उपयोग करके HTML को पार्स करने के लिए देखें। मुझे लगता है कि केवल एक चीज जो HTML को पार्स करने से भी बदतर है वह है शेल पैटर्न मिलान का उपयोग करके HTML को पार्स करना।

यह अब <p>...</p>कई लाइनों को फैलाने से संबंधित है । प्रत्येक <p>...</p>आउटपुट की एक अलग लाइन पर है:

$ echo "http://example.com/" | ./smallbrowse.sh
This domain is established to be used for illustrative examples in documents. You may use this     domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
$ 

35
आपको कल तक यह याद रखना होगा।
कॉनर ओ'ब्रायन

14
+ "खोल पैटर्न मिलान का उपयोग करके HTML को पार्स करने के लिए"
स्वस्तिक

76
-1 क्योंकि आपका अवतार अचेतन संदेश है
TheDoctor

1
... आप बैश से टीसीपी कनेक्शन कर सकते हैं? अब मैं वास्तव में भयभीत हूँ!
मैथमेटिकलऑर्चिड

2
नोट: /dev/tcpएक वैकल्पिक एक्सटेंशन है और हो सकता है कि आपके bash के निर्माण में मौजूद न हो। आपको --enable-net-redirectionsइसे संकलित करने की आवश्यकता है ।
क्रिस डाउन

21

PHP, 175 बाइट्स (215 - 40 बोनस) 227 229 239 202 216 186 बाइट्स

वेब ब्राउज़ करना मज़ेदार है:

for(;$i=parse_url(trim(fgets(STDIN))),fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1
Host:$h
Connection:Close

");preg_match_all('!<p>(.+?)</p>!si',stream_get_contents($f),$r),print join("
",$r[1])."
");

की STDINतरह से URL पढ़ता है http://www.example.com/। आउटपुट पैराग्राफ न्यूलाइन " \n" द्वारा अलग किए गए ।


Ungolfed

for(; $i=parse_url(trim(fgets(STDIN))); ) {
    $h = $i['host'];
    $f = fsockopen($h, 80);

    fwrite($f, "GET " . $i['path'] . " HTTP/1.1\nHost:" . $h . "\nConnection:Close\n\n");

    $c = stream_get_contents($f)

    preg_match_all('!<p>(.+?)</p>!si', $c, $r);
    echo join("\n", $r[1]) . "\n";
}

पहला संस्करण केवल एक URL का समर्थन करता है

$i=parse_url($argv[1]);fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1\nHost:$h\nConnection:Close\n\n");while(!feof($f))$c.=fgets($f);preg_match_all('!<p>(.+?)</p>!sim',$c,$r);foreach($r[1]as$p)echo"$p\n";

यहाँ छवि विवरण दर्ज करें


संपादित करता

  • जैसा कि ब्रेंटिस्ट द्वारा टिप्पणियों में बताया गया है , मैं पूरी तरह से पथ को शामिल करना भूल गया। यह अब तय है, धन्यवाद। 30 बाइट्स जोड़े
  • सहेजा 3 बाइट्स रीसेट करके $c(पृष्ठ की सामग्री रखती है) के साथ $c=$i=parse_url(trim(fgets(STDIN)));के बजाय $c=''
  • 12 बाइट्स\n को नई लाइनों (5 बाइट्स), एक while-लूप for(2 बाइट्स) के साथ forबदलकर , लगभग सभी चीज़ों को (2 बाइट्स) के भावों में रखकर (3 बाइट्स) के साथ सहेजा जाता है । ब्लैकहोल को धन्यवाद ।foreachjoin
  • सहेजा 3 बाइट्स की जगह fgetsके साथ stream_get_contentsधन्यवाद करने के लिए bwoebi
  • सहेजा 5 बाइट्स निकाल कर के फिर से प्रारंभ $cके रूप में यह अब कोई आवश्यकता नहीं है $c सब पर।
  • रेगेक्स से पैटर्न संशोधक को हटाकर 1 बाइट बचायाm । धन्यवाद करने के लिए manatwork


1
@briantist ओह यार, मैं पूरी तरह से याद किया। : D धन्यवाद, अब यह तय हो गया है।
सम्मिलित

1
मैं बर्दाश्त नहीं कर सकता कि पर्ल पीएचपी को हराता है, इसलिए मत भूलो: whileगोल्फिंग के दौरान मना किया जाता है ( forअक्सर छोटा होता है लेकिन कभी भी लंबा नहीं होता है), और एक न्यूलाइन करने के लिए, बस एंटर दबाएं (2 के बजाय 1 बाइट \n)! यहाँ आपका (अप्रकाशित) कोड थोड़ा अधिक गोल्फ (227 बाइट्स) है, जिसके स्थान पर नई पंक्ति है :for(;$c=$i=parse_url(trim(fgets(STDIN))),fwrite($f=fsockopen($h=$i[host],80),"GET $i[path] HTTP/1.1↵Host:$h↵Connection:Close↵↵");preg_match_all('!<p>(.+?)</p>!sim',$c,$r),print join('↵',$r[1]).'↵')for(;!feof($f);)$c.=fgets($f);
ब्लैकहोल

1
मेरा मतलब है "निषिद्ध" के रूप में "नियमों के खिलाफ" नहीं है, मेरा मतलब है कि यह बिल्कुल उपयोगी नहीं है, क्योंकि एक- forलूप हमेशा एक whileलूप से बेहतर होता है ;)।
ब्लैकहोल

1
@MichaelDibbets वास्तव में मैंने किया है कि पहले से ही संपादित में लिखा है। हम्म। मुझे देखने दो। हाहा, मैं अंतिम स्निपेट को कॉपी और गिनना भूल गया। Duh : D जैसी चीजें होती हैं, यदि आप नाश्ते से पहले अपना कोड अपडेट करते हैं। इस पर ध्यान दिलाने के लिए धन्यवाद।
सम्मिलित

14

पर्ल, 132 बाइट्स

155 बाइट्स कोड + 17 के लिए -ln -MIO::Socket- 40 लगातार यूआरएल के लिए पूछ रहे हैं

@ DigitalTrauma के उत्तर के साथ, HTML को पुन: भेजने के लिए, मुझे बताएं कि क्या यह स्वीकार्य नहीं है। URL को अधिक पार्स नहीं करता ... मैं बाद में इसे देखूंगा ... हालांकि बैश के करीब! बिग ब्वॉय @ 59 (!) बाइट्स के लिए @ @ धन्यवाद और बग को फिक्स करने के लिए @ skmrx को बोनस का दावा करने की अनुमति!

m|(http://)?([^/]+)(/(\S*))?|;$s=new IO::Socket::INET"$2:80";print$s "GET /$4 HTTP/1.1
Host:$2
Connection:close

";local$/=$,;print<$s>=~m|<p>(.+?)</p>|gs

प्रयोग

$perl -ln -MIO::Socket -M5.010 wb.pl 
example.com
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.<a href="http://www.iana.org/domains/example">More information...</a>
example.org
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.<a href="http://www.iana.org/domains/example">More information...</a>

मैंने एक बग तय किया और $ h और $ p घोषित करने की आवश्यकता को हटाते हुए कोड को छोटा कर दिया या एक डिफ़ॉल्ट पथ है। यह भी अब मेजबान पर एक अनुगामी / की आवश्यकता नहीं है।
श्वर्न

1
हम अब हरा सकते हैं। :)
श्वर्न

मुझे लगता है कि मैं रात के लिए कर रहा हूं। :)
श्वर्न

चूंकि स्क्रिप्ट बाहर निकलने के बजाय दूसरे URL के लिए पूछती है, आप अतिरिक्त -40 बाइट्स का दावा कर सकते हैं
svsd

1
@DigitalTrauma आप वास्तव में सही हैं! मैंने '$ / ’के साथ अपने बग को ठीक करने के लिए बोनस धन्यवाद के लिए धन्यवाद दिया है और अगर यह Schernern के लिए नहीं होता तो मैं आपके पास नहीं होता!
डोम हेस्टिंग्स

13

पॉवरशेल, 315 294 268 262 254 बाइट्स

355 334 308 302 294 - 40 प्रॉम्प्ट के लिए

$u=[uri]$args[0]
for(){
$h=$u.Host
$s=[Net.Sockets.TcpClient]::new($h,80).GetStream()
$r=[IO.StreamReader]::new($s)
$w=[IO.StreamWriter]::new($s)
$w.Write("GET $($u.PathAndQuery) HTTP/1.1
HOST: $h

")
$w.Flush()
($r.ReadToEnd()|sls '(?s)(?<=<p>).+?(?=</p>)'-a).Matches.Value
[uri]$u=Read-Host
}

PowerShell v5 की आवश्यकता है

सभी लाइन एंडिंग (स्ट्रिंग में एम्बेडेड वाले सहित) केवल newlines हैं \n(धन्यवाद ब्लैकहोल ) जो कि PowerShell द्वारा पूरी तरह से समर्थित है (लेकिन यदि आप परीक्षण कर रहे हैं, तो सावधान रहें; ISE उपयोग करता है \r\n)।


4
+1 बनाने के लिए अपने सर्वर व्यवस्थापक कर्तव्यों और अधिक उत्पादक दिखाई
thanby

HTTP को CRLF की आवश्यकता है, LF की नहीं! [ HTTPSYNTAX ]
टूथब्रश

2
@toothbrush हा! बिंदु लिया गया, लेकिन सहिष्णुता प्रावधान पूरे प्रभाव में दिख रहा है। स्पष्ट रूप से यह कार्य इस बारे में है कि क्या काम करता है और क्या सही नहीं है (अन्यथा हम HTML को regex के साथ पार्स नहीं करेंगे और अच्छी तरह से परीक्षण किए गए मौजूदा पुस्तकालयों के बजाय निम्न स्तर के टीसीपी पुस्तकालयों का उपयोग करेंगे)।
ब्रितानी

1
@briantist greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.5 का कहना है कि "प्राप्तकर्ता MAY एक एकल LF को लाइन टर्मिनेटर के रूप में पहचानता है और किसी पूर्ववर्ती CR को अनदेखा करता है"। मैंने पढ़ा कि अर्थ के रूप में अधिकांश वेब सर्वर इसे लागू करेंगे, और सवाल निश्चित रूप से यह नहीं कहता है कि यह सही GET अनुरोध उत्पन्न करना चाहिए ... :)
टूथब्रश

8

ग्रूवी स्क्रिप्ट, 89 , 61 बाइट्स

बोनस 101- 40 = 61 के लिए लूप बैक

System.in.eachLine{l->l.toURL().text.findAll(/<p>(?s)(.*?)<\/p>/).each{println it[3..it.length()-5]}}

सिर्फ आर्ग के साथ, 89 बाइट्स

this.args[0].toURL().text.findAll(/<p>(?s)(.*?)<\/p>/).each{println it[3..it.length()-5]}

1
ग्रूवी ने सभी को पछाड़ दिया। जैसा कि इसे होना चाहिए।
एक spaghetto

1
@quartata यदि यह इस तरह से रहता है, तो यह पहली बार होगा , इसलिए ...;)
भूतकाल

11
"केवल निम्न-स्तरीय टीसीपी एपीआई की अनुमति है"
डिजिटल ट्रॉमा

हाँ, मैं @DigitalTrauma से सहमत होने जा रहा हूँ कि यह एक निम्न-स्तरीय TCP API का उपयोग नहीं कर रहा है। नियम कहते हैं कि आपको अपने दम पर मेजबान और पथ को विभाजित करना होगा।
TheDoctor

6

बैश (धोखा दे सकता है लेकिन नियमों के भीतर लगता है) 144-40 = 105

while read a;do
u=${a#*//}
d=${u%%/*}
e=www.w3.org
exec 3<>/dev/tcp/$d/80
echo "GET /services/html2txt?url=$a HTTP/1.1
Host:$d
">&3
cat <&3
done

डिजिटल ट्रामा के लिए धन्यवाद।

चूंकि मुझे URL को विभाजित करने की आवश्यकता नहीं है, यह भी काम करता है: 122-40 = 82

while read a;do
d=www.w3.org
exec 3<>/dev/tcp/$d/80
echo "GET /services/html2txt?url=$a HTTP/1.1
Host:$d
">&3   
cat <&3
done

8
मेरा तर्क है कि इस ऑनलाइन html2txt कन्वर्टर का उपयोग करना एक मानक
डिजिटल ट्रॉमा

1
हाँ। और मैं भी बिल्ली का उपयोग करता हूं ताकि आपका समाधान सुरक्षित हो।
दार्शनिकोर्न

5

सी 512 बाइट्स

#include <netdb.h>
int main(){char i,S[999],b[99],*p,s=socket(2,1,0),*m[]={"<p>","</p>"};long n;
gets(S);p=strchr(S,'/');*p++=0;struct sockaddr_in a={0,2,5<<12};memcpy(&a.
sin_addr,gethostbyname(S)->h_addr,4);connect(s,&a,16);send(s,b,sprintf(b,
"GET /%s HTTP/1.0\r\nHost:%s\r\nAccept:*/*\r\nConnection:close\r\n\r\n",p,S),0);
p=m[i=0];while((n=recv(s,b,98,0))>0)for(char*c=b;c<b+n;c++){while(*c==*p &&*++p)
c++;if(!*p)p=m[(i=!i)||puts("")];else{while(p>m[i]){if(i)putchar(c[m[i]-p]);p--;}
if(i)putchar(*c);}}} 

यहाँ मेरे प्रवेश के आधार पर , यह एक प्रमुख "https: //" के बिना वेब पता लेता है। यह नेस्टेड <p>जोड़े को सही ढंग से संभाल नहीं पाएगा :(

बड़े पैमाने पर www.w3.org/People/Berners-Lee/
इसका परीक्षण तब किया जाता है जब Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
इसके साथ संकलित किया गया यह पर्याप्त अपरिभाषित व्यवहार करता है कि यह कहीं और काम न करे।


मैं लगभग एक ही ट्रैक पर जा रहा था (यह सेगफॉल्ट जब gcc के साथ संकलित किया गया था), लेकिन सी में 400 बाइट्स के तहत प्राप्त करना संभव होना चाहिए। क्लैंग के बारे में निश्चित नहीं है, लेकिन आपको रिटर्न का मुख्य घोषित नहीं करना चाहिए। आप इसके बजाय पूर्णांक सरणियों के रूप में संरचना को शामिल और "एक्सेस" भी हटा सकते हैं। मुझे "GET /% s HTTP / 1.1 \ r \ n \ r \ n \" के साथ प्रतिक्रियाएं भी मिल रही हैं, लेकिन उस पर लाभ साइट के आधार पर भिन्न हो सकता है ...
Comintern

5

रूबी, ११ Rub

147 बाइट्स स्रोत; 11 बाइट्स ' -lprsocket'; -40 बाइट्स लूपिंग के लिए।

*_,h,p=$_.split'/',4
$_=(TCPSocket.new(h,80)<<"GET /#{p} HTTP/1.1
Host:#{h}
Connection:close

").read.gsub(/((\A|<\/p>).*?)?(<p>|\Z)/mi,'
').strip

उपयोग उदाहरण:

$ ruby -lprsocket wb.rb
http://example.org/
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
http://www.xkcd.com/1596/
Warning: this comic occasionally contains strong language (which may be unsuitable for children), unusual humor (which may be unsuitable for adults), and advanced mathematics (which may be unsuitable for liberal-arts majors).

This work is licensed under a
<a href="http://creativecommons.org/licenses/by-nc/2.5/">Creative Commons Attribution-NonCommercial 2.5 License</a>.


This means you're free to copy and share these comics (but not to sell them). <a rel="license" href="/license.html">More details</a>.

4

ऑटो इट , 347 बाइट्स

Func _($0)
$4=StringTrimLeft
$0=$4($0,7)
$3=StringSplit($0,"/")[1]
TCPStartup()
$2=TCPConnect(TCPNameToIP($3),80)
TCPSend($2,'GET /'&$4($0,StringLen($3))&' HTTP/1.1'&@LF&'Host: '&$3&@LF&'Connection: close'&@LF&@LF)
$1=''
Do
$1&=TCPRecv($2,1)
Until @extended
For $5 In StringRegExp($1,"(?s)\Q<p>\E(.*?)(?=\Q</p>\E)",3)
ConsoleWrite($5)
Next
EndFunc

परिक्षण

इनपुट:

_('http://www.autoitscript.com')

आउटपुट:

You don't have permission to access /error/noindex.html
on this server.

इनपुट:

_('http://www.autoitscript.com/site')

आउटपुट:

The document has moved <a href="https://www.autoitscript.com/site">here</a>.

टिप्पणियों

  • नेस्टेड <p>टैग का समर्थन नहीं करता है
  • केवल <p>टैग (केस-असंवेदनशील) का समर्थन करता है , हर दूसरे टैग प्रारूप पर टूट जाएगा
  • किसी भी त्रुटि के होने पर पैनिक लूप अनिश्चित काल के लिए बंद हो जाता है

4

सी #, 727 बाइट्स - 40 = 687 बाइट्स

using System.Text.RegularExpressions;class P{static void Main(){a:var i=System.Console.ReadLine();if(i.StartsWith("http://"))i=i.Substring(7);string p="/",h=i;var l=i.IndexOf(p);
if(l>0){h=i.Substring(0,l);p=i.Substring(l,i.Length-l);}var c=new System.Net.Sockets.TcpClient(h,80);var e=System.Text.Encoding.ASCII;var d=e.GetBytes("GET "+p+@" HTTP/1.1
Host: "+h+@"
Connection: close

");var s=c.GetStream();s.Write(d,0,d.Length);byte[]b=new byte[256],o;var m=new System.IO.MemoryStream();while(true){var r=s.Read(b,0,b.Length);if(r<=0){o=m.ToArray();break;}m.Write(b,0,r);}foreach (Match x in new Regex("<p>(.+?)</p>",RegexOptions.Singleline).Matches(e.GetString(o)))System.Console.WriteLine(x.Groups[1].Value);goto a;}}

यह थोड़ा प्रशिक्षण है, लेकिन निश्चित रूप से यादगार है :)

यहाँ एक ungolfed संस्करण है:

using System.Text.RegularExpressions;
class P
{
    static void Main()
    {
    a:
        var input = System.Console.ReadLine();
        if (input.StartsWith("http://")) input = input.Substring(7);
        string path = "/", hostname = input;
        var firstSlashIndex = input.IndexOf(path);
        if (firstSlashIndex > 0)
        {
            hostname = input.Substring(0, firstSlashIndex);
            path = input.Substring(firstSlashIndex, input.Length - firstSlashIndex);
        }
        var tcpClient = new System.Net.Sockets.TcpClient(hostname, 80);
        var asciiEncoding = System.Text.Encoding.ASCII;
        var dataToSend = asciiEncoding.GetBytes("GET " + path + @" HTTP/1.1
Host: " + hostname + @"
Connection: close

");
        var stream = tcpClient.GetStream();
        stream.Write(dataToSend, 0, dataToSend.Length);
        byte[] buff = new byte[256], output;
        var ms = new System.IO.MemoryStream();
        while (true)
        {
            var numberOfBytesRead = stream.Read(buff, 0, buff.Length);
            if (numberOfBytesRead <= 0)
            {
                output = ms.ToArray();
                break;
            }
            ms.Write(buff, 0, numberOfBytesRead);
        }
        foreach (Match match in new Regex("<p>(.+?)</p>", RegexOptions.Singleline).Matches(asciiEncoding.GetString(output)))
        {
            System.Console.WriteLine(match.Groups[1].Value);
            goto a;
        }
    }
}

जैसा कि आप देख सकते हैं, बोनस के रूप में मेमोरी लीक मुद्दे हैं :)


स्मृति रिसाव कहां है? मैं usingधाराओं के आसपास कोई बयान नहीं देखता हूं, लेकिन यह रिसाव नहीं करता है।
गसडॉर

आप कुछ और बाइट्स ट्रिम कर सकते हैं: input = input.trimStart ("http: //") "if" क्लॉज़ को बदल देगा, और आपको System.Text.Encoding.ASCII.GetBytes () को सीधे उपयोग किए बिना सक्षम होना चाहिए पहले इसे asciiEncoding में संग्रहीत करने के लिए। मुझे लगता है कि आप "सिस्टम का उपयोग करना" के साथ भी आगे आएंगे। लाइन और "सिस्टम" के एक मुट्ठी भर से छुटकारा।
मिनीमास

3

जावास्क्रिप्ट (NodeJS) - 187 166

s=require("net").connect(80,p=process.argv[2],_=>s.write("GET / HTTP/1.0\nHost: "+p+"\n\n")&s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/g,(_,g)=>console.log(g))));

187:

s=require("net").connect(80,p=process.argv[2],_=>s.write("GET / HTTP/1.1\nHost: "+p+"\nConnection: close\n\n")&s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/gm,(_,g)=>console.log(g))));

उपयोग:

node file.js www.example.com

या स्वरूपित किया गया

var url = process.argv[2];
s=require("net").connect(80, url ,_=> {
     s.write("GET / HTTP/1.1\nHost: "+url+"\nConnection: close\n\n");
     s.on("data",d=>(d+"").replace(/<p>([^]+?)<\/p>/gm,(_,g)=>console.log(g)))
});

1
कैविएट: यह छोटे पन्नों के लिए काम करेगा - बड़े पृष्ठ कई डेटा घटनाओं का उत्सर्जन करते हैं।
बेंजामिन ग्रुएनबाम

3

पायथन 2 - 212 209 बाइट्स

import socket,re
h,_,d=raw_input().partition('/')
s=socket.create_connection((h,80))
s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h))
p=''
while h:h=s.recv(9);p+=h
for g in re.findall('<p>(.*?)</p>',p):print g

आप बृहदान्त्र के बाद और उससे while h:पहले व्हॉट्सएप को अलग करके दो बाइट बचा सकते हैं print g
स्काइलर

और एक और बाइट के साथ 'GET /%s HTTP/1.1\nHost:%s\n\n'
सेस टिम्मरमैन

3

पायथन 2, 187 - 40 = 147 (आरईपीएल में 141)

Zac के उत्तर का संकुचित और संकुचित संस्करण :

import socket,re
while 1:h,_,d=raw_input().partition('/');s=socket.create_connection((h,80));s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h));print re.findall('<p>(.*?)</p>',s.recv(9000))

उदाहरण:

dictionary.com
['The document has moved <a href="http://dictionary.reference.com/">here</a>.']
dictionary.reference.com
[]
paragraph.com
[]
rare.com
[]

वास्तव में यह उपयोगी है:

207 - 40 = 167

import socket,re
while 1:h,_,d=raw_input().partition('/');s=socket.create_connection((h,80));s.sendall('GET /%s HTTP/1.1\nHost:%s\n\n'%(d,h));print'\n'.join(re.findall('<p>(.*?)</p>',s.recv(9000),re.DOTALL))

उदाहरण:

example.org
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>
www.iana.org/domains/example
The document has moved <a href="/domains/reserved">here</a>.
www.iana.org/domains/reserved

dictionary.com
The document has moved <a href="http://dictionary.reference.com/">here</a>.
dictionary.reference.com

catb.org

      <a href="http://validator.w3.org/check/referer"><img
          src="http://www.w3.org/Icons/valid-xhtml10"
          alt="Valid XHTML 1.0!" height="31" width="88" /></a>

This is catb.org, named after (the) Cathedral and the Bazaar. Most
of it, under directory esr, is my personal site.  In theory other
people could shelter here as well, but this has yet to occur.
catb.org/jargon
The document has moved <a href="http://www.catb.org/jargon/">here</a>.
www.catb.org/jargon/
This page indexes all the WWW resources associated with the Jargon File
and its print version, <cite>The New Hacker's Dictionary</cite>. It's as
official as anything associated with the Jargon File gets.
On 23 October 2003, the Jargon File achieved the
dubious honor of being cited in the SCO-vs.-IBM lawsuit.  See the <a
href='html/F/FUD.html'>FUD</a> entry for details.
www.catb.org/jargon/html/F/FUD.html
 Defined by Gene Amdahl after he left IBM to found his own company:
   &#8220;<span class="quote">FUD is the fear, uncertainty, and doubt that IBM sales people
   instill in the minds of potential customers who might be considering
   [Amdahl] products.</span>&#8221; The idea, of course, was to persuade them to go
   with safe IBM gear rather than with competitors' equipment.  This implicit
   coercion was traditionally accomplished by promising that Good Things would
   happen to people who stuck with IBM, but Dark Shadows loomed over the
   future of competitors' equipment or software.  See
   <a href="../I/IBM.html"><i class="glossterm">IBM</i></a>.  After 1990 the term FUD was associated
   increasingly frequently with <a href="../M/Microsoft.html"><i class="glossterm">Microsoft</i></a>, and has
   become generalized to refer to any kind of disinformation used as a
   competitive weapon.
[In 2003, SCO sued IBM in an action which, among other things,
   alleged SCO's proprietary control of <a href="../L/Linux.html"><i class="glossterm">Linux</i></a>.  The SCO
   suit rapidly became infamous for the number and magnitude of falsehoods
   alleged in SCO's filings.  In October 2003, SCO's lawyers filed a <a href="http://www.groklaw.net/article.php?story=20031024191141102" target="_top">memorandum</a>
   in which they actually had the temerity to link to the web version of
   <span class="emphasis"><em>this entry</em></span> in furtherance of their claims. Whilst we
   appreciate the compliment of being treated as an authority, we can return
   it only by observing that SCO has become a nest of liars and thieves
   compared to which IBM at its historic worst looked positively
   angelic. Any judge or law clerk reading this should surf through to
   <a href="http://www.catb.org/~esr/sco.html" target="_top">my collected resources</a> on this
   topic for the appalling details.&#8212;ESR]

1

गौक, 235 - 40 = 195 बाइट्स

{for(print"GET "substr($0,j)" HTTP/1.1\nHost:"h"\n"|&(x="/inet/tcp/0/"(h=substr($0,1,(j=index($0,"/"))-1))"/80");(x|&getline)>0;)w=w RS$0
for(;o=index(w,"<p>");w=substr(w,c))print substr(w=substr(w,o+3),1,c=index(w,"/p>")-2)
close(x)}

इसे नीचे गिराया गया, लेकिन यह एक अधिक अक्षम संस्करण है, जिसे http://शुरुआत में बिना वेब पते की आवश्यकता होती है । और अगर आप रूट डायरेक्टरी को एक्सेस करना चाहते हैं तो आपको एड्रेस को खत्म करना होगा /। इसके अलावा <p>टैग को कम केस होना चाहिए।

मेरा पूर्व संस्करण वास्तव में </p><p>सही ढंग से युक्त लाइनों को संभाल नहीं पाया था । यह अब तय हो गया है।

इनपुट के लिए आउटपुट example.com/

This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.
<a href="http://www.iana.org/domains/example">More information...</a>

अभी भी विकिपीडिया के साथ काम नहीं करता है। मुझे लगता है कि इसका कारण यह है कि विकिपीडिया httpsहर चीज के लिए उपयोग करता है। लेकिन मुझे नहीं पता।

निम्न संस्करण इनपुट के साथ थोड़ा और क्षमा करने योग्य है और यह ऊपरी केस टैग को भी संभाल सकता है।

IGNORECASE=1{
    s=substr($0,(i=index($0,"//"))?i+2:0)
    x="/inet/tcp/0/"(h=(j=index(s,"/"))?substr(s,1,j-1):s)"/80"
    print"GET "substr(s,j)" HTTP/1.1\nHost:"h"\nConnection:close\n"|&x
    while((x|&getline)>0)w=w RS$0
    for(;o=index(w,"<p>");w=substr(w,c))
        print substr(w=substr(w,o+3),1,c=index(w,"/p>")-2)
    close(x)
}

मैं "Connection:close"रेखा के बारे में निश्चित नहीं हूं । यह अनिवार्य नहीं लगता है। मुझे एक उदाहरण नहीं मिला जो इसके साथ या उसके बिना अलग काम करेगा।


1

पॉवरशेल (४) २४०

$input=Read-Host ""
$url=[uri]$input
$dir=$url.LocalPath
Do{
$res=Invoke-WebRequest -URI($url.Host+"/"+$dir) -Method Get
$res.ParsedHtml.getElementsByTagName('p')|foreach-object{write-host $_.innerText}
$dir=Read-Host ""
}While($dir -NE "")

Ungolfed (प्रॉक्सी की आवश्यकता नहीं है)

$system_proxyUri=Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings" -Name ProxyServer
$proxy = [System.Net.WebRequest]::GetSystemWebProxy()
$proxyUri = $proxy.GetProxy($system_proxyUri.ProxyServer)
$input = Read-Host "Initial url"
#$input="http://stackoverflow.com/questions/tagged/powershell"
$url=[uri]$input
$dir=$url.LocalPath
Do{
$res=Invoke-WebRequest -URI($url.Host+"/"+$dir) -Method Get -Proxy($proxyUri)
$res.ParsedHtml.getElementsByTagName('p')|foreach-object{write-host $_.innerText}
$dir=Read-Host "next dir"
}While($dir -NE "")

संपादित करें * ^ ^ याद करने के लिए भी मुश्किल नहीं है


-1

जावा 620 बी

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class JavaApplication12 {

    public static void main(String[] args) {
        try {             
            BufferedReader i = new BufferedReader(new InputStreamReader(new URL(args[0]).openStream()));
            String l;
            boolean print = false;
            while ((l = i.readLine()) != null) {
                if (l.toLowerCase().contains("<p>")) {
                    print = true;
                }
                if (print) {
                    if (l.toLowerCase().contains("</p>")) {
                        print = false;
                    }
                    System.out.println(l);
                }
            }

        } catch (Exception e) {

        }
    }

}

2
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! दुर्भाग्य से, यह सबमिशन अमान्य है। प्रश्न केवल निम्न स्तर के टीसीपी एपीआई की अनुमति देता है, इसलिए आप इसका उपयोग नहीं कर सकते InputStreamReader
डेनिस

1
ओह, मुझे बहुत खेद है और इसे इंगित करने के लिए धन्यवाद। अगले उत्तर में बेहतर करेंगे
शालिका आशान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.