Aby uczcić rocznicę Światowego dnia IPv6 , Towarzystwo Internetowe opublikowało kampanię Wyłącz IPv4 6 czerwca 2014 r. Na jeden dzień .
Adresy IPv6 mogą być reprezentowane w swojej długiej formie jako osiem 16-bitowych wartości szesnastkowych oddzielonych dwukropkami. W zależności od adresu można je również skrócić, jak opisano w punkcie 2 sekcji 2.2 Tekstowa reprezentacja adresów RFC 3513 :
Aby ułatwić pisanie adresów zawierających bity zerowe, dostępna jest specjalna składnia do kompresji zer. Użycie „::” oznacza jedną lub więcej grup 16 bitów zer. Znak „::” może pojawić się tylko raz w adresie. Znak „::” może także służyć do kompresji zer wiodących lub końcowych w adresie.
Zgłoszenia do tego wyzwania będą dotyczyły programów, które akceptują dokładnie jeden adres IPv6 sformatowany w formacie długim lub skróconym i wyświetlą ten sam adres zarówno w formacie długim, jak i krótkim, w tej kolejności.
Dane wejściowe mogą pochodzić z argumentów wiersza polecenia, STDIN lub dowolnego innego źródła wejściowego, które odpowiada Twojemu językowi.
Biblioteki lub narzędzia specjalnie do analizowania adresów IPv6 są zakazane (np. Inet_ {ntop, pton} () ).
Jeśli adres wejściowy jest nieprawidłowy, dane wyjściowe będą puste (lub zostanie wyświetlony odpowiedni komunikat o błędzie wskazujący, że adres jest nieprawidłowy )
W przypadkach, w których
::
występuje skrócenie, dla danego adresu może wystąpić tylko jedna operacja skracania. Jeśli dla danego adresu istnieje więcej niż jedna potencjalna operacja skracania, należy użyć operacji, która daje ogólny najkrótszy adres. Jeśli w tym względzie istnieje remis, zostanie użyta pierwsza operacja. Ilustrują to poniższe przykłady.
Przykłady:
Input Output
1080:0:0:0:8:800:200C:417A 1080:0:0:0:8:800:200C:417A
1080::8:800:200C:417A
FF01::101 FF01:0:0:0:0:0:0:101
FF01::101
0:0:0:0:0:0:0:1 0:0:0:0:0:0:0:1
::1
:: 0:0:0:0:0:0:0:0
::
1:0:0:2:0:0:0:3 1:0:0:2:0:0:0:3
1:0:0:2::3
1:0:0:8:8:0:0:3 1:0:0:8:8:0:0:3
1::8:8:0:0:3
1:2:3:4:5:6:7:8 1:2:3:4:5:6:7:8
1:2:3:4:5:6:7:8
ABCD:1234 <Invalid address format - no output>
ABCDE::1234 <Invalid address format - no output>
1:2:3:4:5:6:7:8:9 <Invalid address format - no output>
:::1 <Invalid address format - no output>
codegolf puzzle <Invalid address format - no output>
To jest codegolf , więc najkrótsza odpowiedź w bajtach 6 czerwca 2014 roku zostanie zaakceptowana jako zwycięzca.
źródło
1:0:0:2:2::3
. Czy skrócona wydajność byłaby identyczna z tym1::2:2:0:0:3
? To samo dotyczy nieoptymalnie skróconego wejścia.1::2:0:0:0:3
to możliwe wejście?Odpowiedzi:
JavaScript (ES6) -
198,183,180,188, 187 bajtówI, nieco dłuższa, interaktywna wersja z kilkoma wyskakującymi oknami (203 bajty):
Nie golfowany:
Wyjaśnienie:
Aby obliczyć długą wersję adresu IPv6:
8 - str.split(/:+/).length % 9
- obliczyć, ile zer musimy wstawić. Są to 8 - liczba wartości szesnastkowych. Tutaj% 9 jest strażnikiem, więc nigdy nie będzie liczbą ujemną.replace('::', ':0'.repeat(zeros || 1) + ':')
- zamień „::” na zera oddzielone dwukropkiem. Jeśli nie ma żadnych zer do dodania, nadal dodaje jeden, więc adres nie będzie prawidłowy na końcureplace(/^:0|0:$/g, zeros ? '0:0' : '0')
- dotyczy to specjalnego przypadku, gdy adres zaczyna się lub kończy na „::”, ponieważsplit
funkcja dodaje 1 do liczby wartości szesnastkowych (:: 1 -> [„”, „1”])To jest to! Teraz obliczmy krótki formularz:
replace(/(\b0(:0)*)(?!.*\1:0)/,':')
- zamień najdłuższy rząd zer na dwukropek (s) (nieważne ile).replace(/::+/,'::')
- usunąć dodatkowe dwukropki, jeśli występująreturn /^(:[\da-f]{1,4}){8}$/i.test(':'+longIP) && [longIP, shortIP];
- sprawdź, czy długa wersja jest zgodna z IPv6, i zwróć obie wersje lubfalse
jeśli test się nie powiedzie.Testy w przeglądarce Firefox:
źródło
1:2:3:4::a:b:c:d
JavaScript (E6) 246
305 284 292 319Znacznie zmieniony Specjalny przypadek dla :: specjalnie obsługiwanej fazy kompresji unika pętli for (ale nie jest to naprawdę bardzo krótszy)
Jestem pewien, że końcową fazę kompresji można skrócić. W każdym razie nie terazDzięki nderscore
Jako program
Wejście i wyjście za pomocą wyskakującego js, w zasadzie:
p=prompt,p(F(p()))
Przepisywanie z wyskakującym oknem i bez definicji funkcji, liczba znaków powinna być mniejsza niż 260Nie golfił i skomentował trochę
Testuj w konsoli
Wyjście testowe
źródło
prompt()
. Oto kilka optymalizacji, które sprowadzają go do 290: pastie.org/private/3ccpinzqrvvliu9nkccygPerl - 204
176 190 191 197(202 znaków + 2 za
-p
flagę)Przykład:
Wyjaśnienie:
źródło
die
na ciche wyjście.1:2:3:4::a:b:c:d
. Jest to irytujące specjalny przypadek, ponieważ większość adresów osiem okrężnicy są nieważne, ale::2:3:4:a:b:c:d
i1:2:3:4:a:b:c::
to zarówno ważny.sed, 276
Mam 275 bajtów w ipshorten.sed oraz 1 bajt dla
-r
przełącznika wsed -rf
celu użycia rozszerzonych wyrażeń regularnych. Użyłem OpenBSD sed (1) .Stosowanie:
echo ::2:3:4:a:b:c:d | sed -rf ipshorten.sed
Używam 22 wyrażeń regularnych, ponieważ sed nie może porównywać liczb ani tworzyć tablic. Dla każdego wiersza wejścia sed uruchamia polecenia i wypisuje wiersz. Podczas testowania umieściłem w pliku kilka wierszy rzekomych adresów IP i podałem ten plik do sed. Odniesienie do rozszerzonych wyrażeń regularnych znajduje się w re_format (7) .
s/^/:/
dodaje dodatkowy dwukropek na początku wiersza. Używam tego dodatkowego dwukropka do gry w golfa w następnych dwóch poleceniach./^(:[0-9A-Fa-f]{0,4})*$/!d
sprawdza, czy cała linia odpowiada zeru lub większej liczbie grup dwukropków, po których następuje zero do czterech cyfr szesnastkowych.!
neguje sprawdzenie, więcd
usuwa wiersze o zbyt dużych liczbach szesnastkowych lub niepoprawnych znakach. Kiedyd
usuwa linię, sed nie uruchamia już więcej poleceń w tym wierszu.s/:0*([^:])/:\1/g
usuwa początkowe 0 z każdej liczby. Zmieniłoby się:0000:0000:
na:0:0:
. Muszę to zrobić, ponieważ moja pętla skurczu działa tylko z jednocyfrowymi zerami.s/://
usuwa dodatkowy dwukropek. Usuwa tylko pierwszy dwukropek.s/::/:=/
zmienia pierwszy::
na:=
. Jest to więc późniejsze polecenia można dopasować=
zamiast::
, i tak=
się nie liczy jako okrężnicy. Jeśli nie::
, to podstawienie bezpiecznie nic nie robi.::
musi zrobić co najmniej jedno 0, ale istnieją trzy różne przypadki umieszczenia tego 0.s/(.:=)(.)/\10:\2/
to pierwszy przypadek. Jeśli::
było między dwoma innymi postaciami, to:=
staje się:=0:
. Jest to jedyny przypadek, który dodaje dwukropek.s/^:=/0&/
to drugi przypadek. Jeśli::
był na początku linii, wstaw tam 0.s/=$/&0/
to trzeci przypadek,::
na końcu linii.:E
jest etykietą dla pętli rozszerzeń./(.*:){7}/!{/=/!d
rozpoczyna blok warunkowy, jeśli linia ma mniej niż 7 dwukropków./=/!d
usuwa linie, które nie miały::
i nie miały wystarczającej liczby dwukropków.s//=0:/
dodaje jeden dwukropek. Pusty//
powtarza ostatnie wyrażenie regularne, więc tak naprawdę jests/=/=0:/
.bE
rozgałęzienia, aby:E
kontynuować pętlę.}
zamyka blok. Teraz linia ma co najmniej siedem dwukropków.s/=//
usuwa=
./^:|::|:$|(.*:){8}/d
jest ostatnim sprawdzianem po rozwinięciu. Usuwa linie z wiodącym okrężnicą, dodatkowym,::
który nie został rozszerzony, okrężnicą końcową lub ośmioma lub więcej okrężnicami.p
wypisuje linię, która jest długim adresem IP.s/.*/:&:/
zawija adres w dodatkowe dwukropki.:0:0:0:
i zawarcie jej::
.s/:((0:)+)/:<\1>/g
zjada każdą grupę zer, więc:0:0:0:
stałoby się:<0:0:0:>
.:C
jest etykietą dla pętli skurczowej.s/0:>/>0:/g
przesuwa jeden 0 z każdego ujścia, tak:<0:0:0:>
by się stało:<0:0:>0:
./<0/{s/<>//g
otwiera blok warunkowy, jeśli jakiekolwiek usta nie są puste.s/<>//g
usuwa wszystkie puste usta, ponieważ te grupy są zbyt krótkie.bC
kontynuuje pętlę skurczu.}
zamyka blok. Teraz każde usta są puste i oznaczają najdłuższą grupę zer.s/<>(0:)+/:/
skraca najdłuższą grupę, więc tak:<>0:0:0:
się stanie::
. W remisie wybiera puste usta po lewej stronie.s/<>//g
usuwa wszelkie inne puste usta./^::/!s/://
usuwa pierwszy dodatkowy dwukropek, chyba że jest on częścią::
./::$/!s/:$//
robi to dla ostatniego dodatkowego jelita grubego. Następnie sed drukuje adres IP w krótkiej formie.źródło
Python 3: 387 znaków
Działa nawet z nieprawidłowo skróconym wejściem.
Podwójna zastąpić z
':::'
ze'::'
czuje się bardzo źle, ale nie wiem, jak do czynienia z czysto najdłuższy ciąg 0-tych, kiedy to przylega jednym lub obu końcach.Wymień finał
pass
zraise
zobaczyć, jak to sięupaśćchroniąc przed wejściem zniekształconych.źródło
1:2:3:4::a:b:c:d
ale odrzucił zarówno::2:3:4:a:b:c:d
i1:2:3:4:a:b:c::
. Uważam, że to było złe trzy razy.