Ecrivez un programme ou une fonction qui écoute le trafic TCP entrant sur le port N. Il offre un service simple: il calcule la somme des champs d’adresse IP de la connexion entrante et le renvoie.
Le programme ou la fonction lit l'entier N à partir d'arguments ou de stdin. Il écoute les connexions TCP entrantes sur le port N. Lorsque quelqu'un se connecte à ce port, le programme calcule la somme de ses champs d'adresse IP et le renvoie au client avec un saut de ligne final et ferme la connexion.
- Le numéro de port N est un port valide et 2 10 <N <2 15
- Le retour à la ligne peut être
\n
ou\r\n
- Vous pouvez utiliser IPv4 ou IPv6. Les adresses IPv6 étant écrites au format hexadécimal, vous devez également fournir le résultat au même format, par exemple
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
C'est du code-golf . Les règles standard et les échappatoires s'appliquent.
Exemple
Vous exécutez votre serveur avec ./server 1234
. Le serveur est maintenant en cours d'exécution et attend des connexions sur le port 1234. Un client de se 127.0.0.1
connecte ensuite à votre serveur. Votre serveur effectue un calcul simple: 127+0+0+1 => 128
et envoie le résultat au client (avec saut de ligne): 128\n
. Ensuite, le serveur ferme la connexion et attend le prochain client.
Classement
var QUESTION_ID=76379,OVERRIDE_USER=20569;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
la source
Réponses:
Bash + netcat + ss +…,
6560 caractèresPas une solution sérieuse, était simplement curieux de cette possibilité.
Grâce à:
awk
filtrage basé (-5 caractères)Échantillon échantillon:
(terminal 1)
(terminal 2)
Sur Ubuntu , vous pouvez obtenir
nc
de netcat traditionnels (non, netcat-openbsd est pas bon) etss
de iproute2 .la source
C #,
284283282278274254 octetsExemple classique d'un serveur TCP C # basique. Essai:
Terminal 1:
Terminal 2:
Firefox:
la source
int Main
place devoid Main
. Comme le programme ne retourne jamais, le compilateur n'a pas besoin d'unereturn
déclaration.Start
est facultatif, ce qui permet de sauvegarder un autre caractère.using
sur leTcpClient
, ce qui vous permettra d'économiser trois autres caractères (utilisez le{}
defor
), et faire de même avec leStreamWriter
devrait en sauver un de plus.Flush
leStreamWriter
faire fonctionner correctement.Linux ELF / x86, 146 octets
Inclut un en-tête ELF de 52 octets, un en-tête de programme de 32 octets, 111 octets de code de programme + 3 octets de code permettant de sauter dans les en-têtes.
Information sur la façon de créer de petits executables ELF se trouve à breadbox d » « Un Whirlwind tutoriel sur la création vraiment Teensy ELF pour Linux Exécutables » .
Linux / i386 utilise l'
socketcall(2)
appel système multiplex, qui prendebx
l'appel de socket spécifique (lesSYS_*
macros de/usr/include/linux/net.h
) etecx
un pointeur sur la zone d'argument de l'appel de bibliothèque d'origine.Quelques choses faites pour garder le petit exécutable:
EDX
points d' entrée constituent une fonction de finalisation (utile pour les exécutables chargés par l'éditeur de liens dynamique) ou vaut NULL).argv[0]
).bind(2)
,listen(2)
etaccept(2)
.phentsize
andphnum
, un octet est ajouté, ce qui en fait uneCMP
opération qui prend immédiatement les champsphentsize
andphnum
(astuce volée sans vergogne de la solution de breadbox à 123 dans anarchy golf ).LODS
(chargement dans l’accumulateur et index source d’incrémentation / décrémentation) etSTOS
(stockage depuis l’index de destination de l’accumulateur et incrémentation / décrémentation) conviennent au code abrégé.XCHG EAX, reg
est 1 octet, comparé àMOV EAX, reg
, ce qui prend 2 octets.CDQ/CLTD
(sign-extendEAX
intoEDX:EAX
) peut être utilisé comme moyen sur 1 octet de mettre à zéro leEDX
registre.BSWAP
est utile pour la mise en œuvrehtons()
.Source Nasm:
la source
NodeJS,
146134127 octetsJ'ai enfin la possibilité de poster une réponse à NodeJS! IPv4 seulement pour le moment.
Exécution échantillon:
node script.js 1024
. Depuis un autre terminal:la source
'\n'
avec une chaîne de modèle contenant un retour à la ligne littéral.Tcl, 92
Assez explicite:
socket -server s $argv
crée un socket d’écoute sur le port spécifié dans les arguments.Chaque fois qu’une nouvelle connexion arrive, l’
proc s
appel est appelé, avec comme paramètres canal, adresse source et port source.string map
substitue.
à+
l'adresse de source, etexpr
évalue le résultat arithmétique, qui est ensuiteputs
de nouveau au canal de connexionc
.vwait
exécute une boucle d'événements pour attraper les événements de connexion entrants.Crédit à @DonalFellows pour les éléments suivants:
Voici une version qui gère IPv6 (nécessite Tcl 8.6; la plus grande partie de la longueur supplémentaire est due à la production d'une réponse hexadécimale):
Tcl, 109
la source
apply
ne semble rien sauver. Vous ne pouvez pas non plus l'utilisertcl::mathop::+ {*}[split $a .]
car c'est un peu plus long. Vous ne pouvez pas non plus raser quoi que ce soit parmi les noms d'options. Mais prendre en charge IPv6 est assez simple à ajouter et ne coûte que quelques octets de code de plus (et uneregsub
approche basée sur la longueur est tout aussi longue).proc s {c a p}
avez-vous vraiment besoin de tout cet espace?Groovy
133,125,93, 89IPv4 seulement, probablement.
Ungolfed:
Essai:
la source
.toInteger()
→as int
ets.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. Et il y a un espace supplémentaire après.with
.Python 3,
170166147 octetsPrend le port
stdin
, IPv4 seulement. Fonctionne sous GNU / Linux (et, je suppose, dans la plupart des autres), qui s'étend automatiquement "" à "0.0.0.0", mais pas sûr de Windows.la source
import *
et, SOCK_STREAM
sont inutiles. En outre, la ligne d'envoi pourrait être écrite plus efficacement en tant quec.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
devientinput()
et la partie envoi devientc.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 octetsGolfé
Ungolfed
Sortie
la source
int k=
et remplacez le k par tous les éléments cInteger.toString(k)
. Pour économiser quelques octets.interface
pourclass
devrait gagner quelques octets de plusa.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
au lieu denew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
plus court quea.close();
? Nécessite Java 7, mais peut gagner des octets.PowerShell v2 +,
303268257227 octets35 octets sauvés grâce à Matt ... 11 autres octets sauvés par aliasing
New-Object
et modifications mineures ... 30 octets supplémentaires enregistrés en utilisant implicitement localhost plutôt queany
l'adresse IP et corrigés pour tenir compte de l'utilisation continue telle que spécifiée à l'origine et que j'ai manquéeVraiment semblable à la réponse C # , puisque c'est .NET qui sous-tend les deux. Nous économisons quelques octets ici sur la réponse C # en étant en mesure de tirer parti de la fonctionnalité de renvoi de PowerShell (entourant notre déclaration / affectation en parenthèses, puis en appelant immédiatement les méthodes.), Mais nous perdons énormément en raison de la formulation de la somme. . Le fait que nous ayons des noms de classe / appels légèrement plus courts est vraiment la raison pour laquelle cette réponse bat C #.
Explication
Nous créons d’abord un
New-Alias
(avec l’nal
alias) pour économiser sur la recopieNew-Object
plus tard. Le reste de la première ligne configure un écouteur TCP. Nous passons la ligne$args[0]
de commande comme entrée pour créer un nouveauSystem.Net.Sockets.TcpListener
, stocké sous$l
. Cet objet est encapsulé dans des parenthèses et immédiatement appelé avec.Start()
pour l’ouvrir activement.En entrant dans une
for
boucle infinie , nous plaçons ensuite notre auditeur$l
sur le blocage avecAcceptTcpClient()
lequel attendre une connexion. Une référence à cette connexion (une fois établie) est stockée$c
, encapsulée dans des parenthèses et immédiatement appeléeGetStream()
pour obtenir le flux de données. Ce flux de données est transmis à un nouveauSystem.IO.StreamWriter
constructeur$w
afin que nous puissions le manipuler. Ce constructeur est lui-même encapsulé dans des parenthèses et immédiatement appeléWrite(...)
.Pendant l'
Write(...)
appel, nous prenons en charge notre client$c
et obtenons laRemoteEndPoint
propriété du client . C'est le seul moyen (que j'ai trouvé jusqu'à présent) d'obtenir l'adresse IP distante. Ensuite, nous devons reformuler cet[System.Net.IPEndPoint]
objet en tant qu’objet afin qu’il soit correctement formaté, encapsuler cela entre parenthèses et extraire uniquement la.Address
propriété. Nous avons ensuite-replace
les périodes littérales avec des signes plus, puis nous le transmettons àInvoke-Expression
(similaire àeval
) pour obtenir notre sommation.Après l'écriture d'IO, nous devons appeler
.Dispose()
pour nous assurer que le flux de données est envoyé au client et fermé. Le serveur TCP interrompt la connexion client sans avertissement. Par conséquent, en fonction du client utilisé, il est possible que la communication soit interrompue pendant un certain temps. Il continue ensuite dans lafor
boucle sans fermer correctement les connexions. Cela signifie également que la mémoire et le système manquent de manière folle, mais nous ne nous en soucions pas, n'est-ce pas? Vous devrez peut-être utiliser le Gestionnaire des tâches pour arrêter le processus une fois que vous aurez fini d’exécuter le serveur. :RÉÉgalement IPv4 uniquement, car la sommation indique une tentative spectaculaire de gestion d'une adresse IPv6, car ce
:
n'est pas un opérateur algébrique valideiex
à analyser.la source
free()
eux après?delete[]
, peut être? : P.close()
et.dispose()
méthodes que nous ne demandons pas ici qui inciterait les gens sur la révision du Code d'avoir un ajustement.[Net.ipaddress]::Any
travaux.PHP, 161 (56?)
Ceci est mon premier post ici. J'espère que ça va bien :)
Ungolfed:
Terminal:
Cela ne fonctionne que pour IPV4
Edit : Je viens de remarquer que php supporte le serveur de base:
j'ai décidé de m'en tenir au nombre de caractères original à moins que quelqu'un ne confirme si le suivi est autorisé :)
test2.php: (solution possible sur 56 octets)
Et puis démarrez le service avec:
Chrome en tant que client
Edit 2: wget en tant que client
la source
test2.php
? Si tel est le cas, je pense que vous devriez demander au PO s'il jugerait ce type de fonctionnement intrinsèque acceptable pour ce défi. Ce n'est pas une faille cependant.Go ,
359311C'est mon premier programme dans Go - Cela m'a permis de découvrir une chose: ce n'est vraiment pas une bonne langue pour jouer au golf!
(Bravo à @steve qui a fait la majeure partie du golf!)
la source
"strings"
devients "strings"
pour que ce dernierstrings.Split
devienne justes.Split
.import(."pkgname")
toutes les fonctions seront importées dans l'espace de noms actuel, vous pouvez alors supprimer le préfixe. par exemple.import ."fmt"; Println("foo")
Si vous utilisezSscanf
lefmt
paquet pour analyser l'adresse au lieu de regex, cela vous épargnera quelques octets supplémentaires, ce qui vous donnera l'avantage de pouvoirFprintln
renvoyer le total au lieu d'importerstrconv
.Common Lisp, 110 octets
Détails
la source
q, 88 octets
system raze"p ",1_.z.x
: Prend le deuxième argument de ligne de commande (le premier"-"
sert à dire deq
ne pas interpréter enN
tant que script / fichier) et ouvre un port ("p "
) avec cet argument .q -p N
définitN
automatiquement le port , mais comme la question semble suggérer que celaN
devrait être un argument pour le programme plutôt que l'exécutable lui-même, je suis allé dans le sens le plus long..z.pg
fonction qui gère les demandes entrantes,.z.a
l'adresse IP est stockée sous forme d'entier 32 bits."i"$0x0 vs
la scinde en son entier 'constituants' etsum
fait la somme.string
le résultat numérique et ajouter"\n"
à celui-ci pour retourner au client..z.ph
est une autre fonction pour les requêtes HTTP GET, avec un traitement supplémentaire pour convertir la sortie de chaîne en une réponse HTTP valide.Démo - Serveur:
Démo - Client (d'une autre
q
session en cours d'exécution127.0.0.1
):Démo - Client (à partir de
curl
):la source
LiveScript,
107105 octetsRien d’autre à ajouter, c’est juste un truc de base sur NodeJS. Les points de style pour
&1
(second argument),<|
(F # piping, semblable à$
Haskell) et biop:(+)
dans LS, sont comme des sections d'opérateur dans Haskell: une fonction binaire curryed (qui ajoute ses opérandes). Aussi un peu sale:/
si une chaîne littérale se trouve à sa droite, elle se scinde.la source
Perl,
141132 + 1 = 133 octetsGolfé
Ungolfed
Exemple
la source
s/\./+/g
→y/./+/
.while(1){…}
→{…;redo}
selon user130144 grande l » extrémité . Et à l'exception de l'->send()
appel, toutes les autres parenthèses sont inutiles.Python 2, 180 octets
Prend le port sur stdin.
la source
NodeJS (ES6),
129118107 octetsFonctionne pour IPv4. Courir comme
node server.js <port>
la source
c.remoteAddress
serait alors::ffff:127.0.0.1
. (J'ai testé sur Node v5.9.1)..listen()
utilisé par défaut en premier sur IPv4, mais il semble que ce soit par bogue ou par conception que cela a changé. La soumission fonctionnera toujours correctement sur les versions les plus récentes du noeud lorsque IPv6 est désactivé sur la machine hôte.Go, 211 octets
Peut probablement être joué au golf plus loin, je ne suis pas entièrement satisfait de la façon dont je dois analyser l'adresse IP, par exemple, cela ressemble à un horrible hack.
Ecoute sur IPv4 sur le port donné en argument.
la source
PowerShell,
208206192152 octetsinformation sur la version:
Merci à TimmyD de m'avoir sauvé 14 octets!
Merci à TessellatingHeckler de m'avoir sauvé 40 octets
la source
($t=new-object net.sockets.tcplistener($args[0])).start();for(){($z=$t.acceptsocket()).send(($x=[byte[]][char[]](""+($z.remoteendpoint.address-replace"\.","+"|iex))+32),$x.count,0);$z.close()}
($t=[net.sockets.tcplistener]$args[0]).start();for(){($z=$t.acceptsocket()).send([char[]]"$($z.remoteendpoint.address-replace"\.","+"|iex)");$z.close()}
- ce que j’ai seulement testé rapidement avec la connexion netcat, mais cela semble fonctionner de la même manière - la connexion à partir de localhost de toute façon.Code machine 8086 (DOS 16 bits),
163 156 148 148142 octetsCode de montage équivalent:
Cela suppose que
ntcpdrv
soit chargé àINT 0x61
(et à tout pilote de paquet approprié à0x60
). Compiler avecfasm tcpserv.asm
.Il a cependant quelques problèmes:
la source
xor r,r
place demov r,0
.CR LF
, alors je suis allé avec cela. Quoi qu’il en soit, il est inutile de compter maintenant la taille de l’asm, autant le nettoyer un peu et ajouter quelques commentaires.int 0x61
renvoie un port local aléatoire dansax
. Mais il change également l'adresse IP d'écoute en un certain nombre de déchets (4.2.0.0
iirc)Haskell, 216 octets
Utilisation du package "network-simple" (
cabal install network-simple
). Nécessite quelques extensions de langue (-XOverloadedStrings -XNoMonomorphismRestriction
) pour fonctionner.Il existe quelques simplifications possibles, notamment changer la
w
fonction pour renvoyer la somme directement plutôt qu'une liste, et utiliser une fonction plutôt qu'un programme afin que le numéro de port puisse être spécifié en tant qu'argument. Je n'imagine pas que cela réduirait beaucoup la taille, cependant. 20 octets peut-être?la source
w
de#
, alorsw h n
devienth#n
pour une économie de 2 octets par utilisation.Oreillons,
114 à115 octetsGolfé:
Ungolfed:
Il s'agit de la version InterSystems Caché de Mumps. S'il existe une version capable d'acquérir l'adresse TCP plus courte que celle utilisée
##class(%SYSTEM.TCPDevice).PeerAddr()
(car elle représente presque un tiers du programme), elle aurait peut-être une meilleure chance contre certaines des autres langues déjà publiées. ... ;-)Edit: Merci à @TimmyD - J'ai raté la lecture du port de STDIN ou des arguments au lieu d’être codée en dur. Édité; il a ajouté 1 octet au programme.
la source
C, 535 octets
Eh bien, quelqu'un devait le faire.
J'ai ajouté un seul saut de ligne afin que le code publié compte en réalité 536 caractères.
compiler avec
gcc [file_name] -o server
courir avec
./server [port]
se connecter avec
telnet localhost [port]
la source
Java, 210 octets
Golfé:
Étendu:
C’est l’ensemble des astuces que j’ai données dans d’autres réponses en Java, plus l’écriture en tant que fonction au lieu d’un programme complet, qui gagne environ 70 octets par rapport au programme.
la source
Haskell, 326 octets
Malheureusement, j'ai dû utiliser
Network.Socket
pour obtenir l'accès à l'adresse IP distante sous forme d'entier plutôt que de chaîne. Cela aurait sauvé des dizaines de caractères si je pouvais le faires <- listenOn (PortNumber n)
, plutôt que d'avoir à appeler explicitementsocket
,bind
etlisten
individuellement. Mais, malheureusement,Network.accept
me donne une chaîne d’ hôte , pas un entier d’ adresse IP , j’ai donc dû recourir àNetwork.Socket.accept
ami et à des amis.La fonction
f
prend un numéro de port en argument et crée un socket serveur (s
) sur ce port. Il appelle ensuite la fonctiong
avec la socket du serveur.g
boucle pour toujours, acceptant les connexions. La fonctionb
prend une adresse IPv4 réelle et calcule la somme de ses chiffres.Je suis sûr que quelqu'un, quelque part, peut le faire mieux que moi. Je voulais montrer à quel point les tâches de socket sont faciles en Haskell ... mais j'ai ensuite échoué lamentablement, car j'ai besoin d'un accès à l'adresse IP, qui n'est généralement pas facile à obtenir.
la source
withSocketsDo
que cela n’est nécessaire que sous Windows. Par conséquent, si vous utilisez Linux, vous pouvez l’ignorer. (2) 0xFF est un caractère plus long que 255; (3) convertir le socket en un descripteur et utiliser des E / S régulières est beaucoup plus long que l’utiliserNetwork.Socket.send
. Oui,send
c'est obsolète, mais la raison n'est pas pertinente pour ce scénario (elle ne concerne que du texte non binaire ASCII ou des données binaires), il semble donc raisonnable de l'utiliser.Network.accept gives me a host string, not an IP address integer
Vous ne pouvez pas diviser simplement la chaîne IP sur la"."
,map
fonction chaîne à nombre de Haskell sur la chaîne de division et résumer les résultats?Lua,
169162160153151148138129 octetsVersion golfée
Luasocket doit être installé et un interpréteur prenant en charge les étiquettes. Je l'ai testé avec Luajit et je peux également confirmer que le code ne fonctionne pas avec Lua 5.1.
Version non-golfée
Modifier 1:
Changé
i=({c:getpeername()})[1]
pour justei=c:getpeername()
Edit 2:
Suppression des accolades de l'instruction require.
Edit 3:
Suppression des accolades autour du vararg, diminution du nombre d'octets un peu.
Edit 4:
Suppression de la parenthèse autour de "% d +", raccourcie de 2 octets.
Edit 5:
Suppression de la variable inutile i.
Edit 6:
Changement de l'ip de "127.0.0.1" à 0. (Merci à xyzzy sur #lua)
Éditer 7:
Suppression de l'appel de fonction au numéro de numérotation puisque les chaînes sont automatiquement numérotées (Merci à Trebuchette pour cette suggestion, je ne le savais pas)
la source
+
opérateur, afin que vous puissiez en sortirtonumber
.Haskell, 185 (+ 19 = 204)? octets
Prend le numéro de port comme une ligne sur stdin; nécessite
network-simple
de Cabal.Comme d'habitude avec les réponses Haskell qui ne se limitent pas à des fonctions pures, elles
imports
prennent beaucoup trop d'octets. Le retour à la ligne qui précède vaut également 9 octets ...Un peu similaire à la réponse de @ Jules, mais j'utilise la manipulation de chaîne au lieu d'opérations sur les octets. J'ai
voléutilisé le-XOverloadedStrings
prolongement et, ce qui est probablement une valeur de 19 octets supplémentaires.la source
C,
243188 octets (ou peut-être217162 octets)V2: voir ci-dessous pour les explications.
188 octets:
Légèrement circonscrit 162 octets:
Probablement plus de golf possible demain matin. Je vais ranger ce post après ces mises à jour.
V1:
Celui-ci était vraiment amusant au golf.
Cela fonctionne pour IPv4. La plupart du temps, c'est une implémentation simple. Les trois composantes principales sont
Création du socket:
Nous utilisons les différentes formes explicites des constantes AF_INET, etc., et utilisons le fait que lorsqu'une structure est initialisée en C, les éléments non spécifiés sont mis à zéro.
Écoutez les clients, acceptez-les et fermez leurs relations:
Enfin pour envoyer les données à chaque client:
L'IP est stocké dans
C.sin_addr.s_addr
un entier de 32 bits, chaque octet étant représenté par l'un des quatre octets. Nous additionnons ces octets avec la boucle for puis les imprimons dans le flux à l’aide de fprintf.J'ai une solution plus courte de 217 octets mais je ne suis pas tout à fait sûr qu'elle ne viole pas les failles standard, car elle nécessite que le port soit donné de manière unaire dans l'ordre des octets du réseau en tant qu'arguments de ligne de commande. Autrement dit, pour exécuter le serveur sur le port 12345, il faut appeler
où le nombre total de
1
s est 14640. Pour le moins, c'est un peu ... encombrant. Mais la voici quand même:la source
Raquette, 265 octets
Ungolfed:
la source
Facteur,
155146131206190 octetsEh bien, je viens d’apprendre beaucoup de choses sur la programmation de sockets de bas niveau. Je ne pense pas que je veux jamais faire ça à nouveau, parce que mon
Thrmal à la tête.Oh oui, enfilé, et ne revient pas, d'accord.
la source
10 base>
au lieu destring>number
?10 >base
pour number> string, aussi.