Berapa banyak alamat IP dalam rentang tertentu?


31

Terinspirasi oleh...

Jaringan - Bagaimana cara mengetahui berapa banyak alamat IP yang ada dalam rentang tertentu?

Tulis sebuah program atau fungsi yang mengambil dua string sebagai input, masing-masing menjadi alamat IPv4 yang dinyatakan dalam notasi bertitik standar dan menghasilkan atau mengembalikan jumlah alamat IP yang dicakup oleh rentang ini, termasuk dua input alamat IP.

  • Anda tidak boleh menggunakan kode eksternal, pustaka atau layanan apa pun yang dirancang untuk mengurai alamat IP. (Fungsi pustaka string standar lainnya dapat diterima.)
  • Semua 2 ^ 32 alamat IP sama. Tidak ada perbedaan yang dibuat untuk siaran, kelas E, dll.
  • Aturan kode-golf normal berlaku.

Sebagai contoh:

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

Saya melihat pertanyaan ini pada programmer, dan berpikir tentang menanyakannya pada kode golf lol.
Cruncher

3
Saya pikir ini adalah pertanyaan StackOverflow tentang alamat IP apa yang tidak mungkin menurut standar.
Ming-Tang

8
Bukankah IPv4 sedikit ketinggalan jaman?
ugoren

Jawaban:


20

GolfScript, 20 byte

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

Cobalah online.

Uji kasus

$ 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

Bagaimana itu bekerja

~]        # 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.

Sangat bagus, dan penggunaan yang bagus $untuk menghindari abs.
Chris Jester-Young

4
~]juga sangat pintar.
Primo

10

Python 2 - 106

Lihat di sini .

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

Contoh Input

0.0.0.0
0.0.0.255

Contoh Output

256


1
def a():return reduce(lambda c,d:c*256+d,map(int,raw_input().split(".")))jauh lebih pendek
Michael M.

5
@Michael Terima kasih atas sarannya. Saya menggunakannya selama beberapa menit, lalu melihatnya dan berpikir, "Saya tidak menulis 90% dari itu." jadi saya gulung kembali.
Rainbolt

@Michael a=lambda:bukannya def a():return menyimpan 6 karakter
avall

@Rusher Ini 107 karakter, bukan 106
avall

1
@avall: Saya anggap Anda menghitung LF terakhir.
Dennis

8

CJam - 15

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

Cobalah di http://cjam.aditsu.net/

Terima kasih Dennis, wow, saya tidak tahu bagaimana mendapatkan yang terbaik dari bahasa saya sendiri: hlm


Anda dapat menyimpan dua byte dengan menghilangkan :i( btampaknya dilemparkan ke integer) dan satu dengan menggunakan {r...}2*bukannyaqS/{...}/
Dennis

6

Bash murni, 66 byte

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

Catatan:

  • Menentukan fungsi pyang meneruskan alamat IP desimal bertitik, dan menampilkan representasi hex dari alamat itu:
    • ${1//./ }adalah ekspansi parameter yang menggantikan .dengan alamat IP yang diteruskan kep()
    • Sebagian printfbesar cukup jelas. Karena hanya ada satu penspesifikasi format %02xdan empat arg tersisa, penspesifikasi format digunakan kembali untuk setiap arg yang tersisa, secara efektif menggabungkan 2 digit hex dari masing-masing 4 oktet bersamaan
  • $[]menyebabkan ekspansi aritmatika. Kami melakukan pengurangan dasar, dan menetapkan ke variabelr
  • ${r/-}adalah perluasan parameter untuk menghapus -karakter yang mungkin - efektif abs ()
  • Tampilan 1 + perbedaan mutlak untuk memberikan kisaran.

Keluaran:

$ ./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
$ 

Saya mendeteksi printfdan echo. Apakah itu bagian dari bash?
CalculatorFeline

1
@CatsAreFluffy Mereka builtin.
fase

6

Python 2.7 - 96 91 90 87

Membuat fungsi.

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

Pemakaian:

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

Sunting: Dihapus tidak perlu int()dari ffungsi. Terima kasih kepada isaacg

Sunting2: Dihapus LFdi akhir file (terima kasih ke @Rusher) dan dihapus map()dengan biaya reduce()inisialisasi (terima kasih ke @ njzk2)


1
mengapa fungsi f perlu int () di luar?
isaacg

1
Baik. Saya tidak tahu: D
avall

dapat memperoleh 2 karakter dengan meletakkan int di dalam pengurangan alih-alih menggunakan peta (hanya 2 karena Anda perlu menambahkan ,0parameter ke fungsi pengurangan Anda)
njzk2

Saya baru saja menulis sesuatu yang hampir persis kode Anda, jadi saya tidak akan repot mengirimkan sekarang. Sebenarnya, milik saya tiga karakter lebih panjang!
danmcardle

5

GolfScript, 27 byte

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

Contoh:

$ 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
Anda dapat menyimpan satu char dengan menggunakan /alih-alih %~.
Dennis

4

CoffeeScript - 94, 92, 79, 72

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

Tidak golf :

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

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

JavaScript Setara :

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 );
}

Cobalah online .


1
Anda dapat menyimpan beberapa karakter dengan mengganti beberapa tanda kurung dengan spasi: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

Rasanya seperti Anda kehilangan banyak ruang Math.abs, tetapi saya tidak dapat menemukan sesuatu yang lebih pendek. (z>0)*z||-zadalah yang terbaik yang saya punya (panjang yang sama, dan perlu input char tunggal). Apakah Anda memiliki sesuatu yang lebih pintar dari itu?
Aaron Dufour

versi javascript ini sangat membantu saya, saya sudah mencari ini selama satu jam. Terima kasih!
nodeffect

4

dc, 61 karakter

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

Saya pikir ini sangat menakjubkan bahwa ini dapat diselesaikan dengan dc sama sekali karena tidak memiliki kemampuan untuk mengurai string. Kuncinya adalah bahwa 192.168.123.185 berjalan sebagai stack

.185
.123
192.168

dan dXIr^*menggeser titik desimal ke kanan sebanyak digit pecahan seperti yang ada dan bahkan bekerja untuk 0,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

Kurangi karakter jika Anda membiarkan input sudah ada di tumpukan.


4

Powershell - 112 108 92 78 byte

Ini adalah kali pertama saya bermain golf. Tidak ada gunanya:

Golf (Tua):

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

Golf (baru)

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

Tidak Disatukan:

$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

Pemakaian

Simpan sebagai file (dalam hal ini getipamount.ps1) lalu panggil dari konsol

getipamount.ps1 255.255.255.255 0.0.0.0

4

C # dengan LINQ - 139 byte

(Dari 140 setelah menerapkan saran Bob.)

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

Tidak disatukan ....

    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


Bisakah seseorang menjelaskan kepada saya bagaimana seluruh byte yang bergeser ini bekerja?
Obversity

@Obversity a.b.c.dsama dengan (a << 24) | (b << 16) | (c << 8) | (d << 0)setara dengan (((a << 8) << 8) << 8) + ((b << 8) << 8) + (c << 8) + d). Pada dasarnya, setiap iterasi agregasi mengambil jumlah yang ada dan menggesernya menjadi satu oktet, kemudian menambahkan oktet berikutnya.
Bob

Anda dapat menyimpan karakter dengan menggunakan c*256alih-alih (c<<8).
Bob

@ Bob Melihat dengan baik.
billpg

Anda dapat menyimpan dua karakter lagi dengan menggantinya e-fdengan e<f?f-e:e-fdan menjatuhkanMath.Abs()
Patrick Huizinga

4

Perl, 43 byte

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

Menghitung shebang sebagai dua byte.

Penggunaan sampel:

$ 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

Catatan

  • vec eval,0,32adalah drop-in untuk ip2long. Perl memungkinkan karakter literal diekspresikan sebagai awalan ordinal mereka dengan v, misalnya v0dapat digunakan untuk karakter null. Ini juga bisa dirantai bersama, misalnyav65.66.67.68ABCD . Ketika tiga atau lebih nilai hadir, nilai awal vtidak perlu. The vecmenafsirkan fungsi string sebagai array integer, setiap sel memiliki jumlah tertentu bit (di sini, 32). unpack N,evalakan bekerja sama juga.

3

JavaScript ES6 - 68 byte

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

Cobalah dengan konsol (tekan F12) dari Firefox.


Anda harus menggunakan alertatau console.log. Output konsol murah.
nderscore

4
@nderscore, sama sekali tidak ada perbedaan antara console.logdan output langsung. Ini kode-golf, ini bukan tentang melakukan kode bersih.
Michael M.

Jawaban yang paling banyak dipilih untuk meta post ini tidak setuju: Standar JavaScript untuk IO . Ini bukan masalah kode bersih. Ini masalah sebenarnya tidak menghasilkan apa-apa.
nderscore

@DigitalTrauma, itu tidak akan berfungsi karena prioritas operator . (penambahan vs pergeseran bitwise)
Michael M.

2

Python 2.7, 104 byte

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
Terima kasih atas solusinya. Anda pikir Anda bisa: 1. Beralih dari titik koma ke baris baru, agar mudah dibaca tanpa mengorbankan panjang. 2. Jelaskan bagaimana kode bekerja?
isaacg

2

Perl, 72 byte

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

Pemakaian:

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

Ini sudah lebih lama dari program Perl primo , jadi tidak terlalu menarik.

Perl, 119 byte, untuk format alamat IP yang usang

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

Pemakaian:

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

Program ini menerima format usang untuk alamat IP! Ini termasuk alamat dengan 1, 2, atau 3 bagian, atau dengan bagian heksadesimal atau oktal. Mengutip inet_addr (3) halaman manual ,

Nilai yang ditentukan menggunakan notasi titik mengambil salah satu dari bentuk berikut:

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

... Ketika alamat tiga bagian ditentukan, bagian terakhir ditafsirkan sebagai kuantitas 16-bit dan ditempatkan di dua byte paling kanan dari alamat jaringan. ... Ketika dua bagian alamat diberikan, bagian terakhir ditafsirkan sebagai kuantitas 24-bit dan ditempatkan di tiga byte paling kanan dari alamat jaringan. ... Ketika hanya satu bagian yang diberikan, nilai disimpan langsung di alamat jaringan tanpa penataan ulang byte.

Semua angka yang disediakan sebagai `` bagian '' dalam notasi titik dapat berupa desimal, oktal, atau heksadesimal, seperti yang ditentukan dalam bahasa C (yaitu, 0x atau 0X terkemuka menyiratkan heksadesimal; 0 terkemuka berarti oktal; jika tidak, angkanya adalah diartikan sebagai desimal).

Sebagian besar program tidak lagi menerima format usang ini, tetapi ping 0177.1masih berfungsi di OpenBSD 5.5.


Fakta Anda menggunakan BSD lebih mengejutkan daripada hal IP.
fase

2

PHP, 138 110 byte

<?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');

Karena tidak ada menyebutkan 'tidak bantahan peringatan', Anda dapat menyimpan char dengan mengganti explode('.',"$a.$b")dengan split('\.',"$a.$b").
MrLore

Saya menghitung 109, bukan 110. Hemat 9 byte dengan program alih-alih fungsi dan 8 lagi dengan langkah-langkah golf ini: sandbox.onlinephpfunctions.com/code/…
Titus

1

Mathematica 9, 108 byte

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

Tidak Disatukan:

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

Diformat dengan benar

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 byte

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}

Keluaran

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 byte

Mengambil string IP titik-titik sebagai argumen kiri dan kanan.

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

Dijelaskan:

>:@|@-&(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

Contoh:

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

Terjemahan dari jawaban CoffeeScript.

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

0

Javascript ES6, 81 karakter

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

Uji:

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: Saya akan mencoba mengoptimalkannya nanti.


0

Lua, 153 Bytes

Sayang sekali lua tidak memiliki fungsi split, saya harus mendefinisikan milik saya!

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)

Tidak disatukan

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 byte, tantangan tanggal bahasa

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

Cobalah online!

Penjelasan

ṣ”.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

Jumlah elemen dalam rentang inklusif adalah perbedaan absolut dari titik akhir mereka, ditambah 1.


0

Aksioma, 385 byte

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

ungolf itu dan uji

-- 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.