Histoire de fond:
Vous aimez votre nouveau poste de programmeur dans une méga-multinationale. Cependant, vous n'êtes pas autorisé à naviguer sur le Web car votre ordinateur ne dispose que d'une interface de ligne de commande. Ils effectuent également des balayages sur les disques durs de tous les employés. Vous ne pouvez donc pas simplement télécharger un navigateur Web de grande taille. Vous décidez de créer un simple navigateur textuel aussi petit que possible afin de pouvoir le mémoriser et le saisir dans un fichier temporaire tous les jours.
Défi:
Votre tâche consiste à créer un navigateur Web avec golf dans une interface de ligne de commande. Cela devrait:
- Prendre une seule URL dans via args ou stdin
- Fractionner les composants
directory
ethost
de l'URL - Envoyer une simple requête HTTP à la
host
pour demander laditedirectory
- Imprimer le contenu de toutes les étiquettes de
<p>
paragraphe</p>
- Et soit sortir ou demander une autre page
Plus d'informations:
Une simple requête HTTP ressemble à ceci:
GET {{path}} HTTP/1.1
Host: {{host}}
Connection: close
\n\n
Terminer les nouvelles lignes soulignées.
Une réponse typique ressemble à:
HTTP/1.1 200 OK\n
<some headers separated by newlines>
\n\n
<html>
....rest of page
Règles:
- Il ne doit fonctionner que sur le port 80 (pas de SSL nécessaire)
- Vous ne pouvez pas utiliser netcat
- Quel que soit le langage de programmation utilisé, seules les API TCP de bas niveau sont autorisées (sauf netcat).
- Vous ne pouvez pas utiliser l'interface graphique, rappelez-vous, c'est une CLI
- Vous ne pouvez pas utiliser les analyseurs HTML, sauf ceux qui sont intégrés (BeautifulSoup n'est pas intégré)
- Prime!! Si votre programme effectue une boucle et demande une autre URL au lieu de quitter, -40 caractères (tant que vous n'utilisez pas de récursivité)
- Aucun programme tiers. Rappelez-vous, vous ne pouvez rien installer.
- code-golf , donc le nombre d'octets le plus court gagne
import webbrowser;webbrowser.open(url)
Réponses:
Pure Bash (sans utilitaire), 200 octets - 40 bonus = 160
Je pense que cela dépend de la spécification,
bien que bien sûr, attention à l' analyse HTML à l'aide de regexJe pense que la seule chose pire que l'analyse de HTML à l'aide de regex est l'analyse HTML à l'aide de la correspondance de modèle de shell.Cela concerne maintenant l’
<p>...</p>
étendue de plusieurs lignes. Chacun<p>...</p>
est sur une ligne de sortie séparée:la source
/dev/tcp
extension est facultative et peut ne pas figurer dans votre version de bash. Vous devez compiler avec--enable-net-redirections
pour l'avoir.PHP, 175 octets (bonus 215 - 40)
227229239202216186octetsAmusez-vous à naviguer sur le Web:
Lit les URL de
STDIN
commehttp://www.example.com/
. Affiche les paragraphes séparés par une nouvelle ligne "\n
".Ungolfed
Première version supportant une seule URL
Édite
$c
(contient le contenu de la page) avec$c=$i=parse_url(trim(fgets(STDIN)));
au lieu de$c=''
.\n
par de nouvelles lignes (5 octets), unewhile
boucle avecfor
(2 octets), en plaçant presque tout dans les expressions defor
(2 octets) et en les remplaçantforeach
parjoin
(3 octets). Merci à Blackhole .fgets
parstream_get_contents
Merci à bwoebi .la réinitialisation,$c
car vous n'en avez plus besoin$c
.m
de motif de la regex. Merci à manatworkla source
while
est interdit de jouer au golf (for
souvent plus court, mais jamais plus longtemps), et pour créer une nouvelle ligne, appuyez simplement sur la touche Entrée (1 octet au lieu de 2\n
)! Voici votre code (non testé) un peu plus golfé (227 octets), la nouvelle ligne étant remplacée par↵
: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
boucle" vaut toujours mieux qu'un "while
boucle";).Perl, 132 octets
Code de 155 octets + 17 pour
-ln -MIO::Socket
- 40 pour demander continuellement des URLComme avec la réponse de @ DigitalTrauma, l'analyse rationnelle du code HTML, faites-moi savoir si ce n'est pas acceptable. Ne continue plus à analyser les URL ... Je reviendrai plus tard ... Bien que Bash soit proche! Un grand merci à @ Schwern pour m'avoir sauvé 59 (!) Octets et à @ skmrx pour avoir corrigé le bogue permettant de réclamer le bonus!
Usage
la source
PowerShell,
315 294 268 262254 octets355 334 308 302294 - 40 pour inviteNécessite PowerShell v5
Toutes les fins de ligne (y compris celles incorporées dans la chaîne) sont uniquement des nouvelles lignes
\n
(merci Blackhole ) qui sont entièrement prises en charge par PowerShell (mais si vous testez, soyez prudent, ISE utilise\r\n
).la source
GET
requêtes correctes … :)Script Groovy,
89, 61 octetsRetour en boucle pour le bonus 101- 40 = 61
Avec juste des arguments, 89 octets
la source
Bash (peut tricher mais semble être dans les règles) 144-40 = 105
Merci à Digital Trauma.
Puisque je n'ai pas besoin de scinder l'URL, cela fonctionne aussi: 122-40 = 82
la source
C 512 octets
Sur la base de mon entrée ici , cela prend l'adresse Web sans le mot "https: //" en tête. Il ne gérera pas les
<p>
paires imbriquées correctement :(Testé intensivement sur
www.w3.org/People/Berners-Lee/
Cela fonctionne lorsque compilé avec
Apple LLVM version 6.1.0 (clang-602.0.53) / Target: x86_64-apple-darwin14.1.1
Il a suffisamment de comportement indéfini pour que cela ne fonctionne pas ailleurs.
la source
Ruby, 118
Source de 147 octets; 11 octets '
-lprsocket
'; -40 octets pour la mise en boucle.Exemple d'utilisation:
la source
AutoIt , 347 octets
Essai
Contribution:
Sortie:
Contribution:
Sortie:
Remarques
<p>
tags imbriqués<p>
balises (insensible à la casse), se cassera à tous les autres formats de balisesPanicsBoucle indéfiniment quand une erreur survientla source
C #, 727 octets - 40 = 687 octets
C'est un peu d'entraînement mais sûrement mémorable :)
Voici une version non-golfée:
Comme vous pouvez le constater, il existe des problèmes de fuite de mémoire en prime :)
la source
using
déclaration autour des cours d'eau, mais cela ne fait pas une fuite.JavaScript (NodeJS) -
187166187:
Usage:
Ou formaté
la source
Python 2 -
212209 octetsla source
while h:
et avantprint g
.'GET /%s HTTP/1.1\nHost:%s\n\n'
.Python 2, 187 - 40 = 147 (141 dans une REPL)
Version compressée et en boucle de la réponse de Zac :
Exemple:
En fait utile est ceci:
207 - 40 = 167
Exemple:
la source
gawk, 235 - 40 = 195 octets
Il y a du golf, mais c'est une version plus impitoyable, qui a besoin de l'adresse Web sans
http://
le début. Et si vous voulez accéder au répertoire racine, vous devez terminer l’adresse par un/
. De plus, les<p>
étiquettes doivent être en minuscules.Ma version précédente ne traitait pas réellement les lignes contenant
</p><p>
correctement. Ceci est maintenant corrigé.Sortie pour l'entrée
example.com/
Ne fonctionne toujours pas avec Wikipedia. Je pense que la raison est que Wikipedia utilise
https
pour tout. Mais je ne sais pas.La version suivante est un peu plus clémente avec l'entrée et elle peut aussi gérer les balises majuscules.
Je ne suis pas sûr de la
"Connection:close"
ligne. Ne semble pas être obligatoire. Je ne pouvais pas trouver un exemple qui fonctionnerait différemment avec ou sans cela.la source
Powershell (4) 240
Ungolfed (proxy n'est pas requis)
modifier * également pas difficile à mémoriser ^^
la source
Java 620 B
la source
InputStreamReader
.