Verbose IP Range Generator


11

งานง่าย ๆ โดยกำหนดที่อยู่ IP สองอัน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(ถ้าคุณทำเช่นนั้นรุ่งโรจน์)
  • ผลลัพธ์ควรอยู่ในลำดับจาก "ต่ำสุด" ถึง "สูงสุด" (ดูตัวอย่าง)
  • สำหรับความท้าทายนี้ไวยากรณ์ที่ถูกต้องสำหรับ IP \d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}เป็น:
  • คุณไม่จำเป็นต้องจัดการอินพุตที่ไม่ใช่ IP หากเป็นอินพุตที่ไม่คาดคิดคุณอาจผิดพลาด
  • ผลลัพธ์อาจเป็นอาร์เรย์หรือเป็นสตริงที่คั่นด้วย (ใช้อักขระช่องว่างใด ๆ )

การชนะ


1
คุณมี "รูปแบบที่ละเว้น" ระหว่างเช่น123.0.200.255และ123.0.201.0แต่ไม่ได้เรียงตามลำดับใช่หรือไม่
nmjcman101

@ nmjcman101 ทำอย่างนั้นสองครั้งคงที่
Magic Octopus Urn

คำตอบ:


3

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

@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

น่าเสียดายเลขคณิต 32 บิตของแบทช์ไม่สามารถพิมพ์ที่อยู่ IP ทั้งหมดได้ดังนั้นฉันต้องแยกมันออกเป็นออคเต็ต


กำลังเอา@echo offตัวเลือกออกหรือไม่ ไม่ใช่ว่ามันสร้างความแตกต่างอย่างมาก
บาดเจ็บทางดิจิตอล

@ DigitalTrauma ฉันคิดว่ามันไม่จำเป็นอย่างยิ่งเพราะเสียงก้องไปที่คอนโซลเสมอและไม่ได้เป็นส่วนหนึ่งของ STDOUT แต่มันน่ารำคาญมากโดยเฉพาะกับสคริปต์ที่ยาวเช่นนี้
Neil



2

เยลลี่ขนาด 18 ไบต์

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

ลองออนไลน์!

ผลลัพธ์จะปรากฏขึ้นโดยตัวเลขและทศนิยม แต่จะถูกเก็บไว้ภายในเป็นรายการของสตริง ผนวก a 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

JavaScript (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.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

Java (OpenJDK 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));}

Ungolfed:

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.