বিশ্বের সবচেয়ে ছোট ওয়েব ব্রাউজার


72

গল্পের:

আপনি মেগা-মাল্টি-কর্পোরেশনে আপনার নতুন প্রোগ্রামিং কাজটি উপভোগ করছেন। তবে আপনার কম্পিউটারটিতে কেবল একটি সিএলআই রয়েছে সেহেতু আপনাকে ওয়েব ব্রাউজ করার অনুমতি নেই। এগুলি সমস্ত কর্মীদের হার্ড ড্রাইভগুলিও চালায় তাই আপনি সহজেই একটি বৃহত সিএলআই ওয়েব ব্রাউজার ডাউনলোড করতে পারবেন না। আপনি যতটা সম্ভব ছোট একটি সাধারণ পাঠ্য ব্রাউজার তৈরি করার সিদ্ধান্ত নিয়েছেন যাতে আপনি এটি মুখস্ত করতে এবং প্রতিদিন এটি একটি অস্থায়ী ফাইলে টাইপ করতে পারেন।

চ্যালেঞ্জ:

আপনার কাজ হ'ল কমান্ড-লাইন ইন্টারফেসের মধ্যে একটি গল্ফড ওয়েব ব্রাউজার তৈরি করা। এটি করা উচিত:

  • আরগস বা স্টিডিনের মাধ্যমে একটি একক ইউআরএল নিন
  • ইউআরএলের উপাদান directoryএবং hostউপাদানগুলি বিভক্ত করুন
  • এটি একটি সহজ HTTP- র অনুরোধ পাঠান hostবলেন অনুরোধ করতেdirectory
  • যে কোনও <p>অনুচ্ছেদে </p>ট্যাগগুলির সামগ্রী মুদ্রণ করুন
  • এবং হয় প্রস্থান করুন বা অন্য পৃষ্ঠা জিজ্ঞাসা করুন

অধিক তথ্য:

একটি সাধারণ এইচটিটিপি অনুরোধটি দেখে মনে হচ্ছে:

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 পোর্টে কাজ করা দরকার (কোনও এসএসএল প্রয়োজন নেই)
  • আপনি নেটকেট ব্যবহার করতে পারেন না
  • প্রোগ্রামিংয়ের যে কোনও ভাষা ব্যবহার করা হোক না কেন, কেবলমাত্র নিম্ন-স্তরের টিসিপি API গুলি অনুমোদিত (নেটক্যাট ব্যতীত)
  • আপনি জিইআইআই ব্যবহার করতে পারবেন না , মনে রাখবেন, এটি সিএলআই রয়েছে
  • বিল্ট ইনগুলি ব্যতীত আপনি HTML পার্সার ব্যবহার করতে পারবেন না (বিউটিফুলসপ কোনও বিল্টিন নয়)
  • বোনাস!! যদি আপনার প্রোগ্রামটি পিছনে ফিরে আসে এবং বাইরে বের হওয়ার পরিবর্তে অন্য কোনও URL জিজ্ঞাসা করে, -40 অক্ষর (যতক্ষণ না আপনি পুনরাবৃত্তি ব্যবহার করবেন না)
  • কোনও তৃতীয় পক্ষের প্রোগ্রাম নেই। মনে রাখবেন, আপনি কিছু ইনস্টল করতে পারবেন না।
  • , তাই সংক্ষিপ্ততম বাইট গণনা জিতেছে

7
পাইথন,import webbrowser;webbrowser.open(url)
নীল

8
@ মুডিফিশ নিয়মগুলি পড়ুন
থিওডাক্টর

4
আপনি এটি পরীক্ষা করার জন্য কোনও ধরণের একটি নমুনা ওয়েব পৃষ্ঠা সরবরাহ করতে পারেন? <p>: পি
একটি স্প্যাগেটো


3
নিম্ন-স্তরের সকেট ইন্টারফেসের সীমাবদ্ধতা টিসিপি-স্তরের এপিআই রয়েছে এমন বেশিরভাগ ভাষার টিসিপি-স্তরের API গুলি নিষিদ্ধ বলে মনে হচ্ছে।
পিটার টেলর

উত্তর:


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

আমি মনে করি এটি অনুমানযোগ্য, যদিও অবশ্যই রেগেক্স ব্যবহার করে এইচটিএমএল পার্সিংয়ের জন্য নজর রাখবেন আমি মনে করি রেগেক্স ব্যবহার করে এইচটিএমএলকে পার্সিংয়ের চেয়ে খারাপ একমাত্র জিনিসটি শেল প্যাটার্নের মিলটি ব্যবহার করে এইচটিএমএলকে পার্স করছে।

এটি এখন <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
+ "" শেল প্যাটার্নের মিল ব্যবহার করে এইচটিএমএল
পার্সিংয়ের জন্য

76
-1 কারণ আপনার অবতার
সাবলিমিনাল

1
... আপনি কি বাশ থেকে টিসিপি সংযোগ তৈরি করতে পারবেন? এখন আমি সত্যিই আতঙ্কিত!
গাণিতিক

2
দ্রষ্টব্য: /dev/tcpoptionচ্ছিক এক্সটেনশন এবং আপনার ব্যাশ তৈরিতে উপস্থিত নাও থাকতে পারে। --enable-net-redirectionsএটির জন্য আপনাকে সংকলন করা দরকার ।
ক্রিস ডাউন

21

পিএইচপি, 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লাইক থেকে পড়ে 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";
}

প্রথম সংস্করণটি কেবল একটি ইউআরএল সমর্থন করে

$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সঙ্গে -loop for, (2 বাইটস) অভিব্যক্তি মধ্যে প্রায় সবকিছু স্থাপন for(2 বাইট) এবং প্রতিস্থাপন foreachসঙ্গে join(3 বাইট)। ধন্যবাদ Blackhole
  • সংরক্ষিত 3 বাইট প্রতিস্থাপন fgetsসঙ্গে stream_get_contentsধন্যবাদ bwoebi
  • সংরক্ষিত 5 বাইট সরিয়ে পুনরায় আরম্ভের $cযেমন আর প্রয়োজন হয় না $c এ সব।
  • সংরক্ষিত 1 বাইট প্যাটার্ন পরিবর্তক সরিয়ে mRegex থেকে। মানবিক কাজের জন্য ধন্যবাদ

6
a

1
@ ব্রায়েন্টিস্ট ওহ মানুষ, আমি এটি পুরোপুরি মিস করেছি। : ডি ধন্যবাদ, এখনই ঠিক হয়ে গেছে।
সন্নিবেশকারী নাম এখানে

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
@ মিশেলডিবিটস বাস্তবে আমি ইতিমধ্যে সম্পাদনায় লিখিত হিসাবে এটি করেছি। হুঁ। আমাকে দেখতে দাও. হাহা, আমি চূড়ান্ত স্নিপেট অনুলিপি এবং গণনা করতে ভুলে গেছি। দুহ : ডি আপনি যদি প্রাতঃরাশের আগে আপনার কোড আপডেট করেন তবে এমনটি ঘটে থাকে। এটা ইশারা জন্য ধন্যবাদ।
সন্নিবেশকারী নাম এখানে

14

পার্ল, 132 বাইট

-ln -MIO::Socketক্রমাগত ইউআরএল জিজ্ঞাসা করার জন্য - 40 এর জন্য 155 বাইট কোড

@ ডিজিটালট্রামার জবাব হিসাবে, রেজেক্স এইচটিএমএলকে পার্সিং করছে, যদি তা গ্রহণযোগ্য না হয় তবে আমাকে জানান। ইউআরএলকে আর পার্সিং করে রাখবেন না ... আমি পরে তা দেখব ... যদিও বাশের কাছে! @ কে অনেক ধন্যবাদ Schwern আমাকে 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>

আমি একটি বাগ সংশোধন করেছি এবং and h এবং $ p ঘোষণা করার বা ডিফল্ট পাথের প্রয়োজন বাদ দিয়ে কোডটি সংক্ষিপ্ত করে দিয়েছি। এটির জন্য আর হোস্টে চলার দরকার নেই।
শোওয়ার্ন

1
আমরা এখনই পরাজিত। :)
শোবার্ন

আমি মনে করি আমি রাতের জন্য কাজ করেছি। :)
শোওয়ার্ন

যেহেতু স্ক্রিপ্টটি প্রস্থান করার পরিবর্তে অন্য URL টি চেয়েছে, আপনি অতিরিক্ত -40 বাইট দাবি করতে পারবেন
এসভিএসডি

1
@ ডিজিটাল ট্রুমা আপনি সত্যিই সঠিক! আমি স্ক্যামরেক্সকে আমার বাগটি '$ /' দিয়ে ঠিক করে দেওয়ার জন্য বোনাসকে ধন্যবাদ দিয়েছি এবং আমি যদি আপনার কাছে না থাকি তবে এটি যদি শোয়ার্নের পক্ষে না হয়!
ডম হেস্টিংস

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
}

পাওয়ারশেল ভি 5 প্রয়োজন

সমস্ত লাইন সমাপ্তি (স্ট্রিংটিতে এম্বেড হওয়াগুলি সহ) কেবলমাত্র নতুন লাইনের \n(ধন্যবাদ ব্ল্যাকহোল ) যা পাওয়ারশেল দ্বারা সম্পূর্ণরূপে সমর্থিত (তবে আপনি যদি পরীক্ষা করে নিচ্ছেন তবে সাবধান হন; আইএসই ব্যবহার করে \r\n)।


4
+1 টি তৈরীর জন্য আমার সার্ভারে অ্যাডমিন দায়িত্ব অনেক বেশি প্রদর্শিত
thanby

এইচটিটিপি-র সিএলএলএফ প্রয়োজন, এলএফ নয়! [ HTTPSYNTAX ]
টুথব্রাশ

2
@ টুথব্রাশ হা! পয়েন্ট নেওয়া হয়েছে, তবে সহনীয়তার বিধানটি সম্পূর্ণ কার্যকর বলে মনে হচ্ছে। স্পষ্টতই এই টাস্কটি কী কাজ করে এবং কোনটি সঠিক নয় সে সম্পর্কে হয় (অন্যথায় আমরা ভাল পরীক্ষিত বিদ্যমান লাইব্রেরির পরিবর্তে নিম্ন স্তরের টিসিপি লাইব্রেরি ব্যবহার করি না) HTML
ব্রিটিশবাদী

1
@ ব্রিটিশবাদী গ্রিনবিটস.ডি / টেক / ওয়েবেডাভ / আরএফসি 30৩০.সিটিএল # rfc.section.3.5 বলেছেন যে "একজন প্রাপক মায়া একটি একক এলএফকে লাইন টার্মিনেটর হিসাবে স্বীকৃতি দেয় এবং পূর্ববর্তী কোনও সিআর উপেক্ষা করে"। আমি পড়লাম যার অর্থ বেশিরভাগ ওয়েব সার্ভারগুলি এটি বাস্তবায়ন করবে এবং প্রশ্নটি অবশ্যই বলে না যে এটি অবশ্যই সঠিক 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
গ্রোভি সবাইকে ছাড়িয়ে গেল। হিসাবে এটি করা উচিত.
একটি স্প্যাগেটো

1
@ কোয়ার্তাটা যদি এভাবেই থেকে যায় তবে এটি প্রথমবারের মতো হবে , তাই ...;)
জিওবিটস

11
"কেবলমাত্র নিম্ন-স্তরের টিসিপি এপিআইগুলিকেই অনুমোদিত"
ডিজিটাল ট্রমা

হ্যাঁ আমি @ ডিজিটালট্রামার সাথে একমত হতে চলেছি যে এটি নিম্ন-স্তরের টিসিপি এপিআই ব্যবহার করছে না। বিধিগুলি জানিয়েছে যে আপনাকে নিজের থেকে হোস্ট এবং পথটি বিভক্ত করতে হবে।
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

ডিজিটাল ট্রমা ধন্যবাদ।

যেহেতু আমার ইউআরএল বিভক্ত করার দরকার নেই, এটিও কাজ করে: 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
আমি যুক্তি দিয়ে বলব যে এই অনলাইন এইচটিএমএল 2 টেক্সট রূপান্তরকারীটি ব্যবহার করা একটি মান ফাঁক
ডিজিটাল ট্রমা

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
এটির পর্যাপ্ত সংজ্ঞায়িত আচরণ রয়েছে যে এটি অন্য কোথাও কাজ করতে পারে না।


আমি মোটামুটি একই ট্র্যাকটিতে যাচ্ছিলাম (জিসিসি দিয়ে সংকলিত করার সময় এই সেগফাল্টস), তবে সি বাজানো সম্পর্কে 400 বাইটের নিচে পাওয়া সম্ভব হওয়া উচিত, তবে আপনাকে রিটার্ন টাইপের মূল কথাটি ঘোষণা করতে হবে না। আপনি এর পরিবর্তে পূর্ণসংখ্যার অ্যারে হিসাবে স্ট্রাক্টগুলি অন্তর্ভুক্ত করতে এবং "অ্যাক্সেস" করতে পারেন। আমি "GET /% s HTTP / 1.1 \ r \ n \ r \ n \" এর সাথেও প্রতিক্রিয়া পাচ্ছি, তবে সে সম্পর্কে মাইলেজ সাইটের উপর ভিত্তি করে আলাদা হতে পারে ...
কমিন্টার

5

রুবি, 118

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

এটি প্রশিক্ষণের কিছুটা হলেও অবশ্যই স্মরণীয় :)

এখানে একটি অবারিত সংস্করণ:

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স্ট্রিমের আশেপাশে কোনও বিবৃতি দেখতে পাচ্ছি না তবে এটি ফুটো করে না।
গুড্ডর

আপনি আরও কয়েকটি বাইট ছাঁটাতে পারেন: ইনপুট = ইনপুট.ট্রিমস্টার্ট ("HTTP: //") "if" ধারাটি প্রতিস্থাপন করবে এবং আপনার সিস্টেম.টেক্সট.ইনকোডিং.এএসসিআইআই.গেটবাইটস () না পেয়ে সরাসরি ব্যবহার করতে সক্ষম হবেন প্রথমে এটি এনকোডিং-এ সঞ্চয় করতে। আমি মনে করি আপনি একটি "সিস্টেম ব্যবহারের ব্যবস্থা" নিয়ে এগিয়ে এসেছেন; লাইন এবং মুষ্টিমেয় "সিস্টেম।" গুলি থেকে মুক্তি পাওয়া।
minnmass

3

জাভাস্ক্রিপ্ট (নোডজেএস) - 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 (একটি REPL এ 141)

জ্যাকের উত্তরের সংকুচিত এবং লুপ করা সংস্করণ :

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

পাওয়ারশেল (4) 240

$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 "")

অবহেলিত (প্রক্সি প্রয়োজন হয় না)

$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
ওহ আমি খুব দুঃখিত এবং এটি নির্দেশ করার জন্য আপনাকে ধন্যবাদ। পরবর্তী উত্তরে আরও ভাল করবে
শালিকা আশান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.