Tulis program atau fungsi yang mendengarkan lalu lintas TCP yang masuk pada port N. Ini menawarkan layanan sederhana: menghitung jumlah bidang alamat IP dari koneksi yang masuk dan kembali.
Program atau fungsi membaca integer N dari argumen atau stdin. Ia mendengarkan koneksi TCP yang masuk pada port N. Ketika seseorang terhubung ke port itu, program menghitung jumlah bidang alamat IP-nya dan mengirimkannya kembali ke klien dengan mengikuti baris baru dan menutup koneksi.
- Nomor port N adalah port yang valid, dan 2 10 <N <2 15
- Mengejar baris baru dapat berupa
\n
atau\r\n
- Anda dapat menggunakan IPv4 atau IPv6. Karena alamat IPv6 ditulis dalam bentuk heksadesimal, Anda juga harus memberikan hasil dalam format yang sama, misalnya
2001:0db8:0000:0042:0000:8a2e:0370:7334 => 12ecd
.
Ini adalah kode-golf . Aturan dan celah standar berlaku.
Contoh
Anda menjalankan server Anda dengan ./server 1234
. Server sekarang sedang berjalan dan menunggu koneksi pada port 1234. Kemudian klien dari 127.0.0.1
terhubung ke server Anda. Server Anda melakukan perhitungan sederhana: 127+0+0+1 => 128
dan mengirimkan hasilnya ke klien (dengan newline yang mengekor): 128\n
. Kemudian server menutup koneksi dan menunggu klien berikutnya.
Papan peringkat
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>
sumber
Jawaban:
Bash + netcat + ss +…,
6560 karakterBukan solusi serius, hanya penasaran dengan kemungkinan ini.
Terimakasih untuk:
awk
pemfilteran berbasis (-5 karakter)Contoh dijalankan:
(terminal 1)
(terminal 2)
Di Ubuntu Anda bisa dapatkan
nc
dari netcat-tradisional (tidak, netcat-openbsd tidak bagus) danss
dari iproute2 .sumber
C #,
284283282278274254 byteContoh klasik dari server C # TCP dasar. Pengujian:
Terminal 1:
Terminal 2:
Firefox:
sumber
int Main
alih-alihvoid Main
. Karena program tidak pernah mengembalikan kompiler tidak memerlukanreturn
pernyataan.Start
adalah opsional, menyimpan karakter lain.using
padaTcpClient
, yang akan menyelamatkan Anda tiga karakter lagi (gunakan{}
darifor
), dan melakukan hal yang sama denganStreamWriter
harus menyimpan satu lagi.Flush
dalamStreamWriter
untuk membuatnya bekerja dengan baik.Linux ELF / x86, 146 byte
Termasuk header 52-byte ELF, header program 32-byte, 111 byte kode program + 3 byte kode untuk dilewati di dalam header.
Informasi tentang cara membuat executable ELF yang kecil dapat ditemukan di breadbox 's " A Whirlwind Tutorial tentang Menciptakan ELF Executables ELF yang Benar-benar Cukup untuk Linux " .
Linux / i386 menggunakan
socketcall(2)
panggilan sistem multipleks, yang mengambilebx
panggilan soket khusus (SYS_*
makro dari/usr/include/linux/net.h
), dan dalamecx
pointer ke area argumen panggilan perpustakaan asli.Beberapa hal dilakukan untuk menjaga eksekusi kecil:
EDX
titik masuk ke funtion finalisasi (berguna untuk executable yang dimuat oleh dynamic linker) atau NULL).argv[0]
).bind(2)
,listen(2)
danaccept(2)
.phentsize
danphnum
bidang, byte digantikan, berubah menjadiCMP
operasi yang mengambil bidangphentsize
danphnum
sebagai langsung (trik tanpa malu dicuri dari solusi breadbox ke 123 di golf anarki ).LODS
(memuat ke akumulator dan indeks sumber kenaikan / penurunan) danSTOS
(menyimpan dari akumulator dan indeks tujuan kenaikan / penurunan) bagus untuk kode pendek.XCHG EAX, reg
adalah 1-byte, dibandingkan denganMOV EAX, reg
, yang membutuhkan 2 byte.CDQ/CLTD
(sign-extendedEAX
keEDX:EAX
) dapat digunakan sebagai cara 1-byte untuk nolEDX
register.BSWAP
berguna untuk implementasihtons()
.Sumber nasm:
sumber
NodeJS,
146134127 byteSaya akhirnya bisa mengirim jawaban NodeJS! IPv4 hanya sekarang.
Eksekusi sampel:
node script.js 1024
. Dari terminal lain:sumber
'\n'
dengan string template yang berisi baris baru literal.Tcl, 92
Cukup jelas:
socket -server s $argv
membuat soket pendengaran pada port yang ditentukan dalam argumen.Setiap kali koneksi baru tiba,
proc s
itu disebut, dengan saluran, alamat-sumber dan port-sumber sebagai parameter.string map
pengganti.
untuk+
di alamat sumber, danexpr
deret hitung mengevaluasi hasil, yang kemudianputs
kembali ke saluran koneksic
.vwait
menjalankan loop acara untuk menangkap acara koneksi yang masuk.Kredit ke @ DonalFellows untuk yang berikut:
Berikut adalah versi yang menangani IPv6 (membutuhkan Tcl 8.6; sebagian besar panjang tambahan adalah karena menghasilkan respons hex):
Tcl, 109
sumber
apply
tampaknya tidak menyimpan sesuatu. Anda juga tidak dapat menggunakantcl::mathop::+ {*}[split $a .]
karena itu sedikit lebih lama. Anda juga tidak dapat mencukur apa pun dari nama opsi. Tetapi mendukung IPv6 cukup sepele untuk ditambahkan, dan hanya membutuhkan biaya beberapa byte kode lebih banyak (dan kemudianregsub
pendekatan berbasis sama selama).proc s {c a p}
apakah Anda benar-benar membutuhkan semua spasi putih itu?Groovy
133,125,93, 89Hanya IPv4, mungkin.
Tidak Disatukan:
Pengujian:
sumber
.toInteger()
→as int
dans.inetAddress.address*.toInteger()
→(s.inetAddress.address as int[])
. Dan ada ruang ekstra setelahnya.with
.Python 3,
170166147 byteMengambil port aktif
stdin
, hanya IPv4. Bekerja pada GNU / Linux (dan, saya berasumsi, sebagian besar unix lainnya), yang secara otomatis memperluas "" ke "0.0.0.0", tidak yakin tentang Windows.sumber
import *
dan, SOCK_STREAM
tidak perlu. Juga, baris kirim dapat ditulis lebih efisien sebagaic.send(b"%d\n"%eval(a[0].replace(".","+")))
.s=socket(2)
.int(input())
menjadiinput()
dan bagian kirim menjadic.send(`eval(a[0].replace(".","+"))`)
Java,
371368350344333310295282 byteGolf
Tidak disatukan
Keluaran
sumber
int k=
dan ganti k dengan semua hal di dalamnyaInteger.toString(k)
. Untuk menyimpan beberapa byte.interface
untukclass
mendapatkan beberapa byte lagia.getOutputStream().write((c[0] + c[1] + c[2] + c[3]+"\n").getBytes());
sebagai gantinew DataOutputStream(a.getOutputStream()).writeBytes(c[0] + c[1] + c[2] + c[3] + "\n")
try(Socket a=...){}
lebih pendek dari itua.close();
? Membutuhkan Java 7, tetapi bisa mendapatkan byte.PowerShell v2 +,
303268257227 byteMenyimpan 35 byte berkat Matt ... Menyimpan 11 byte lainnya dengan aliasing
New-Object
dan minor tweak ... Menyimpan 30 byte lebih banyak dengan secara implisit menggunakan localhost alih-alihany
alamat IP dan dikoreksi ke akun untuk penggunaan berkelanjutan seperti yang ditentukan sebelumnya dan saya tidak terjawabSangat mirip dengan jawaban C # , karena .NET yang mendasari keduanya. Kami menyimpan beberapa byte di sini di atas jawaban C # dengan dapat memanfaatkan fungsionalitas PowerShell yang kembali (mengelilingi deklarasi / penugasan kami di parens, dan kemudian segera memanggil metode.), Tetapi kami kehilangan banyak hal karena harus merumuskan penjumlahan . Fakta bahwa kami mendapat nama / panggilan kelas yang sedikit lebih pendek adalah mengapa jawaban ini mengalahkan C #.
Penjelasan
Kami pertama-tama membuat
New-Alias
(dengannal
alias) untuk menghemat pengetikan ulangNew-Object
nanti. Sisa dari baris pertama adalah menyiapkan TCP Listener. Kami melewati baris perintah$args[0]
sebagai input untuk membuat yang baruSystem.Net.Sockets.TcpListener
, disimpan sebagai$l
. Objek itu dienkapsulasi dalam parens dan segera dipanggil dengan.Start()
agar aktif membuka soket.Memasuki
for
loop tak terbatas , kami kemudian mengatur pendengar kami$l
untuk memblokirAcceptTcpClient()
yang akan menunggu koneksi. Referensi ke koneksi itu (setelah dibuat) disimpan dalam$c
, dienkapsulasi dalam parens, dan segera dipanggilGetStream()
untuk mendapatkan datastream. Datastream itu diteruskan keSystem.IO.StreamWriter
konstruktor baru$w
,, jadi kita bisa memanipulasinya. Konstruktor itu sendiri diringkas dalam parens dan segera dipanggilWrite(...)
.Di dalam
Write(...)
panggilan, kami menangani klien kami$c
dan mendapatkanRemoteEndPoint
properti klien . Ini adalah satu-satunya cara (yang saya temukan sejauh ini) untuk mendapatkan alamat IP jarak jauh. Selanjutnya kita perlu melemparkan kembali itu sebagai[System.Net.IPEndPoint]
objek sehingga diformat dengan benar, merangkumnya dalam parens, dan menarik hanya.Address
properti. Kami kemudian-replace
periode harfiah dengan tanda-tanda plus, kemudian pipa itu keInvoke-Expression
(mirip denganeval
) untuk mendapatkan penjumlahan kami.Setelah IO menulis, kita perlu menelepon
.Dispose()
untuk memastikan datastream memerah ke klien dan ditutup. Server TCP menjatuhkan koneksi klien tanpa peringatan, jadi tergantung pada klien yang digunakan, mungkin hang untuk sementara waktu pada saat ini. Kemudian dilanjutkan melaluifor
loop tanpa menutup koneksi dengan benar. Ini juga berarti itu bocor memori dan sistem menangani seperti orang gila, tapi kami tidak peduli tentang itu, kan? Anda mungkin perlu menggunakan Task Manager untuk mematikan proses ketika Anda selesai menjalankan server. : DJuga hanya IPv4, karena penjumlahan barfs secara spektakuler mencoba menangani alamat IPv6, karena
:
bukan operator aljabar yang valid untukiex
melakukan parsing.sumber
free()
setelah itu?delete[]
, mungkin? : P.close()
dan.dispose()
metode yang tidak kami panggil di sini yang akan menyebabkan orang-orang di Code Review cocok.[Net.ipaddress]::Any
bekerja.PHP, 161 (56?)
Ini posting pertama saya di sini. Saya harap ini berjalan dengan benar :)
Tidak Disatukan:
Terminal:
Ini hanya berfungsi untuk IPV4
Sunting : Saya baru saja memperhatikan bahwa php mendukung server dasar:
Saya memutuskan untuk tetap berpegang pada jumlah karakter asli kecuali seseorang mengonfirmasi jika yang berikut diperbolehkan :)
test2.php: (kemungkinan solusi 56-byte)
Dan kemudian mulai layanan dengan:
Chrome sebagai klien
Sunting 2: wget sebagai klien
sumber
test2.php
? Jika demikian, saya pikir Anda harus bertanya kepada OP apakah mereka akan menganggap built-in seperti itu dapat diterima untuk tantangan ini. Tapi itu bukan celah.Pergi ,
359311Ini adalah program pertama saya di Go - Ini memungkinkan saya menemukan satu hal: Ini jelas bukan bahasa golf yang bagus!
(Kudos kepada @steve yang melakukan sebagian besar golf!)
sumber
"strings"
menjadis "strings"
sehingga nantistrings.Split
menjadi adils.Split
.import(."pkgname")
semua fungsi yang akan diimpor ke namespace saat ini, Anda dapat menjatuhkan awalan. misalnya.import ."fmt"; Println("foo")
Jika Anda menggunakanSscanf
darifmt
paket untuk mem-parsing alamat alih-alih regex, itu akan menghemat beberapa byte lagi, memberi Anda bonus bagusFprintln
untuk mengembalikan total alih-alih mengimporstrconv
.Gangguan Umum, 110 byte
Detail
sumber
q, 88 byte
system raze"p ",1_.z.x
: Mengambil argumen baris perintah kedua (yang pertama"-"
adalah untuk mengatakanq
agar tidak menafsirkanN
sebagai skrip / file) dan membuka port ("p "
) dengannya.q -p N
menetapkan porta sebagaiN
secara otomatis, tetapi karena pertanyaan itu tampaknya menyarankan bahwaN
seharusnya menjadi argumen untuk program daripada eksekusi itu sendiri, saya sudah melangkah lebih jauh..z.pg
fungsi yang menangani permintaan masuk,.z.a
memegang alamat IP sebagai integer 32-bit."i"$0x0 vs
membaginya menjadi 'konstituen' integernya, dansum
melakukan penjumlahan.string
hasil numerik dan ditambahkan"\n"
ke sana untuk kembali ke klien..z.ph
adalah fungsi lain untuk permintaan HTTP GET, dengan penanganan ekstra untuk mengubah output string menjadi respons HTTP yang valid.Demo - Server:
Demo - Klien (dari
q
sesi lain yang berjalan pada127.0.0.1
):Demo - Klien (dari
curl
):sumber
LiveScript,
107105 byteTidak banyak yang bisa ditambahkan, itu hanya hal-hal dasar NodeJS. Poin gaya untuk
&1
(argumen kedua),<|
(F # perpipaan, mirip dengan$
di Haskell) dan biop:(+)
di LS seperti bagian operator di Haskell: fungsi biner kari (yang menambahkan operannya). Juga agak kotor:,/
jika diberi string literal di sebelah kanannya, akan melakukan split.sumber
Perl,
141132 + 1 = 133 byteGolf
Tidak disatukan
Contoh
sumber
s/\./+/g
→y/./+/
.while(1){…}
→{…;redo}
menurut tip yang bagus dari user130144 . Dan kecuali panggilan, semua tanda kurung lainnya tidak perlu.->send()
Python 2, 180 byte
Mengambil port over stdin.
sumber
NodeJS (ES6),
129118107 byteBekerja untuk IPv4. Jalankan sebagai
node server.js <port>
sumber
c.remoteAddress
akan menjadi::ffff:127.0.0.1
. (Saya menguji pada Node v5.9.1)..listen()
dulu default ke IPv4, tetapi tampaknya oleh bug atau desain bahwa ini telah berubah. Pengajuan masih akan berfungsi dengan baik pada versi node yang lebih baru ketika IPv6 dinonaktifkan pada mesin host.Pergi, 211 byte
Mungkin bisa bermain golf lebih lanjut, saya tidak sepenuhnya puas dengan cara saya harus mengurai alamat IP misalnya, sepertinya hack yang mengerikan.
Mendengarkan IPv4 pada port yang diberikan sebagai argumen.
sumber
PowerShell,
208206192152 byteinformasi versi:
Terima kasih kepada TimmyD karena telah menyelamatkan saya 14 byte!
Terima kasih banyak kepada TessellatingHeckler karena telah menyelamatkan saya 40 byte
sumber
($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()}
- yang saya baru saja diuji dengan cepat dengan menghubungkan netcat, tetapi tampaknya berfungsi sama - tetap terhubung dari localhost.8086 kode mesin (16-bit DOS),
163 156 148 148142 byteKode perakitan yang setara:
Asumsi
ntcpdrv
ini dimuat diINT 0x61
(dan driver paket yang sesuai di0x60
). Kompilasi denganfasm tcpserv.asm
.Ini memiliki beberapa masalah:
sumber
xor r,r
bukanmov r,0
.CR LF
, jadi saya hanya pergi dengan itu. Either way agak tidak ada gunanya untuk menghitung ukuran asm sekarang, mungkin juga membersihkannya sedikit dan menambahkan beberapa komentar.int 0x61
mengembalikan port lokal acak dalamax
. Tetapi itu juga mengubah IP yang mendengarkan ke beberapa nomor sampah (4.2.0.0
iirc)Haskell, 216 byte
Menggunakan paket "network-simple" (
cabal install network-simple
). Perlu beberapa ekstensi bahasa (-XOverloadedStrings -XNoMonomorphismRestriction
) untuk berfungsi.Ada beberapa kemungkinan penyederhanaan, termasuk mengubah
w
fungsi untuk mengembalikan jumlah secara langsung daripada daftar, dan menggunakan fungsi daripada program sehingga nomor port dapat ditentukan sebagai argumen. Saya tidak membayangkan ini akan mengurangi ukuran sangat banyak. 20 byte mungkin?sumber
w
menjadi#
, jadiw h n
menjadih#n
penghematan 2 byte per penggunaan.Mumps,
114115 BytesGolf:
Tidak Disatukan:
Ini adalah versi InterSystems Caché dari Mumps - jika ada versi di luar sana yang dapat memperoleh alamat TCP lebih pendek dari
##class(%SYSTEM.TCPDevice).PeerAddr()
(karena hampir 1/3 dari seluruh program) mungkin ada peluang lebih baik terhadap beberapa bahasa lain yang sudah diposting ... ;-)Sunting: Terima kasih kepada @TimmyD - Saya melewatkan pembacaan port dari STDIN atau argumen alih-alih hardcoded. Diedit; itu menambahkan 1 byte ke program.
sumber
C, 535 byte
Ya, seseorang harus melakukan ini.
Saya menambahkan satu baris jeda sehingga kode yang diposting sebenarnya memiliki 536 karakter.
kompilasi dengan
gcc [file_name] -o server
jalankan bersama
./server [port]
terhubung dengan
telnet localhost [port]
sumber
Java, 210 byte
Golf:
Diperluas:
Ini adalah kumpulan dari semua tips yang saya berikan di jawaban Java lainnya, ditambah tulisan sebagai fungsi alih-alih program penuh, yang mendapatkan sekitar 70 byte dibandingkan dengan program.
sumber
Haskell, 326 byte
Sayangnya saya harus menggunakan
Network.Socket
untuk mendapatkan akses ke alamat IP jarak jauh sebagai bilangan bulat bukan string. Itu akan menyelamatkan puluhan karakter jika saya bisa melakukannyas <- listenOn (PortNumber n)
, daripada harus menelepon secara eksplisitsocket
,bind
dan secaralisten
individual. Tapi, sayangnya,Network.accept
memberi saya string host , bukan integer alamat IP , jadi saya harus menggunakanNetwork.Socket.accept
dan berteman.Fungsi
f
mengambil nomor port sebagai argumen, dan membuat socket server (s
) mendengarkan pada port itu. Kemudian memanggil fungsig
dengan soket server.g
loop selamanya, menerima koneksi. Fungsinyab
mengambil alamat IPv4 aktual dan menghitung jumlah digitnya.Saya yakin seseorang di suatu tempat dapat melakukan ini lebih baik daripada saya. Saya ingin memamerkan betapa mudahnya hal-hal soket di Haskell ... tapi kemudian gagal total, karena saya perlu akses ke alamat IP, yang biasanya tidak mudah didapat.
sumber
withSocketsDo
ini hanya diperlukan pada Windows, jadi jika berjalan di Linux itu dapat diabaikan; (2) 0xFF adalah karakter yang lebih panjang dari 255; (3) mengubah soket menjadi pegangan dan menggunakan IO biasa jauh lebih lama daripada menggunakanNetwork.Socket.send
. Ya,send
sudah usang, tetapi alasannya tidak relevan dengan skenario ini (hanya terkait dengan teks atau data biner non-ASCII), jadi sepertinya masuk akal untuk menggunakannya.Network.accept gives me a host string, not an IP address integer
Tidak bisakah Anda membagi string IP pada"."
,map
fungsi string-to-number Haskell di atas string split dan menjumlahkan hasilnya?Lua,
169162160153151148138129 byteVersi golf
Ini membutuhkan Luasocket untuk diinstal dan seorang juru bahasa yang mendukung label. Saya sudah mengujinya dengan Luajit dan saya juga dapat mengkonfirmasi bahwa kode tidak bekerja dengan Lua 5.1.
Versi tidak disatukan
Edit 1:
Diubah
i=({c:getpeername()})[1]
menjadi adili=c:getpeername()
Edit 2:
Kawat gigi dihapus dari pernyataan membutuhkan.
Edit 3:
Dihapus kawat gigi di sekitar vararg, mengurangi jumlah byte sedikit.
Edit 4:
Menghapus kurung sekitar "% d +", lebih pendek 2 byte.
Edit 5:
Menghapus variabel yang tidak perlu i.
Edit 6:
Mengubah ip dari "127.0.0.1" menjadi 0. (Terima kasih kepada xyzzy di #lua)
Edit 7:
Menghapus panggilan fungsi ke tonumber karena string dilemparkan ke angka secara otomatis (Terima kasih kepada Trebuchette atas sarannya, saya tidak tahu ini)
sumber
+
operator, sehingga Anda dapat mengeluarkannyatonumber
.Haskell, 185 (+ 19 = 204)? byte
Mengambil nomor port sebagai satu baris di stdin; membutuhkan
network-simple
dari Cabal.Seperti biasa dengan jawaban Haskell yang tidak membatasi diri pada fungsi murni, the
imports
mengambil terlalu banyak byte. Newline tambahan juga bernilai 9 byte ...Agak mirip dengan jawaban @ Jules, tapi saya menggunakan manipulasi string daripada operasi byte. Saya
mencurimenggunakan-XOverloadedStrings
ekstensi juga, yang mungkin bernilai 19 byte tambahan.sumber
C,
243188 byte (atau mungkin217162 byte)V2: lihat penjelasan di bawah ini.
188 byte:
Sedikit berhati-hati 162 byte:
Mungkin lebih banyak bermain golf besok pagi. Saya akan merapikan posting ini setelah pembaruan tersebut.
V1:
Yang ini sangat menyenangkan untuk bermain golf.
Ini berfungsi untuk IPv4. Sebagian besar ini merupakan implementasi langsung. Tiga komponen utama adalah
Membuat soket:
Kami menggunakan berbagai bentuk eksplisit dari konstanta AF_INET dll, dan memanfaatkan fakta bahwa ketika struct diinisialisasi dalam C dengan cara ini elemen yang tidak ditentukan ditetapkan ke nol.
Dengarkan klien, terima mereka, dan tutup koneksi mereka:
Akhirnya untuk mengirim setiap klien data:
IP disimpan
C.sin_addr.s_addr
sebagai integer 32 bit di mana setiap oktet diwakili oleh salah satu dari empat byte. Kami menjumlahkan byte ini dengan for loop dan kemudian mencetaknya ke aliran menggunakan fprintf.Saya memiliki solusi 217 byte yang lebih pendek tetapi saya tidak sepenuhnya yakin itu tidak melanggar celah standar karena mengharuskan port diberikan secara unary dalam urutan byte jaringan sebagai argumen baris perintah. Artinya, untuk menjalankan server pada port 12345 orang perlu menelepon
di mana jumlah total
1
s adalah 14640. Untuk sedikitnya itu sedikit ... rumit. Tapi ini dia:sumber
Racket, 265 byte
Tidak Disatukan:
sumber
Factor,
155146131206190 byteYah, saya baru belajar banyak tentang pemrograman soket tingkat rendah. Saya tidak berpikir saya pernah ingin melakukan itu lagi, karena saya
thrkepala sakit.Oh ya, utas, dan tidak kembali, benar.
sumber
10 base>
bukanstring>number
?10 >base
untuk angka> string, juga.