มีที่อยู่ IP เท่าใดในช่วงที่กำหนด


31

เเรงบันดาลใจจาก...

ระบบเครือข่าย - ฉันจะทราบได้อย่างไรว่ามีที่อยู่ IP จำนวนเท่าใดในช่วงที่กำหนด

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสองสายเป็นอินพุตแต่ละอันเป็นที่อยู่ IPv4 ที่แสดงในรูปแบบเครื่องหมายจุดมาตรฐานและส่งออกหรือส่งคืนจำนวนที่อยู่ IP ที่ครอบคลุมโดยช่วงนี้รวมถึงอินพุต IP สองที่อยู่

  • คุณต้องไม่ใช้รหัสภายนอกไลบรารีหรือบริการที่ออกแบบมาเพื่อแยกที่อยู่ IP (ยอมรับฟังก์ชั่นไลบรารีมาตรฐานการประมวลผลสตริงอื่น ๆ )
  • ที่อยู่ IP 2 ^ 32 ทั้งหมดเท่ากัน ไม่มีความแตกต่างในการออกอากาศคลาส E ฯลฯ
  • มีการใช้กฎของสนามกอล์ฟรหัสปกติ

ตัวอย่างเช่น:

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

ฉันเห็นคำถามนี้เกี่ยวกับโปรแกรมเมอร์และกำลังคิดจะถามมันเกี่ยวกับ code golf lol
Cruncher

3
ฉันคิดว่านี่เป็นคำถาม StackOverflow เกี่ยวกับที่อยู่ IP ใดที่เป็นไปไม่ได้ตามมาตรฐาน
Ming-Tang

8
IPv4 นั้นไม่ใช่บิตหรือไม่?
ugoren

คำตอบ:


20

GolfScript ขนาด 20 ไบต์

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

ลองออนไลน์

กรณีทดสอบ

$ 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

มันทำงานอย่างไร

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

ดีมากและการใช้งานที่ดีของการที่จะหลีกเลี่ยง$ abs
Chris Jester-Young

4
~]เป็นคนฉลาดจริงๆ
โม่

10

Python 2 - 106

เห็นมันนี่

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

ตัวอย่างอินพุต

0.0.0.0
0.0.0.255

ตัวอย่างผลลัพธ์

256


1
def a():return reduce(lambda c,d:c*256+d,map(int,raw_input().split(".")))สั้นกว่ามาก
Michael M.

5
@Michael ขอบคุณสำหรับคำแนะนำ ฉันใช้มันไปสองสามนาทีแล้วดูและคิดว่า "ฉันไม่ได้เขียน 90% ของสิ่งนั้น" ดังนั้นฉันจึงย้อนกลับ
Rainbolt

@Michael a=lambda:แทนการdef a():return บันทึก 6 ตัวอักษร
avall

@Rusher มันมี 107 ตัวละครไม่ใช่ 106
avall

1
@avall: ฉันถือว่าคุณนับ LF ขั้นสุดท้ายแล้ว
Dennis

8

CJam - 15

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

ลองที่http://cjam.aditsu.net/

ขอบคุณเดนนิสว้าวฉันไม่รู้วิธีการใช้ภาษาของตัวเองให้ดีที่สุด: p


คุณสามารถบันทึกสองไบต์โดยกำจัด:i( bดูเหมือนว่าจะแปลงเป็นจำนวนเต็ม) และหนึ่งโดยใช้{r...}2*แทนqS/{...}/
เดนนิส

6

ทุบตีบริสุทธิ์ 66 ไบต์

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

หมายเหตุ:

  • กำหนดฟังก์ชั่นpที่ส่งผ่านที่อยู่ IP ทศนิยมแบบจุดและแสดงผลลัพธ์การแสดงเลขฐานสิบหกของที่อยู่นั้น:
    • ${1//./ }เป็นการขยายพารามิเตอร์ที่แทนที่.ด้วยในที่อยู่ IP ที่ส่งไปยังp()
    • printfส่วนใหญ่จะเป็นตัวอธิบาย เนื่องจากมีตัวระบุรูปแบบเพียงหนึ่งรูปแบบ%02xและส่วนที่เหลืออีกสี่รูปแบบตัวระบุรูปแบบจะถูกนำมาใช้ใหม่สำหรับแต่ละ ARG ที่เหลืออยู่เชื่อมโยงเลขฐานสิบหก 2 หลักของ 4 octets เข้าด้วยกันอย่างมีประสิทธิภาพ
  • $[]ทำให้เกิดการขยายตัวทางคณิตศาสตร์ เราทำการลบพื้นฐานและกำหนดให้กับตัวแปรr
  • ${r/-}เป็นการขยายพารามิเตอร์เพื่อลบ-อักขระที่เป็นไปได้- abs อย่างมีประสิทธิภาพ ()
  • แสดง 1 + ความแตกต่างที่แน่นอนเพื่อให้ช่วง

เอาท์พุท:

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

ผมตรวจสอบและprintf echoเป็นส่วนหนึ่งของbash?
CalculatorFeline

1
@CatsAreFluffy พวกเขาอยู่ในตัว
เฟส

6

Python 2.7 - 96 91 90 87

ทำฟังก์ชั่น

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

การใช้งาน:

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

แก้ไข:ลบที่ไม่จำเป็นออกint()จากfฟังก์ชั่น ขอบคุณ isaacg

แก้ไข 2:ลบออกLFที่ท้ายไฟล์ (ขอบคุณ @Rusher) และลบออกmap()ด้วยราคาของreduce()initializer (ขอบคุณ @ njzk2)


1
ทำไมฟังก์ชั่น f ถึงต้องการ int () ด้านนอก?
isaacg

1
ดี. ฉันไม่มีความคิด: D
avall

สามารถรับ 2 ตัวอักษรโดยใส่ int ในการลดแทนการใช้แผนที่ (เพียง 2 ตามที่คุณต้องการเพิ่ม,0พารามิเตอร์ในฟังก์ชั่นการลดของคุณ)
njzk2

ฉันเพิ่งเขียนสิ่งที่เกือบจะเป็นรหัสของคุณดังนั้นฉันจะไม่รบกวนการส่งในขณะนี้ จริงๆแล้วของฉันคือตัวละครสามตัวอีกต่อไป!
danmcardle

5

GolfScript, 27 ไบต์

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

ตัวอย่าง:

$ 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
คุณสามารถบันทึกหนึ่งถ่านโดยใช้แทน/ %~
เดนนิส

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

เลิกเล่น :

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

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

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

ลองมันออนไลน์


1
คุณสามารถบันทึกอักขระบางตัวโดยแทนที่วงเล็บด้วยช่องว่าง: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

รู้สึกเหมือนคุณกำลังสูญเสียพื้นที่เหลือเฟือMath.absแต่ฉันไม่สามารถคิดอะไรสั้น ๆ ได้เลย (z>0)*z||-zเป็นสิ่งที่ดีที่สุดที่ฉันมี (ความยาวเท่ากันและต้องการอินพุตแบบถ่านเดียว) คุณมีอะไรที่ฉลาดกว่านี้ไหม?
Aaron Dufour

เวอร์ชันจาวาสคริปต์นี้ช่วยฉันได้จริงๆฉันได้ค้นหาสิ่งนี้เป็นเวลาหนึ่งชั่วโมง ขอบคุณ!
nodeffect

4

dc, 61 ตัวอักษร

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

ฉันคิดว่ามันวิเศษมากที่สามารถแก้ไขได้ด้วย dc เลยเนื่องจากไม่มีความสามารถในการแยกสตริง เคล็ดลับคือ 192.168.123.185 ไปในกองเป็น

.185
.123
192.168

และdXIr^*เลื่อนจุดทศนิยมไปทางขวาให้มากที่สุดเท่าที่มีเศษและยังใช้ได้กับ. 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

ลบอักขระหากคุณให้อินพุตอยู่ในสแต็กแล้ว


4

Powershell - 112 108 92 78 ไบต์

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟ ที่นี่ไม่มีอะไรไป:

Golfed (เก่า):

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

Golfed (ใหม่)

$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

การใช้

บันทึกเป็นไฟล์ (ในกรณีนี้ getipamount.ps1) จากนั้นโทรจากคอนโซล

getipamount.ps1 255.255.255.255 0.0.0.0

4

C # กับ LINQ - 139 ไบต์

(จาก 140 หลังจากใช้คำแนะนำของ 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;}

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


มีคนอธิบายให้ฉันฟังได้ไหมว่าการเปลี่ยนไบต์ทั้งหมดไปพร้อม ๆ กันทำงานอย่างไร?
Obversity

@Obversity a.b.c.dเทียบเท่ากับเทียบเท่ากับ(a << 24) | (b << 16) | (c << 8) | (d << 0) (((a << 8) << 8) << 8) + ((b << 8) << 8) + (c << 8) + d)โดยทั่วไปการวนซ้ำแต่ละครั้งของการรวมจะใช้ผลรวมที่มีอยู่และเลื่อนไปทางซ้ายหนึ่ง octet จากนั้นเพิ่ม octet ถัดไป
Bob

คุณสามารถบันทึกตัวอักษรโดยใช้แทนc*256 (c<<8)
Bob

@ บ๊อบเห็นดี
billpg

คุณสามารถบันทึกอักขระได้อีกสองตัวโดยแทนที่e-fด้วยe<f?f-e:e-fและปล่อยMath.Abs()
Patrick Huizinga

4

Perl, 43 ไบต์

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

นับ Shebang เป็นสองไบต์

ตัวอย่างการใช้งาน:

$ 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

หมายเหตุ

  • vec eval,0,32ip2longเป็นแบบเลื่อนใน Perl ช่วยให้ตัวอักษรตัวละครที่จะแสดงเป็นลำดับของพวกเขานำหน้าด้วยvตัวอย่างเช่นv0สามารถนำมาใช้สำหรับ char ถ่าน เหล่านี้ยังสามารถถูกล่ามโซ่ด้วยกันตัวอย่างเช่น→v65.66.67.68 ABCDเมื่อมีสามค่าขึ้นไปค่าเริ่มต้นvนั้นไม่จำเป็น vecฟังก์ชั่นการตีความสตริงเป็นอาร์เรย์จำนวนเต็มแต่ละเซลล์มีการระบุจำนวนของบิต (ที่นี่ 32) unpack N,evalก็จะได้ผลเท่าเทียมกันเช่นกัน

3

JavaScript ES6 - 68 ไบต์

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

ลองใช้กับคอนโซล (กด F12) ของ Firefox


คุณควรจะใช้หรือalert console.logเอาต์พุตคอนโซลราคาถูก
nderscore

4
@ ตัวเลขอย่างไม่มีความแตกต่างระหว่างconsole.logและเอาท์พุทโดยตรง นี่คือรหัส - กอล์ฟไม่ใช่เกี่ยวกับการทำความสะอาดรหัส
Michael M.

upvoted ที่สุดคำตอบให้กับเมตานี้โพสต์ไม่เห็นด้วย: มาตรฐาน JavaScript สำหรับ IO ไม่ใช่เรื่องของรหัสที่สะอาด มันเป็นเรื่องของการไม่แสดงผลอะไรเลย
nderscore

@DigitalTrauma ก็จะไม่ทำงานเนื่องจากผู้ประกอบการมีความสำคัญ (นอกจากนี้เทียบกับการเปลี่ยนแปลงระดับบิต)
Michael M.

2

Python 2.7, 104 ไบต์

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
ขอบคุณสำหรับการแก้ปัญหา คุณคิดว่าคุณทำได้หรือไม่: 1. เปลี่ยนจากอัฒภาคเป็นบรรทัดใหม่เพื่อความสะดวกในการอ่านโดยไม่เสียสละความยาว 2. อธิบายว่ารหัสทำงานอย่างไร
isaacg

2

Perl, 72 ไบต์

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

การใช้งาน:

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

นี่นานกว่าโปรแกรม Perl ของ primoดังนั้นจึงไม่น่าสนใจเกินไป

Perl, 119 ไบต์สำหรับรูปแบบที่อยู่ IP ล้าสมัย

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

การใช้งาน:

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

โปรแกรมนี้ยอมรับรูปแบบที่ล้าสมัยสำหรับที่อยู่ IP! ซึ่งรวมถึงที่อยู่ที่มี 1, 2 หรือ 3 ส่วนหรือมีเลขฐานสิบหกหรือเลขฐานแปด การอ้างถึงหน้าคู่มือinet_addr (3)

ค่าที่ระบุโดยใช้เครื่องหมายจุดใช้หนึ่งในฟอร์มต่อไปนี้:

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

... เมื่อมีการระบุที่อยู่สามส่วนส่วนสุดท้ายจะถูกตีความเป็นปริมาณ 16 บิตและวางในสองไบต์ขวาสุดของที่อยู่เครือข่าย ... เมื่อมีการจัดหาที่อยู่สองส่วนส่วนสุดท้ายจะถูกตีความเป็นปริมาณ 24 บิตและวางไว้ในสามไบต์ขวาสุดของที่อยู่เครือข่าย ... เมื่อได้รับเพียงส่วนเดียวค่าจะถูกจัดเก็บโดยตรงในที่อยู่เครือข่ายโดยไม่มีการจัดเรียงไบต์ใหม่

ตัวเลขทั้งหมดที่ให้เป็น `` ส่วน '' ในรูปแบบจุดอาจเป็นทศนิยมฐานแปดหรือฐานสิบหกตามที่ระบุในภาษา C (เช่นนำหน้า 0x หรือ 0X หมายถึงเลขฐานสิบหก 0 นำหน้าหมายถึงฐานแปดมิฉะนั้นตัวเลขคือ ตีความว่าเป็นทศนิยม)

โปรแกรมส่วนใหญ่ไม่ยอมรับรูปแบบที่ล้าสมัยนี้อีกต่อไป แต่ping 0177.1ยังคงใช้งานได้ใน OpenBSD 5.5


ความจริงที่คุณใช้ BSD นั้นน่าแปลกใจกว่าเรื่องของ IP
เฟส

2

PHP, 138 110 ไบต์

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

ตามที่มีการกล่าวถึง 'ไม่มีคำเตือนการเลิก' ไม่คุณสามารถบันทึกถ่านโดยการแทนที่ด้วยexplode('.',"$a.$b") split('\.',"$a.$b")
MrLore

ฉันนับ 109 ไม่ใช่ 110 บันทึก 9 ไบต์ด้วยโปรแกรมแทนฟังก์ชั่นและอีก 8 ขั้นตอนในการเล่นกอล์ฟเหล่านี้: sandbox.onlinephpfunctions.com/code/…
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;}

รูปแบบที่เหมาะสม

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 ไบต์

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}

เอาท์พุต

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 ไบต์

รับสตริง IP แบบจุดประเป็นอาร์กิวเมนต์ซ้ายและขวา

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

อธิบาย:

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

ตัวอย่าง:

   '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

ตัวคูณ 73 ไบต์

การแปลคำตอบของ CoffeeScript

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

0

Javascript ES6, 81 ตัวอักษร

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

ทดสอบ:

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: ฉันจะพยายามปรับให้เหมาะสมในภายหลัง


0

Lua, 153 ไบต์

มันเป็นความอัปยศที่ lua ไม่ได้มีฟังก์ชั่นแยกผมต้องกำหนดระเบิด!

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

ความท้าทายของเยลลี่ขนาด 12 ไบต์ภาษาที่โพสต์ลงวันที่

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

ลองออนไลน์!

คำอธิบาย

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

จำนวนขององค์ประกอบในช่วงรวมเป็นความแตกต่างแน่นอนของจุดสิ้นสุดของพวกเขารวมทั้ง 1


0

ความจริง 385 ไบต์

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

ถอดเสื้อผ้าออกแล้วทดสอบ

-- 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.