Parfois, lorsque je tape une adresse IPv4, tous les chiffres sont corrects, mais j'oublie de taper un ou plusieurs points. J'aimerais avoir un programme (ou une fonction) qui prend mon adresse IPv4 erronée et génère tous les emplacements valides possibles des périodes manquantes.
Contribution
L'entrée sera toujours une chaîne qui transformera une adresse IPv4 valide (voir les détails ci-dessous). Il aura toujours été transformé uniquement par l'élimination d'un ou plusieurs caractères d'époque.
Votre soumission n'a pas besoin de gérer des entrées en dehors de ce format.
Sortie
Une collection ou une liste, sans ordre ni format particulier, de chaînes représentant toutes les adresses IPv4 valides pouvant être créées à partir de l'entrée en insérant des caractères de période dans l'entrée.
- La sortie peut être une liste native de la langue ou un autre type de collection ordonné ou non.
- Alternativement, il peut s'agir d'une séquence de chaîne d'adresse IPv4 délimitée de manière claire.
- Si vous utilisez un délimiteur à un seul caractère pour délimiter votre chaîne, les points et les chiffres ne sont pas autorisés comme délimiteur à un seul caractère. Je me rends compte que, contrairement aux nombres, les points comme délimiteurs ne sont pas ambigus (car une période sur quatre serait nécessairement un délimiteur), mais par souci de lisibilité, je le refuse.
Format d'adresse IPv4
Bien que les adresses IPv4 ne soient en réalité qu'une séquence de quatre octets binaires, ce défi utilise un format décimal en pointillés restreint.
- Une adresse IPv4 est composée de quatre valeurs décimales séparées par trois points.
- Chacune des quatre valeurs sont dans la plage
0
à255
inclusivement. - Les zéros non significatifs ne sont autorisés dans aucune valeur numérique. (Autonome un caractère
0
est permis, tout autre numéro commençant par un zéro n'est pas:052
,00
, etc.)
Cas de test
L'entrée est sur la première ligne, la sortie sur la deuxième ligne (ici, structurée comme une liste de chaînes de caractères citées, séparées par des virgules, séparées par des virgules, entourées de [
]
, mais vous pouvez utiliser n'importe quel format ou structure raisonnable, comme spécifié ci-dessus). Certains exemples comportent des notes sur une troisième ligne pour mettre en évidence l'application d'une règle particulière.
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"]
(J'ai fait ces exemples à la main, alors s'il vous plaît, alertez-moi de toute erreur que vous pourriez trouver.)
la source
Réponses:
Pyth, 24 octets
Essayez-le en ligne
Comment ça marche
Pyth, 17 octets, très lent
Attention. Ne cours pas. Nécessite environ 553 Go de RAM.
Comment ça marche
la source
1.9.2.1.6.8.1.2
et19.2.1.6.8.1.2
etc.? (Mais alors, évidemment, tous les invalides sont filtrés)C (gcc / linux),
125121 octetsParcourt toutes les adresses IPv4 possibles et effectue une comparaison personnalisée qui ignore des points supplémentaires dans l'adresse IP générée (mais pas dans l'adresse de comparaison principale) pour décider d'imprimer ou non. Très lent, mais devrait finir en moins d’une heure sur un PC raisonnable .
la source
i=0;
.i
est à nouveau 0 ...Perl 5, 91 octets
Le programme attend une seule ligne d'une seule entrée et génère une liste de candidats délimitée par des espaces.
Explication
Le programme exploite la fonction de retour arrière de regex pour couvrir toutes les possibilités de former une adresse IPv4 valide à partir de la chaîne d'entrée.
La regex IPv4 avec optionnel
.
, rien d’important ici.Expression d'évaluation de code qui imprime le contenu des groupes de capture.
Faire le match échoue et force le retour en arrière.
Exemple d'exécution
la source
JavaScript (ES6),
147141135 octetsEdit: sauvegardé 6 octets grâce à @apsillers. A enregistré 6 autres octets en copiant le test de validité de @ YOU.
la source
.
qui jetterait le test, mais je pense que cette version est OK.0
a un$
. (Il manque aussi un^
, alors merci d'avoir attiré mon attention dessus.)splice
cela ne fonctionne pas comme ça, cela modifie le tableau et renvoie tous les éléments supprimés.Python 3, 232 octets
Assez simple: nous plaçons des périodes partout et imprimons si l'adresse IP avec les périodes placées est valide. Nous vérifions la validité des adresses IP en utilisant (ab)
ipaddress.ip_address
, ce qui déclenche une exception si l'entrée n'est pas une adresse IP valide. Le défi définit certaines règles supplémentairesip_address
non gérées (à savoir qu'il ne peut y avoir de zéros non significatifs). Nous vérifions donc celles-ci également avec une expression régulière, puis imprimons.Affiche chaque solution sur une nouvelle ligne, mélangée avec un nombre arbitraire de lignes vides.
Exemple d'exécution:
Voici mon ancienne solution Python 2 de 248 octets. Les deuxième et troisième niveaux de retrait sont
\t
(onglet brut) et\t
(onglet brut plus espace) respectivement. Cela joue vraiment mal avec Markdown, donc les onglets ont été remplacés par deux espaces.
Nécessite une entrée entourée de guillemets (par exemple
"123.456.789"
). Affiche chaque adresse IP générée sur une nouvelle ligne.Sauvegardé 9 octets grâce à @grawity!
la source
ipaddress.ip_address()
plus court que aton + vérification manuelle?Brachylog , 110 octets
Essayez-le en ligne!
la source
Python 3,
262260 octetsAucune bibliothèque utilisée, mais plus tard et plus tard, il se peut que je manque certaines techniques évidentes de golf.
Des résultats quand même.
la source
or
clause?