特定の範囲にいくつのIPアドレスがありますか?


31

に触発さ...

ネットワーキング-特定の範囲にいくつのIPアドレスがあるかを調べるにはどうすればよいですか?

入力として2つの文字列を受け取り、それぞれが標準のドット表記法で表されたIPv4アドレスであるプログラムまたは関数を記述し、2つの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.

私はプログラマーにこの質問を見て、コードゴルフで質問することを考えていました(笑)。
ランチャー

3
これは、標準に従って不可能なIPアドレスについてのStackOverflowの質問だと思いました。
明唐

8
IPv4は少し過ぎていませんか?
ウゴレン

回答:


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
クリスジェスターヤング

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(".")))ずっと短いです
マイケルM.

5
@Michael提案をありがとう。私はそれを数分間使用し、それを見て、「その90%を書いていない」と考えました。だからロールバックしました。
レインボルト

@Michael a=lambda:の代わりに、def a():return 6つの文字節約
avall

@Rusherそれの107文字ではなく、106
avall

1
@avall:最終的なLFを数えていると思います。
デニス

8

CJam-15

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

で試してみてください http://cjam.aditsu.net/でください

デニス、ありがとう、私の言語を最大限に活用する方法がわからない:p


削除することで2バイトを節約することができます:ib整数にキャストするようです){r...}2*qS/{...}/
デニス14年

6

純粋なbash、66バイト

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

ノート:

  • pドット付き10進IPアドレスが渡される関数を定義し、そのアドレスの16進表現を出力します。
    • ${1//./ }置き換えパラメータ展開である. IPアドレスではに渡さp()
    • これprintfはほとんど自明です。形式指定子は1つと%02x残りの4つの引数しかないため、残りの各引数には形式指定子が再利用され、4つのオクテットのそれぞれの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
$ 

検出printfechoます。それらの一部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に感謝

Edit2:LFファイルの最後で削除され(@Rusherに感謝)、初期化子のmap()コストで削除reduce()(@ njzk2に感謝)


1
なぜf関数は外側でint()を必要とするのですか?
isaacg

1
まあ。
わから

マップを使用する代わりにintをreduceに入れることで2文字を獲得できます(,0reduce関数にパラメーターを追加する必要があるため、2つだけです)
njzk2

私はちょうどあなたのコードとほぼ同じものを書いたので、今はわざわざ送信しません。実際、私は3文字長くなっています!
-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
/代わりにを使用して1つの文字を保存できます%~
デニス

4

CoffeeScript- 949279、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
ロブ・W

あなたはに多くのスペースを失っているように感じますがMath.abs、これより短いものは思いつきません。 (z>0)*z||-z私が持っている最高のものです(同じ長さで、単一文字の入力が必要です)。それより賢いものはありますか?
アーロンデュフォー

このjavascriptバージョンは本当に役立ちます。これを1時間ほど探していました。ありがとう!
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バイト

これは私の初めてのゴルフです。ここには何もありません:

ゴルフ(旧):

$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

ゴルフをしていない:

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

アンゴルフ...

    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)です。基本的に、集約の各反復は既存の合計を取り、それを1オクテットだけ左にシフトしてから、次のオクテットを追加します。
ボブ

c*256代わりにを使用してキャラクターを保存できます(c<<8)
ボブ

@Bobよく見つけた。
billpg

あなたは置き換えることによって、さらに2つの文字を保存することができますe-fe<f?f-e:e-f、滴下Math.Abs()
パトリックHuizingaを

4

Perl、43バイト

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

シバングを2バイトとしてカウントします。

サンプル使用法:

$ 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。Perlでは、文字リテラルをv、接頭辞aを付けて表すv0ことができます。たとえば、ヌル文字に使用できます。これらは、たとえばv65.66.67.68→のように連結することもできABCDます。3つ以上の値が存在する場合、イニシャル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())

Firefoxのコンソール(F12を押します)で試してください。


alertまたはを使用する必要がありますconsole.log。コンソール出力は安価です。
nderscore

4
@nderscore、console.log直接出力とまったく違いはありません。これはコードゴルフです。コードをきれいにすることではありません。
マイケルM.

このメタ投稿への最も賛成の答えは同意しません:IOのJavaScript標準。きれいなコードの問題ではありません。実際に何も出力しないという問題です。
アンダースコア

@DigitalTrauma、演算子の優先順位のために機能しません。(加算対ビットシフト)
マイケル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$ 

これはすでにprimoのPerlプログラムよりも長いので、あまり面白くありません。

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つの部分、または16進数または8進数の部分を持つアドレスが含まれます。引用inet_addr(3)のマニュアルページを、

ドット表記を使用して指定される値は、次のいずれかの形式を取ります。

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

... 3つの部分のアドレスが指定されている場合、最後の部分は16ビット量として解釈され、ネットワークアドレスの右端の2バイトに配置されます。... 2部構成のアドレスを指定すると、最後の部分は24ビット量として解釈され、ネットワークアドレスの右端の3バイトに配置されます。... 1つの部分のみが指定されている場合、値はバイトの再配置なしでネットワークアドレスに直接格納されます。

ドット表記の「部分」として提供されるすべての数値は、C言語で指定されているように、10進数、8進数、または16進数です(つまり、先頭の0xまたは0Xは16進数を意味し、先頭の0は8進数を意味し、そうでない場合は数字10進数として解釈されます)。

ほとんどのプログラムはこの古い形式を受け入れませんが、 ping 0177.1ましたが、OpenBSD 5.5でも機能していました。


BSDを使用しているという事実は、IPのことよりも驚くべきことです。
フェーズ

2

PHP、138110バイト

<?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")でcharを保存できますsplit('\.',"$a.$b")
MrLore 14年

私はより多くのこれらのゴルフのステップで代わりに関数のプログラムおよび8でない110セーブ9バイト、109カウント:sandbox.onlinephpfunctions.com/code/...
タイタス

1

Mathematica 9、108バイト

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

ゴルフをしていない:

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

ルビー、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)

非ゴルフ

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バイト、言語のポストデートチャレンジ

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

ungolf it and test

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