세계에서 가장 작은 웹 브라우저


72

뒷이야기 :

메가 멀티 코퍼레이션에서 새로운 프로그래밍 작업을 즐길 수 있습니다. 그러나 컴퓨터에는 CLI 만 있기 때문에 웹을 탐색 할 수 없습니다. 또한 모든 직원의 하드 드라이브를 청소할 수 있으므로 대형 CLI 웹 브라우저를 다운로드 할 수 없습니다. 가능한 한 작은 간단한 텍스트 브라우저를 작성하여 암기하고 매일 임시 파일에 입력 할 수 있습니다.

도전:

당신의 임무는 명령 줄 인터페이스 내에서 골프 웹 브라우저를 만드는 것입니다. 다음과 같아야합니다.

  • args 또는 stdin을 통해 단일 URL을 가져옵니다.
  • URL의 구성 요소 directory및 분할host
  • 에 간단한 HTTP 요청을 host보내서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을 사용할 수 없습니다
  • 어떤 프로그래밍 언어를 사용하든 저수준 TCP API 만 허용됩니다 (netcat 제외).
  • GUI를 사용 하지 않을 수도 있습니다 . CLI입니다.
  • 내장 파서를 제외하고 HTML 파서를 사용할 수 없습니다 (BeautifulSoup은 내장되지 않습니다)
  • 보너스!! 프로그램이 루프백하고 종료하는 대신 다른 URL을 요청하는 경우 -40 문자 (재귀를 사용하지 않는 한)
  • 타사 프로그램이 없습니다. 아무것도 설치할 수 없습니다.
  • 이므로 가장 짧은 바이트 수가 이깁니다.

7
Pythonimport webbrowser;webbrowser.open(url)
Blue

8
@muddyfish는 규칙을 읽고
TheDoctor

4
이것을 테스트하기 위해 일종의 샘플 웹 페이지를 제공 할 수 있습니까? 사용 장소를 찾기 어렵 <P> : P
spaghetto


3
저수준 소켓 인터페이스에 대한 제한 은 TCP 수준 API를 가진 대부분의 언어의 TCP 수준 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

정규식을 사용하여 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
내일까지 암기해야합니다.
Conor O'Brien

14
"셸 패턴 일치를 사용하여 HTML 구문 분석"에 대해 + ∞
SztupY

76
-1 당신의 아바타는 잠재 메시지이므로
TheDoctor

1
... Bash에서 TCP 연결을 만들 수 있습니까? 이제 나는 정말로 겁에 질려있다!
MathematicalOrchid

2
참고 : /dev/tcp선택적 확장이며 bash 빌드에는 없을 수 있습니다. --enable-net-redirections그것을 가지고 컴파일 해야합니다.
Chris Down

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])."
");

STDINlike 에서 URL을 읽습니다 http://www.example.com/. 줄 바꿈 " \n"으로 구분 된 단락을 출력합니다 .


언 골프

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

여기에 이미지 설명을 입력하십시오


편집

  • 에 의해 코멘트에서 지적 Braintist , 난 완전히 경로를 포함하도록 잊어 버렸습니다. 고마워요. 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
  • Regex에서 패턴 수정자를 제거하여 1 바이트절약했습니다m . manatwork 덕분에


1
@ briantist 오 이런, 나는 그것을 완전히 놓쳤다. : D 감사합니다. 이제 수정되었습니다.
insertusername 여기

1
나는 Perl이 PHP를 능가한다는 것을 견딜 수 없으므로 잊지 마십시오. while골프 할 때 ( for종종 짧지 만 결코 더 이상) 금지됩니다 . 개행을 수행하려면 enter (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);
Blackhole

1
"규칙에 대해" "금지 된"을 의미하는 것은 아닙니다. for-loop가 항상 while-loop 보다 낫기 때문에 전혀 유용하지 않습니다 .).
Blackhole

1
@MichaelDibbets 사실 나는 편집에 쓰여진 것처럼 이미 그렇게했습니다. 흠. 보자 하하, 나는 마지막 스 니펫을 복사하고 계산하는 것을 잊었다. Duh : D 아침 식사 전에 코드를 업데이트하면 이와 같은 일이 발생합니다. 지적 해 주셔서 감사합니다.
insertusername 여기

14

펄, 132 바이트

-ln -MIO::SocketURL을 지속적으로 요청하는 155 바이트 코드 + 17-40

@DigitalTrauma의 대답과 마찬가지로 정규식 구문 분석 HTML은 허용되지 않는 경우 알려주십시오. 더 이상 URL을 구문 분석하지 않습니다 ... 나중에 볼 것입니다 ... Bash에 가깝습니다! 보너스를 청구 할 수 있도록 버그를 수정 한 @ 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>

$ h 및 $ p를 선언하거나 기본 경로가 없어 버그를 수정하고 코드를 줄였습니다. 또한 더 이상 호스트에 후행 /가 필요하지 않습니다.
Schwern

1
우리는 지금 이길 사람입니다. :)
Schwern

밤에 끝난 것 같아요. :)
Schwern

스크립트 대신 종료의 또 다른 URL을 요구하기 때문에, 당신은 추가 -40 바이트를 주장 할 수
svsd

1
@DigitalTrauma 당신은 실제로 맞습니다! skmrx가 버그를 '$ /'로 수정하여 보너스를 청구했으며 Schwern이 아닌 경우 귀하의 근처에 있지 않을 것입니다!
Dom Hastings

13

PowerShell, 315 294268262254 바이트

3553343083022994-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 필요

문자열에 포함 된 줄을 포함하여 모든 줄 끝은 줄 바꿈 만 가능합니다 \n( Blackhole 덕분에 ) PowerShell에서 완벽하게 지원합니다 (그러나 테스트하는 경우 조심하십시오. ISE 사용 \r\n).


4
서버 관리자의 업무 생산성 향상을위한 +1
시보 다

HTTP에는 LF가 아닌 CRLF가 필요합니다! [ HTTPSYNTAX ]
칫솔

2
@ 칫솔 하! 점을 찍었으나 공차 규정 은 완전한 것으로 보입니다. 분명히이 작업은 작동하는 것과 맞지 않는 것에 관한 것입니다 (그렇지 않으면 정규식으로 HTML을 구문 분석하지 않고 잘 테스트 된 기존 라이브러리 대신 낮은 수준의 TCP 라이브러리를 사용하지 않을 것입니다).
briantist

1
@briantist greenbytes.de/tech/webdav/rfc7230.html#rfc.section.3.5 는 "수신자가 단일 LF를 라인 종결 자로 인식하고 앞의 CR을 무시할 수있다"고 말합니다. 나는 대부분의 웹 서버가 그것을 구현한다는 의미로 읽었으며, 올바른 GET 요청을 생성해야한다고 말하는 것은 아닙니다 ... :)
Toothbrush

8

Groovy 스크립트, 89 , 61 바이트

루프 다시 보너스 101 (40) = 61

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

args만으로 89 바이트

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

1
그루비는 모든 사람을 능가했다. 그렇습니다.
스파게티

1
@quartata 만약 그렇게된다면 그것은 처음 이 될 것이다 . 그래서 ...;)
Geobits

11
"낮은 수준의 TCP API 만 허용됩니다"
Digital Trauma

예, @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

Digital Trauma에게 감사합니다.

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
예. 그리고 나는 또한 고양이를 사용하므로 솔루션이 안전합니다.
philcolbourn

5

C 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로 컴파일 할 때이 segfaults) C에서 400 바이트 미만을 얻을 수 있어야합니다. clang에 대해서는 확실하지 않지만 main의 반환 유형을 선언 할 필요는 없습니다. 또한 include를 제거하고 대신 구조체를 정수 배열로 "액세스"할 수 있습니다. 또한 "GET / % s HTTP / 1.1 \ r \ n \ r \ n \"로 응답을 받았지만 마일리지는 사이트에 따라 다를 수 있습니다 ...
Comintern

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

AutoIt , 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

C #, 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스트림 주위에 진술 은 없지만 누출되지는 않습니다.
Gusdor

몇 개의 바이트를 더 트리밍 할 수 있습니다. input = input.trimStart ( "http : //")는 "if"절을 대체하므로 System.Text.Encoding.ASCII.GetBytes ()를 직접 사용할 수 있어야합니다. 먼저 asciiEncoding에 저장하십시오. 당신은 "Using System;"으로 나올 것이라고 생각합니다. 몇 줄의 "시스템"을 제거합니다.
minnmass

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
주의 사항 : 작은 페이지에서는 작동합니다. 큰 페이지에서는 여러 데이터 이벤트가 발생합니다.
Benjamin Gruenbaum

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

당신은에 콜론 뒤에 공백을 제거하여 2 바이트를 저장할 수 있습니다 while h:및 전 print g.
Skyler

와 다른 바이트 'GET /%s HTTP/1.1\nHost:%s\n\n'.
Cees Timmerman

3

파이썬 2, 187-40 = 147 (REPL에서 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

gawk, 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>

여전히 위키 백과에서는 작동하지 않습니다. 그 이유는 Wikipedia가 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 "")

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 B

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
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 불행히도이 제출은 유효하지 않습니다. 이 질문은 저수준 TCP API 만 허용하므로 사용할 수 없습니다 InputStreamReader.
Dennis

1
아 죄송합니다. 지적 해 주셔서 감사합니다. 다음 답변에서 더 잘할 것입니다
Shalika Ashan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.