मेरे IPv4 पते की गुम अवधि तय करें


37

कभी-कभी जब मैं एक IPv4 पता टाइप कर रहा होता हूं, तो मुझे सभी नंबर सही मिलते हैं, लेकिन मैं एक या अधिक पीरियड लिखना भूल जाता हूं। मुझे एक प्रोग्राम (या फ़ंक्शन) चाहिए जो मेरे टूटे हुए आईपीवी 4 पते को लेता है और लापता अवधि के सभी संभावित वैध प्लेसमेंट को आउटपुट करता है।

इनपुट

इनपुट हमेशा एक स्ट्रिंग होगा जो एक मान्य IPv4 पते का रूपांतरण है (नीचे दिए गए विवरण देखें)। यह हमेशा एक या एक से अधिक अवधि के पात्रों के उन्मूलन द्वारा रूपांतरित किया जाएगा।

आपको सबमिट करने की आवश्यकता नहीं है कि इस प्रारूप के बाहर इनपुट को संभालना है।

उत्पादन

सभी मान्य IPv4 पतों को दर्शाने वाले तार के किसी विशेष क्रम या प्रारूप में संग्रह या सूची, जो इनपुट में अवधि वर्णों के सम्मिलन द्वारा इनपुट से बनाई जा सकती है।

  • आउटपुट एक भाषा-मूल सूची या अन्य आदेशित या अनियोजित संग्रह प्रकार हो सकता है।
  • वैकल्पिक रूप से, यह कुछ स्पष्ट तरीके से सीमांकित IPv4 पते का एक स्ट्रिंग अनुक्रम हो सकता है।
    • यदि आप अपने स्ट्रिंग को सीमांकित करने के लिए एकल-वर्ण परिसीमन का उपयोग करते हैं, तो उस एकल-वर्ण परिसीमन के रूप में अवधियों और अंकों की अनुमति नहीं है। मुझे लगता है कि, संख्याओं के विपरीत, अवधि के रूप में सीमांकक अस्पष्ट नहीं हैं (चूंकि हर चौथे अवधि आवश्यक रूप से परिसीमन होगा) लेकिन पठनीयता के लिए, मैं इसे अस्वीकार कर रहा हूं।

IPv4 पता प्रारूप

जबकि IPv4 पते वास्तव में केवल चार बाइनरी ऑक्टेट का एक अनुक्रम हैं, यह चुनौती प्रतिबंधित डॉटेड दशमलव प्रारूप का उपयोग करती है।

  • IPv4 पता एक चार दशमलव मान है जिसे तीन अवधियों द्वारा अलग किया गया है।
  • चार मूल्यों से प्रत्येक श्रेणी में हैं 0करने के लिए 255समावेशी,।
  • किसी भी संख्या मूल्य में अग्रणी शून्य की अनुमति नहीं है । (स्टैंडअलोन एक चरित्र 0की अनुमति दी है, किसी अन्य नंबर एक शून्य के साथ शुरुआत नहीं है: 052, 00, आदि)

परीक्षण के मामलों

इनपुट पहली पंक्ति पर है, दूसरी पंक्ति पर आउटपुट (यहां, उद्धृत स्ट्रिंग्स के अल्पविराम से अलग सूची के रूप में संरचित, अल्पविराम से घिरा हुआ है [ ], लेकिन आप ऊपर निर्दिष्ट अनुसार किसी भी उचित प्रारूप या संरचना का उपयोग कर सकते हैं)। कुछ उदाहरणों में एक विशेष नियम के आवेदन को उजागर करने के लिए तीसरी पंक्ति पर नोट्स हैं।

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"]

(मैंने इन उदाहरणों को हाथ से बनाया है, इसलिए कृपया मुझे उन गलतियों के प्रति सचेत करें जो आपको मिल सकती हैं।)


आउटपुट ऑर्डर मायने रखता है?
आप


अग्रणी शून्य की अनुमति नहीं है : क्या यह इनपुट पर भी लागू होता है?
लुइस मेंडो

3
तो .... "000125" को केवल एक सही समाधान वापस करना चाहिए ... 0.0.0.125?
कीता

2
@ कीटा जो बिल्कुल सही है। (मैंने इसे एक परीक्षण के मामले के रूप में जोड़ा।)
अप्सिलर्स

जवाबों:


9

पायथ, 24 बाइट्स

f&q4lJcT\.!-J`M256jL\../

इसे ऑनलाइन आज़माएं

यह काम किस प्रकार करता है

                      ./Q   all partitions of input
                  jL\.      join each on .
f                           filter for results T such that:
      cT\.                    split T on .
     J                        assign to J
    l                         length
  q4                          equals 4
 &                            … and:
           -J`M256              J minus the list of representations of [0, …, 255]
          !                     is false (empty)

पायथ, 17 बाइट्स, बहुत धीमी गति से

@FjLL\.,^U256 4./

चेतावनी। भागो मत। लगभग 553 GiB RAM की आवश्यकता है।

यह काम किस प्रकार करता है

       ,             two-element list of:
        ^U256 4        all four-element lists of [0, …, 255]
               ./Q     all partitions of input
  jLL\.              join each element of both on .
@F                   fold intersection

अच्छा! बस मेरी अपनी समझ के लिए, "इनपुट के सभी विभाजन" का मतलब इनपुट सेगमेंट करने के सभी संभावित तरीके हैं, है ना? तो आप हर संभव विभाजन करते हैं और फिर समय के साथ विभाजन को फिर से जोड़ते हैं, इसलिए आप उम्मीदवारों को लोड करते हैं जैसे कि 1.9.2.1.6.8.1.2और 19.2.1.6.8.1.2आदि? (लेकिन फिर स्पष्ट रूप से सभी अमान्य लोगों को फ़िल्टर किया जाता है)
अप्सिलर्स

@ अंतराल सही।
एंडर्स कासोर्ग

16

C (gcc / linux), 125 121 बाइट्स

i;f(char*a){do{char*y=a,s[99],*x=inet_ntop(2,&i,s,99);for(;*x&&!(*x^*y&&*x^46);++x)y+=*x==*y;*x|*y||puts(s);}while(++i);}

सभी संभव IPv4 पतों पर लूप्स , और एक कस्टम तुलना करता है जो जेनरेट किए गए आईपी एड्रेस में अतिरिक्त डॉट्स (लेकिन मुख्य तुलना पते में नहीं) को प्रिंट करने या न करने का निर्णय लेने के लिए छोड़ देता है। बहुत धीमी गति से, लेकिन एक उचित पीसी पर 1 घंटे के भीतर समाप्त होना चाहिए


आप निकाल सकते हैं i=0;
betseg

@ReleasingHeliumNuclei मुझे लगा कि मैं (एक फ़ंक्शन को फिर से उपयोग करने योग्य होना चाहिए), लेकिन अब मुझे एहसास हुआ कि फ़ंक्शन i0 के बाद फिर से है ...
orlp

6

पर्ल 5, 91 बाइट्स

<>=~/^(([1-9]?|1\d|2[0-4])\d|25[0-5])\.?((?1))\.?((?1))\.?((?1))$(?{print"$1.$3.$4.$5 "})^/

कार्यक्रम एक एकल इनपुट की एक पंक्ति की उम्मीद करता है और उम्मीदवारों की अंतरिक्ष-सीमांकित सूची को आउटपुट करता है।

व्याख्या

कार्यक्रम इनपुट स्ट्रिंग से एक वैध IPv4 पता बनाने की सभी संभावनाओं पर लूप के रेगेक्स की बैकट्रैकिंग सुविधा का उपयोग करता है।

^(([1-9]?|1\d|2[0-4])\d|25[0-5])\.?((?1))\.?((?1))\.?((?1))$

वैकल्पिक के साथ IPv4 regex ., यहाँ कुछ भी नोट नहीं है।

(?{print"$1.$3.$4.$5 "})

एक कोड मूल्यांकन अभिव्यक्ति जो कैप्चरिंग समूहों की सामग्री को प्रिंट करता है।

^

मैच को विफल करें और पीछे हटने पर मजबूर करें।

उदाहरण चलाते हैं

$ echo "012345" | perl G89503.pl
0.12.34.5 0.12.3.45 0.1.23.45 0.1.234.5 0.123.4.5

5

जावास्क्रिप्ट (ईएस 6), 147 141 135 बाइट्स

f=(s,n=0)=>(a=s.split`.`)[3]?a.every(s=>s==`0`|s[0]>0&s<256)?s+' ':'':[...s].map((_,i)=>i>n?f(s.slice(0,i)+`.`+s.slice(i),i):``).join``
<input placeholder=Input oninput=o.textContent=f(this.value)><div id=o style=font-family:monospace;width:1em>Output

संपादित करें: @apsillers के लिए 6 बाइट्स सहेजे गए। @ आप की वैधता परीक्षण की प्रतिलिपि बनाकर एक और 6 बाइट्स सहेजे।


क्या [1-9] | 0 और [0-9] या \ d के बीच अंतर है ??
आप

@apsillers आह हाँ, मेरे कोड का एक पुराना संस्करण एक अनुगामी उत्पन्न कर सकता है .जो परीक्षण को फेंक देगा, लेकिन मुझे लगता है कि यह संस्करण ठीक है।
नील

@ आप महत्वपूर्ण बिट यह है कि 0$। (यह भी एक याद आ रही है ^, इसलिए मेरा ध्यान आकर्षित करने के लिए धन्यवाद।)
नील

@apsillers दुख की बात spliceहै कि इस तरह से काम नहीं करता है, यह सरणी को संशोधित करता है और किसी भी हटाए गए तत्वों को वापस करता है।
नील

4

पायथन 3, 232 बाइट्स

import re,itertools as t,ipaddress as k
R=range
i=input()
for d in R(5):
 for p in t.combinations(R(len(i)),d):
  n=i;o=0
  for a in p:n=n[:a+o]+'.'+n[a+o:];o+=1
  try:k.ip_address(n);print(n*(not re.search(r'\D?0\d',n)))
  except:0

बहुत ही सरल: हम हर जगह पीरियड्स रखते हैं और प्रिंट करते हैं अगर आईपी पता लगाया गया पीरियड्स वैध है। हम (आब) का उपयोग करके आईपी एड्रेस की वैधता की जांच करते हैं ipaddress.ip_address, जो एक अपवाद उठाता है यदि इनपुट वैध आईपी पता नहीं है। चुनौती कुछ अतिरिक्त नियमों को परिभाषित करती है जो ip_addressसंभालती नहीं हैं (अर्थात्, कोई अग्रणी शून्य नहीं हो सकता है), इसलिए हम उन लोगों के लिए भी एक नियमित अभिव्यक्ति के साथ जांच करते हैं, फिर प्रिंट करते हैं।

प्रत्येक समाधान को एक नई लाइन पर आउटपुट करता है, जो रिक्त लाइनों की एक मनमानी संख्या के साथ मिश्रित होता है।

उदाहरण रन:

$ echo 012345 | python fixip.py
0.1.23.45
0.1.234.5
0.12.3.45
0.12.34.5
0.123.4.5





$ echo 000123 | python fixip.py
0.0.0.123








_

यहां मेरा पुराना, 248-बाइट पायथन 2 समाधान है। दूसरे और तीसरे इंडेंट स्तर क्रमशः \t(कच्चे टैब) और \t (कच्चे टैब प्लस स्पेस) हैं। यह मार्कडाउन के साथ वास्तव में बुरी तरह से खेलता है , इसलिए टैब को दो स्थानों से बदल दिया गया है।

import socket,re,itertools as t
R=range
i=input()
for d in R(5):
 for p in t.combinations(R(len(i)),d):
  n=i;o=0
  for a in p:n=n[:a+o]+'.'+n[a+o:];o+=1
  try:
   socket.inet_aton(n)
   if n.count('.')==3and not re.search(r'\D?0\d',n):print n
  except:0

उद्धरण (जैसे "123.456.789") से घिरे इनपुट की आवश्यकता है । आउटपुट एक नई लाइन पर प्रत्येक आईपी पते को उत्पन्न करता है।

सहेजे गए 9 बाइट्स @grawity की बदौलत!


1
ipaddress.ip_address()Aton + मैन्युअल जांच से छोटा होगा ?
ग्रैविटी


2

पायथन 3, 262 260 बाइट्स

p,l,L,T=set(),-1,len,tuple
while l<L(p):l=L(p);p|={T(z[:i]+(y[:j],y[j:])+z[i+1:])for z in set(p)or[T(input().split("."))]for i,y in enumerate(z)for j in range(1,L(y))}
print(['.'.join(x)for x in p if L(x)==4and all(y=='0'or y[0]!='0'and int(y)<256for y in x)])

कोई लाइब्रेरी का उपयोग नहीं किया गया, लेकिन देर से और लंबे समय तक, हो सकता है कि मैं कुछ स्पष्ट गोल्फ तकनीकों को याद कर रहा हूं।

परिणाम वैसे भी।

for x in 192.168.1234 192.1681234 1921681.234 1921681234 192.168.1204 192.168.123 192.168.256 120345 012345 000123; do
echo $x | python3 ipv4.py
done;

['192.168.123.4', '192.168.1.234', '192.168.12.34']
['192.16.81.234', '192.168.1.234', '192.168.123.4', '192.168.12.34']
['19.216.81.234', '192.168.1.234', '192.16.81.234']
['19.216.81.234', '192.168.123.4', '192.168.12.34', '192.16.81.234', '192.168.1.234']
['192.168.1.204', '192.168.120.4']
['192.16.8.123', '19.2.168.123', '1.92.168.123', '192.168.1.23', '192.168.12.3', '192.1.68.123']
['192.168.25.6', '192.168.2.56']
['1.20.3.45', '1.203.4.5', '12.0.34.5', '120.3.4.5', '1.20.34.5', '12.0.3.45']
['0.1.23.45', '0.12.3.45', '0.12.34.5', '0.123.4.5', '0.1.234.5']
['0.0.0.123']

1
मैंने सोचा कि मैं आपकी वैधता परीक्षा की नकल करूँगा और सोचता हूँ कि क्या आपको orखंड के चारों ओर कोष्ठकों की आवश्यकता है ?
नील

@ नील, धन्यवाद, उन की जरूरत नहीं थी।
आप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.