Histórico:
Você gosta do seu novo trabalho de programação em uma megaempresa. No entanto, você não tem permissão para navegar na Web, pois seu computador possui apenas uma CLI. Eles também executam varreduras nos discos rígidos de todos os funcionários, para que você não possa simplesmente baixar um grande navegador da CLI. Você decide criar um navegador de texto simples, o mais pequeno possível, para memorizá-lo e digitá-lo em um arquivo temporário todos os dias.
Desafio:
Sua tarefa é criar um navegador da web dentro de uma interface da linha de comandos. Deveria:
- Adquira uma única URL via args ou stdin
- Divida os componentes
directory
ehost
da URL - Envie uma solicitação HTTP simples para o
host
para solicitar o referidodirectory
- Imprimir o conteúdo de qualquer tag de
<p>
parágrafo</p>
- E saia ou peça outra página
Mais informações:
Uma solicitação HTTP simples se parece com isso:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Enfatizando novas linhas enfatizadas.
Uma resposta típica é semelhante a:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Regras:
- Ele só precisa funcionar na porta 80 (não é necessário SSL)
- Você não pode usar o netcat
- Qualquer que seja a linguagem de programação usada, apenas APIs TCP de baixo nível são permitidas (exceto netcat)
- Você não pode usar a GUI, lembre-se, é uma CLI
- Você não pode usar analisadores de HTML, exceto os incorporados (BeautifulSoup não é um incorporado)
- Bônus!! Se o seu programa retornar e solicitar outro URL em vez de sair, -40 caracteres (desde que você não use recursão)
- Não há programas de terceiros. Lembre-se, você não pode instalar nada.
- código-golfe , para que a menor contagem de bytes ganhe
import webbrowser;webbrowser.open(url)
Respostas:
Pure Bash (sem utilitários), 200 bytes - bônus 40 = 160
Eu acho que isso está de acordo com as especificações,
embora, éclaro,tenha cuidado com a análise de HTML usando regexAcho que a única coisa pior do que analisar o HTML usando o regex é analisar o HTML usando a correspondência de padrões de shell.Agora isso lida com a
<p>...</p>
abrangência de várias linhas. Cada um<p>...</p>
está em uma linha de saída separada:fonte
/dev/tcp
é uma extensão opcional e pode não estar presente na sua compilação do bash. Você precisa compilar com--enable-net-redirections
ele.PHP, 175 bytes (215-40 bónus)
227229239202216186bytesDivirta-se navegando na Web:
Lê URLs de
STDIN
comohttp://www.example.com/
. Gera parágrafos separados por nova linha "\n
".Ungolfed
Primeira versão que suporta apenas um URL
Editar% s
$c
(mantém o conteúdo da página) com em$c=$i=parse_url(trim(fgets(STDIN)));
vez de$c=''
.\n
por novas linhas (5 bytes), umwhile
loop comfor
(2 bytes), colocando quase tudo nas expressões defor
(2 bytes) e substituindoforeach
porjoin
(3 bytes). Graças ao Blackhole .fgets
porstream_get_contents
Thanks to bwoebi .a reinicialização,$c
pois não é mais necessário$c
.m
do Regex. Graças à manatworkfonte
while
é proibido quando jogar golfe (for
geralmente é mais curto, mas nunca mais longo) e, para fazer uma nova linha, basta pressionar enter (1 byte em vez de 2 para\n
)! Aqui está o seu código (não testado) um pouco mais golfe (227 bytes), com a nova linha substituída por↵
: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 é sempre melhor do que umwhile
loop;).Perl, 132 bytes
Código de 155 bytes + 17 para
-ln -MIO::Socket
- 40 para solicitar continuamente URLsComo na resposta do @ DigitalTrauma, regex que analisa HTML, deixe-me saber se isso não é aceitável. Não fica mais analisando URLs ... Veremos isso mais tarde ... No entanto, próximo ao Bash! Muito obrigado a @ Schwern por me salvar 59 (!) Bytes e a @ skmrx por corrigir o erro para permitir uma reivindicação do bônus!
Uso
fonte
PowerShell,
315294268262254bytes355 334 308 302294 - 40 para solicitaçãoRequer PowerShell v5
Todas as terminações de linha (incluindo as incorporadas na string) são apenas novas linhas
\n
(graças ao Blackhole ), que são totalmente suportadas pelo PowerShell (mas se você estiver testando, tenha cuidado; o ISE usa\r\n
).fonte
GET
... :)Script Groovy,
89, 61 bytesLacete de volta para bónus 101- 40 = 61
Com apenas args, 89 bytes
fonte
Bash (pode estar enganando, mas parece estar dentro das regras) 144-40 = 105
Obrigado ao Digital Trauma.
Como não preciso dividir o URL, isso também funciona: 122-40 = 82
fonte
C 512 bytes
Baseado livremente na minha entrada aqui , é necessário o endereço da Web sem um "https: //" inicial. Ele não manipulará
<p>
pares aninhados corretamente :(Testado extensivamente em
www.w3.org/People/Berners-Lee/
Funciona quando compilado com
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Possui um comportamento indefinido suficiente para que não funcione em nenhum outro lugar.
fonte
Ruby, 118
Fonte de 147 bytes; 11 bytes '
-lprsocket
'; -40 bytes para loop.Exemplo de uso:
fonte
AutoIt , 347 bytes
Testando
Entrada:
Resultado:
Entrada:
Resultado:
Observações
<p>
tags aninhadas<p>
tags (sem distinção entre maiúsculas e minúsculas), será interrompido em qualquer outro formato de tagPânicoLoops indefinidamente quando ocorre algum errofonte
C #, 727 bytes - 40 = 687 bytes
É um pouco de treinamento, mas certamente memorável :)
Aqui está uma versão não destruída:
Como você pode ver, há problemas de vazamento de memória como um bônus :)
fonte
using
declarações em torno de fluxos, mas isso não vaza.JavaScript (NodeJS) -
187166187:
Uso:
Ou formatado
fonte
Python 2 -
212209 bytesfonte
while h:
antes e depoisprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 em um REPL)
Versão compactada e em loop da resposta de Zac :
Exemplo:
Realmente útil é o seguinte:
207 - 40 = 167
Exemplo:
fonte
gawk, 235 - 40 = 195 bytes
Golpeou, mas esta é uma versão mais implacável, que precisa do endereço da Web sem
http://
no começo. E se você quiser acessar o diretório raiz, precisará terminar o endereço com a/
. Além disso, as<p>
tags devem ser minúsculas.Minha versão anterior, na verdade, não lidava com linhas contendo
</p><p>
corretamente. Agora está corrigido.Saída para entrada
example.com/
Ainda não funciona com a Wikipedia. Eu acho que o motivo é que a Wikipedia usa
https
para tudo. Mas eu não sei.A versão a seguir é um pouco mais tolerante com a entrada e também pode lidar com tags maiúsculas.
Eu não tenho certeza sobre a
"Connection:close"
linha. Não parece ser obrigatório. Não consegui encontrar um exemplo que funcionasse diferente com ou sem ele.fonte
Powershell (4) 240
Ungolfed (proxy não é necessário)
editar * também não é difícil de memorizar ^^
fonte
Java 620 B
fonte
InputStreamReader
.