IPv4 주소의 누락 된 기간 수정


37

때로는 IPv4 주소를 입력 할 때 모든 숫자가 올바르게 표시되지만 하나 이상의 마침표를 입력하는 것을 잊어 버립니다. 깨진 IPv4 주소를 사용하여 누락 된 기간의 모든 유효한 배치를 출력하는 프로그램 (또는 기능)을 갖고 싶습니다.

입력

입력은 항상 유효한 IPv4 주소의 변환 인 문자열입니다 (아래 세부 사항 참조). 하나 이상의 마침표 문자를 제거하여 항상 변형되었을 것입니다.

제출은이 형식 이외의 입력을 처리 할 필요가 없습니다.

산출

마침표 문자를 입력에 삽입하여 입력에서 만들 수있는 모든 유효한 IPv4 주소를 나타내는 문자열의 특정 순서 나 형식이없는 문자열 모음 또는 목록입니다.

  • 출력은 언어 고유 목록 또는 다른 순서가 있거나 비 정렬 된 콜렉션 유형일 수 있습니다.
  • 또는 명확한 방식으로 구분 된 IPv4 주소의 문자열 시퀀스 일 수 있습니다.
    • 단일 문자 구분 기호를 사용하여 문자열을 구분하는 경우 마침표와 숫자는 해당 단일 문자 구분 기호로 사용할 수 없습니다. 나는 숫자와 달리 구분 기호로서의 기간이 모호 하지는 않지만 (매 4 번째 기간은 반드시 구분 문자이므로) 가독성을 위해 허용하지 않는다는 것을 알고 있습니다.

IPv4 주소 형식

IPv4 주소는 실제로 4 개의 2 진수 8 진수 시퀀스 일 뿐이지 만이 문제는 제한된 점으로 구분 된 10 진수 형식을 사용합니다.

  • IPv4 주소는 3 개의 마침표로 구분 된 4 개의 10 진수 값입니다.
  • 네 가지 값 각각의 범위는 0~ 255을 포함합니다.
  • 숫자 값 에는 선행 0이 허용되지 않습니다 . (독립 한 문자가 0허용되는 임의의 다른 개수가 0으로 시작되는 것은 아니다 : 052, 00등)

테스트 사례

입력은 첫 번째 행에, 두 번째 행에 출력됩니다 (여기서는 쉼표로 구분되고 쉼표로 구분되고 쉼표로 구분 [ ]되지만 위에 지정된대로 적절한 형식 또는 구조를 사용할 수 있음). 일부 예에는 특정 규칙의 적용을 강조하기 위해 세 번째 줄에 메모가 있습니다.

192.168.1234
["192.168.1.234", "192.168.12.34", "192.168.123.4"]

192.1681234
["192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]
(Note: 192.1681.2.34 (etc.) is illegal because 1681 is greater than 255)

1921681.234
["19.216.81.234", "192.16.81.234", "192.168.1.234"]

1921681234
["19.216.81.234", "192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]

192.168.1204
["192.168.1.204", "192.168.120.4"]
(Note: 192.168.12.04 is illegal because of leading zero)

192.168.123
["1.92.168.123", "19.2.168.123", "192.1.68.123", "192.16.8.123", "192.168.1.23", "192.168.12.3"]

192.168.256
["192.168.2.56", "192.168.25.6"]
(Note: Any combination that would leave 256 intact is illegal)

120345
["1.20.3.45", "1.20.34.5", "1.203.4.5", "12.0.3.45", "12.0.34.5", "120.3.4.5"]
(Note: 12.03.4.5 (etc.) is illegal due to leading zero.)

012345
["0.1.23.45", "0.1.234.5", "0.12.3.45", "0.12.34.5", "0.123.4.5"]
(Note: the first segment must be 0, because `01` or `012` would be illegal.)

000123
["0.0.0.123"]

(이 예제를 직접 작성 했으므로 찾을 수있는 실수를 알려주십시오.)


출력 순서가 중요합니까?
당신

@YOU No : " 특별한 순서 나 형식이없는 컬렉션 또는 목록 ... "
apsillers

선행 0은 허용되지 않습니다 . 입력에도 적용됩니까?
Luis Mendo

3
"000125"는 하나의 올바른 솔루션 만 반환해야합니다 ... 0.0.0.125?
Keeta

2
@Keeta 정확히 맞습니다. (방금 테스트 케이스로 추가했습니다.)
apsillers

답변:


9

Pyth, 24 바이트

f&q4lJcT\.!-J`M256jL\../

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

작동 원리

                      ./Q   all partitions of input
                  jL\.      join each on .
f                           filter for results T such that:
      cT\.                    split T on .
     J                        assign to J
    l                         length
  q4                          equals 4
 &                            … and:
           -J`M256              J minus the list of representations of [0, …, 255]
          !                     is false (empty)

Pyth, 17 바이트, 매우 느림

@FjLL\.,^U256 4./

경고. 실행되지 않습니다. 약 553GiB의 RAM이 필요합니다.

작동 원리

       ,             two-element list of:
        ^U256 4        all four-element lists of [0, …, 255]
               ./Q     all partitions of input
  jLL\.              join each element of both on .
@F                   fold intersection

좋은! 내 자신의 이해를 위해 "입력의 모든 파티션"은 입력을 분할하는 모든 가능한 방법을 의미합니다. 당신은 모든 가능한 분할을 한 후 기간과 분할에 다시 가입, 그래서 당신은 같은 후보자의 부하와 끝까지 그래서 1.9.2.1.6.8.1.219.2.1.6.8.1.2등? (그러나 분명히 모든 유효하지 않은 것들이 걸러지게됩니다)
apsillers

@apsillers 맞습니다.
Anders Kaseorg

16

C (GCC / 리눅스) 125 121 바이트

i;f(char*a){do{char*y=a,s[99],*x=inet_ntop(2,&i,s,99);for(;*x&&!(*x^*y&&*x^46);++x)y+=*x==*y;*x|*y||puts(s);}while(++i);}

가능한 모든 IPv4 주소를 반복 하고 생성 된 IP 주소 (주 비교 주소는 아님)의 추가 점을 건너 뛰어 인쇄할지 여부를 결정하는 사용자 지정 비교를 수행합니다. 매우 느리지 만 합리적인 PC에서 1 시간 이내에 완료되어야합니다 .


를 제거 할 수 있습니다 i=0;.
betseg

@ReleasingHeliumNuclei 난 (함수가 다시 사용할 수 있어야합니다)하지 수 있다고 생각하지만, 지금은 실현이 함수는 이후에 i다시 ... 0
orlp

6

펄 5, 91 바이트

<>=~/^(([1-9]?|1\d|2[0-4])\d|25[0-5])\.?((?1))\.?((?1))\.?((?1))$(?{print"$1.$3.$4.$5 "})^/

이 프로그램은 단일 입력의 단일 라인을 예상하고 공백으로 구분 된 후보 목록을 출력합니다.

설명

이 프로그램은 정규식의 역 추적 기능을 활용하여 입력 문자열에서 유효한 IPv4 주소를 형성하는 모든 가능성을 반복합니다.

^(([1-9]?|1\d|2[0-4])\d|25[0-5])\.?((?1))\.?((?1))\.?((?1))$

선택 사항 .인 IPv4 정규식은 여기에 유의하지 않습니다.

(?{print"$1.$3.$4.$5 "})

캡처 그룹의 내용을 인쇄하는 코드 평가 표현식입니다.

^

경기가 실패하고 역 추적을 강요하십시오.

예제 실행

$ echo "012345" | perl G89503.pl
0.12.34.5 0.12.3.45 0.1.23.45 0.1.234.5 0.123.4.5

5

자바 스크립트 (ES6), 147 (141) 135 바이트

f=(s,n=0)=>(a=s.split`.`)[3]?a.every(s=>s==`0`|s[0]>0&s<256)?s+' ':'':[...s].map((_,i)=>i>n?f(s.slice(0,i)+`.`+s.slice(i),i):``).join``
<input placeholder=Input oninput=o.textContent=f(this.value)><div id=o style=font-family:monospace;width:1em>Output

편집 : @apsillers 덕분에 6 바이트를 절약했습니다. @YOU의 유효성 테스트를 복사하여 6 바이트를 더 절약했습니다.


[1-9] | 0과 [0-9] 또는 \ d 사이에 차이가 있습니까?
당신

@apsillers Ah 예, 이전 버전의 코드는 후행 .을 생성 하여 테스트를 던질 수 있지만이 버전은 괜찮습니다.
Neil

@YOU는 중요한 비트는이 때문이다 0있다 $. (또한 누락되었습니다 ^. 관심을 가져 주셔서 감사합니다.)
Neil

@apsillers 슬프게도 splice그렇게 작동하지 않습니다. 배열을 수정하고 제거 된 요소를 반환합니다.
Neil

4

파이썬 3, 232 바이트

import re,itertools as t,ipaddress as k
R=range
i=input()
for d in R(5):
 for p in t.combinations(R(len(i)),d):
  n=i;o=0
  for a in p:n=n[:a+o]+'.'+n[a+o:];o+=1
  try:k.ip_address(n);print(n*(not re.search(r'\D?0\d',n)))
  except:0

매우 간단합니다 : 우리는 모든 곳에 기간을두고 기간이 지정된 IP 주소가 유효한 경우 인쇄합니다. (ab) using을 사용하여 IP 주소의 유효성을 검사합니다 ipaddress.ip_address. 입력이 유효한 IP 주소가 아닌 경우 예외가 발생합니다. 이 과제는 ip_address처리하지 않는 몇 가지 추가 규칙 (즉, 선행 0이 없음)을 정의하므로 정규식으로 규칙을 확인한 다음 인쇄합니다.

임의의 수의 빈 줄과 혼합하여 각 솔루션을 새 줄에 출력합니다.

예제 실행 :

$ echo 012345 | python fixip.py
0.1.23.45
0.1.234.5
0.12.3.45
0.12.34.5
0.123.4.5





$ echo 000123 | python fixip.py
0.0.0.123








_

여기에 이전의 248 바이트 Python 2 솔루션이 있습니다. 두 번째 및 세 번째 들여 쓰기 수준은 각각 \t(원시 탭) 및 \t (원시 탭 + 공백)입니다. 이것은 Markdown과 함께 매우 잘못 재생 되므로 탭이 두 개의 공백으로 대체되었습니다.

import socket,re,itertools as t
R=range
i=input()
for d in R(5):
 for p in t.combinations(R(len(i)),d):
  n=i;o=0
  for a in p:n=n[:a+o]+'.'+n[a+o:];o+=1
  try:
   socket.inet_aton(n)
   if n.count('.')==3and not re.search(r'\D?0\d',n):print n
  except:0

따옴표로 묶은 입력이 필요합니다 (예 :) "123.456.789". 생성 된 각 IP 주소를 새 줄에 출력합니다.

@grawity 덕분에 9 바이트가 절약되었습니다!


1
시겠습니까 ipaddress.ip_address()+ 수동 검사 ATON보다 짧을 수?
grawity


2

파이썬 3, 262260 바이트

p,l,L,T=set(),-1,len,tuple
while l<L(p):l=L(p);p|={T(z[:i]+(y[:j],y[j:])+z[i+1:])for z in set(p)or[T(input().split("."))]for i,y in enumerate(z)for j in range(1,L(y))}
print(['.'.join(x)for x in p if L(x)==4and all(y=='0'or y[0]!='0'and int(y)<256for y in x)])

사용 된 라이브러리는 없지만 늦게, 더 긴 골프 기술이 누락되었을 수 있습니다.

어쨌든 결과.

for x in 192.168.1234 192.1681234 1921681.234 1921681234 192.168.1204 192.168.123 192.168.256 120345 012345 000123; do
echo $x | python3 ipv4.py
done;

['192.168.123.4', '192.168.1.234', '192.168.12.34']
['192.16.81.234', '192.168.1.234', '192.168.123.4', '192.168.12.34']
['19.216.81.234', '192.168.1.234', '192.16.81.234']
['19.216.81.234', '192.168.123.4', '192.168.12.34', '192.16.81.234', '192.168.1.234']
['192.168.1.204', '192.168.120.4']
['192.16.8.123', '19.2.168.123', '1.92.168.123', '192.168.1.23', '192.168.12.3', '192.1.68.123']
['192.168.25.6', '192.168.2.56']
['1.20.3.45', '1.203.4.5', '12.0.34.5', '120.3.4.5', '1.20.34.5', '12.0.3.45']
['0.1.23.45', '0.12.3.45', '0.12.34.5', '0.123.4.5', '0.1.234.5']
['0.0.0.123']

1
나는 당신의 유효성 테스트를 복사 할 것이라고 생각하고 or조항 주위에 괄호가 필요한지 궁금합니다 .
Neil

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