주어진 범위에 몇 개의 IP 주소가 있습니까? 에서 영감을

에서 영감을 받다…

네트워킹-주어진 범위에 몇 개의 IP 주소가 있는지 어떻게 알 수 있습니까?

두 개의 문자열을 입력으로 사용하는 프로그램 또는 함수를 작성하십시오. 각 문자열은 표준 점 표기법으로 표현 된 IPv4 주소이며 두 개의 IP 주소 입력을 포함하여이 범위가 적용되는 IP 주소 수를 출력하거나 리턴합니다.

  • IP 주소를 구문 분석하도록 설계된 외부 코드, 라이브러리 또는 서비스를 사용해서는 안됩니다. (다른 문자열 처리 표준 라이브러리 함수도 허용됩니다.)
  • 모든 2 ^ 32 IP 주소가 동일합니다. 방송, 클래스 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.



답변

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.


답변

파이썬 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


답변

CJam-15

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

http://cjam.aditsu.net/ 에서 시도 하십시오

고마워 Dennis, 와우, 나는 내 언어를 최대한 활용하는 방법을 모른다 : p


답변

순수한 bash, 66 바이트

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

노트:

  • p점으로 구분 된 10 진수 IP 주소로 전달 되는 함수 를 정의하고 해당 주소의 16 진 표현을 출력합니다.
    • ${1//./ }을 대체하는 매개 변수 확장이다 .IP 주소가 전달이p()
    • printf대부분 자기 설명이다. 하나의 형식 지정자 %02x와 나머지 4 개의 인수가 있으므로 나머지 지정 인수마다 형식 지정자를 재사용하여 4 개의 8 진수 각각의 2 개의 16 진수를 효과적으로 연결합니다.
  • $[]산술 확장을 일으 킵니다. 기본 뺄셈을하고 변수에 대입합니다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
$


답변

파이썬 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 덕분에

Edit2 :LF 파일 끝에서 제거 (@Rusher 덕분) 및 초기화 map()비용으로 제거 reduce()(@ njzk2 덕분)


답변

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


답변

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

온라인으로 사용해보십시오 .