Czasami, gdy wpisuję adres IPv4, wszystkie liczby są prawidłowe, ale zapominam o wpisaniu jednego lub więcej kropek. Chciałbym mieć program (lub funkcję), który pobiera mój uszkodzony adres IPv4 i wyświetla wszystkie możliwe prawidłowe miejsca brakujących kropek.
Wkład
Dane wejściowe zawsze będą ciągiem będącym transformacją prawidłowego adresu IPv4 (patrz szczegółowe informacje poniżej). Zawsze będzie transformowany wyłącznie przez wyeliminowanie jednego lub więcej znaków z okresu.
Przesłanie nie wymaga obsługi danych wejściowych poza tym formatem.
Wydajność
Zbiór lub lista ciągów reprezentujących wszystkie prawidłowe adresy IPv4, które nie mogą być tworzone w określonym porządku ani formacie, które można utworzyć z danych wejściowych poprzez wstawienie do nich znaków kropki.
- Dane wyjściowe mogą być listą natywną dla języka lub innym uporządkowanym lub nieuporządkowanym typem kolekcji.
- Alternatywnie może to być ciąg znaków adresu IPv4 ograniczony w jakiś wyraźny sposób.
- Jeśli używasz separatora jednoznakowego do rozgraniczenia łańcucha, kropki i cyfry nie są dozwolone jako separator jednoznakowy. Zdaję sobie sprawę, że w przeciwieństwie do liczb, kropki jako separatory nie są niejednoznaczne (ponieważ co czwarty kropka koniecznie byłby separatorem), ale ze względu na czytelność, nie pozwalam na to.
Format adresu IPv4
Chociaż adresy IPv4 są tak naprawdę tylko sekwencją czterech binarnych oktetów, w tym wyzwaniu zastosowano ograniczony format dziesiętny z kropkami.
- Adres IPv4 to cztery wartości dziesiętne oddzielone trzema kropkami.
- Każdy z czterech wartości mieszczą się w przedziale
0
do255
włącznie. - Zera wiodące nie są dozwolone w żadnej wartości liczbowej. (Standalone jedna postać
0
jest dozwolona; każda inna liczba zaczynając od zera nie jest:052
,00
, itd.)
Przypadki testowe
Dane wejściowe znajdują się w pierwszym wierszu, dane wyjściowe w drugim wierszu (tutaj mają strukturę rozdzieloną przecinkami listy ciągów cytowanych, oddzielonych przecinkami, otoczoną przez [
]
, ale można użyć dowolnego rozsądnego formatu lub struktury, jak określono powyżej). Niektóre przykłady zawierają uwagi w trzecim wierszu w celu podkreślenia zastosowania określonej reguły.
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"]
(Te przykłady zrobiłem ręcznie, więc proszę powiadamiaj mnie o wszelkich znalezionych błędach).
źródło
Odpowiedzi:
Pyth, 24 bajty
Wypróbuj online
Jak to działa
Pyth, 17 bajtów, bardzo wolno
Ostrzeżenie. Nie biegać. Wymaga około 553 GiB pamięci RAM.
Jak to działa
źródło
1.9.2.1.6.8.1.2
i19.2.1.6.8.1.2
itp? (Ale wtedy oczywiście wszystkie nieprawidłowe są odfiltrowywane)C (gcc / linux),
125121 bajtówZapętla wszystkie możliwe adresy IPv4 i dokonuje niestandardowego porównania, które pomija dodatkowe kropki w wygenerowanym adresie IP (ale nie w głównym adresie porównania), aby zdecydować, czy wydrukować, czy nie. Bardzo wolno, ale powinien zakończyć się w ciągu 1 godziny na rozsądnym komputerze .
źródło
i=0;
.i
znów jest 0 ...Perl 5, 91 bajtów
Program oczekuje pojedynczego wiersza jednego wejścia i wyświetla listę kandydatów rozdzielaną spacjami.
Wyjaśnienie
Program wykorzystuje funkcję cofania wyrażenia regularnego w celu zapętlenia wszystkich możliwości utworzenia prawidłowego adresu IPv4 z ciągu wejściowego.
Wyrażenie regularne IPv4 z opcjonalnym
.
, nic tu nie warte uwagi.Wyrażenie oceny kodu, które drukuje zawartość grup przechwytujących.
Spraw, aby mecz się nie powiódł i wymuś powrót.
Przykładowy przebieg
źródło
JavaScript (ES6),
147141135 bajtówEdycja: zapisano 6 bajtów dzięki @apsillers. Zaoszczędzono kolejne 6 bajtów, kopiując test poprawności @ YOU.
źródło
.
które rzuciłyby test, ale myślę, że ta wersja jest OK.0
ma$
. (Brakuje również^
, więc dziękuję za zwrócenie na to uwagi.)splice
tak nie działa, modyfikuje tablicę i zwraca wszelkie usunięte elementy.Python 3, 232 bajty
Całkiem proste: umieszczamy kropki wszędzie i drukujemy, jeśli adres IP z umieszczonymi kropkami jest prawidłowy. Sprawdzamy ważność adresów IP za pomocą (ab)
ipaddress.ip_address
, co powoduje wyjątek, jeśli dane wejściowe nie są prawidłowym adresem IP. Wyzwanie określa pewne dodatkowe reguły, któreip_address
nie są obsługiwane (a mianowicie, że nie mogą być zerami wiodącymi), więc sprawdzamy je również za pomocą wyrażeń regularnych, a następnie drukujemy.Wysyła każde rozwiązanie do nowej linii, zmieszanej z dowolną liczbą pustych linii.
Przykładowy przebieg:
Oto moje starsze 248-bajtowe rozwiązanie Python 2. Poziomy tiret drugie i trzecie to odpowiednio
\t
(tabulator surowy) i\t
(tabulator raw plus spacja). Gra Markdown działa bardzo źle, więc karty zostały zastąpione dwoma spacjami.
Wymaga wprowadzania otoczonego cudzysłowami (np
"123.456.789"
.). Wysyła każdy wygenerowany adres IP w nowej linii.Zaoszczędź 9 bajtów dzięki @grawity!
źródło
ipaddress.ip_address()
będzie krótszy niż aton + sprawdzenie ręczne?Brachylog , 110 bajtów
Wypróbuj online!
źródło
Python 3,
262260 bajtówŻadnych bibliotek, ale późno i dłużej, być może brakuje mi oczywistych technik gry w golfa.
Wyniki mimo wszystko.
źródło
or
klauzuli?