दी गई सीमा में कितने आईपी पते हैं?


31

से प्रेरित...

नेटवर्किंग - मैं किसी श्रेणी में कितने IP पते काम कर सकता हूं?

एक प्रोग्राम या फ़ंक्शन लिखें जो इनपुट के रूप में दो स्ट्रिंग्स लेता है, प्रत्येक में एक आईपीवी 4 पता है जो मानक बिंदीदार अंकन और आउटपुट में व्यक्त किया गया है या दो आईपी पते इनपुट सहित इस रेंज द्वारा कवर किए गए आईपी पते की संख्या देता है।

  • आपको किसी आईपी पते को पार्स करने के लिए डिज़ाइन किए गए किसी भी बाहरी कोड, लाइब्रेरी या सेवाओं का उपयोग नहीं करना चाहिए। (अन्य स्ट्रिंग प्रसंस्करण मानक पुस्तकालय कार्य स्वीकार्य हैं।)
  • सभी 2 ^ 32 आईपी पते समान हैं। प्रसारण, वर्ग ई आदि के लिए कोई भेद नहीं किया जाता है।
  • सामान्य कोड-गोल्फ नियम लागू होते हैं।

उदाहरण के लिए:

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

मैंने इस सवाल को प्रोग्रामर्स पर देखा, और इसे कोड गोल्फ लोल पर पूछने के बारे में सोच रहा था।
क्रंचर

3
मुझे लगा कि मानकों के अनुसार आईपी पते क्या असंभव हैं, इस बारे में यह एक StackOverflow प्रश्न है।
मिंग-तांग

8
क्या IPv4 थोड़ा विस्मित नहीं है?
बदसूरत

जवाबों:


20

गोल्फस्क्रिप्ट, 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
क्रिस जस्टर-यंग

4
~]वास्तव में चतुर भी है।
प्रिमो

10

अजगर 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(".")))बहुत छोटा है
माइकल एम।

5
@ मिचेल सुझाव के लिए धन्यवाद। मैंने इसे कुछ मिनटों के लिए इस्तेमाल किया, फिर इसे देखा और सोचा, "मैंने इसका 90% नहीं लिखा।" इसलिए मैंने इसे वापस ले लिया।
बारिश का समय

@ a=lambda:def a():return
मिचेल

@ राशेर यह १० 107 अक्षर हैं, न कि १०६
एवल

1
@avall: मुझे लगता है कि आप अंतिम LF की गिनती कर रहे हैं।
डेनिस

8

सीजाम - 15

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

इसे http://cjam.aditsu.net/ पर आज़माएं

धन्यवाद डेनिस, वाह, मैं नहीं जानता कि कैसे अपनी भाषा से सबसे अच्छा पाने के लिए: पी


आप दो बाइट्स को समाप्त करके बचा सकते हैं :i( bपूर्णांक के लिए कास्ट करने के लिए लगता है) और एक के {r...}2*बजाय का उपयोग करकेqS/{...}/
डेनिस

6

शुद्ध बैश, 66 बाइट्स

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

टिप्पणियाँ:

  • एक फ़ंक्शन को परिभाषित करता है pजो एक बिंदीदार दशमलव आईपी पते को पारित करता है , और उस पते के हेक्स प्रतिनिधित्व को आउटपुट करता है:
    • ${1//./ }एक पैरामीटर विस्तार है जो आईपी ​​पते में बदल .जाता हैp()
    • printfज्यादातर आत्म व्याख्यात्मक है। चूँकि केवल एक प्रारूप निर्दिष्टकर्ता %02xऔर चार शेष आर्ग हैं, इसलिए प्रारूप विनिर्देशक का प्रत्येक शेष अर्ग के लिए पुन: उपयोग किया जाता है, प्रभावी रूप से एक साथ 4 अष्टकों में से प्रत्येक के 2 हेक्स अंकों को समाप्‍त करता है।
  • $[]अंकगणितीय विस्तार का कारण बनता है। हम एक मूल घटाव करते हैं, और चर को असाइन करते हैंr
  • ${r/-}एक संभावित -चरित्र को हटाने के लिए एक पैरामीटर विस्तार है - प्रभावी रूप से एब्स ()
  • रेंज देने के लिए 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?
कैलक्यूलेटरफैलीन

1
@CatsAreFluffy वे बिलिन हैं।
चरण

6

अजगर 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फंक्शन से हटाया गया । इसाक धन्यवाद

Edit2:LF फ़ाइल के अंत में हटा दिया गया (@Rusher के लिए धन्यवाद) और इनिशियलाइज़र की map()लागत पर हटा दिया गया reduce()(@ njzk2 के लिए धन्यवाद)


1
f फ़ंक्शन को बाहर पर int () की आवश्यकता क्यों है?
ईसैक

1
कुंआ। डी: मुझे पता नहीं था
avall

मानचित्र का उपयोग करने के बजाय इंट में घटाकर 2 चार्ट प्राप्त कर सकते हैं (केवल 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

कॉफ़ीस्क्रिप्ट - 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 )

समतुल्य जावास्क्रिप्ट :

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मुझे जो सबसे अच्छा मिला है (वही लंबाई, और इसके लिए सिंगल-चार इनपुट चाहिए)। क्या आपके पास इससे ज्यादा चालाक है?
एरोन डुफौर

यह जावास्क्रिप्ट संस्करण वास्तव में मेरी मदद करता है, ive इसे एक घंटे के लिए खोज रहा है। धन्यवाद!
nodeffect

4

डीसी, 61 अक्षर

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

मुझे लगता है कि यह बहुत आश्चर्यजनक है कि यह डीसी के साथ हल किया जा सकता है क्योंकि इसमें तार को पार्स करने की कोई क्षमता नहीं है। चाल यह है कि 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

पॉवर्सशेल - 112 108 92 78 बाइट्स

यह मेरी पहली बार गोल्फ है। कुछ भी नहीं हुआ:

गोल्फ (पुराना):

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

गोल्फ (नया)

$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

LINQ के साथ C # - 139 बाइट्स

(बॉब के सुझाव को लागू करने के बाद 140 से।)

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)। मूल रूप से, एकत्रीकरण का प्रत्येक पुनरावृत्ति मौजूदा योग लेता है और इसे एक ऑक्टेट द्वारा छोड़ दिया जाता है, फिर अगला ऑक्टेट जोड़ता है।
बॉब

आप c*256इसके बजाय का उपयोग करके एक चरित्र को बचा सकते हैं (c<<8)
बॉब

@ याकूब को देखा गया।
बिल्वपत्र

आप के e-fसाथ दो और पात्रों को बचाने के e<f?f-e:e-fलिएMath.Abs()
पैट्रिक Huizinga

4

पर्ल, 43 बाइट्स

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

दो बाइट्स के रूप में शेबंग की गिनती।

नमूना उपयोग:

$ 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,32एक ड्रॉप-इन के लिए है ip2long। पर्ल चरित्र शाब्दिकों को एक के साथ उपसर्ग के रूप में व्यक्त करने की अनुमति देता है v, उदाहरण v0के लिए अशक्त चार के लिए इस्तेमाल किया जा सकता है। ये भी एक साथ श्रृंखलित किया जा सकता है, उदाहरण के लिए v65.66.67.68ABCD। जब तीन या अधिक मान मौजूद होते हैं, तो प्रारंभिक vअनावश्यक होता है। vecसमारोह की व्याख्या एक पूर्णांक सरणी के रूप में एक स्ट्रिंग, प्रत्येक कोशिका बिट्स की निर्धारित संख्या (यहाँ, 32) है। unpack N,evalसमान रूप से भी काम किया होगा।

3

जावास्क्रिप्ट ईएस 6 - 68 बाइट्स

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

फ़ायरफ़ॉक्स के कंसोल (प्रेस F12) के साथ इसे आज़माएं।


आप का उपयोग किया जाना चाहिए alertया console.log। कंसोल आउटपुट सस्ता है।
'20

4
@nderscore, console.logऔर सीधे आउटपुट के बीच कोई अंतर नहीं है । यह कोड-गोल्फ है, यह क्लीन कोड के बारे में नहीं है।
माइकल एम।

इस मेटा पोस्ट का सबसे अधिक उत्तर दिया गया है: आईओ के लिए जावास्क्रिप्ट मानक । यह साफ कोड की बात नहीं है। यह वास्तव में कुछ भी नहीं outputting की बात है।
nderscore

@DigitalTrauma, यह ऑपरेटर पूर्वता के कारण काम नहीं करेगा । (इसके अलावा बिटवाइस शिफ्ट)
माइकल एम।

2

पायथन 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. बताएं कि कोड कैसे काम करता है?
ईसैक

2

पर्ल, 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$ 

यह पहले से ही प्राइमो के पर्ल प्रोग्राम से अधिक लंबा है , इसलिए बहुत दिलचस्प नहीं है।

अप्रचलित आईपी पता प्रारूप के लिए पर्ल, 119 बाइट्स

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

यह कार्यक्रम आईपी पते के लिए अप्रचलित प्रारूप को स्वीकार करता है! इसमें 1, 2, या 3 भागों के साथ या हेक्साडेसिमल या ऑक्टल भागों के साथ पते शामिल हैं। Inet_addr (3) मैनुअल पेज का हवाला देते हुए ,

डॉट नोटेशन का उपयोग करके निर्दिष्ट मूल्य निम्नलिखित रूपों में से एक लेते हैं:

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

... जब तीन भाग का पता निर्दिष्ट किया जाता है, तो अंतिम भाग को 16-बिट मात्रा के रूप में समझा जाता है और नेटवर्क पते के सबसे दाईं ओर दो बाइट्स में रखा जाता है। ... जब एक दो भाग पते की आपूर्ति की जाती है, तो अंतिम भाग को 24-बिट मात्रा के रूप में व्याख्या किया जाता है और नेटवर्क पते के सबसे दाहिने तीन बाइट्स में रखा जाता है। ... जब केवल एक भाग दिया जाता है, तो मूल्य बिना किसी बाइट पुनर्व्यवस्था के सीधे नेटवर्क पते में संग्रहीत किया जाता है।

डॉट संकेतन में `` भागों '' के रूप में दिए गए सभी संख्याएँ दशमलव, अष्टक या हेक्साडेसिमल हो सकती हैं, जैसा कि सी भाषा में निर्दिष्ट किया गया है (अर्थात, एक अग्रणी 0x या 0X हेक्साडेसिमल का अर्थ है; एक प्रमुख 0 निहित अष्टक; अन्यथा, संख्या) है दशमलव के रूप में व्याख्या)।

अधिकांश कार्यक्रम अब इस अप्रचलित प्रारूप को स्वीकार नहीं करते हैं, लेकिन फिर ping 0177.1भी OpenBSD 5.5 में काम करते हैं।


तथ्य यह है कि आप बीएसडी का उपयोग कर रहे हैं, आईपी चीज की तुलना में अधिक आश्चर्यजनक है।
चरण

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/…
टाइटस

1

गणितज्ञ 9, 108 बाइट्स

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

सी # - 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

रूबी, 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

जे, 25 बाइट्स

छोड़ दिया और सही तर्क के रूप में बिंदीदार क्वाड आईपी तार लेता है।

>:@|@-&(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 बाइट्स

कॉफीस्क्रिप्ट उत्तर का अनुवाद।

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

0

जावास्क्रिप्ट ईएस 6, 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])

पुनश्च: मैं इसे थोड़ा बाद में अनुकूलित करने का प्रयास करूँगा।


0

लूआ, 153 बाइट्स

यह शर्म की बात है कि लुआ का विभाजन कार्य नहीं होता है, मुझे मेरा परिभाषित करना था!

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

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

यह ungolf और परीक्षण

-- 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.