Bộ tạo dải IP dài


11

Nhiệm vụ rất đơn giản, được cung cấp hai địa chỉ IP ab, xuất tất cả các địa chỉ trong phạm vi đó.


Ví dụ

Ví dụ 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

Ví dụ # 2 (TIO sẽ cắt ngắn phần này, sử dụng phạm vi nhỏ hơn khi kiểm tra):

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

Đầu vào và đầu ra

  • a < b nói cách khác:
    • Được xác định theo chương trình :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])
    • Defined in Words: a sẽ luôn thấp hơn b(vì vậy bạn sẽ phải tăng mạng con để tiếp cận b).
    • Không, bạn không phải xử lý a == b(nếu bạn làm thế, kudos).
  • Đầu ra phải theo thứ tự từ "thấp nhất" đến "cao nhất" (xem ví dụ).
  • Đối với thử thách này, cú pháp hợp lệ cho IP là : \d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}.
  • Bạn không phải xử lý đầu vào địa chỉ không phải IP, nếu đầu vào không mong muốn, bạn có thể gặp lỗi.
  • Đầu ra có thể là một mảng hoặc dưới dạng một chuỗi phân tách (sử dụng bất kỳ ký tự khoảng trắng nào).

Chiến thắng


1
Bạn có "Mô hình bị bỏ qua" giữa ví dụ 123.0.200.255123.0.201.0, nhưng chúng không tuần tự?
nmjcman101

@ nmjcman101 đã làm điều đó hai lần, cố định.
Bạch tuộc ma thuật Urn

Câu trả lời:


3

Bình thường, 22

mj\.jd256}FmivMcd\.256

Hãy thử trực tuyến .

               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
Điều này đã truyền cảm hứng cho một sự thay đổi đối với Pyth sẽ làm cho mã đó ngắn hơn trong tương lai. vMsẽ được mặc định vkhi áp dụng vào danh sách.
isaacg

@isaacg cool - cảm ơn, tôi sẽ cố nhớ điều đó cho lần sau.
Chấn thương kỹ thuật số

3

Hàng loạt, 623 byte

@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

Thật không may, số học 32 bit của Batch không thể in tất cả các địa chỉ IP, vì vậy tôi phải chia nó thành các octet.


Là loại bỏ @echo offmột tùy chọn? Không phải là nó làm cho một sự khác biệt rất lớn.
Chấn thương kỹ thuật số

@DigitalTrauma Tôi đoán nó không thực sự cần thiết vì tiếng vang luôn đi đến bàn điều khiển và do đó không phải là một phần của STDOUT nhưng nó rất khó chịu, đặc biệt là trên các tập lệnh dài như cái này.
Neil



2

Thạch , 18 byte

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

Hãy thử trực tuyến!

Đầu ra xuất hiện bằng một hỗn hợp các chữ số và số thập phân, nhưng được lưu trữ bên trong dưới dạng một danh sách các chuỗi. Nối a Yvào cuối (+1 byte) để nối các chuỗi theo dòng mới.

Làm thế nào nó hoạt động

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

JavaScript (ES6), 104 byte

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)

Giải pháp này thay thế mẫu n .256 bằng n + 1 .0 và nó tự gọi đệ quy cho đến khi hai tham số bằng nhau.

Nó gắn '0,256' vào đầu vào ban đầu để có được quả bóng lăn. slice(0,-2)sau đó được sử dụng để xóa dấu '.0'.

Ví dụ:

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

Java (OpenJDK 8) ,339 314 282 byte

Chơi gôn

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

Ung dung:

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.