Có bao nhiêu địa chỉ IP trong một phạm vi nhất định?


31

Lấy cảm hứng từ...

Kết nối mạng - Làm cách nào tôi có thể biết được có bao nhiêu địa chỉ IP trong một phạm vi nhất định?

Viết chương trình hoặc hàm lấy hai chuỗi làm đầu vào, mỗi chuỗi là một địa chỉ IPv4 được thể hiện bằng ký hiệu chấm chấm tiêu chuẩn và đầu ra hoặc trả về số lượng địa chỉ IP được bao phủ trong phạm vi này, bao gồm cả hai địa chỉ IP đầu vào.

  • Bạn không được sử dụng bất kỳ mã bên ngoài, thư viện hoặc dịch vụ nào được thiết kế để phân tích địa chỉ IP. (Các hàm thư viện tiêu chuẩn xử lý chuỗi khác được chấp nhận.)
  • Tất cả 2 ^ 32 địa chỉ IP đều bằng nhau. Không có sự phân biệt được thực hiện để phát sóng, lớp E, vv
  • Quy tắc golf-golf bình thường được áp dụng.

Ví dụ:

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

Tôi thấy câu hỏi này trên các lập trình viên, và đã suy nghĩ về việc hỏi nó trên mã golf lol.
Cruncher

3
Tôi nghĩ rằng đây là một câu hỏi StackOverflow về những địa chỉ IP nào là không thể theo các tiêu chuẩn.
Ming-Tang

8
Không phải là IPv4 một chút vượt qua?
ugoren

Câu trả lời:


20

GolfScript, 20 byte

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

Hãy thử trực tuyến.

Các trường hợp thử nghiệm

$ 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

Làm thế nào nó hoạt động

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

Rất tốt đẹp, và sử dụng tốt đẹp $để tránh abs.
Chris Jester-Young

4
~]cũng thực sự thông minh.
primo

10

Con trăn 2 - 106

Xem nó ở đây .

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

Ví dụ đầu vào

0.0.0.0
0.0.0.255

Ví dụ đầu ra

256


1
def a():return reduce(lambda c,d:c*256+d,map(int,raw_input().split(".")))ngắn hơn rất nhiều
Michael M.

5
@Michael Cảm ơn bạn đã gợi ý. Tôi đã sử dụng nó trong vài phút, sau đó nhìn vào nó và nghĩ, "Tôi đã không viết 90% trong số đó." Vì vậy, tôi cuộn nó trở lại.
Rainbolt

@Michael a=lambda:thay vì def a():return lưu 6 ký tự
trong

@Rizer Đó là 107 ký tự, không phải 106
trong

1
@avall: Tôi giả sử bạn đang đếm số cuối cùng của LF.
Dennis

8

CJam - 15

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

Dùng thử tại http://cjam.aditsu.net/

Cảm ơn Dennis, wow, tôi không biết làm thế nào để sử dụng tốt nhất ngôn ngữ của mình: p


Bạn có thể lưu hai byte bằng cách loại bỏ :i( bdường như chuyển thành số nguyên) và một byte bằng cách sử dụng {r...}2*thay vìqS/{...}/
Dennis

6

Bash tinh khiết, 66 byte

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

Ghi chú:

  • Xác định hàm pđược truyền địa chỉ IP thập phân rải rác và xuất ra biểu diễn hex của địa chỉ đó:
    • ${1//./ } là một mở rộng tham số thay thế . bằng địa chỉ IP được truyền tớip()
    • Phần printflớn là tự giải thích. Vì chỉ có một trình xác định định dạng %02xvà bốn đối số còn lại, nên trình xác định định dạng được sử dụng lại cho mỗi đối số còn lại, kết hợp hiệu quả 2 chữ số hex của mỗi 4 octet với nhau
  • $[]gây ra sự mở rộng số học. Chúng tôi thực hiện một phép trừ cơ bản và gán cho biếnr
  • ${r/-} là một mở rộng tham số để loại bỏ một khả năng - ký tự - abs ()
  • Hiển thị 1 + sự khác biệt tuyệt đối để đưa ra phạm vi.

Đầu ra:

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

Tôi phát hiện printfecho. Là những phần của bash?
Máy

1
@CatsAreFluffy Họ được xây dựng.
giai đoạn

6

Python 2.7 - 96 91 90 87

Thực hiện một chức năng.

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

Sử dụng:

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

Chỉnh sửa: Loại bỏ không cần thiết int()khỏi fchức năng. Cảm ơn isaacg

Edit2: Đã xóa LFở cuối tệp (nhờ @Rizer) và xóa map()bằng chi phí reduce()khởi tạo (nhờ @ njzk2)


1
Tại sao hàm f cần int () ở bên ngoài?
isaacg

1
Tốt. Tôi không biết: D
avall

có thể nhận được 2 ký tự bằng cách đặt int vào phần giảm thay vì sử dụng bản đồ (chỉ có 2 khi bạn cần thêm ,0tham số cho hàm giảm)
njzk2

Tôi vừa mới viết một cái gì đó gần như chính xác mã của bạn, vì vậy tôi sẽ không bận tâm gửi ngay bây giờ. Thật ra, của tôi dài hơn ba nhân vật!
danmcardle

5

GolfScript, 27 byte

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

Ví dụ:

$ 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
Bạn có thể lưu một char bằng cách sử dụng /thay vì %~.
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

Chưa chơi gôn :

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

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

JavaScript tương đương :

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

Hãy thử trực tuyến .


1
Bạn có thể lưu một số ký tự bằng cách thay thế một số dấu ngoặc đơn bằng dấu cách: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

Cảm giác như bạn đang mất rất nhiều không gian Math.abs, nhưng tôi không thể nghĩ ra thứ gì ngắn hơn. (z>0)*z||-zlà thứ tốt nhất tôi có (cùng độ dài và nó cần một đầu vào char). Bạn có điều gì thông minh hơn thế không?
Aaron Dufour

phiên bản javascript này thực sự giúp tôi, tôi đã tìm kiếm nó trong khoảng một giờ. cảm ơn!
nodeffect

4

dc, 61 ký tự

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

Tôi nghĩ thật tuyệt vời khi điều này có thể được giải quyết bằng dc vì nó không có khả năng phân tích chuỗi. Thủ thuật là 192.168.123.185 đi vào ngăn xếp như

.185
.123
192.168

dXIr^*dịch chuyển dấu thập phân sang phải có nhiều chữ số phân số và thậm chí nó hoạt động với giá trị .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

Trừ một ký tự nếu bạn để đầu vào đã ở trên ngăn xếp.


4

Powershell - 112 108 92 78 byte

Đây là lần đầu tiên tôi chơi golf. Ở đây không có gì:

Chơi gôn (Cũ):

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

Chơi gôn (mới)

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

Ung dung:

$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

Sử dụng

Lưu dưới dạng tệp (trong trường hợp này là getipamount.ps1) và sau đó gọi từ bảng điều khiển

getipamount.ps1 255.255.255.255 0.0.0.0

4

C # với LINQ - 139 byte

(Từ 140 sau khi áp dụng đề xuất của 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;}

Bị đánh cắp ....

    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


Ai đó có thể giải thích cho tôi làm thế nào toàn bộ byte dịch chuyển này cùng hoạt động?
Trở ngại

@Obversity a.b.c.dtương (a << 24) | (b << 16) | (c << 8) | (d << 0)đương với (((a << 8) << 8) << 8) + ((b << 8) << 8) + (c << 8) + d). Về cơ bản, mỗi lần lặp của tập hợp sẽ lấy tổng hiện có và dịch chuyển nó còn lại bởi một octet, sau đó thêm octet tiếp theo.
Bob

Bạn có thể lưu một ký tự bằng cách sử dụng c*256thay vì (c<<8).
Bob

@Bob Phát hiện tốt.
billpg

Bạn có thể lưu hai nhân vật nhiều hơn bằng cách thay thế e-fvới e<f?f-e:e-fvà thảMath.Abs()
Patrick Huizinga

4

Perl, 43 byte

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

Đếm shebang là hai byte.

Sử dụng mẫu:

$ 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

Ghi chú

  • vec eval,0,32là một thả cho ip2long. Perl cho phép các ký tự bằng chữ được thể hiện dưới dạng tiền tố thứ tự của chúng với a v, ví dụ v0có thể được sử dụng cho null char. Chúng cũng có thể được nối lại với nhau, ví dụ v65.66.67.68ABCD. Khi có ba giá trị trở lên, ban đầu vlà không cần thiết. Các vecdiễn giải chức năng một chuỗi như một mảng số nguyên, mỗi tế bào có số lượng nhất định các bit (ở đây, 32). unpack N,evalcũng sẽ làm việc như nhau.

3

JavaScript ES6 - 68 byte

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

Hãy thử nó với bảng điều khiển (nhấn F12) của Firefox.


Bạn nên sử dụng alerthoặc console.log. Bảng điều khiển đầu ra là giá rẻ.
nderscore

4
@nderscore, hoàn toàn không có sự khác biệt giữa console.logvà đầu ra trực tiếp. Đây là môn đánh gôn, không phải là làm sạch mã.
Michael M.

Câu trả lời được đánh giá cao nhất cho bài đăng meta này không đồng ý: Tiêu chuẩn JavaScript cho IO . Đây không phải là vấn đề về mã sạch. Đó là một vấn đề không thực sự xuất ra bất cứ điều gì.
nderscore

@DigitalTrauma, nó sẽ không hoạt động do ưu tiên của nhà điều hành . (bổ sung so với thay đổi 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
Cảm ơn giải pháp. Bạn có nghĩ rằng bạn có thể: 1. Chuyển từ dấu chấm phẩy sang dòng mới, để dễ đọc mà không phải hy sinh độ dài. 2. Giải thích cách làm việc của mã?
isaacg

2

Perl, 72 byte

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

Sử dụng:

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

Chương trình này đã dài hơn chương trình Perl của primo , nên không quá thú vị.

Perl, 119 byte, cho định dạng địa chỉ IP lỗi thời

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

Sử dụng:

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

Chương trình này chấp nhận định dạng lỗi thời cho các địa chỉ IP! Điều này bao gồm các địa chỉ có 1, 2 hoặc 3 phần hoặc với các phần thập lục phân hoặc bát phân. Trích dẫn trang hướng dẫn inet_addr (3) ,

Các giá trị được chỉ định bằng cách sử dụng ký hiệu dấu chấm có một trong các hình thức sau:

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

... Khi một địa chỉ ba phần được chỉ định, phần cuối cùng được hiểu là số lượng 16 bit và được đặt ở hai byte ngoài cùng bên phải của địa chỉ mạng. ... Khi địa chỉ hai phần được cung cấp, phần cuối cùng được hiểu là số lượng 24 bit và được đặt ở ba byte ngoài cùng bên phải của địa chỉ mạng. ... Khi chỉ có một phần được đưa ra, giá trị được lưu trữ trực tiếp trong địa chỉ mạng mà không cần sắp xếp lại byte.

Tất cả các số được cung cấp dưới dạng `` phần '' trong ký hiệu dấu chấm có thể là số thập phân, bát phân hoặc thập lục phân, như được chỉ định trong ngôn ngữ C (nghĩa là số 0x hoặc 0X hàng đầu ngụ ý thập lục phân; số 0 đứng đầu có nghĩa là số bát phân; được hiểu là số thập phân).

Hầu hết các chương trình không còn chấp nhận định dạng lỗi thời này, nhưng ping 0177.1vẫn hoạt động trong OpenBSD 5.5.


Thực tế bạn đang sử dụng BSD đáng ngạc nhiên hơn điều IP.
giai đoạn

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

Vì không có đề cập đến 'không có cảnh báo khấu hao', bạn có thể lưu một char bằng cách thay thế explode('.',"$a.$b")bằng split('\.',"$a.$b").
MrLore

Tôi đếm 109, không phải 110. Lưu 9 byte bằng một chương trình thay vì chức năng và 8 lần nữa với các bước chơi gôn này: sandbox.onlinephpfifts.com/code/iêu
Titus

1

Toán học 9, 108 byte

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

Ung dung:

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

Định dạng đúng

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}

Đầu ra

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

Lấy các chuỗi IP rải rác làm đối số trái và phải.

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

Giải thích:

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

Ví dụ:

   '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

Yếu tố, 73 byte

Bản dịch của câu trả lời CoffeeScript.

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

0

Javascript ES6, 81 ký tự

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

Kiểm tra:

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: Tôi sẽ cố gắng tối ưu hóa nó một chút sau.


0

Lua, 153 byte

Thật xấu hổ vì lua không có chức năng phân tách, tôi phải xác định chức năng của mình!

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)

Ung dung

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, thách thức ngôn ngữ

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

Hãy thử trực tuyến!

Giải trình

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

Số lượng phần tử trong phạm vi bao gồm là sự khác biệt tuyệt đối của các điểm cuối của chúng, cộng với 1.


0

Tiên đề, 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 nó và kiểm tra

-- 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.