Maschera un indirizzo IP e fornisci la sua trasmissione


12

sfondo

Ispirato da questa domanda Unix.SE (e ovviamente dalla mia risposta ).

Quando viene specificato un indirizzo IP per un'interfaccia, viene spesso fornito in questo formato decimale puntato:

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

dove si a.b.c.dtrova l'indirizzo effettivo ed e.f.g.hè la maschera di rete.

La maschera di rete, quando rappresentata in binario, è sostanzialmente un gruppo di 1bit seguito da un gruppo di 0bit. Quando la maschera di rete è AND bit per bit rispetto all'indirizzo IP specificato, il risultato sarà la porzione di rete dell'indirizzo o semplicemente l' indirizzo di rete . Questo sarà programmato nella tabella di instradamento dell'host in modo che l'host sappia inviare qualsiasi cosa destinata a questa rete da questa interfaccia.

L'indirizzo di trasmissione per una rete viene derivato prendendo l'indirizzo di rete (dall'alto) e impostando tutti i bit dell'host su 1. L'indirizzo di trasmissione viene utilizzato per inviare a tutti gli indirizzi all'interno di una determinata rete.

Sfida

Dato un indirizzo IP decimale puntato e una maschera di rete valida come input, fornire l'indirizzo di rete e l'indirizzo di trasmissione come output, anche in formato decimale puntato.

  • L'input deve essere indirizzo e maschera come due stringhe in formato decimale puntato. Puoi passare questo come 2 stringhe separate, come elenco o matrice di 2 elementi di stringa o una singola stringa con l'indirizzo e la maschera separati da un separatore sensibile.
  • Il formato di output è soggetto agli stessi vincoli del formato di input.

Esempi

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

2
La maschera di rete avrà solo 255 e 0?
xnor

1
@xnor L'ultimo esempio contiene 252.
user81655

2
L'ultimo output non dovrebbe essere 10.24.0.0 10.27.255.255?
PurkkaKoodari,

2
@ Pietu1998 no, 255.252.0.0 è una maschera valida. In binario è 11111111.11111100.0000000000.00000000
Trauma digitale

2
@ Pietu1998 Oh yeah - scusa - ora è riparato.
Trauma digitale il

Risposte:


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`.`

Spiegazione

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

Test


4

MATL , 47 byte

Questa risposta utilizza la versione corrente (4.0.0) della lingua.

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

Esempio

>> 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

Spiegazione

'%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


0

PHP, 126 byte

Con input in $ 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";

E una versione più leggibile:

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_filterrichiede una singola istruzione nel modello di sostituzione quando si utilizza il eflag, quindi "accoda" il risultato dei calcoli al 5 ° e ai valori più alti di $ a, perché non vengono mai riutilizzati.


0

Perl, 90 85 byte

include +6 per -pF/\D/

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

Uso:

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

Più leggibile:

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

La -F/\D/divide l'ingresso non-cifre e lo memorizza in @F.


0

Fattore, 103 byte

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

Bello.

Ungolfed:

: 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@ ;

0

PHP , 74 byte

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

Come standalone, l'input avviene tramite riga di comando:

$ php ip.php 192.168.0.1 255.255.255.0
192.168.0.0 192.168.0.255

Provalo online!

O come funzione, 80 byte :

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

Provalo online!

Ungolfed

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 ha dei bei built-in (anche se con nomi di funzione lunghi) per gestire la stringa tratteggiata IPv4 su binario e ritorno.

Produzione

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.