Historia:
Lubisz swoją nową pracę programistyczną w wielkiej korporacji. Nie możesz jednak przeglądać Internetu, ponieważ Twój komputer ma tylko interfejs CLI. Przeszukują również dyski twarde wszystkich pracowników, więc nie można po prostu pobrać dużej przeglądarki internetowej CLI. Decydujesz się stworzyć prostą przeglądarkę tekstową, która jest tak mała, jak to możliwe, abyś mógł ją zapamiętać i wpisywać do pliku tymczasowego każdego dnia.
Wyzwanie:
Twoim zadaniem jest stworzenie gry w golfa w interfejsie wiersza poleceń. Powinno:
- Weź pojedynczy adres URL za pośrednictwem args lub stdin
- Podziel
directory
ihost
składniki adresu URL - Wyślij proste żądanie HTTP do,
host
aby poprosić o wspomnianedirectory
- Wydrukuj zawartość dowolnych znaczników
<p>
akapitu</p>
- I wyjdź lub poproś o kolejną stronę
Więcej informacji:
Proste żądanie HTTP wygląda następująco:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Podkreślono zakończenie nowych linii.
Typowa odpowiedź wygląda następująco:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Zasady:
- Musi działać tylko na porcie 80 (nie wymaga SSL)
- Nie możesz używać NetCat
- Niezależnie od używanego języka programowania dozwolone są tylko interfejsy API niskiego poziomu TCP (z wyjątkiem netcat)
- Być może nie używać GUI, należy pamiętać, że jest to CLI
- Nie możesz używać parserów HTML, z wyjątkiem wbudowanych (BeautifulSoup nie jest wbudowanym)
- Premia!! Jeśli Twój program zapętla się i prosi o podanie innego adresu URL zamiast wyjścia, -40 znaków (o ile nie używasz rekurencji)
- Brak programów innych firm. Pamiętaj, że nie możesz niczego zainstalować.
- code-golf , więc wygrywa najkrótsza liczba bajtów
import webbrowser;webbrowser.open(url)
Odpowiedzi:
Pure Bash (bez narzędzi), 200 bajtów - 40 bonusów = 160
Myślę, że to zależy od specyfikacji,
choć oczywiście uważaj na parsowanie HTML za pomocą regex.Myślę, że jedyną rzeczą gorszą niż parsowanie HTML za pomocą regex jest parsowanie HTML za pomocą dopasowania wzorca powłoki.Teraz dotyczy to
<p>...</p>
łączenia wielu linii. Każdy<p>...</p>
znajduje się w osobnym wierszu danych wyjściowych:źródło
/dev/tcp
jest opcjonalnym rozszerzeniem i może nie być obecny w twojej wersji bash. Musisz go skompilować,--enable-net-redirections
aby go mieć.PHP, 175 bajtów (premia
215–40)227229239202216186bajtówMiłej zabawy podczas przeglądania sieci:
Czyta adresy URL z
STDIN
podobnychhttp://www.example.com/
. Wypisuje akapity oddzielone znakiem nowej linii „\n
”.Nie golfił
Pierwsza wersja obsługuje tylko jeden adres URL
Edycje
$c
(przechowuje zawartość strony) za pomocą$c=$i=parse_url(trim(fgets(STDIN)));
zamiast$c=''
.\n
nowych linii (5 bajtów), jedenwhile
-loop zfor
(2 bajty) umieszczenie prawie wszystko w wyrażeniachfor
(2 bajty) i zastępującforeach
zjoin
(3 bajty). Dzięki Blackhole .fgets
zestream_get_contents
Dzięki bwoebi .ponowną inicjalizację,$c
ponieważ nie jest już wcale potrzebna$c
.m
z Regex. Dzięki manatworkźródło
while
jest zabronione podczas gry w golfa (for
często jest krótsze, ale nigdy nie dłuższe), a aby rozpocząć nową linię, wystarczy nacisnąć enter (1 bajt zamiast 2 dla\n
)! Oto twój (nieprzetestowany) kod nieco bardziej golfowy (227 bajtów), a nowy wiersz został zastąpiony przez↵
: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
pętla jest zawsze lepsza niżwhile
pętla;).Perl, 132 bajty
Kod 155 bajtów + 17 dla
-ln -MIO::Socket
- 40 dla ciągłego pytania o adresy URLPodobnie jak w przypadku odpowiedzi @ DigitalTrauma, analizowanie wyrażeń regularnych HTML, daj mi znać, jeśli jest to nie do przyjęcia. Nie przetwarza już parsujących adresów URL ... Zajmę się tym później ... Jednak blisko Bash! Ogromne podziękowania dla @ Schwern za uratowanie mnie 59 (!) Bajtów i @ skmrx za naprawienie błędu, aby umożliwić roszczenie o bonus!
Stosowanie
źródło
PowerShell,
315 294 268 262254 bajtów355 334 308 302294 - 40 na zapytanieWymaga PowerShell v5
Wszystkie zakończenia linii (w tym te osadzone w ciągu) są tylko nowymi liniami
\n
(dzięki Blackhole ), który jest w pełni obsługiwany przez PowerShell (ale jeśli testujesz, bądź ostrożny; używa ISE\r\n
).źródło
GET
żądania… :)Groovy script,
89, 61 bajtówPętlę powrotną do premii 101- 40 = 61
Z tylko argumentami, 89 bajtów
źródło
Bash (może oszukiwać, ale wydaje się być zgodny z regułami) 144-40 = 105
Dzięki Digital Trauma.
Ponieważ nie muszę dzielić adresu URL, działa to również: 122-40 = 82
źródło
C 512 bajtów
Opierając się luźno na moim wpisie tutaj , pobiera adres internetowy bez wiodącego „https: //”. Nie obsługuje
<p>
poprawnie zagnieżdżonych par :(Przebadany szeroko.
www.w3.org/People/Berners-Lee/
Działa po kompilacji
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Ma wystarczająco niezdefiniowane zachowanie, że może nie działać nigdzie indziej.
źródło
Ruby, 118
Źródło 147 bajtów; 11 bajtów '
-lprsocket
'; -40 bajtów do zapętlenia.Przykład użycia:
źródło
AutoIt , 347 bajtów
Testowanie
Wejście:
Wynik:
Wejście:
Wynik:
Uwagi
<p>
tagów<p>
tagi (bez rozróżniania wielkości liter), zepsuje się na każdym innym formacie taguPanikaPętle bez końca w przypadku wystąpienia błęduźródło
C #, 727 bajtów - 40 = 687 bajtów
Trochę treningu, ale na pewno niezapomniany :)
Oto wersja bez golfa:
Jak widać, występują problemy z wyciekiem pamięci jako bonus :)
źródło
using
oświadczeń wokół strumieni, ale to nie powoduje wycieku.JavaScript (NodeJS) -
187166187:
Stosowanie:
Lub sformatowane
źródło
Python 2 -
212209 bajtówźródło
while h:
przed i przedprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 w REPL)
Skompresowana i zapętlona wersja odpowiedzi Zac :
Przykład:
Właściwie przydatne jest to:
207 - 40 = 167
Przykład:
źródło
gawk, 235 - 40 = 195 bajtów
Grałem w golfa, ale jest to bardziej bezlitosna wersja, która wymaga adresu internetowego bez
http://
początku. A jeśli chcesz uzyskać dostęp do katalogu głównego, musisz zakończyć adres znakiem/
. Ponadto<p>
tagi muszą być pisane małymi literami.Moja wcześniejsza wersja faktycznie nie obsługiwała wierszy zawierających
</p><p>
poprawnie. To jest teraz naprawione.Wyjście dla danych wejściowych
example.com/
Nadal nie działa z Wikipedią. Myślę, że powodem jest to, że Wikipedia używa
https
do wszystkiego. Ale nie wiem.Poniższa wersja jest nieco bardziej wybaczająca z wejściem i może również obsługiwać duże litery.
Nie jestem pewien co do
"Connection:close"
linii. Nie wydaje się to obowiązkowe. Nie mogłem znaleźć przykładu, który działałby inaczej z nim lub bez niego.źródło
PowerShell (4) 240
Niegolfowany (proxy nie jest wymagane)
edytuj * też nie trudno zapamiętać ^^
źródło
Java 620 B
źródło
InputStreamReader
.