Problem:

A: IPアドレス (Internet Protocol Address)

問題

数字列が 1 つ与えられるので、IPv4のIPアドレスとして有効な区切り方の個数を求めよ。
ただし、IPv4のIPアドレスとして有効な区切り方は以下の通りである。

数字列は 4 つに区切られ、区切られた各列について以下をすべて満たす。

空列でない。

10 進数として読むと 0 以上 255 以下の整数である。

その数が 0 ならば、その列は 0 である（00 などは認められない）。

その数が 0 でないならば、先頭の数字は 0 でない（01 などは認められない）。

入力形式

S

制約

4 \leq |S| \leq 12

S に含まれる文字は数字のみである。

出力形式

有効な区切り方の通り数を一行に出力せよ。

入力例1

123456789

出力例1

1

有効な区切り方は 123.45.67.89 の 1 通りである。

入力例2

768426

出力例2

6



Sample input:
123456789


Sample output:
1

Submission status: Accepted

Solution code:
def check(num):
  if num == "":return False
  if num[0] == "0":return num == "0"
  return 0 <= int(num) <= 255
s = input()
ans = 0
for i in range(1, 4):
  for j in range(1, 4):
    for k in range(1, 4):
      n1 = s[:i]
      n2 = s[i:i+j]
      n3 = s[i+j:i+j+k]
      n4 = s[i+j+k:]
      if check(n1) and check(n2) and check(n3) and check(n4):ans += 1
print(ans)

Submission status: Accepted

Solution code:
import itertools
S = input()

ans = 0
for ptn in itertools.combinations(range(1,len(S)), 3):
    ai,bi,ci = ptn
    a = S[:ai]
    b = S[ai:bi]
    c = S[bi:ci]
    d = S[ci:]
    if a[0] == '0' and a != '0': continue
    if b[0] == '0' and b != '0': continue
    if c[0] == '0' and c != '0': continue
    if d[0] == '0' and d != '0': continue
    if not 0 <= int(a) <= 255: continue
    if not 0 <= int(b) <= 255: continue
    if not 0 <= int(c) <= 255: continue
    if not 0 <= int(d) <= 255: continue

    ans += 1
print(ans)

Submission status: Accepted

Solution code:
from itertools import combinations

S = raw_input()
N = len(S)
cnt = 0

for a, b, c in combinations(range(1, N), 3):
    ok = True
    A = S[:a]
    B = S[a:b]
    C = S[b:c]
    D = S[c:]
    for x in [A, B, C, D]:
        y = int(x)
        if y > 255:
            ok = False
        if y == 0 and len(x) != 1:
            ok = False
        if y != 0 and x[0] == '0':
            ok = False
    cnt += ok

print cnt