Ausführlicher IP-Bereichsgenerator

11

Die Aufgabe ist einfach, wenn zwei IP-Adressen vorhanden sind aund balle Adressen innerhalb dieses Bereichs ausgegeben werden.


Beispiele

Beispiel 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

Beispiel 2 (TIO schneidet dies ab, verwenden Sie beim Testen einen kleineren Bereich):

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

Ein- und Ausgabe

  • a < b mit anderen Worten:
    • Programmatisch definiert :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])
    • In Worten definiert: a ist immer niedriger als b(Sie müssen also das Subnetz erhöhen, um es zu erreichen b).
    • Nein, Sie müssen nicht damit umgehen a == b(wenn Sie dies tun, ein dickes Lob).
  • Die Ausgabe sollte in der Reihenfolge von "niedrigste" bis "höchste" erfolgen (siehe Beispiele).
  • Für diese Herausforderung lautet die gültige Syntax für eine IP : \d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}.
  • Sie müssen keine Nicht-IP-Adresseneingabe verarbeiten. Wenn es sich um eine unerwartete Eingabe handelt, können Fehler auftreten.
  • Die Ausgabe kann als Array oder als begrenzte Zeichenfolge erfolgen (unter Verwendung eines beliebigen Leerzeichens).

Gewinnen

  • Dies ist , niedrigste Byte-Anzahl gewinnt.
Magische Krakenurne
quelle
1
Sie haben "Ausgelassenes Muster" zwischen zB 123.0.200.255und 123.0.201.0, aber sind sie nicht sequentiell?
nmjcman101
@ nmjcman101 hat das zweimal gemacht, behoben.
Magic Octopus Urn

Antworten:

3

Pyth, 22

mj\.jd256}FmivMcd\.256

Probieren Sie es online aus .

               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 
Digitales Trauma
quelle
1
Dies führte zu einer Änderung von Pyth, die diesen Code in Zukunft verkürzen sollte. vMwird die Standardeinstellung für die vAnwendung auf eine Liste sein.
isaacg
@isaacg cool - danke, ich werde versuchen, mich das nächste Mal daran zu erinnern.
Digitales Trauma
3

Stapel, 623 Bytes

@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

Leider kann die 32-Bit-Arithmetik von Batch nicht alle IP-Adressen drucken, daher muss ich sie in Oktette aufteilen.

Neil
quelle
Ist das Entfernen der @echo offOption? Nicht, dass es einen großen Unterschied macht.
Digitales Trauma
@DigitalTrauma Ich denke, es ist nicht unbedingt notwendig, da das Echo immer zur Konsole geht und daher nicht Teil von STDOUT ist, aber es ist sehr ärgerlich, besonders bei langen Skripten wie diesem.
Neil
2

PHP, 71 Bytes

Ausgabe als Zeichenfolge

for($s=ip2long($argv[1]);$s<=ip2long($argv[2]);)echo long2ip($s++)," ";

Probieren Sie es online aus! oder Ausgabe als Array

print_r(array_map(long2ip,range(ip2long($argv[1]),ip2long($argv[2]))));

Probieren Sie es online aus!

Jörg Hülsermann
quelle
2

Gelee , 18 Bytes

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

Probieren Sie es online aus!

Die Ausgabe wird durch eine Reihe von Ziffern und Dezimalstellen angezeigt, wird jedoch intern als Liste von Zeichenfolgen gespeichert. Fügen Sie Yam Ende ein (+1 Byte) hinzu, um die Zeichenfolgen durch Zeilenumbrüche zu verbinden.

Wie es funktioniert

ṣ”.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.
fireflame241
quelle
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)

Diese Lösung ersetzt das Muster n .256 durch n + 1 .0 und ruft sich rekursiv auf, bis die beiden Parameter gleich sind.

Es wird '.256' an die anfängliche Eingabe angehängt, um den Ball ins Rollen zu bringen. slice(0,-2)wird dann verwendet, um die nachfolgende '.0' zu entfernen.

Beispiele:

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

Rick Hitchcock
quelle
1

Java (OpenJDK 8) ,339 314 282 Bytes

Golf:

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

Probieren Sie es online aus!

Schüchternes Beluga
quelle