Сколько IP-адресов в данном диапазоне?


31

Вдохновленный...

Сеть - Как я могу определить, сколько 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.

Я видел этот вопрос на программистов, и думал о том, чтобы спросить его о коде гольф лол.
Cruncher

3
Я думал, что это вопрос StackOverflow о том, какие IP-адреса невозможны в соответствии со стандартами.
Мин-Тан

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(".")))намного короче
Майкл М.

5
@ Майкл Спасибо за предложение. Я использовал его в течение нескольких минут, затем посмотрел на него и подумал: «Я не написал 90% этого». поэтому я откатился назад.
Рейнболт

@ Майкл a=lambda:вместо того, чтобы def a():return сохранять 6 символов
avall

@Rusher Это 107 символов, а не 106
все

1
@avall: я полагаю, вы рассчитываете окончательный LF.
Деннис

8

CJam - 15

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

Попробуйте это на http://cjam.aditsu.net/

Спасибо, Деннис, вау, я не знаю, как получить максимум от моего языка: p


Вы можете сохранить два байта, исключив :i( bкажется, что приведен к целому числу) и один, используя {r...}2*вместоqS/{...}/
Деннис

6

Чистый bash, 66 байт

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

Заметки:

  • Определяет функцию p, которой передается точечный десятичный IP-адрес, и выводит шестнадцатеричное представление этого адреса:
    • ${1//./ }является расширением параметра , который заменяет .с в IP - адресе передаетсяp()
    • Это printfв основном говорит само за себя. Поскольку существует только один спецификатор формата %02xи четыре оставшихся аргумента, спецификатор формата повторно используется для каждого оставшегося аргумента, эффективно объединяя 2 шестнадцатеричные цифры каждого из 4 октетов вместе
  • $[]вызывает арифметическое расширение. Мы делаем основное вычитание и присваиваем переменной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

Edit2: удалено LFв конце файла (благодаря @Rusher) и удалено map()за счет reduce()инициализатора (благодаря @ njzk2)


1
почему функция f нуждается в int () снаружи?
Исаак

1
Что ж. Я понятия не имел: D
Avall

Вы можете получить 2 символа, поместив int в уменьшение вместо использования карты (только 2, так как вам нужно добавить ,0параметр в функцию снижения)
njzk2

Я только что написал что-то, что почти точно ваш код, поэтому я не буду беспокоиться о представлении сейчас. На самом деле, мой на три символа длиннее!
Данмкардл

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, 7972

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это лучшее, что у меня есть (той же длины, и он требует ввода одного символа). У тебя есть что-нибудь умнее этого?
Аарон Дюфур

эта версия javascript действительно помогает мне, я искал это около часа. Благодарность!
эффект узла

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

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 после применения предложения Боба.)

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 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).
Боб

@Bob Хорошо замечен.
billpg

Вы можете сохранить больше двух символов, заменяя e-fс e<f?f-e:e-fи опускаяMath.Abs()
Патрик Хейзинга

4

Perl, 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. Perl позволяет символьным литералам быть выраженными в виде их порядкового префикса с v, например, v0может использоваться для нулевого символа. Они также могут быть связаны вместе, например v65.66.67.68ABCD. Когда присутствуют три или более значений, начальные значения 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
@nderscore, абсолютно никакой разницы между console.logпрямым выводом. Это код-гольф, речь не идет о чистом коде.
Майкл М.

Наиболее одобренный ответ на этот мета-пост не согласен: Стандарты JavaScript для ввода-вывода . Дело не в чистом коде. Дело в том, чтобы ничего не выводить.
nderscore

@DigitalTrauma, это не будет работать из-за приоритета оператора . (дополнение против побитового сдвига)
Майкл М.

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. Объясните, как работает код?
Исаак

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-битная величина и помещается в самые правые три байта сетевого адреса. ... Если задана только одна часть, значение сохраняется непосредственно в сетевом адресе без перестановки байтов.

Все числа, представленные как `` parts '' в точечной нотации, могут быть десятичными, восьмеричными или шестнадцатеричными, как указано в языке 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/…
Титус

1

Mathematica 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

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 байта

Жаль, что у Луа нет функции разделения, я должен был определить мою!

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.