상세 IP 범위 생성기


11

이 작업은 두 개의 IP adresses 주어, 간단 a하고 b그 범위 내에서 출력 모든 주소를.


예 # 1 :

f(a = 192.168.0.1, b = 192.168.0.4) 
    192.168.0.1
    192.168.0.2
    192.168.0.3
    192.168.0.4

예제 # 2 (TIO는이를 자르고 테스트 할 때 더 작은 범위를 사용합니다) :

f (a = 123.0.200.0, b = 124.0.0.0)
    123.0.200.0
    123.0.200.1
    ...            # Omitted pattern 
    123.0.200.255
    123.0.201.0
    ...            # Omitted pattern
    123.0.201.255
    ...            # Omitted pattern
    123.0.255.255
    123.1.0.0
    ...            # Omitted pattern
    123.255.255.255
    124.0.0.0

입력과 출력

  • a < b 다시 말해:
    • 프로그래밍 방식으로 정의 :a[0] < b[0] || (a[0] == b[0] && a[1] < b[1]) || (a[0:1] == b[0:1] && a[2] < b[2]) || (a[0:2] == b[0:2] && a[3] < b[3])
    • 단어로 정의 됨 : a 항상보다 낮습니다 b(에 도달하려면 서브넷을 늘려야합니다 b).
    • 아니, 당신 처리 할 필요가 없습니다a == b (그렇다면 kudos).
  • 출력은 "가장 낮음"에서 "가장 높음"까지 순서대로 표시되어야합니다 (예 참조).
  • 이 문제에 대한 유효한 IP 구문은 다음과 같습니다 \d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}.
  • IP가 아닌 주소 입력을 처리 할 필요가 없습니다. 예기치 않은 입력 인 경우 오류가 발생할 수 있습니다.
  • 출력은 배열 또는 공백 문자를 사용하여 구분 된 문자열 일 수 있습니다.

승리

  • 이것은 , 가장 낮은 바이트 수의 승리입니다.

1
eg 123.0.200.255와 사이에 "생략 된 패턴"이 123.0.201.0있지만 순차적이지 않습니까?
nmjcman101 2016 년

@ nmjcman101은 두 번 수정했습니다.
매직 문어 Urn

답변:


3

피스, 22

mj\.jd256}FmivMcd\.256

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

               cd\.       # split string by "."
             vM           # eval list (convert strings to integers)
            i      256    # convert list of base256 digits to integer
           m          Q   # map the above over implicit input list
         }F               # inclusive range
    jd256                 # convert to list of base256 digits
 j\.                      # join by "." 
m                         # map over inclusive range 

1
이것은 미래에 그러한 코드를 더 짧게 만들 Pyth의 변화에 ​​영감을 주었다. 목록에 적용 할 때 vM의 기본값이 v됩니다.
isaacg 2016

@isaacg cool-고마워, 나는 다음에 그것을 기억하려고 노력할 것이다.
디지털 외상

3

배치, 623 바이트

@echo off
set s=%1.%2
call:c %s:.= %
exit/b
:c
if %1==%5 goto d
call:d %1 %2 %3 %4 %1 255 255 255
set/al=%1+1,u=%5-1
for /l %%i in (%l%,1,%u%)do call:d %%i 0 0 0 %%i 255 255 255
call:d %5 0 0 0 %5 %6 %7 %8
exit/b
:d
if %2==%6 goto e
call:e %1 %2 %3 %4 %1 %2 255 255
set/al=%2+1,u=%6-1
for /l %%j in (%l%,1,%u%)do call:e %1 %%j 0 0 %5 %%j 255 255
call:e %5 %6 0 0 %5 %6 %7 %8
exit/b
:e
if %3==%7 goto f
call:f %1 %2 %3 %4 %1 %2 %3 255
set/al=%3+1,u=%7-1
for /l %%k in (%l%,1,%u%)do call:e %1 %2 %%k 0 %5 %6 %%k 255
call:e %5 %6 %7 0 %5 %6 %7 %8
exit/b
:f
for /l %%l in (%4,1,%8)do echo %1.%2.%3.%%l

불행히도 Batch의 32 비트 산술은 모든 IP 주소를 인쇄 할 수 없으므로 8 진수로 나누어야합니다.


@echo off옵션을 제거하고 있습니까? 그것이 큰 차이를 만드는 것은 아닙니다.
디지털 외상

@DigitalTrauma 에코가 항상 콘솔에 들어가므로 STDOUT의 일부가 아니기 때문에 엄격하게 필요하지는 않지만 특히이 스크립트와 같은 긴 스크립트에서는 매우 성가시다.
Neil



2

젤리 , 18 바이트

ṣ”.V€ḅ⁹µ€r/b⁹j”.$€

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

결과는 자릿수와 십진수로 표시되지만 내부적으로 문자열 목록으로 저장됩니다. Y줄 바꿈으로 문자열을 결합하려면 끝에 (+1 바이트)를 추가하십시오 .

작동 원리

ṣ”.V€ḅ⁹µ€r/b⁹j”.$€ - main link, input is a list of addresses which are strings
       µ€          - for each address string,
ṣ”.                  - split on periods
   V€                - eval each element in the list (convert strings to numbers)
     ḅ⁹              - transform from base 256 to integer (⁹ is 256)
         r/        - take the inclusive range
           b⁹      - convert each element in the range from integer to base 256
             j”.$€ - join each address with periods.

2

자바 스크립트 (ES6), 104 바이트

g=s=>s.replace(/(\d+)\.256/,(_,n)=>++n+'.0')
f=(a,b)=>a==b?a:a+`
`+f(g(g(g(g(a+'.256').slice(0,-2)))),b)

이 솔루션은 패턴 n .256을 n + 1.0으로 대체하며 두 매개 변수가 같을 때까지 재귀 적으로 호출합니다.

볼 롤링을 얻기 위해 초기 입력에 '.256'을 추가합니다. slice(0,-2)그런 다음 후행 '.0'을 제거하는 데 사용됩니다.

예 :

g=s=>s.replace(/(\d+)\.256/,(_,n)=>++n+'.0')
f=(a,b)=>a==b?a:a+`
`+f(g(g(g(g(a+'.256').slice(0,-2)))),b)

console.log('192.168.0.1 ... 192.168.0.4');
console.log(f('192.168.0.1', '192.168.0.4'));

console.log('123.255.255.0 ... 124.0.3.0');
console.log(f('123.255.255.0', '124.0.3.0'));

console.log('192.1.1.1 ... 192.1.1.1 ... kudos');
console.log(f('192.1.1.1', '192.1.1.1'));


1

자바 (오픈 JDK 8) ,339 314 282 바이트

골프 :

long f(String i)throws Exception{return java.nio.ByteBuffer.wrap(java.net.InetAddress.getByName(i).getAddress()).getInt()&(1L<<32)-1;}void g(String[] a)throws Exception{for(long l=f(a[0]),m=255;l<=f(a[1]);)System.out.println(((l>>24)&m)+"."+((l>>16)&m)+"."+((l>>8)&m)+"."+(l++&m));}

언 골프 드 :

long ipToLong(String ip) throws Exception {
    return java.nio.ByteBuffer.wrap(java.net.InetAddress.getByName(ip).getAddress()).getInt() & (1L << 32) - 1;
}

void printRange(String[] ips) throws Exception {
    for (long ip = ipToLong(ips[0]), m = 255; ip <= ipToLong(ips[1]);)
        System.out.println(((ip >> 24) & m) + "." + ((ip >> 16) & m) + "." + ((ip >> 8) & m) + "." + (ip++ & m));
}

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.