सभी मान्य उत्तम दर्जे का सार्वजनिक यूनिकस्ट IPv4 पतों को आउटपुट करें


10

IPv4 पते 32 बिट्स चौड़े हैं, और इस प्रकार पता स्थान का आकार 2 32 , या 4,294,967,296 है। हालांकि, यह केवल एक सैद्धांतिक ऊपरी सीमा है। यह उन सभी पतों का सटीक प्रतिनिधित्व नहीं है जो वास्तव में सार्वजनिक इंटरनेट पर उपयोग किए जा सकते हैं।

इस चुनौती के प्रयोजनों के लिए, यह माना जाता है कि सभी संबोधन उत्तम दर्जे का है । वास्तविकता में, CIDR (क्लासलेस इंटर-डोमेन रूटिंग और वीएलएसएम (वेरिएबल लेंथ सबनेट मास्किंग) द्वारा पते की जगह के क्लासफुल सबडिवीजन को खत्म कर दिया गया है , लेकिन इस चुनौती के लिए इसे नजरअंदाज कर दिया जाता है।

वर्गीय पता योजना के अनुसार, 3 वर्ग हैं:

  • क्लास A - 0.0.0.0करने के लिए 127.255.255.255साथ /8नेटमास्क लंबाई
  • कक्षा बी - 128.0.0.0करने के लिए 191.255.255.255साथ /16नेटमास्क लंबाई
  • कक्षा सी - 192.0.0.0के 223.255.255.255साथ /24नेटमास्क लंबाई

कक्षा डी (मल्टीकास्ट) और ई (आरक्षित) को भी परिभाषित किया गया है, लेकिन इनका उपयोग सार्वजनिक यूनिकस्ट पते के लिए नहीं किया जाता है।

प्रत्येक वर्ग को उस वर्ग के नेटमस्क के अनुसार नेटवर्क में विभाजित किया जाता है।

इस प्रकार 3.0.0.0क्लास ए नेटवर्क का एक उदाहरण है। क्लास ए के लिए नेटमास्क लंबाई, 8 तो इस नेटवर्क के लिए पूर्ण पता स्थान है 3.0.0.0करने के लिए 3.255.255.255। हालाँकि, पहला पता ( 3.0.0.0) नेटवर्क पते के रूप में और अंतिम पता ( 3.255.255.255) उस नेटवर्क के लिए प्रसारण पते के रूप में आरक्षित है। इस प्रकार प्रयोग करने योग्य पतों की वास्तविक सीमा है 3.0.0.1करने के लिए 3.255.255.254जो 2 है 24 - 2 (= 16,777,214) कुल पतों।

इसी तरह, 200.20.30.0क्लास सी नेटवर्क का एक उदाहरण है। कक्षा सी के लिए नेटमास्क लंबाई, 24 है, इसलिए इस नेटवर्क के लिए पूर्ण पता स्थान है 200.20.30.0करने के लिए 200.20.30.255। नेटवर्क और प्रसारण पतों को हटाकर प्रयोग करने योग्य पतों की वास्तविक सीमा को छोड़ दिया जाता 200.20.30.1है, 200.20.30.254जो कि 2 8 - 2 (= 254) कुल पते हैं।

पता सीमाओं पर आगे की सीमाएँ हैं जिनका उपयोग सार्वजनिक यूनिकस्ट के लिए किया जा सकता है। RFC 6890 के अनुसार , अस्वीकृत श्रेणियां हैं:

  • 0.0.0.0/8 - स्थानीय नेटवर्किंग
  • 10.0.0.0/8 - निजी उपयोग
  • 100.64.0.0/10 - साझा पता स्थान
  • 127.0.0.0/8 - लूपबैक
  • 169.254.0.0/16 - लिंक लोकल
  • 172.16.0.0/12- निजी उपयोग
  • 192.0.0.0/24 - IETF प्रोटोकॉल असाइनमेंट
  • 192.0.2.0/24 - प्रलेखन में उपयोग के लिए आरक्षित
  • 192.88.99.0/24 - 6to4 रिले एनीकट
  • 192.168.0.0/16 - निजी उपयोग
  • 198.18.0.0/15 - बेंचमार्किंग
  • 198.51.100.0/24 - प्रलेखन में उपयोग के लिए आरक्षित
  • 203.0.113.0/24 - प्रलेखन में उपयोग के लिए आरक्षित

ध्यान दें कि उपरोक्त सूची कुशलता से एक सीमा निर्दिष्ट करने के लिए वीएलएसआर नेटमास्क का उपयोग करती है। सभी लेकिन एक मामले में, दिए गए मास्क की लंबाई की विशिष्टता रेंज की शुरुआत के लिए सामान्य क्लासफुल मास्क की लंबाई से कम या उसके बराबर है। इस प्रकार इन वीएलएसआर श्रेणियों में से प्रत्येक एक या एक से अधिक क्लास नेटवर्क के बराबर है। उदाहरण के लिए 172.16.0.0/12कक्षा बी नेटवर्क के बराबर है 172.16.0.0करने के लिए 172.31.0.0या पता श्रेणी 172.16.0.0के लिए 172.31.255.255

इस नियम का अपवाद 100.64.0.0/10वीएलएसआर रेंज है, जो कि 100.0.0.0क्लास ए रेंज की तुलना में अधिक विशिष्ट है । इस प्रकार 100.0.0.0अन्य कक्षा ए की सीमाओं को इस अपवाद के साथ संभाला जाएगा कि इसमें बीच में 4,194,304-पता छेद है। इस क्लास ए श्रेणी में मान्य पतों के लिए किया जाएगा 100.0.0.0करने के लिए 100.63.255.255और 100.128.0.0करने के लिए 100.255.255.254, 2 की कुल 24 2 - 22 - 2 (= 12,582,910) कुल पतों।

इस चुनौती का लक्ष्य सभी क्लास ए, बी और सी यूनिकैस्ट आईपीवी 4 पतों को आउटपुट करना है जो वैध रूप से एक सार्वजनिक इंटरनेट होस्ट को निर्दिष्ट किया जा सकता है (अर्थात ऊपर विस्तृत विवरण को छोड़कर)।

  • कोई इनपुट नहीं दिया जाएगा और उम्मीद नहीं की जानी चाहिए।

  • आउटपुट किसी भी रूप में आपकी भाषा के लिए सुविधाजनक हो सकता है, उदाहरण के लिए सरणी, सूची, सीमांकित स्ट्रिंग। पते मानक डॉटेड दशमलव प्रारूप में आउटपुट होना चाहिए।

  • आउटपुट ऑर्डर मायने नहीं रखता।

  • विशेष रूप से पतों की आवश्यक श्रेणी देने वाले बिल्‍डल अस्वीकृत हैं। इसी तरह सार्वजनिक इंटरनेट के लिए बीजीपी (या अन्य प्रोटोकॉल) राउटिंग टेबल का गतिशील रूप से निरीक्षण करने की कोई भी विधि अस्वीकृत है।

संख्यात्मक रूप से सबसे कम पता होगा 1.0.0.1और संख्यात्मक रूप से उच्चतम होगा 223.255.255.254


यह चुनौती सभी IPv6 पतों को प्रिंट करने के समान है , लेकिन प्रतिबंधों के कारण गैर-तुच्छ रूप से अलग कार्यान्वयन की आवश्यकता होनी चाहिए।

जवाबों:


2

पॉवरशेल, 648 641 625 बाइट्स

for([uint64]$a=16MB;$a-lt2GB-16mb;$a++){if(($a%16mb)*(($a+1)%16mb)*($a-lt160MB-or$a-gt176MB)*($a-lt1604MB-or$a-ge1608MB)){([ipaddress]$a).IPAddressToString}}
for($a=2GB;$a-lt3GB;$a++){if(($a%64kb)*(($a+1)%64kb)*($a-lt2785152kb-or$a-gt2720mb)*($a-lt2753mb-or$a-gt2754mb)){([ipaddress]$a).IPAddressToString}}
for($a=3221225728;$a-lt3.5GB;$a++){if(($a%256)*(($a+1)%256)*(($a-lt3221225984-or$a-gt3221226240))*(($a-lt3227017984-or$a-gt3151385kb))*(($a-lt3156480kb-or$a-gt3156544kb))*(($a-lt3245184kb-or$a-gt3245312kb))*(($a-lt3247321kb-or$a-gt3325256959))*(($a-lt3405803776-or$a-gt3405804032))){([ipaddress]$a).IPAddressToString}}

संपादित करें 1 - मैंने सभी शेष शक्तियों में से दो ऑपरेटरों को निकाल दिया है, जिसने 7 अतिरिक्त बाइट्स बचाए।
एडिट 2 - [uint64]कलाकारों को पहली घोषणा पर ले जाया गया , $aजिसमें अन्य दो री- कास्ट को समाप्त किया गया, जिससे 16 बाइट्स बच गए।

तीन लाइनें, क्लास ए / क्लास बी / क्लास सी। पठनीयता के लिए अलग लाइन के रूप में छोड़ दिया। ;-)

क्या हो रहा है समझने के लिए दो मुख्य बिंदु:

  • PowerShell में दो-दो ऑपरेटर की शक्तियां हैं KB, MB, GB। उदाहरण के लिए, एक इंट के रूप में 4KBवापस आएगा 4096। हम कई स्थानों में दर्जनों बाइट्स का लाभ उठाने का लाभ उठाते हैं।
  • .NET [ipaddress]क्लास नंबर के बाइनरी प्रतिनिधित्व को ले कर आईपी एड्रेस के रूप में संख्यात्मक मान को पार्स करने की कोशिश करेगा । हम उस कंस्ट्रक्टर को IPAddressToStringआउटपुट के तर्क के साथ उपयोग करते हैं ।

उन दो चीजों को युग्मित करके, हम आईपी पते को संख्याओं के रूप में समझ सकते हैं और उनके माध्यम से लूप के माध्यम से for()लूप कर सकते हैं। उदाहरण के लिए, क्लास ए सबनेट के लिए पहली पाश से चला जाता है 16MBके लिए 2GB-16MB, या से 16777216करने के लिए 2130706432। बाइनरी का प्रतिनिधित्व 16777216है 1000000000000000000000000या 00000001.00000000.00000000.00000000अगर हम इसे 8-बिट विखंडू में विभाजित करते हैं तो हम आसानी से देख सकते हैं कि 1.0.0.0डॉटेड-दशमलव संकेतन में मेल खाती है। इसी तरह, 2130706432के रूप में लिखा जा सकता है 01111111000000000000000000000000या 01111111.00000000.00000000.00000000या 127.0.0.0। प्रत्येक पूर्णांक, या पावर-ऑफ-दो पूर्णांक, यहां उपयोग किया जाता है इस फैशन में आईपी पते के रूप में फिर से लिखा जा सकता है।

इसलिए, प्रत्येक लूप पुनरावृत्ति के लिए, हम if()अलग-अलग कथनों को एक साथ जोड़कर, बाहर के पते को हटाने के लिए एक बयान का निर्माण करते हैं। चूंकि प्रत्येक में पहले बयान ifएक पूर्णांक (सापेक्ष परीक्षण करने के लिए धन्यवाद) है, शेष बूलियन मूल्यों के लिए या तो बदल दिए जाते हैं 0या 1झूठी / सच के लिए। यदि कोई भी कथन गलत है, तो संपूर्ण गुणनफल बदल जाएगा 0और इस प्रकार गलत होगा। इस प्रकार, केवल यदि सभी कथन सत्य हैं, तो क्या हम पार्सिंग के परिणाम का उत्पादन करेंगे।

थोड़ा अनगढ़:

# Class A
for($a=16MB;$a-lt2GB-16mb;$a++){
  $b=($a%16mb)                     # x.0.0.0
  $b*=(($a+1)%16mb)                # x.255.255.255
  $b*=($a-lt160MB-or$a-gt176MB)    # 10.0.0.0/8
  $b*=($a-lt1604MB-or$a-ge1608MB)  # 100.64.0.0/10
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

# Class B
for($a=2GB;$a-lt3GB;$a++){
  $b=($a%64kb)                           # x.y.0.0
  $b*=(($a+1)%64kb)                      # x.y.255.255
  $b*=(($a-lt2785152kb-or$a-gt2720mb))  # 169.254.0.0/16
  $b*=(($a-lt2753mb-or$a-gt2754mb))      # 172.16.0.0/12
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

# Class C
for($a=3221225728;$a-lt3.5GB;$a++){
  $b=($a%256)                               # x.y.z.0
  $b*=(($a+1)%256)                          # x.y.z.255
  $b*=(($a-lt3221225984-or$a-gt3221226240)) # 192.0.2.0/24
  $b*=(($a-lt3227017984-or$a-gt3151385kb)) # 192.88.99.0/24
  $b*=(($a-lt3156480kb-or$a-gt3156544kb)) # 192.168.0.0/16
  $b*=(($a-lt3245184kb-or$a-gt3245312kb)) # 198.18.0.0/15
  $b*=(($a-lt3247321kb-or$a-gt3325256959)) # 198.51.100.0/24
  $b*=(($a-lt3405803776-or$a-gt3405804032)) # 203.0.113.0/24
  if($b){([ipaddress]::Parse($a)).IPAddressToString}
}

1

बैच, 1930 1884 1848 1830 बाइट्स

@echo off
for /l %%a in (1,1,9)do call:a1 %%a
for /l %%a in (11,1,99)do call:a1 %%a
for /l %%b in (0,1,63)do call:a2 100 %%b
for /l %%b in (128,1,255)do call:a2 100 %%b
for /l %%a in (101,1,126)do call:a1 %%a
for /l %%a in (128,1,168)do call:b1 %%a
for /l %%b in (0,1,253)do call:b2 169 %%b
call:b2 169 255
call:b1 170
call:b1 171
for /l %%b in (0,1,15)do call:b2 172 %%b
for /l %%b in (32,1,255)do call:b2 172 %%b
for /l %%a in (173,1,191)do call:b1 %%a
call:c3 192 0 1
for /l %%c in (3,1,255)do call:c3 192 0 %%c
for /l %%b in (1,1,87)do call:c2 192 %%b
for /l %%c in (0,1,98)do call:c3 192 88 %%c
for /l %%c in (100,1,255)do call:c3 192 88 %%c
for /l %%b in (89,1,167)do call:c2 192 %%b
for /l %%b in (169,1,255)do call:c2 192 %%b
for /l %%a in (193,1,197)do call:c1 %%a
for /l %%b in (0,1,17)do call:c2 198 %%b
for /l %%b in (20,1,50)do call:c2 198 %%b
for /l %%c in (0,1,99)do call:c3 198 51 %%c
for /l %%c in (101,1,255)do call:c3 198 51 %%c
for /l %%b in (52,1,255)do call:c2 198 %%b
for /l %%a in (199,1,202)do call:c1 %%a
for /l %%c in (0,1,112)do call:c3 203 0 %%c
for /l %%c in (114,1,255)do call:c3 203 0 %%c
for /l %%b in (1,1,255)do call:c2 203 %%b
for /l %%a in (204,1,223)do call:c1 %%a
exit/b
:a1
for /l %%b in (0,1,255)do call:a2 %1 %%b
exit/b
:a2
for /l %%c in (0,1,255)do call:a3 %1 %2 %%c
exit/b
:a3
for /l %%d in (0,1,255)do if not %2%3%%d==000 if not %2%3%%d==255255255 echo %1.%2.%3.%%d
exit/b
:b1
for /l %%b in (0,1,255)do call:b2 %1 %%b
exit/b
:b2
for /l %%c in (0,1,255)do call:b3 %1 %2 %%c
exit/b
:b3
for /l %%d in (0,1,255)do if not %3%%d==00 if not %3%%d==255255 echo %1.%2.%3.%%d
exit/b
:c1
for /l %%b in (0,1,255)do call:c2 %1 %%b
exit/b
:c2
for /l %%c in (0,1,255)do call:c3 %1 %2 %%c
exit/b
:c3
for /l %%d in (1,1,254)do echo %1.%2.%3.%%d

संपादित करें: अनावश्यक स्थानों को हटाकर 46 82 बाइट्स सहेजे गए। के exit/bबजाय का उपयोग करके 18 बाइट्स बचाता है goto:eof


1
मैं 1872 बाइट्स गिनता हूं। आपको तकनीकी रूप से भी इसकी आवश्यकता नहीं है @echo off
Addison Crump

@FlagAsSpam शायद CR; नोटपैड उन्हें बचाना पसंद करता है।
नील

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