Pour marquer l'anniversaire de la journée mondiale IPv6 , l'Internet Society a publié une campagne pour désactiver IPv4 le 6 juin 2014 pour One Day .
Les adresses IPv6 peuvent être représentées sous leur forme longue par huit valeurs hexadécimales de 16 bits séparées par deux-points. Selon l'adresse, ils peuvent également être raccourcis comme décrit au point 2 de la section 2.2 Représentation textuelle des adresses de la RFC 3513 :
Afin de faciliter l'écriture d'adresses contenant zéro bit, une syntaxe spéciale est disponible pour compresser les zéros. L'utilisation de "::" indique un ou plusieurs groupes de 16 bits de zéros. Le "::" ne peut apparaître qu'une seule fois dans une adresse. Le "::" peut également être utilisé pour compresser des zéros de début ou de fin dans une adresse.
Les inscriptions à ce défi seront les programmes qui acceptent exactement une adresse IPv6 formatée soit dans le format long ou raccourci, et affichera la même adresse dans les deux formats longs et courts, dans cet ordre.
L'entrée peut provenir d'arguments de ligne de commande, STDIN ou de toute autre source d'entrée qui convient à votre choix de langue.
Les bibliothèques ou utilitaires spécifiquement pour l'analyse des adresses IPv6 sont interdits (par exemple inet_ {ntop, pton} () ).
Si l'adresse d'entrée n'est pas valide, la sortie sera vide (ou un message d'erreur approprié indiquant que l'adresse n'est pas valide est donné)
Dans les cas où le
::
raccourcissement se produit, une seule opération de raccourcissement peut se produire pour une adresse donnée. S'il existe plusieurs opérations de raccourcissement possibles pour une adresse donnée, l'opération qui donne l'adresse la plus courte globale doit être utilisée. S'il y a égalité à cet égard, la première opération sera utilisée. Ceci est illustré dans les exemples ci-dessous.
Exemples:
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>
Ceci est codegolf , donc la réponse la plus courte en octets du 6 juin 2014 sera acceptée comme gagnante.
la source
1:0:0:2:2::3
. La sortie raccourcie serait-elle identique à celle ou1::2:2:0:0:3
? Idem pour une entrée raccourcie de manière non optimale.1::2:0:0:0:3
une entrée possible?Réponses:
JavaScript (ES6) -
198,183,180,188, 187 octetsEt, version un peu plus longue et interactive avec quelques pop-ups (203 octets):
Non golfé:
Explication:
Pour calculer la version longue de l'adresse IPv6:
8 - str.split(/:+/).length % 9
- calculer combien de zéros nous devons insérer. Ils sont 8 - le nombre de valeurs hexadécimales. Ici,% 9 est un gardien donc ce ne sera jamais un nombre négatif.replace('::', ':0'.repeat(zeros || 1) + ':')
- remplacez le "::" par des zéros séparés par deux points. S'il n'y a pas de zéros à ajouter, il en ajoute toujours un afin que l'adresse ne soit pas valide à la finreplace(/^:0|0:$/g, zeros ? '0:0' : '0')
- cela concerne le cas spécial où l'adresse commence ou se termine par "::" car lasplit
fonction ajoute 1 au nombre de valeurs hexadécimales (:: 1 -> ["", "1"])C'est ça! Calculons maintenant la forme courte:
replace(/(\b0(:0)*)(?!.*\1:0)/,':')
- remplacez la plus longue rangée de zéros par deux points (peu importe le nombre).replace(/::+/,'::')
- retirer les deux points supplémentaires le cas échéantreturn /^(:[\da-f]{1,4}){8}$/i.test(':'+longIP) && [longIP, shortIP];
- testez si la version longue est valide IPv6 et renvoyez les deux versions oufalse
si le test échoue.Tests dans Firefox:
la source
1:2:3:4::a:b:c:d
Javascript (E6) 246
305 284 292 319Cas spécialement révisé pour :: spécifiquement traité, la phase de compression évite la boucle for (mais pas très courte en effet)
Je suis sûr que la phase finale de compression peut être raccourcie. Pas maintenant de toute façonMerci à nderscore
En tant que programme
Entrée et sortie en utilisant js popup, essentiellement:
p=prompt,p(F(p()))
réécriture avec popup et sans la définition de la fonction, le nombre de caractères doit être inférieur à 260Ungolfed et commenté un peu
Test dans la console
Sortie test
la source
prompt()
. Voici quelques optimisations qui le ramènent à 290: pastie.org/private/3ccpinzqrvvliu9nkccygPerl - 204
176 190 191 197(202 caractères + 2 pour le
-p
drapeau)Exemple:
Explication:
la source
die
en sortie silencieuse.1:2:3:4::a:b:c:d
. Ceci est un cas particulier gênant, car la plupart des adresses de huit côlon ne sont pas valides, mais::2:3:4:a:b:c:d
et1:2:3:4:a:b:c::
sont valides.sed, 276
J'ai 275 octets dans ipshorten.sed, plus 1 octet pour que le
-r
commutateursed -rf
utilise des expressions régulières étendues. J'ai utilisé OpenBSD sed (1) .Usage:
echo ::2:3:4:a:b:c:d | sed -rf ipshorten.sed
J'utilise 22 expressions régulières, car sed ne peut pas comparer les nombres ou faire des tableaux. Pour chaque ligne d'entrée, sed exécute les commandes et imprime la ligne. Pendant les tests, j'ai mis plusieurs lignes d'adresses IP présumées dans un fichier et ai alimenté ce fichier à sed. Une référence aux expressions régulières étendues se trouve dans re_format (7) .
s/^/:/
ajoute deux points supplémentaires au début de la ligne. J'utilise ces deux points supplémentaires pour jouer aux deux commandes suivantes./^(:[0-9A-Fa-f]{0,4})*$/!d
vérifie si la ligne entière correspond à zéro ou plusieurs groupes de deux-points suivis de zéro à quatre chiffres hexadécimaux.!
annule la vérification, doncd
supprime les lignes avec des nombres hexadécimaux trop grands ou avec des caractères invalides. Lorsqued
supprime une ligne, sed n'exécute plus de commandes sur cette ligne.s/:0*([^:])/:\1/g
supprime les 0 en tête de chaque numéro. Cela changerait:0000:0000:
en:0:0:
. Je dois le faire car ma boucle de contraction ne fonctionne qu'avec des 0 à un chiffre.s/://
supprime le côlon supplémentaire. Il supprime uniquement le premier côlon.s/::/:=/
change le premier::
en:=
. C'est ainsi que les commandes ultérieures peuvent correspondre=
plutôt que::
, et=
ne comptent donc pas comme deux points. S'il n'y a pas::
, cette substitution ne fait rien en toute sécurité.::
faut maintenant faire au moins un 0, mais il y a trois cas différents pour placer ce 0.s/(.:=)(.)/\10:\2/
est le premier cas. Si::
était entre deux autres personnages, alors:=
devient:=0:
. C'est le seul cas qui ajoute deux points.s/^:=/0&/
est le deuxième cas. Si::
était au début de la ligne, mettez-y 0.s/=$/&0/
est le troisième cas,::
en fin de ligne.:E
est l'étiquette de la boucle d'expansion./(.*:){7}/!{/=/!d
commence un bloc conditionnel si la ligne a moins de 7 points-virgules./=/!d
supprime les lignes qui n'avaient pas::
et pas assez de deux-points.s//=0:/
ajoute un colon. Vide//
répète la dernière expression régulière, c'est vraiment le cass/=/=0:/
.bE
branches pour:E
continuer la boucle.}
ferme le bloc. Maintenant, la ligne a au moins sept deux-points.s/=//
supprime=
./^:|::|:$|(.*:){8}/d
est une dernière vérification après expansion. Il supprime les lignes avec un côlon de tête, un extra::
qui n'a pas été développé, un côlon arrière ou huit ou deux points.p
imprime la ligne, qui est une adresse IP sous forme longue.s/.*/:&:/
encapsule l'adresse dans des deux points supplémentaires.:0:0:0:
, et à le contracter::
.s/:((0:)+)/:<\1>/g
mange chaque groupe de 0,:0:0:0:
deviendrait ainsi:<0:0:0:>
.:C
est l'étiquette de la boucle de contraction.s/0:>/>0:/g
se déplace d'un 0 de chaque bouche,:<0:0:0:>
deviendrait ainsi:<0:0:>0:
./<0/{s/<>//g
ouvre un bloc conditionnel si une bouche n'est pas vide.s/<>//g
supprime toutes les bouches vides, car ces groupes sont trop courts.bC
continue la boucle de contraction.}
ferme le bloc. Maintenant, toute bouche est vide et marque le plus long groupe de 0.s/<>(0:)+/:/
contrats le groupe le plus long,:<>0:0:0:
deviendrait ainsi::
. En cravate, il prend la bouche vide à gauche.s/<>//g
supprime toute autre bouche vide./^::/!s/://
supprime le premier côlon supplémentaire sauf s'il fait partie de::
./::$/!s/:$//
le fait pour le dernier colon supplémentaire. Sed imprime ensuite l'adresse IP sous forme abrégée.la source
Python 3: 387 caractères
Fonctionne même avec une entrée incorrectement raccourcie.
Le double remplacement de
':::'
with'::'
se sent vraiment mal, mais ne sait pas comment gérer proprement la plus longue chaîne de 0 lorsqu'elle touche une ou les deux extrémités.Remplacez la finale
pass
parraise
pour voir comment elle sebloque enprotégeant contre une entrée mal formée.la source
1:2:3:4::a:b:c:d
mais rejeté à la fois::2:3:4:a:b:c:d
et1:2:3:4:a:b:c::
. Je crois que c'était mal les trois fois.