Hintergrundgeschichte:
Sie genießen Ihren neuen Programmierjob bei einem Mega-Multi-Unternehmen. Sie dürfen jedoch nicht im Internet surfen, da Ihr Computer nur über eine CLI verfügt. Sie durchsuchen auch die Festplatten aller Mitarbeiter, sodass Sie nicht einfach einen großen CLI-Webbrowser herunterladen können. Sie entscheiden sich für einen einfachen Textbrowser, der so klein wie möglich ist, damit Sie ihn sich merken und jeden Tag in eine temporäre Datei eingeben können.
Herausforderung:
Ihre Aufgabe ist es, einen Golf-Webbrowser innerhalb einer Befehlszeilenschnittstelle zu erstellen. Es sollte:
- Nehmen Sie eine einzelne URL über args oder stdin ein
- Teilen Sie die
directory
undhost
Komponenten der URL - Senden Sie eine einfache HTTP-Anfrage an die,
host
um diese anzuforderndirectory
- Drucken Sie die Inhalte der
<p>
Absatz -</p>
Tags - Und entweder beenden oder nach einer anderen Seite fragen
Mehr Info:
Eine einfache HTTP-Anfrage sieht folgendermaßen aus:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Letzte Zeilenumbrüche werden hervorgehoben.
Eine typische Antwort sieht wie folgt aus:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Regeln:
- Es muss nur auf Port 80 funktionieren (kein SSL erforderlich)
- Sie dürfen netcat nicht verwenden
- Unabhängig von der verwendeten Programmiersprache sind nur TCP-APIs auf niedriger Ebene zulässig (außer Netcat).
- Sie können die GUI möglicherweise nicht verwenden, denken Sie daran, es ist eine CLI
- Sie dürfen keine HTML-Parser verwenden, außer eingebauten (BeautifulSoup ist kein eingebauter Parser).
- Bonus!! Wenn Ihr Programm eine Schleife durchläuft und nach einer anderen URL fragt, anstatt zu beenden, -40 Zeichen (solange Sie keine Rekursion verwenden)
- Keine Programme von Drittanbietern. Denken Sie daran, Sie können nichts installieren.
- Code-Golf , so dass die kürzeste Anzahl von Bytes gewinnt
import webbrowser;webbrowser.open(url)
Antworten:
Pure Bash (keine Dienstprogramme), 200 Bytes - 40 Bonus = 160
Ich denke, dass dies der Spezifikation entspricht, aber
achten Sie natürlich auf das Parsen von HTML mit Regex.Ich denke, das Einzige, was schlimmer ist als das Parsen von HTML mit Regex, ist das Parsen von HTML mit Shell-Pattern-Matching.Dies betrifft nun das
<p>...</p>
Überspannen mehrerer Zeilen. Jedes<p>...</p>
steht in einer separaten Ausgabezeile:quelle
/dev/tcp
ist eine optionale Erweiterung und möglicherweise nicht in Ihrem Bash-Build enthalten. Sie müssen mit kompilieren--enable-net-redirections
, um es zu haben.PHP, 175 Bytes (215 - 40 Bonus)
227229239202216186BytesViel Spaß beim Stöbern im Internet:
Liest URLs von
STDIN
likehttp://www.example.com/
. Gibt durch "\n
" getrennte Absätze aus .Ungolfed
Erste Version, die nur eine URL unterstützt
Bearbeitungen
$c
(enthält den Seiteninhalt) mit$c=$i=parse_url(trim(fgets(STDIN)));
anstelle von$c=''
.\n
mit neuen Leitungen (5 Bytes), einewhile
-loop mitfor
(2 Bytes), Platzieren fast alles in die Ausdrücke vonfor
(2 Byte) und durch Ersetzenforeach
mitjoin
(3 Bytes). Danke an Blackhole .fgets
durchstream_get_contents
Danke an bwoebi .die Neuinitialisierung von entfernt wurde,$c
da sie überhaupt nicht mehr benötigt wird$c
.m
von der Regex. Dank der Handarbeitquelle
while
beim Golfen verboten ist (for
oft kürzer, aber nie länger). Um eine neue Zeile zu erstellen, drücken Sie einfach die Eingabetaste (1 Byte statt 2 für\n
). Hier ist Ihr (ungetesteter) Code ein bisschen besser (227 Bytes), wobei die neue Zeile ersetzt wird durch↵
: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);
for
-loop immer besser ist als einwhile
-loop;).Perl, 132 Bytes
155 Byte Code + 17 für
-ln -MIO::Socket
- 40 für die ständige Abfrage von URLsWie bei der Antwort von @DigitalTrauma, bei der regulären Syntaxanalyse von HTML, lassen Sie mich wissen, ob dies nicht akzeptabel ist. Parset keine URLs mehr ... Ich schaue mir das später an ... In der Nähe von Bash! Ein großes Dankeschön an @ Schwern für das Speichern von 59 (!) Bytes und an @ skmrx für das Beheben des Fehlers, um einen Anspruch auf den Bonus zu erheben!
Verwendungszweck
quelle
PowerShell,
315 294 268 262254 Byte355 334 308 302294 - 40 zur BestätigungBenötigt PowerShell v5
Alle Zeilenenden (einschließlich der in die Zeichenfolge eingebetteten) sind nur Zeilenumbrüche
\n
(danke Blackhole ), die von PowerShell voll unterstützt werden (aber wenn Sie testen, seien Sie vorsichtig, ISE verwendet\r\n
).quelle
GET
Anfragen generiert werden müssen … :)Grooviges Skript,
89, 61 BytesLoopback für Bonus - 101- 40 = 61
Mit nur Argumenten, 89 Bytes
quelle
Bash (könnte betrügen, scheint aber innerhalb der Regeln zu liegen) 144-40 = 105
Dank Digital Trauma.
Da ich die URL nicht teilen muss, funktioniert dies auch: 122-40 = 82
quelle
C 512 Bytes
Basierend lose auf meinem Eintrag hier , nimmt es die Webadresse ohne ein führendes "https: //". Verschachtelte
<p>
Paare werden nicht korrekt verarbeitet :(Ausführlich getestet,
www.w3.org/People/Berners-Lee/
funktioniert es, wenn es mit
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Es kompiliert wurde. Es hat genug undefiniertes Verhalten, dass es möglicherweise nirgendwo anders funktioniert.
quelle
Rubin, 118
147-Byte-Quelle; 11 Bytes '
-lprsocket
'; -40 Bytes zum Schleifen.Anwendungsbeispiel:
quelle
AutoIt , 347 Bytes
Testen
Eingang:
Ausgabe:
Eingang:
Ausgabe:
Bemerkungen
<p>
Tags<p>
Tags (ohne Berücksichtigung der Groß- und Kleinschreibung), unterbricht jedes andere Tag-FormatPanicsLoops auf unbestimmte Zeit, wenn ein Fehler auftrittquelle
C #, 727 Bytes - 40 = 687 Bytes
Es ist ein bisschen Training, aber sicherlich unvergesslich :)
Hier ist eine ungolfed Version:
Wie Sie sehen können, gibt es Probleme mit Speicherverlusten als Bonus :)
quelle
using
Aussagen um Streams, aber das macht kein Leck.JavaScript (NodeJS) -
187166187
Verwendungszweck:
Oder formatiert
quelle
Python 2 -
212209 Bytesquelle
while h:
und vor dem Doppelpunkt entfernenprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 in einer REPL)
Komprimierte und geloopte Version von Zacs Antwort :
Beispiel:
Eigentlich nützlich ist das:
207 - 40 = 167
Beispiel:
quelle
Gawk, 235 - 40 = 195 Bytes
Golfen Sie es runter, aber dies ist eine unerbittlichere Version, die die Webadresse ohne
http://
am Anfang benötigt. Und wenn Sie auf das Stammverzeichnis zugreifen möchten, müssen Sie die Adresse mit einem abschließen/
. Außerdem müssen die<p>
Tags in Kleinbuchstaben geschrieben werden.Meine frühere Version behandelte Zeilen, die
</p><p>
richtig enthielten , nicht. Dies ist jetzt behoben.Ausgabe für Eingabe
example.com/
Funktioniert immer noch nicht mit Wikipedia. Ich denke, der Grund ist, dass Wikipedia
https
für alles verwendet. Aber ich weiß es nicht.In der folgenden Version ist die Eingabe etwas fehlerverzeihender und es können auch Tags in Großbuchstaben verarbeitet werden.
Ich bin mir nicht sicher über die
"Connection:close"
Linie. Scheint nicht obligatorisch zu sein. Ich konnte kein Beispiel finden, das anders mit oder ohne funktionieren würde.quelle
Powershell (4) 240
Ungolfed (Proxy ist nicht erforderlich)
edit * auch nicht zu schwer zu merken ^^
quelle
Java 620 B
quelle
InputStreamReader
.