Trasfondo:
Disfrutas tu nuevo trabajo de programación en una mega-multi-corporación. Sin embargo, no puede navegar por la web ya que su computadora solo tiene una CLI. También ejecutan barridos de los discos duros de todos los empleados, por lo que no puede simplemente descargar un navegador web CLI grande. Decide crear un navegador de texto simple que sea lo más pequeño posible para que pueda memorizarlo y escribirlo en un archivo temporal todos los días.
Desafío:
Su tarea es crear un navegador web con golf dentro de una interfaz de línea de comandos. Debería:
- Tome una sola URL a través de args o stdin
- Dividir los componentes
directory
yhost
de la URL - Enviar una solicitud HTTP simple a la
host
solicitud de dichodirectory
- Imprima el contenido de cualquier etiqueta de
<p>
párrafo</p>
- Y salga o solicite otra página
Más información:
Una simple solicitud HTTP se ve así:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Poner fin a las nuevas líneas enfatizadas.
Una respuesta típica se ve así:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Reglas:
- Solo necesita trabajar en el puerto 80 (no se necesita SSL)
- No puedes usar netcat
- Independientemente del lenguaje de programación utilizado, solo se permiten API TCP de bajo nivel (excepto netcat)
- Es posible que no usar interfaz gráfica de usuario, recuerda, es una CLI
- No puede usar analizadores HTML, excepto los incorporados (BeautifulSoup no es incorporado)
- ¡¡Prima!! Si su programa retrocede y solicita otra URL en lugar de salir, -40 caracteres (siempre que no use la recursividad)
- No hay programas de terceros. Recuerda, no puedes instalar nada.
- code-golf , por lo que gana el conteo de bytes más corto
import webbrowser;webbrowser.open(url)
Respuestas:
Pure Bash (sin utilidades), 200 bytes - 40 bonus = 160
Creo que esto está a la altura de las especificaciones,
aunque,por supuesto, ten cuidado con el análisis HTML utilizando expresiones regularesCreo que lo único peor que analizar HTML usando regex es analizar HTML usando la coincidencia de patrones de shell.Ahora se trata de
<p>...</p>
abarcar varias líneas. Cada uno<p>...</p>
está en una línea de salida separada:fuente
/dev/tcp
es una extensión opcional y puede no estar presente en su compilación de bash. Necesitas compilar--enable-net-redirections
para tenerlo.PHP, 175 bytes (215 - 40 bonificación)
227229239202216186bytesDiviértete navegando por la web:
Lee las URL de me
STDIN
gustahttp://www.example.com/
. Emite párrafos separados por nueva línea "\n
".Sin golf
Primera versión que admite solo una URL
Ediciones
$c
(contiene el contenido de la página) con en$c=$i=parse_url(trim(fgets(STDIN)));
lugar de$c=''
.\n
con nuevas líneas (5 bytes), unwhile
bucle confor
(2 bytes), colocando casi todo en las expresiones defor
(2 bytes) y al reemplazarforeach
conjoin
(3 bytes). Gracias a Blackhole .fgets
constream_get_contents
Gracias a bwoebi .la reinicialización de,$c
ya que ya no es necesario$c
.m
de Regex. Gracias a manatworkfuente
while
está prohibido jugar al golf (afor
menudo es más corto pero nunca más largo), y para hacer una nueva línea, solo presiona enter (1 byte en lugar de 2 para\n
). Aquí está su código (no probado) un poco más golfizado (227 bytes), con la nueva línea reemplazada 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
bucle siempre es mejor que unwhile
bucle;Perl, 132 bytes
Código de 155 bytes + 17 para
-ln -MIO::Socket
- 40 para pedir continuamente URLsAl igual que con la respuesta de @ DigitalTrauma, regex analizando HTML, avíseme si eso no es aceptable. Ya no sigue analizando las URL ... Lo veré más tarde ... ¡Cerca de Bash! ¡ Muchas gracias a @ Schwern por salvarme 59 (!) Bytes y a @ skmrx por corregir el error para permitir un reclamo de la bonificación!
Uso
fuente
PowerShell,
315 294 268 262254 bytes355334308302294-40para solicitudRequiere PowerShell v5
Todas las terminaciones de línea (incluidas las incrustadas en la cadena) son solo líneas nuevas
\n
(gracias a Blackhole ) que es totalmente compatible con PowerShell (pero si está probando, tenga cuidado; ISE usa\r\n
).fuente
GET
... :)Groovy script,
89, 61 bytesLoop de vuelta para bono 101- 40 = 61
Con solo args, 89 bytes
fuente
Bash (puede estar haciendo trampa pero parece estar dentro de las reglas) 144-40 = 105
Gracias a Digital Trauma.
Como no necesito dividir la URL, esto también funciona: 122-40 = 82
fuente
C 512 Bytes
Basado libremente en mi entrada aquí , toma la dirección web sin un "https: //" principal. No manejará
<p>
pares anidados correctamente :(Probado exhaustivamente en
www.w3.org/People/Berners-Lee/
Funciona cuando se compila con
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Tiene un comportamiento indefinido suficiente que puede no funcionar en ningún otro lugar.
fuente
Ruby, 118
Fuente de 147 bytes; 11 bytes '
-lprsocket
'; -40 bytes para bucle.Ejemplo de uso:
fuente
AutoIt , 347 bytes
Pruebas
Entrada:
Salida:
Entrada:
Salida:
Observaciones
<p>
etiquetas anidadas<p>
etiquetas (no distingue entre mayúsculas y minúsculas), se romperá en cualquier otro formato de etiquetaPánicoLoops indefinidamente cuando se produce cualquier errorfuente
C #, 727 bytes - 40 = 687 bytes
Es un poco de entrenamiento pero seguramente memorable :)
Aquí hay una versión sin golf:
Como puede ver, hay problemas de pérdida de memoria como un bono :)
fuente
using
declaraciones en torno a las transmisiones, pero eso no hace una fuga.JavaScript (NodeJS) -
187166187:
Uso:
O formateado
fuente
Python 2 -
212209 bytesfuente
while h:
y antesprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187-40 = 147 (141 en una REPL)
Versión comprimida y en bucle de la respuesta de Zac :
Ejemplo:
Realmente útil es esto:
207 - 40 = 167
Ejemplo:
fuente
gawk, 235 - 40 = 195 bytes
Lo descarté, pero esta es una versión más implacable, que necesita la dirección web sin
http://
al principio. Y si desea acceder al directorio raíz, debe finalizar la dirección con un/
. Además, las<p>
etiquetas deben ser minúsculas.Mi versión anterior en realidad no manejaba las líneas que contenían
</p><p>
correctamente. Esto ya está arreglado.Salida para entrada
example.com/
Todavía no funciona con Wikipedia. Creo que la razón es que Wikipedia usa
https
para todo. Pero no lo se.La siguiente versión es un poco más indulgente con la entrada y también puede manejar etiquetas en mayúsculas.
No estoy seguro de la
"Connection:close"
línea. No parece ser obligatorio. No pude encontrar un ejemplo que funcionaría diferente con o sin él.fuente
Powershell (4) 240
Sin golf (no se requiere proxy)
editar * también no es difícil de memorizar ^^
fuente
Java 620 B
fuente
InputStreamReader
.