Предыстория:
Вы наслаждаетесь своей новой работой программиста в мегакультурной корпорации. Однако вы не можете просматривать веб-страницы, поскольку на вашем компьютере есть только CLI. Они также запускают развертки жестких дисков всех сотрудников, поэтому вы не можете просто загрузить большой веб-браузер CLI. Вы решаете сделать простой текстовый браузер настолько маленьким, насколько это возможно, чтобы вы могли запомнить его и каждый день вводить во временный файл.
Вызов:
Ваша задача - создать веб-браузер для гольфа в интерфейсе командной строки. Должно:
- Возьмите один URL через args или stdin
- Разделить
directory
иhost
компоненты URL - Отправьте простой 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 символов (если вы не используете рекурсию)
- Нет сторонних программ. Помните, вы не можете ничего установить.
- код-гольф , поэтому выигрывает самый короткий счетчик байтов
import webbrowser;webbrowser.open(url)
Ответы:
Pure Bash (без утилит), 200 байт - 40 бонусов = 160
Я думаю, что это зависит от спецификации,
хотя, конечно, остерегайтесь парсинга HTML с помощью регулярных выражений.Думаю, что хуже, чем синтаксический анализ HTML с помощью регулярных выражений, является разбор HTML с использованием сопоставления с шаблоном оболочки.Теперь это касается
<p>...</p>
нескольких строк. Каждый<p>...</p>
находится на отдельной строке вывода:источник
/dev/tcp
это необязательное расширение, которое может отсутствовать в вашей сборке bash. Вы должны скомпилировать,--enable-net-redirections
чтобы иметь это.PHP, 175 байтов (215 - 40 бонусов)
227229239202216186байтовПриятного просмотра веб-страниц:
Читает URL-адреса
STDIN
какhttp://www.example.com/
. Вывод абзацев через пробел "\n
".Ungolfed
Первая версия, поддерживающая только один URL
Правки
$c
(содержит содержимое страницы)$c=$i=parse_url(trim(fgets(STDIN)));
вместо$c=''
.\n
новыми строками (5 байтов), одногоwhile
цикла сfor
(2 байта), размещения почти всего в выраженияхfor
(2 байта) и заменыforeach
наjoin
(3 байта). Благодаря Черной дыре .fgets
наstream_get_contents
Благодаря bwoebi .повторную инициализацию, так$c
как она больше не нужна$c
.m
из регулярного выражения. Благодаря манатворкеисточник
while
это запрещено при игре в гольф (for
часто короче, но никогда не длиннее), а для перехода на новую строку просто нажмите enter (1 байт вместо 2 для\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);
for
-loop всегда лучше, чемwhile
-loop;).Perl, 132 байта
Код 155 байт + 17 для
-ln -MIO::Socket
- 40 для постоянного запроса URLКак и в случае ответа @ DigitalTrauma, регулярного анализа HTML, дайте мне знать, если это не приемлемо. Больше не обрабатывает URL-адреса ... Я посмотрю на это позже ... Впрочем, близко к Bash! Большое спасибо @ Schwern за сохранение 59 (!) Байтов и @ skmrx за исправление ошибки, позволяющей получить бонус!
использование
источник
PowerShell,
315 294 268 262254 байта355 334 308 302294 - 40 для быстрогоТребуется PowerShell v5
Все окончания строк (включая те, что встроены в строку) - это только новые строки
\n
(благодаря Blackhole ), которые полностью поддерживаются PowerShell (но если вы тестируете, будьте осторожны, ISE использует\r\n
).источник
GET
запросы… :)Groovy скрипт,
89, 61 байтПетля обратно бонусной 101- 40 = 61
Только с аргументами, 89 байтов
источник
Bash (может быть обманывает, но, кажется, в рамках правил) 144-40 = 105
Благодаря Цифровой Травме.
Поскольку мне не нужно разделять URL, это также работает: 122-40 = 82
источник
C 512 байт
Основываясь на моей записи здесь , он берет веб-адрес без ведущего "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
Он имеет достаточно неопределенное поведение, что он может не работать в другом месте
источник
Руби, 118
Источник 147 байт; 11 байт '
-lprsocket
'; -40 байт для циклов.Пример использования:
источник
AutoIt , 347 байт
тестирование
Входные данные:
Выход:
Входные данные:
Выход:
замечания
<p>
теги<p>
теги (без учета регистра), будет прерываться на любой другой формат тегаПаниказацикливается на неопределенное время при возникновении любой ошибкиисточник
C #, 727 байт - 40 = 687 байт
Это немного тренировки, но, безусловно, запоминающийся :)
Вот негольфированная версия:
Как видите, в качестве бонуса есть проблемы с утечкой памяти :)
источник
using
заявлений о потоках, но это не делает утечку.JavaScript (NodeJS) -
187166187:
Использование:
Или отформатированный
источник
Python 2 -
212209 байтисточник
while h:
и доprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 в REPL)
Сжатый и зацикленный вариант ответа Зака :
Пример:
На самом деле полезно это:
207 - 40 = 167
Пример:
источник
gawk, 235 - 40 = 195 байт
Гольф это, но это более неумолимая версия, которая требует веб-адрес без
http://
в начале. И если вы хотите получить доступ к корневому каталогу, вы должны закончить адрес с/
. Кроме того,<p>
теги должны быть в нижнем регистре.Моя ранняя версия на самом деле не обрабатывает строки, содержащие
</p><p>
правильно. Это сейчас исправлено.Выход для ввода
example.com/
Все еще не работает с Википедией. Я думаю, причина в том, что Википедия использует
https
для всего. Но я не знаюСледующая версия немного прощает ввод и может обрабатывать теги верхнего регистра.
Я не уверен насчет
"Connection:close"
линии. Не кажется обязательным. Я не мог найти пример, который работал бы по-другому с или без него.источник
Powershell (4) 240
Ungolfed (прокси не требуется)
редактировать * также не трудно запомнить ^^
источник
Java 620 B
источник
InputStreamReader
.