আমার আইপিভি 4 ঠিকানার অনুপস্থিত সময়সীমা ঠিক করুন


37

কখনও কখনও যখন আমি একটি আইপিভি 4 ঠিকানা টাইপ করি তখন আমি সমস্ত নম্বর ঠিক পাই তবে আমি এক বা একাধিক পিরিয়ড টাইপ করতে ভুলে যাই। আমি এমন একটি প্রোগ্রাম (বা ফাংশন) রাখতে চাই যা আমার ভাঙা IPv4 ঠিকানা নেয় এবং হারিয়ে যাওয়া সময়ের সমস্ত সম্ভাব্য বৈধ স্থান নির্ধারণ করে।

ইনপুট

ইনপুটটি সর্বদা একটি স্ট্রিং থাকবে যা একটি বৈধ IPv4 ঠিকানার রূপান্তর (নীচে বিবরণ দেখুন)। এটি সর্বদা এক বা একাধিক পিরিয়ড অক্ষরকে বাদ দিয়ে কেবল রূপান্তরিত হবে।

আপনার জমা দেওয়ার জন্য এই ফর্ম্যাটটির বাইরে ইনপুটগুলি পরিচালনা করতে হবে না।

আউটপুট

ইনপুটটিতে পিরিয়ড অক্ষর সন্নিবেশ করে ইনপুট থেকে তৈরি করা যেতে পারে এমন সমস্ত বৈধ আইপিভি 4 ঠিকানা উপস্থাপন করে এমন স্ট্রিংগুলির কোনও নির্দিষ্ট ক্রম বা বিন্যাসে কোনও সংগ্রহ বা তালিকা।

  • আউটপুটটি কোনও ভাষা-স্থানীয় তালিকা বা অন্য অর্ডারযুক্ত বা অর্ডারযুক্ত সংগ্রহের ধরণ হতে পারে।
  • বিকল্পভাবে, এটি কিছু পরিষ্কার উপায়ে ডিলিমেড IPv4 ঠিকানার স্ট্রিং ক্রম হতে পারে।
    • আপনি যদি আপনার স্ট্রিংটি সীমিত করতে একক-অক্ষর ডিলিমিটার ব্যবহার করেন তবে পিরিয়ড এবং অঙ্কগুলি সেই একক-অক্ষর ডিলিমিটার হিসাবে অনুমোদিত নয়। আমি বুঝতে পারি যে সংখ্যার বিপরীতে, ডিলিমিটার হিসাবে পিরিয়ডগুলি অস্পষ্ট নয় (যেহেতু প্রতিটি চতুর্থ সময়কালে অবিচ্ছিন্নভাবে একটি সীমান্তকারী হবে) তবে পাঠযোগ্যতার জন্য আমি এটিকে অস্বীকার করছি allow

IPv4 ঠিকানার ফর্ম্যাট

যদিও আইপিভি 4 অ্যাড্রেসগুলি চারটি বাইনারি অক্টেটের কেবলমাত্র একটি ক্রম, এই চ্যালেঞ্জটি একটি সীমাবদ্ধ বিন্দুযুক্ত দশমিক ফর্ম্যাট ব্যবহার করে।

  • একটি আইপিভি 4 ঠিকানা একটি চার দশমিক মান যা তিন পিরিয়ড দ্বারা পৃথক হয়।
  • চার মূল্যবোধের প্রতিটি সীমার মধ্যে হয় 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"]

(আমি এই উদাহরণগুলি হাতে হাতে তৈরি করেছি, সুতরাং দয়া করে আপনার যে কোনও ভুলের জন্য আমাকে সতর্ক করুন))


আউটপুট অর্ডার কি ব্যাপার?
আপনি

@ ইয়ু ন: " একটি সংগ্রহ বা তালিকা, কোনও নির্দিষ্ট ক্রমে বা বিন্যাসে ... "
অ্যাপসিলাররা 11:40

শীর্ষস্থানীয় শূন্যগুলি অনুমোদিত নয় : এটি কি ইনপুটটিতেও প্রযোজ্য?
লুইস মেন্ডো

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 গিগাবাইট র‌্যামের প্রয়োজন।

কিভাবে এটা কাজ করে

       ,             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ইত্যাদি দিয়ে শেষ করেন ? (তবে তারপরে স্পষ্টতই সমস্ত অবৈধ ফিল্টার আউট হয়ে যায়)
অ্যাপসিলাররা 11:58

@ অ্যাপ্লায়ার্স সঠিক
অ্যান্ডারস কাসেরগ

16

সি (জিসিসি / লিনাক্স), 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);}

সমস্ত সম্ভাব্য আইপিভি 4 অ্যাড্রেসের উপরে লুপ করে এবং একটি কাস্টম তুলনা করে যা উত্পন্ন আইপি ঠিকানায় অতিরিক্ত বিন্দুগুলি ছাড়ায় (তবে মূল তুলনা ঠিকানায় নয়) মুদ্রণ করবে কিনা তা সিদ্ধান্ত নিতে। খুব ধীর, তবে একটি যুক্তিসঙ্গত পিসিতে 1 ঘন্টার মধ্যে শেষ করা উচিত


আপনি মুছে ফেলতে পারেন i=0;
betseg

@ রিলিজিংহেলিয়াম নিউকলি আমি ভেবেছিলাম আমি করতে পারি না (একটি ফাংশন অবশ্যই পুনরায় ব্যবহারযোগ্য) তবে এখন বুঝতে পেরেছি যে ফাংশনটি iআবার 0 হওয়ার পরে ...
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))$

Vচ্ছিক আইপিভি 4 রেগেক্স ., এখানে নোটের কিছুই নেই।

(?{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

জাভাস্ক্রিপ্ট (ES6), 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

সম্পাদনা: @ আপসিলারদের ধন্যবাদ 6 বাইট সংরক্ষণ করা হয়েছে @ YOU এর বৈধতা পরীক্ষা করে অনুলিপি করে আরও 6 বাইট সংরক্ষণ করা হয়েছে।


[1-9] | 0 এবং [0-9] বা \ d এর মধ্যে কি পার্থক্য আছে?
আপনি

@ অ্যাপ্লায়াররা হ্যাঁ হ্যাঁ, আমার কোডের পূর্ববর্তী সংস্করণটি এমন একটি অনুমান তৈরি করতে পারে .যা পরীক্ষা নিক্ষেপ করতে পারে , তবে আমি মনে করি এই সংস্করণটি ঠিক আছে।
নীল

@ ইউইউ গুরুত্বপূর্ণ বিটটি হ'ল 0একটি $। (এটিও একটি অনুপস্থিত ^, তাই এতে আমার দৃষ্টি আকর্ষণ করার জন্য ধন্যবাদ))
নীল

@ অ্যাপসিলাররা দুঃখের 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") দিয়ে ঘিরে থাকা ইনপুট প্রয়োজন । প্রতিটি উত্পন্ন IP ঠিকানা একটি নতুন লাইনে আউটপুট দেয়।

@ গ্রায়েটিকে 9 টি বাইট সংরক্ষণ করা হয়েছে!


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ধারাটির চারপাশে প্রথম বন্ধনী প্রয়োজন ?
নীল

@ নীল, ধন্যবাদ, তাদের দরকার নেই।
আপনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.