Wie viele IP-Adressen befinden sich in einem bestimmten Bereich?


31

Inspiriert von...

Netzwerk - Wie kann ich herausfinden, wie viele IP-Adressen sich in einem bestimmten Bereich befinden?

Schreiben Sie ein Programm oder eine Funktion, die zwei Zeichenfolgen als Eingabe verwendet, wobei jede eine IPv4-Adresse ist, die in gepunkteter Standardnotation ausgedrückt wird, und die Anzahl der von diesem Bereich abgedeckten IP-Adressen einschließlich der zwei eingegebenen IP-Adressen ausgibt oder zurückgibt.

  • Sie dürfen keinen externen Code, keine Bibliotheken oder Dienste zum Analysieren einer IP-Adresse verwenden. (Andere Funktionen der Standardbibliothek zur Verarbeitung von Zeichenfolgen sind zulässig.)
  • Alle 2 ^ 32 IP-Adressen sind gleich. Es wird nicht zwischen Rundfunk, Klasse E usw. unterschieden.
  • Es gelten die normalen Code-Golf-Regeln.

Beispielsweise:

"0.0.0.0","255.255.255.255" returns 4294967296.
"255.255.255.255","0.0.0.0" also returns 4294967296.
"1.2.3.4","1.2.3.4" returns 1.
"56.57.58.59","60.61.62.63" returns 67372037.
"1","2" is invalid input. Your code may do anything you like.

Ich sah diese Frage bei Programmierern und dachte darüber nach, sie bei Code Golf zu stellen.
Cruncher

3
Ich dachte, dies ist eine StackOverflow-Frage darüber, welche IP-Adressen nach den Standards nicht möglich sind.
Ming-Tang

8
Ist IPv4 nicht ein bisschen passe?
Ugoren

Antworten:


20

GolfScript, 20 Bytes

~]7/${2%256base}/)\-

Probieren Sie es online aus.

Testfälle

$ echo 0.0.0.0 255.255.255.255 | golfscript range.gs
4294967296
$ echo 255.255.255.255 0.0.0.0 | golfscript test.gs
4294967296
$ echo 1.2.3.4 1.2.3.4 | golfscript test.gs
1
$ echo 56.57.58.59 60.61.62.63 | golfscript test.gs
67372037

Wie es funktioniert

~]        # Evaluate and collect into an array.
          #
          # “.” duplicates, so for "5.6.7.8 1.2.3.4", this leaves
          # [ 5 5 6 6 7 7 8 1 1 2 2 3 3 4 ] on the stack.
          #
7/        # Split into chunks of length 7: [ [ 5 5 6 6 7 7 8 ] [ 1 1 2 2 3 3 4 ] ]
$         # Sort the array of arrays: [ [ 1 1 2 2 3 3 4 ] [ 5 5 6 6 7 7 8 ] ]
{         # For each array:
  2%      # Extract every second element. Example: [ 1 2 3 4 ]
  256base # Convert the IP into an integer by considering it a base 256 number.
}/        #
)         # Add 1 to the second integer.
\-        # Swap and subtract. Since the integers were sorted, the result is positive.

Sehr schön und schön $zu meiden abs.
Chris Jester-Young

4
~]ist auch wirklich schlau.
Primo

10

Python 2 - 106

Sehen Sie es hier .

def a():x=map(int,raw_input().split("."));return x[0]*2**24+x[1]*2**16+x[2]*2**8+x[3]
print abs(a()-a())+1

Beispiel Eingabe

0.0.0.0
0.0.0.255

Beispielausgabe

256


1
def a():return reduce(lambda c,d:c*256+d,map(int,raw_input().split(".")))ist viel kürzer
Michael M.

5
@Michael Danke für den Vorschlag. Ich habe es ein paar Minuten lang benutzt, dann habe ich es mir angesehen und gedacht: "Davon habe ich nicht 90% geschrieben." also rollte ich es zurück.
Rainbolt

@Michael a=lambda:anstatt def a():return 6 Zeichen zu speichern
avall

@ Rusher Es ist 107 Zeichen, nicht 106
avall

1
@avall: Ich nehme an, du zählst die letzte LF.
Dennis

8

CJam - 15

{r'./256b}2*-z)

Versuchen Sie es unter http://cjam.aditsu.net/

Danke Dennis, wow, ich weiß nicht, wie ich das Beste aus meiner eigenen Sprache herausholen kann: p


Sie können zwei Bytes durch Eliminieren :i( bscheint in eine Ganzzahl umgewandelt zu werden) und eines durch Verwenden {r...}2*vonqS/{...}/
Dennis,

6

Pure Bash, 66 Bytes

p()(printf %02x ${1//./ })
r=$[0x`p $1`-0x`p $2`]
echo $[1+${r/-}]

Anmerkungen:

  • Definiert eine Funktion p, der eine IP-Adresse mit gepunkteten Dezimalstellen übergeben wird und die hexadezimale Darstellung dieser Adresse ausgibt:
    • ${1//./ }Expansion ist ein Parameter, ersetzt .mit der IP - Adresse übergebenp()
    • Das printfist meistens selbsterklärend. Da es nur einen Formatbezeichner %02xund vier verbleibende Argumente gibt, wird der Formatbezeichner für jedes verbleibende Argument wiederverwendet, wodurch die 2 Hexadezimalziffern jedes der 4 Oktette effektiv miteinander verkettet werden
  • $[]verursacht arithmetische Expansion. Wir führen eine grundlegende Subtraktion durch und ordnen der Variablen zur
  • ${r/-} ist eine Parametererweiterung um ein mögliches zu entfernen - Zeichen - effektiv abs ()
  • Zeigen Sie 1 + die absolute Differenz an, um den Bereich anzugeben.

Ausgabe:

$ ./iprangesize.sh 0.0.0.0 255.255.255.255
4294967296
$ ./iprangesize.sh 255.255.255.255 0.0.0.0
4294967296
$ ./iprangesize.sh 1.2.3.4 1.2.3.4
1
$ ./iprangesize.sh 56.57.58.59 60.61.62.63
67372037
$ ./iprangesize.sh 1 2
2
$ 

Ich erkenne printfund echo. Sind die ein Teil von bash?
CalculatorFeline

1
@CatsAreFluffy Sie sind eingebaut.
Phase

6

Python 2.7 - 96 91 90 87

Eine Funktion gemacht.

f=lambda a:reduce(lambda x,y:x*256+int(y),a.split("."),0)
p=lambda a,b:abs(f(a)-f(b))+1

Verwendung:

>>> p("1.2.3.4","1.2.3.5")
2

Bearbeiten: Wurde unnötig int()aus der fFunktion entfernt. Vielen Dank an Isaacg

Edit2: Entfernt LFam Ende der Datei (dank @Rusher) und entfernt map()auf Kosten der reduce()Initialisierer (dank @ njzk2)


1
warum braucht die f-funktion außen int ()?
isaacg

1
Gut. Ich hatte keine Ahnung: D
Avall

Sie können 2 Zeichen gewinnen, indem Sie das Int in den Reduce setzen, anstatt die Map zu verwenden (nur 2, wenn Sie ,0Parameter zu Ihrer
Reduce-

Ich habe gerade etwas geschrieben, das fast genau Ihrem Code entspricht, daher werde ich mich nicht darum kümmern, es jetzt einzureichen. Eigentlich sind meine drei Zeichen länger!
Danmcardle

5

GolfScript, 27 Bytes

' '/{'.'/{~}%256base}/-abs)

Beispiele:

$ echo 0.0.0.0 255.255.255.255 | ruby golfscript.rb iprange.gs
4294967296
$ echo 255.255.255.255 0.0.0.0 | ruby golfscript.rb iprange.gs
4294967296
$ echo 1.2.3.4 1.2.3.4 | ruby golfscript.rb iprange.gs
1
$ echo 56.57.58.59 60.61.62.63 | ruby golfscript.rb iprange.gs
67372037

2
Sie können ein Zeichen speichern, indem Sie /anstelle von verwenden %~.
Dennis

4

CoffeeScript - 94, 92, 7972

I=(a)->a.split(".").reduce((x,y)->+y+x*256)
R=(a,b)->1+Math.abs I(b)-I a

Nicht golfen :

I = ( a ) ->
    return a.split( "." ).reduce( ( x, y ) -> +y + x * 256 )

R = ( a, b ) ->
    return 1 + Math.abs I( b ) - I( a )

Entsprechendes JavaScript :

function ip2long( ip_str )
{
    var parts = ip_str.split( "." );    
    return parts.reduce( function( x, y ) {
        return ( +y ) + x * 256; //Note: the unary '+' prefix operator casts the variable to an int without the need for parseInt()
    } );
}

function ip_range( ip1, ip2 )
{
    var ip1 = ip2long( ip1 );
    var ip2 = ip2long( ip2 );

    return 1 + Math.abs( ip2 - ip1 );
}

Probieren Sie es online aus .


1
Sie können einige Zeichen speichern, indem Sie einige Klammern durch Leerzeichen ersetzen:I=(a)->n=0;a.split(".").forEach((x)->n<<=8;n+=parseInt x);n>>>0 R=(a,b)->1+Math.abs I(b)-I a
Rob W

Es fühlt sich an, als ob Sie viel Platz verlieren Math.abs, aber ich kann mir nichts kürzeres einfallen lassen. (z>0)*z||-zist das Beste, was ich habe (gleiche Länge, und es braucht einen Single-Char-Eingang). Hast du etwas schlaueres als das?
Aaron Dufour

Diese Javascript-Version hilft mir wirklich, ich habe eine Stunde lang danach gesucht. Vielen Dank!
Nickerchen

4

dc, 61 zeichen

?[dXIr^*rdXIr^*256*+r1~dXIr^*r256*+65536*+]dspxsalpxla-d*v1+p

Ich finde es ziemlich erstaunlich, dass dies überhaupt mit dc gelöst werden kann, da es keine Möglichkeit zum Parsen von Strings gibt. Der Trick ist, dass 192.168.123.185 als auf den Stapel geht

.185
.123
192.168

und dXIr^*verschiebt den Dezimalpunkt nach rechts, so viele Nachkommastellen wie es gibt, und es funktioniert sogar für .100.

$ echo 56.57.58.59 60.61.62.63 | dc -e '?[dXIr^*rdXIr^*256*+r1~dXIr^*r256*+65536*+]dspxsalpxla-d*v1+p'
67372037.00

Subtrahieren Sie ein Zeichen, wenn die Eingabe bereits auf dem Stapel vorhanden ist.


4

Powershell - 112 108 92 78 Bytes

Ich spiele zum ersten Mal Golf. Hier geht nichts:

Golf (alt):

$a,$b=$args|%{$t='0x';$_-split'\.'|%{$t+="{0:X2}"-f[int]$_};[uint32]$t};1+[math]::abs($a-$b)

Golf (neu)

$a,$b=$args|%{$t='0x';$_-split'\.'|%{$t+="{0:X2}"-f+$_};[long]$t}|sort;1+$b-$a

Ungolfed:

$a, $b = $args | % {           #powershell's way of popping an array. In a larger array
                               #$a would equal the first member and $b would be the rest.
    $t = '0x';                 #string prefix of 0x for hex notation
    $_ -split '\.' | % {       #split by escaped period (unary split uses regex)
        $t += "{0:X2}" -f +$_  #convert a dirty casted int into a hex value (1 octet)
    };
    [long]$t                   #and then cast to long
} | sort;                      #sort to avoid needing absolute value
1 + $b - $a                    #perform the calculation

Verwendung

Speichern Sie als Datei (in diesem Fall getipamount.ps1) und rufen Sie dann von der Konsole aus auf

getipamount.ps1 255.255.255.255 0.0.0.0

4

C # mit LINQ - 139 Bytes

(Ab 140 nach Anwendung von Bobs Vorschlag.)

long f(params string[] a){return Math.Abs(a.Select(b=>b.Split('.').Select(long.Parse).Aggregate((c,d)=>c*256+d)).Aggregate((e,f)=>e-f))+1;}

Ungolfed ....

    long f(params string[] a)                           // params is shorter than two parameters.
    {
        return Math.Abs(                                // At the end, make all values +ve.
             a.Select(                                  // Go through both items in the array...
                b =>                                    // Calling each one 'b'. 
                    b.Split('.')                        // Separating out each "." separated byte...
                    .Select(long.Parse)                 // Converting them to a long.
                    .Aggregate((c, d) => c*256 + d)     // Shift each byte along and add the next one.
             )
             .Aggregate((e,f) => e-f)                   // Find the difference between the two remaining values.
         )+1;                                           // Add one to the result of Math.Abs.
    }

https://dotnetfiddle.net/XPTDlt


Könnte mir jemand erklären, wie das ganze Verschieben von Bytes entlang der Sache funktioniert?
Obversity

@Obversity a.b.c.dist äquivalent zu (a << 24) | (b << 16) | (c << 8) | (d << 0)ist äquivalent zu (((a << 8) << 8) << 8) + ((b << 8) << 8) + (c << 8) + d). Grundsätzlich nimmt jede Iteration der Aggregation die vorhandene Summe und verschiebt sie um ein Oktett nach links und fügt dann das nächste Oktett hinzu.
Bob

Sie können ein Zeichen speichern, indem Sie c*256anstelle von verwenden (c<<8).
Bob

@ Bob Gut gesehen.
billpg

Sie können zwei weitere Zeichen sparen durch Ersetzen e-fmit e<f?f-e:e-fund Fallenlassen derMath.Abs()
Patrick Huizinga

4

Perl, 43 Bytes

#!perl -pa
$_=1+abs${\map{$_=vec eval,0,32}@F}-$F[0]

Zählen Sie den Shebang als zwei Bytes.

Beispielnutzung:

$ echo 0.0.0.0 255.255.255.255 | perl count-ips.pl
4294967296

$ echo 255.255.255.255 0.0.0.0 | perl count-ips.pl
4294967296

$ echo 56.57.58.59 60.61.62.63 | perl count-ips.pl
67372037

Anmerkungen

  • vec eval,0,32ist ein Drop-In für ip2long. Perl ermöglicht die Angabe von Zeichenliteralen als Ordnungszahl mit dem Präfix a v, z. B. v0als Nullzeichen. Diese können auch miteinander verkettet werden, zum Beispiel v65.66.67.68ABCD. Wenn drei oder mehr Werte vorhanden sind, ist die Initiale nicht verforderlich. Die vecFunktion interpretiert eine Zeichenfolge als Ganzzahl-Array, wobei jede Zelle die angegebene Anzahl von Bits aufweist (hier 32). unpack N,evalhätte genauso gut funktioniert.

3

JavaScript ES6 - 68 Bytes

f=x=>prompt().split('.').reduce((a,b)=>+b+a*256);1+Math.abs(f()-f())

Versuchen Sie es mit der Konsole (drücken Sie F12) von Firefox.


Sie sollten alertoder verwenden console.log. Konsolenausgabe ist billig.
nderscore

4
@nderscore, absolut kein Unterschied zwischen console.logund direkter Ausgabe. Das ist Code-Golf, es geht nicht darum, sauberen Code zu machen.
Michael M.

Die upvoted Antwort auf diese Meta - Post nicht einverstanden ist : JavaScript Standards für IO . Es geht nicht um sauberen Code. Es geht darum, nichts auszugeben.
nderscore

@DigitalTrauma, es funktioniert nicht, da der Operator Vorrang hat . (Addition vs bitweise Verschiebung)
Michael M.

2

Python 2.7, 104 Bytes

y=lambda:map(int,input().split("."));a,b=y(),y();print sum(256**(3-i)*abs(a[i]-b[i])for i in range(4))+1

1
Danke für die Lösung. Glauben Sie, Sie könnten: 1. Zur besseren Lesbarkeit von Semikolons zu Zeilenumbrüchen wechseln, ohne die Länge zu beeinträchtigen? 2. Erklären Sie, wie der Code funktioniert.
Isaacg

2

Perl, 72 Bytes

#!perl -ap
@a=map{unpack N,pack C4,split/\./,$_}@F;$_=abs($a[1]-$a[0])+1

Verwendung:

$ echo 10.0.2.0 10.0.3.255 | perl ip-range.pl
512$ 

Das ist schon länger als das Perl-Programm von primo , also nicht allzu interessant.

Perl, 119 Byte, für veraltetes IP-Adressformat

#!perl -ap
sub v(){/^0/?oct:$_}@a=map{$m=3;@p=split/\./,$_;$_=pop@p;$s=v;$s+=v<<8*$m--for@p;$s}@F;$_=abs($a[1]-$a[0])+1

Verwendung:

$ echo 10.0.2.0 10.0.3.255 | perl ip-obsolete.pl
512$ 
$ echo 10.512 10.1023 | perl ip-obsolete.pl
512$ 
$ echo 0xa.0x200 012.01777 | perl ip-obsolete.pl 
512$ 

Dieses Programm akzeptiert das veraltete Format für IP-Adressen! Dies umfasst Adressen mit 1, 2 oder 3 Teilen oder mit hexadezimalen oder oktalen Teilen. Zitieren der Handbuchseite inet_addr (3) ,

Mit der Punktnotation angegebene Werte haben eine der folgenden Formen:

a.b.c.d
a.b.c
a.b
a

... Wenn eine dreiteilige Adresse angegeben wird, wird der letzte Teil als 16-Bit-Größe interpretiert und in die zwei Bytes ganz rechts der Netzwerkadresse eingefügt. ... Wenn eine zweiteilige Adresse angegeben wird, wird der letzte Teil als 24-Bit-Menge interpretiert und in die drei Bytes ganz rechts der Netzwerkadresse eingefügt. ... Wenn nur ein Teil angegeben wird, wird der Wert direkt in der Netzwerkadresse gespeichert, ohne dass eine Byte-Neuanordnung erforderlich ist.

Alle Zahlen, die als "Teile" in einer Punktnotation angegeben werden, können dezimal, oktal oder hexadezimal sein, wie in der C-Sprache angegeben als Dezimalzahl interpretiert).

Die meisten Programme akzeptieren dieses veraltete Format nicht mehr, ping 0177.1funktionierten aber immer noch in OpenBSD 5.5.


Die Tatsache, dass Sie BSD verwenden, ist überraschender als die IP-Sache.
Phase

2

PHP, 138 110 Bytes

<?php

function d($a,$b){foreach(explode('.',"$a.$b")as$i=>$v){$r+=$v*(1<<24-$i%4*8)*($i<4?1:-1);}return 1+abs($r);}

// use it as
d('0.0.0.0','255.255.255.255');

Da gibt es keine Erwähnung von ‚keine deprecation Warnungen‘ können Sie ein Zeichen sparen durch Ersetzen explode('.',"$a.$b")mit split('\.',"$a.$b").
MrLore

Ich zähle 109, nicht 110. Sparen Sie 9 Bytes mit einem Programm anstelle einer Funktion und 8 weitere mit diesen Golfschritten
Titus

1

Mathematica 9, 108 Bytes

c[f_,s_]:=1+First@Total@MapIndexed[#1*256^(4-#2)&,First@Abs@Differences@ToExpression@StringSplit[{f,s},"."]]

Ungolfed:

countIpAddresses[first_, second_] := Module[{digitArrays, differences},

  (* Split the strings and parse them into numbers. 
  Mathematica automatically maps many/most of its functions across/
  through lists *)

  digitArrays = ToExpression[StringSplit[{first, second}, "."]];

  (* Find the absolute value of the differences of the two lists, 
  element-wise *)
  differences = Abs[Differences[digitArrays]];

  (* differences looks like {{4, 4, 4, 4}} right now, 
  so take the first element *)
  differences = First[differences];

  (* now map a function across the differences, 
  taking the nth element (in code, '#2') which we will call x (in 
  code, '#1') and setting it to be equal to (x * 256^(4-n)). 
  To do this we need to track the index, so we use MapIndexed. 
  Which is a shame, 
  because Map can be written '/@' and is generally a huge character-
  saver. *)
  powersOf256 = MapIndexed[#1*256^(4 - #2) &, differences];

  (* now we essentially have a list (of singleton lists, 
  due to MapIndexed quirk) which represents the digits of a base-256, 
  converted to decimal form. 
  Example: {{67108864},{262144},{1024},{4}}

  We add them all up using Total, 
  which will give us a nested list as such: {67372036}

  We need to add 1 to this result no matter what. But also, 
  to be fair to the challenge, we want to return a number - 
  not a list containing one number. 
  So we take the First element of our result. If we did not do this, 
  we could chop off 6 characters from our code. *)

  1 + First[Total[powersOf256]]
]


0

C # - 135

long f(string x,string y){Func<string,long>b=s=>s.Split('.').Select((c,i)=>long.Parse(c)<<(3-i)*8).Sum();return Math.Abs(b(x)-b(y))+1;}

Richtig formatiert

long g(string x, string y) { 
    Func<string, long> b = s => s.Split('.').Select((c, i) => long.Parse(c) << (3 - i) * 8).Sum(); 
    return Math.Abs(b(x) - b(y)) + 1; 
}

https://dotnetfiddle.net/Q0jkdA


0

Ruby, 93 Bytes

a=->(x){s=i=0;x.split('.').map{|p|s+=256**(3-i)*p.to_i;i+=1};s}
s=->(x,y){1+(a[x]-a[y]).abs}

Ausgabe

irb(main):003:0> s['1.1.1.1', '1.1.1.2']
=> 2
irb(main):006:0> s['0.0.0.0', '255.255.255.255']
=> 4294967296

0

J, 25 Bytes

Nimmt die IP-Strings mit vier Punkten als linkes und rechtes Argument.

>:@|@-&(256#.".;.2@,&'.')

Erklärt:

>:@|@-&(256#.".;.2@,&'.')  NB. ip range
      &(                )  NB. on both args, do:
                   ,&'.'   NB.   append a .
               ;.2@        NB.   split by last character:
             ".            NB.     convert each split to number
        256#.              NB. convert from base 256
   |@-                     NB. absolute difference
>:@                        NB. add 1 to make range inclusive

Beispiele:

   '0.0.0.0' >:@|@-&(256#.".;.2@,&'.') '255.255.255.255'
4294967296
   iprange =: >:@|@-&(256#.".;.2@,&'.')
   '255.255.255.255' iprange '0.0.0.0'
4294967296
   '1.2.3.4' iprange '1.2.3.4'
1
   '56.57.58.59' iprange '60.61.62.63'
67372037

0

Faktor 73 Bytes

Übersetzung der CoffeeScript-Antwort.

[ "." split [ 10 base> ] [ [ 256 * ] dip + ] map-reduce ] bi@ - abs 1 + ]

0

Javascript ES6, 81 Zeichen

(a,b)=>Math.abs(eval(`(((((${a})>>>0)-(((((${b})>>>0)`.replace(/\./g,")<<8|")))+1

Prüfung:

f=(a,b)=>Math.abs(eval(`(((((${a})>>>0)-(((((${b})>>>0)`.replace(/\./g,")<<8|")))+1
;`0.0.0.0,255.255.255.255,4294967296
255.255.255.255,0.0.0.0,4294967296
1.2.3.4,1.2.3.4,1
56.57.58.59,60.61.62.63,67372037`.split`
`.map(x=>x.split`,`).every(x=>f(x[0],x[1])==x[2])

PS: Ich werde später versuchen, es zu optimieren.


0

Lua, 153 Bytes

Es ist eine Schande, dass Lua keine Split-Funktion hat, ich musste meine definieren!

a,b=...r=0y=8^8x={}t={}function f(t,s)s:gsub("%d+",function(d)t[#t+1]=d end)end
f(x,a)f(t,b)for i=1,4 do r=r+y*math.abs(t[i]-x[i])y=y/256 end print(r+1)

Ungolfed

a,b=...                    -- unpack the arguments into two variables
r=0                        -- initialise the sume of ip adress
y=8^8                      -- weight for the rightmost value
x={}t={}                   -- two empty arrays -> will contains the splittedip adresses
function f(t,s)            -- define a split function that takes:
                           --   a pointer to an array
                           --   a string
  s:gsub("%d+",function(d) -- iterate over the group of digits in the string
    t[#t+1]=d              -- and insert them into the array
  end)
end
f(x,a)                     -- fill the array x with the first address
f(t,b)                     -- fill the array t with the second address
for i=1,4                  -- iterate over t and x
do
  r=r+y*math.abs(t[i]-x[i])-- incr r by weight*abs(range a- range b)
  y=y/256                  -- reduce the weight
end
print(r+1)                 -- output the result

0

Jelly , 12 Bytes, Sprachnachstellung

ṣ”.V€ḅ⁹µ€ạ/‘

Probieren Sie es online!

Erläuterung

ṣ”.V€ḅ⁹µ€ạ/‘
       µ€     On each element of input:
ṣ”.             Split on periods
   V€           Convert string to number in each section
     ḅ⁹         Convert base 256 to integer
         ạ/   Take absolute difference of the resulting integers
           ‘  Increment

Die Anzahl der Elemente in einem Inklusivbereich ist die absolute Differenz ihrer Endpunkte plus 1.


0

Axiom, 385 Bytes

c(a:String):INT==(d:=digit();s:NNI:=#a;t:INT:=0;for i in 1..s repeat(~member?(a.i,d)=>return-1;t:=t+(ord(a.i)-48)*10^(s-i)::NNI);t)
g(x:String):List NNI==(a:=split(x,char".");s:NNI:=#a;r:=[];for i in s..1 by -1 repeat(y:=c(a.i);y=-1=>return [];r:=concat(y,r));r)
m(x:NNI,y:NNI):NNI==x*256+y
f(a:String,b:String):INT==(x:=g(a);y:=g(b);#x~=4 or #y~=4=>-1;1+abs(reduce(m,x)-reduce(m,y)))

entgolfen und testen

-- convert the string only digit a in one not negative number
-- return -1 in case of error
cc(a:String):INT==
     d:=digit();s:NNI:=#a;t:INT:=0
     for i in 1..s repeat
               ~member?(a.i,d)=>return -1
               t:=t+(ord(a.i)-48)*10^(s-i)::NNI
     t

-- Split the string x using '.' as divisor in a list of NNI
-- if error return []
gg(x:String):List NNI==
    a:=split(x,char".");s:NNI:=#a;r:=[]
    for i in s..1 by -1 repeat
          y:=cc(a.i)
          y=-1=>return []
          r:=concat(y,r)
    r


mm(x:NNI,y:NNI):NNI==x*256+y

-- Return absolute value of difference of address for IP strings in a and in b 
-- Retrun -1 for error
-- [Convert the IP strings in a and in b in numbers ad subtract and return the difference]
ff(a:String,b:String):INT==(x:=gg(a);y:=gg(b);#x~=4 or #y~=4=>-1;1+abs(reduce(mm,x)-reduce(mm,y)))


(14) -> f("0.0.0.0", "255.255.255.255")
   (14)  4294967296
                                                    Type: PositiveInteger
(15) -> f("255.255.255.255", "0.0.0.0")
   (15)  4294967296
                                                    Type: PositiveInteger
(16) -> f("1.2.3.4", "1.2.3.4")
   (16)  1
                                                    Type: PositiveInteger
(17) -> f("56.57.58.59", "60.61.62.63")
   (17)  67372037
                                                    Type: PositiveInteger
(18) -> f("1", "2")
   (18)  - 1
                                                            Type: Integer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.