Tutupi alamat IP dan berikan siarannya

12

Latar Belakang

Terinspirasi oleh pertanyaan Unix.SE ini (dan tentu saja jawaban saya sendiri ).

Ketika alamat IP ditentukan untuk antarmuka, sering diberikan dalam bentuk desimal bertitik:

a.b.c.d e.f.g.h

di mana a.b.c.dalamat aktual dan e.f.g.hnetmask.

Netmask, ketika direpresentasikan dalam biner, pada dasarnya adalah sekelompok 1bit diikuti oleh sekelompok 0bit. Ketika netmask adalah AND AND terhadap alamat IP yang diberikan, hasilnya akan menjadi bagian jaringan dari alamat, atau hanya alamat jaringan . Ini akan diprogram ke dalam tabel rute host sehingga tuan rumah tahu untuk mengirim apa pun yang ditujukan untuk jaringan ini dari antarmuka ini.

Alamat broadcast untuk jaringan diturunkan dengan mengambil alamat jaringan (dari atas) dan mengatur semua bit host menjadi 1. Alamat broadcast digunakan untuk mengirim ke semua alamat dalam jaringan yang diberikan.

Tantangan

Diberikan alamat IP titik-desimal dan netmask yang valid sebagai input, berikan alamat jaringan dan alamat siaran sebagai output, juga dalam format titik-desimal.

  • Input harus berupa alamat dan mask sebagai dua string dalam format desimal bertitik. Anda dapat melewatkan ini sebagai 2 string terpisah, sebagai daftar atau larik elemen string 2 atau string tunggal dengan alamat dan mask dipisahkan oleh beberapa pemisah yang masuk akal.
  • Format output tunduk pada batasan yang sama dengan format input.

Contohnya

Input                              Output

192.168.0.1 255.255.255.0          192.168.0.0 192.168.0.255
192.168.0.0 255.255.255.0          192.168.0.0 192.168.0.255
192.168.0.255 255.255.255.0        192.168.0.0 192.168.0.255
100.200.100.200 255.255.255.255    100.200.100.200 100.200.100.200
1.2.3.4 0.0.0.0                    0.0.0.0 255.255.255.255
10.25.30.40 255.252.0.0            10.24.0.0 10.27.255.255
Trauma Digital
sumber
2
Apakah netmask hanya memiliki 255 dan 0?
xnor
1
@ xnor Contoh terakhir ada 252di dalamnya.
user81655
2
Bukankah seharusnya keluaran terakhir 10.24.0.0 10.27.255.255?
PurkkaKoodari
2
@ Pietu1998 no, 255.252.0.0 adalah topeng yang valid. Dalam biner, itu adalah 11111111.11111100000000000000000000
Digital Trauma
2
@ Pietu1998 Oh yeah - maaf - sudah diperbaiki sekarang.
Trauma Digital

Jawaban:

5

JavaScript (ES6), 92 byte

(a,m)=>a.split`.`.map((n,i)=>(v=m[i],m[i]=n&v|v^255,n&v),m=m.split`.`).join`.`+" "+m.join`.`

Penjelasan

(a,m)=>
  a.split`.`
  .map((n,i)=>(
      v=m[i],
      m[i]=n&v|v^255,
      n&v
    ),
    m=m.split`.`
  ).join`.`
  +" "+m.join`.`

Uji

pengguna81655
sumber
4

MATL , 47 byte

Jawaban ini menggunakan versi bahasa saat ini (4.0.0) .

'%i.%i.%i.%i't32whh2:"j'\d+'XXU]tbZ&tb255Z~+hYD

Contoh

>> matl
 > '%i.%i.%i.%i't32whh2:"j'\d+'XXU]tbZ&tb255Z~+hYD
 > 
> 192.168.0.1
> 255.255.255.0
192.168.0.0 192.168.0.255

Penjelasan

'%i.%i.%i.%i't32whh      % format string: '%i.%i.%i.%i %i.%i.%i.%i'
2:"                      % for loop: do this twice
    j'\d+'XXU            % input string and parse into 4-vector with the numbers
]                        % end
tbZ&                     % compute network address
tb255Z~+                 % compute broadcast address
hYD                      % concatenate into 8-vector and apply format string
Luis Mendo
sumber
4

Pyth, 44 42 byte

LisMcb\.256Lj\..[04jb256'J.&yzKyw'+JxKt^2 32

Cobalah online. Suite uji.

Harapkan input sebagai array, seperti ["10.25.30.40", "255.252.0.0"].

PurkkaKoodari
sumber
0

PHP, 126 byte

Dengan input $ n:

preg_filter(~Ð×£ÔÖÐ,~Û¤¢Â×ÛÎÖÑ×ÛÔÔÁÌÀ×ÛÑÂ×ÛÂÛÁÊÀÝÑÝÅÝÝÖÑ×Û¤ÛÒÊ¢ÙÛÎÖÖÑ×ÛÑÂÛÑ×Û¤ÛÒÊ¢ÍÊÊÙÛÎÖÖÅÝÝÖ,$n);echo"$c $b";

Hexdump:

0000000: 7072 6567 5f66 696c 7465 7228 7ed0 d7a3  preg_filter(~...
0000010: 9bd4 d6d0 9a2c 7edb 9ea4 a2c2 d7db ced6  .....,~.........
0000020: d1d7 db96 d4d4 c1cc c0d7 db9c d1c2 d7db  ................
0000030: 8bc2 db96 c1ca c0dd d1dd c5dd ddd6 d1d7  ................
0000040: db9e a4db 96d2 caa2 d9db ced6 d6d1 d7db  ................
0000050: 9dd1 c2db 8bd1 d7db 9ea4 db96 d2ca a283  ................
0000060: cdca cad9 81db ced6 d6c5 dddd d62c 246e  .............,$n
0000070: 293b 6563 686f 2224 6320 2462 223b       );echo"$c $b";

Dan versi yang lebih mudah dibaca:

preg_filter( /* PCRE regex on input */
    '/(\d+)/e', /* match all digits, execute the code for each one */
    '$a[]=($1) /* push the matched value to the array $a */
        .($i++>3 /* if we're at the 5th or higher digit */
            ?($c.=($t=$i>5?".":"").($a[$i-5]&$1)) /* append to $c bitwise AND-ed number */
                .($b.=$t.($a[$i-5]|255&~$1)) /* append to $b the broadcast address */
            :"")',
    $n);
echo"$c $b"; /* output $c and $b */

preg_filtermembutuhkan satu pernyataan dalam pola penggantian ketika menggunakan ebendera, jadi saya 'menambahkan' hasil perhitungan ke nilai 5 dan lebih tinggi dari $ a, karena itu tidak pernah digunakan kembali.

Aurel Bílý
sumber
0

Perl, 90 85 byte

termasuk +6 untuk -pF/\D/

for(0..3){push@a,$F[$_]&1*($y=$F[$_+4]);push@b,$F[$_]|~$y&255}$"='.';$_="@a @b"

Pemakaian:

echo "192.168.0.1 255.255.255.0" | perl -pF/\\D/ file.pl

Lebih mudah dibaca:

for(0..3) {
    push @a, $F[$_] & 1*($y=$F[$_+4]);  # calc/add network address 'byte'
    push @b, $F[$_] | ~$y & 255         # calc/add broadcast address 'byte'
}
$"='.';                                 # set $LIST_SEPARATOR
$_="@a @b"                              # set output to network address and broadcast

The -F/\D/membagi input non-digit dan menyimpannya dalam @F.

Kenney
sumber
0

Faktor, 103 byte

[ [ ipv4-aton ] bi@ 2dup bitand -rot dup bit-count 32 - abs on-bits pick bitor 2nip [ ipv4-ntoa ] bi@ ]

Bagus.

Tidak Disatukan:

: mask-and-broadcast ( ip mask -- netaddr broadcast )
  [ ipv4-aton ] bi@ 2dup bitand -rot dup bit-count 32 - abs on-bits pick bitor 2nip
  [ ipv4-ntoa ] bi@ ;
kucing
sumber
0

PHP , 74 byte

<?=long2ip($i=ip2long($argv[1])&$m=ip2long($argv[2])),' ',long2ip($i|~$m);

Sebagai standalone, input melalui baris perintah:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Cobalah online!

Atau sebagai fungsi, 80 byte :

function($a,$b){return[long2ip($i=ip2long($a)&$m=ip2long($b)),long2ip($i|~$m)];}

Cobalah online!

Tidak disatukan

function ip( $a, $b ) {
    $i = ip2long( $a );          // string IP to 32 bit int
    $m = ip2long( $b );          // string netmask to 32 bit int
    $n = $i & $m;                // network is bitwise AND of IP and netmask
    $c = $i | ~$m;               // broadcast is bitwise OR of IP and inverse netmask
    return [ long2ip( $n ), long2ip( $c ) ];
}

PHP memiliki built-in yang bagus (meskipun dengan nama fungsi panjang) untuk menangani IPv4 putus-putus-string ke biner dan kembali.

Keluaran

192.168.0.1 255.255.255.0   => 192.168.0.0 192.168.0.255
192.168.0.0 255.255.255.0   => 192.168.0.0 192.168.0.255
192.168.0.255 255.255.255.0 => 192.168.0.0 192.168.0.255
100.200.100.200 255.255.255.255 => 100.200.100.200 100.200.100.200
1.2.3.4 0.0.0.0 => 0.0.0.0 255.255.255.255
10.25.30.40 255.252.0.0 => 10.24.0.0 10.27.255.255
640KB
sumber