Backstory:
Anda menikmati pekerjaan pemrograman baru Anda di mega-multi-korporasi. Namun, Anda tidak diizinkan menjelajah web karena komputer Anda hanya memiliki CLI. Mereka juga menjalankan sweeping semua hard drive karyawan, sehingga Anda tidak bisa hanya mengunduh peramban web CLI yang besar. Anda memutuskan untuk membuat peramban teks sederhana yang sekecil mungkin agar Anda dapat menghafalnya dan mengetiknya menjadi file sementara setiap hari.
Tantangan:
Tugas Anda adalah membuat browser web golf dalam antarmuka baris perintah. Itu harus:
- Ambil satu URL melalui via args atau stdin
- Membagi
directory
danhost
komponen URL - Kirim permintaan HTTP sederhana ke
host
untuk meminta katadirectory
- Cetak isi setiap tag
<p>
paragraf</p>
- Dan apakah keluar atau meminta halaman lain
Info lebih lanjut:
Permintaan HTTP sederhana terlihat seperti ini:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Mengakhiri baris baru ditekankan.
Respons khas terlihat seperti:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Aturan:
- Ini hanya perlu bekerja pada port 80 (tidak diperlukan SSL)
- Anda tidak boleh menggunakan netcat
- Apapun bahasa pemrograman yang digunakan, hanya TCP API level rendah yang diizinkan (kecuali netcat)
- Anda tidak boleh menggunakan GUI, ingat, ini adalah CLI
- Anda tidak boleh menggunakan parser HTML, kecuali yang builtin (BeautifulSoup bukan builtin)
- Bonus !! Jika program Anda kembali dan meminta URL lain alih-alih keluar, -40 karakter (selama Anda tidak menggunakan rekursi)
- Tidak ada program pihak ketiga. Ingat, Anda tidak dapat menginstal apa pun.
- kode-golf , sehingga hitungan byte terpendek menang
import webbrowser;webbrowser.open(url)
Jawaban:
Bash Murni (tanpa utilitas), 200 byte - 40 bonus = 160
Saya pikir ini terserah spec,
meskipun tentu saja hati-hati untuk parsing HTML menggunakan regexSaya pikir satu-satunya hal yang lebih buruk daripada parsing HTML menggunakan regex parsing HTML menggunakan pencocokan pola shell.Ini sekarang berkaitan dengan
<p>...</p>
span beberapa baris. Masing<p>...</p>
- masing berada pada jalur output yang terpisah:sumber
/dev/tcp
adalah ekstensi opsional dan mungkin tidak ada dalam bash Anda. Anda perlu mengkompilasi dengan--enable-net-redirections
untuk memilikinya.PHP, 175 byte (215 - 40 bonus)
227229239202216186byteBersenang-senang menjelajahi web:
Membaca URL dari
STDIN
sukahttp://www.example.com/
. Keluaran paragraf dipisahkan oleh baris "\n
" baru.Tidak disatukan
Versi pertama hanya mendukung satu URL
Suntingan
$c
(menyimpan konten halaman) dengan$c=$i=parse_url(trim(fgets(STDIN)));
alih - alih$c=''
.\n
dengan baris baru (5 byte), satu-while
loop denganfor
(2 byte), menempatkan hampir semuanya ke dalam ekspresifor
(2 byte) dan dengan menggantiforeach
denganjoin
(3 byte). Berkat Blackhole .fgets
denganstream_get_contents
Terima kasih kepada bwoebi .inisialisasi ulang$c
karena tidak diperlukan lagi$c
sama sekali.m
dari Regex. Berkat kerja manatsumber
while
dilarang saat bermain golf (for
seringkali lebih pendek tetapi tidak pernah lebih lama), dan untuk melakukan baris baru, cukup tekan enter (1 byte, bukan 2 untuk\n
)! Ini kode Anda (yang belum diuji) sedikit lebih golf (227 byte), dengan baris baru digantikan oleh↵
: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 selalu lebih baik daripadawhile
-loop;).Perl, 132 byte
155 byte kode + 17 untuk
-ln -MIO::Socket
- 40 untuk terus-menerus meminta URLSeperti jawaban @ DigitalTrauma, regex parsing HTML, beri tahu saya jika itu tidak dapat diterima. Tidak menyimpan URL parsing lagi ... Saya akan melihatnya nanti ... Tutup untuk Bash! Terima kasih banyak kepada @ Schwern karena telah menyelamatkan saya byte (!) Dan @ skmrx karena telah memperbaiki bug untuk memungkinkan klaim bonus!
Pemakaian
sumber
PowerShell,
315 294 268 262254 byte355 334 308 302294 - 40 untuk konfirmasiMembutuhkan PowerShell v5
Semua ujung garis (termasuk yang tertanam dalam string) hanya baris baru
\n
(terima kasih Blackhole ) yang didukung penuh oleh PowerShell (tetapi jika Anda menguji, berhati-hatilah; penggunaan ISE\r\n
).sumber
GET
... :)Skrip Groovy,
89, 61 byteLoop kembali untuk bonus 101- 40 = 61
Dengan hanya args, 89 byte
sumber
Bash (mungkin curang tetapi tampaknya dalam aturan) 144-40 = 105
Berkat Digital Trauma.
Karena saya tidak perlu memisahkan URL, ini juga berfungsi: 122-40 = 82
sumber
C 512 Bytes
Berdasarkan longgar pada entri saya di sini , Dibutuhkan alamat web tanpa "https: //" terkemuka. Itu tidak akan menangani
<p>
pasangan bersarang dengan benar :(Diuji secara ekstensif pada
www.w3.org/People/Berners-Lee/
Ini berfungsi ketika dikompilasi dengan
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Ini memiliki perilaku yang tidak terdefinisi cukup sehingga mungkin tidak berfungsi di tempat lain.
sumber
Ruby, 118
147 sumber byte; 11 byte '
-lprsocket
'; -40 byte untuk perulangan.Contoh penggunaan:
sumber
AutoIt , 347 byte
Pengujian
Memasukkan:
Keluaran:
Memasukkan:
Keluaran:
Catatan
<p>
tag bersarang<p>
tag (tidak peka huruf besar-kecil), akan memecah setiap format tag lainnyaPanicsLoops tanpa batas waktu ketika terjadi kesalahansumber
C #, 727 Bytes - 40 = 687 Bytes
Ini sedikit pelatihan tapi pasti berkesan :)
Berikut ini adalah versi yang tidak dikoleksi:
Seperti yang Anda lihat, ada masalah kebocoran memori sebagai bonus :)
sumber
using
pernyataan di sekitar aliran tetapi itu tidak membuat kebocoran.JavaScript (NodeJS) -
187166187:
Pemakaian:
Atau diformat
sumber
Python 2 -
212209 bytesumber
while h:
dan sebelumnyaprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 dalam REPL)
Versi Zac yang dikompresi dan dilingkari :
Contoh:
Sebenarnya bermanfaat adalah ini:
207 - 40 = 167
Contoh:
sumber
gawk, 235 - 40 = 195 byte
Menurunkannya, tetapi ini adalah versi yang lebih tak kenal ampun, yang membutuhkan alamat web tanpa
http://
di awal. Dan jika Anda ingin mengakses direktori root, Anda harus mengakhiri alamat dengan a/
. Selanjutnya<p>
tag harus huruf kecil.Versi saya sebelumnya sebenarnya tidak menangani garis yang berisi
</p><p>
dengan benar. Ini sekarang sudah diperbaiki.Output untuk input
example.com/
Masih tidak berfungsi dengan Wikipedia. Saya pikir alasannya adalah Wikipedia menggunakan
https
semuanya. Tapi saya tidak tahu.Versi berikut sedikit lebih memaafkan dengan input dan dapat menangani tag huruf besar juga.
Saya tidak yakin tentang
"Connection:close"
garis itu. Sepertinya tidak wajib. Saya tidak dapat menemukan contoh yang akan bekerja berbeda dengan atau tanpa itu.sumber
Powershell (4) 240
Tidak digabungkan (proxy tidak diperlukan)
sunting * juga tidak sulit untuk menghafal ^^
sumber
Java 620 B
sumber
InputStreamReader
.