मैं आपके सबनेट में हूँ, आपका कोड गोल्फ कर रहा हूँ


17

चुनौती

addressडॉटेड-क्वाड नोटेशन subnetमें IPv4 और CIDR नोटेशन में IPv4 को देखते हुए , निर्धारित करें कि addressक्या अंदर है subnet। यदि यह अंदर है और यदि यह अंदर नहीं है subnet, तो एक अलग और सुसंगत मूल्य का उत्पादन करें subnet। जरूरी नहीं कि आउटपुट वैल्यू आपकी भाषा में सत्य / गलत हो।

CIDR सबनेट संकेतन संक्षिप्त प्राइमर

IPv4 नेटवर्क पतों की लंबाई 32 बिट्स है, पढ़ने में आसानी के लिए 8 बिट्स के चार समूहों में विभाजित। CIDR सबनेट नोटेशन बिट्स की निर्दिष्ट संख्या का एक मुखौटा है, जो सबसे बाईं ओर शुरू होता है। उदाहरण के लिए, एक /24सबनेट के लिए, इसका मतलब है कि पते के दाएं-8 बिट्स उस सबनेट में उपलब्ध हैं। इस प्रकार दो पते जो अलग-अलग होते हैं 255, और एक ही सबनेट मास्क होता है, एक ही सबनेट में होते हैं। ध्यान दें कि वैध CIDR में सभी होस्ट-बिट्स (दाहिने हाथ की तरफ) unset (शून्य) हैं।

xxxxxxxx xxxxxxxx xxxxxxxx 00000000
^---    subnet mask   ---^ ^-hosts-^

एक अन्य उदाहरण के लिए, एक /32सबनेट निर्दिष्ट करता है कि सभी बिट सबनेट मास्क हैं, अनिवार्य रूप से अर्थ है कि प्रति केवल एक मेजबान की अनुमति है /32

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
^---        subnet mask        ---^

उदाहरण:

True"सबनेट में" और Falseआउटपुट के रूप में "सबनेट में नहीं " के लिए उपयोग करना :

127.0.0.1
127.0.0.0/24
True

127.0.0.55
127.0.0.0/23
True

127.0.1.55
127.0.0.0/23
True

10.4.1.33
10.4.0.0/16
True

255.255.255.255
0.0.0.0/0
True

127.1.2.3
127.0.0.0/24
False

127.1.2.3
127.1.2.1/32
False

10.10.83.255
10.10.84.0/22
False

नियम और स्पष्टीकरण

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

क्या हमें आपके परीक्षण मामलों के समान प्रारूप में इनपुट लेना है?
अज्ञानता का अवतार

1
@EmbodimentofIgnorance आपको उन्हें उदाहरणों के अनुसार प्रति-पंक्ति के रूप में लेने की आवश्यकता नहीं है, लेकिन आपको उदाहरण के रूप में उन्हें डॉटेड-क्वाड और डॉटेड-सबनेट के रूप में लेने की आवश्यकता है। (उदाहरण के लिए,
अर्नुलद

क्या उन्हें स्लैश द्वारा अलग किया जाना ठीक है, जैसे 10.0.0.1/10.0.0.0”/16?
निक केनेडी

1
@ मैं मानता हूं कि आप सही हैं कि सीआईडीआर नोटेशन एक आईपी पते और एक सबनेट आकार का वर्णन करता है। के रूप में, 1.255.1.1/8एक वैध CIDR अभिव्यक्ति है , 1.255.1.1नेटवर्क 1.0.0.0में एक सबनेट मास्क के साथ मेजबान का प्रतिनिधित्व करता है 255.0.0.0। हालाँकि चुनौती विशेष रूप से CIDR संकेतन में नेटवर्क नंबर और सबनेट के लिए पूछती है, जो 1.255.1.1/8एक मान्य नेटवर्क नंबर और सबनेट संयोजन नहीं है।
640KB

1
अब हमें इस चुनौती के एक IPv6 संस्करण की भी आवश्यकता है
फेरीबिग

जवाबों:


13

पायथन 3 (62 बाइट्स)

बहुत सीधा:

from ipaddress import*
lambda i,m:ip_address(i)in ip_network(m)

9
अच्छा है, लेकिन क्या बकरियों को भी पहचानने के लिए अजगर के पास एक अंतर्निहित है ?
बेंजामिन यूरेखर्ट

3
बेशक गणितज्ञ के पास हर चीज के लिए एक निर्माण है - यहां तक ​​कि एक्सोप्लैनेट के लिए भी ! कुछ भी नहीं है कि हरा कर सकते हैं ... लेकिन जैसा कि आप देखा हो सकता था, अजगर मेथेमेटिका के बकरी formace से मेल खाता है
agtoever

मुझे आश्चर्य है कि अगर एक ip_adressवस्तु और एक ip_networkवस्तु का गठन होता है any convenient method, संभवतः पायथन को जीतने देता है, जब तक कि एक अजगर-आधारित गोल्फिंग भाषा में ये इसके प्रकार नहीं हैं?
मेरा सर्वनाम

आप इसे सामान्य पायथन में 20 बाइट्स की सीमा में नहीं पाएंगे। केवल स्टैक्स उत्तर की तुलना में केवल आयात और लैम्ब्डा पहले से ही लंबे हैं। यह कोई आश्चर्य की बात नहीं है कि गोल्फिंग भाषाएँ "सामान्य" भाषाओं से
जीतती

@someone: मैंने पायथन को x86-64 मशीन कोड के 53 बाइट्स के साथ हराया । :) नहीं एक पारंपरिक गोल्फ भाषा, और कोड आकार के अधिकांश स्ट्रिंग-> int मैन्युअल रूप से स्ट्रिंग है। (host^net)>>(32-mask)केवल 10 बाइट्स है। लेकिन यह सूचियों की सूचियों को शामिल नहीं करने या किसी कार्य को किसी सूची में मैप करने के कार्यों के बीच का आधा तरीका है, क्योंकि 2 या 3 बाइट अनुदेशों के साथ कई स्केलर ऑपरेशन किए जा सकते हैं, और कुछ बाइट्स में चीजों के चारों ओर लूप का निर्माण किया जा सकता है।
पीटर कॉर्डेस

4

सी # (विजुअल सी # कंपाइलर) , 250 + 31 = 281 बाइट्स

(a,b)=>{Func<string,string>h=g=>string.Join("",g.Split('.').Select(x=>{var e=Convert.ToString(int.Parse(x),2);while(e.Length<8)e='0'+e;return e;}));a=h(a);var c=b.Split('/');b=h(c[0]);var d=int.Parse(c[1]);return a.Substring(0,d)==b.Substring(0,d);};

बायटेकाउंट में शामिल हैं using System;using System.Linq;

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

मैंने इसे जेएस में लिखा था जैसे ही चुनौती पोस्ट की गई, लेकिन अर्नुल ने मुझे बहुत बेहतर जवाब के साथ पंच के लिए हराया, इसलिए यहां यह सी # के बजाय है।

निश्चित रूप से गोल्फ के लिए बहुत जगह है।

स्पष्टीकरण:

फ़ंक्शन में उप-फ़ंक्शन होते हैं जिन्हें कहा जाता है h:

h=g=>string.Join("",
    g.Split('.').Select(x => {
        var e = Convert.ToString(int.Parse(x), 2);
        while (e.Length < 8) e = '0' + e;
        return e;
    }
);

यह उप-कार्य आईपी पते को विभाजित करता है ., प्रत्येक संख्या को एक बाइनरी स्ट्रिंग में परिवर्तित करता है, प्रत्येक स्ट्रिंग 0को 8 बिट लंबा करने के लिए प्रत्येक स्ट्रिंग को बाएं-पैड में परिवर्तित करता है , फिर स्ट्रिंग को एक 32-बिट बाइनरी स्ट्रिंग में जोड़ता है।

यह तुरंत a=h(a);दिए गए IP पते पर इन-प्लेस किया गया है।
हमने तब सबनेट मास्क को आईपी एड्रेस और मास्क नंबर के साथ विभाजित कियाc=b.Split('/');

IP पता घटक को हमारे उप-फ़ंक्शन के माध्यम से भी पास किया जाता है: b=h(c[0]);और मुखौटा संख्या एक पूर्णांक पर पार्स की जाती है:var d=int.Parse(c[1]);

अंत में हम dदोनों बाइनरी स्ट्रिंग्स (जहां dमुखौटा संख्या है) के पहले बिट्स लेते हैं और उनकी तुलना करते हैं:return a.Substring(0,d)==b.Substring(0,d);


1
यह काम करने के लिए बहुत थक गया तो मैं सिर्फ तुम्हारे लिए तुम्हारी खातिरदारी करता हूं
डाटा

1
वास्तव में PadLeft के बारे में भूल गए कि यह
समय सीमा समाप्त डेटा

अनुकूलन के बहुत सारे। मुझे आपको यह बताते हुए खुशी हो रही है कि आपका rPadएक बिल्ट-इन स्ट्रिंग्स है। TIO लिंक के लिए पास्टबिन लिंक जो कि बहुत लंबा है
मेरा सर्वनाम

2
@someone छोटे जानकारी के लिए: जैसे URL शॉर्टनर tinyurl.com इस एसई को टिप्पणियों के लिए अनुमति दी जाती है, सबसे अधिक के विपरीत है। :)
केविन क्रूज़सेन

1
188 - tinyurl.com/y6xfkbxt - अच्छा url छोटा करने के नुस्खे @ केविनक्रूजसेन
दाना

4

Linux POSIX शेल (नेट-टूल्स / आईपूटिल्स के साथ) (34 बाइट्स नॉन-टर्मिनेटिंग, 47 बाइट्स टर्मिनेटिंग)

नेटवर्क उपयोगिताओं की तुलना में नेटवर्क मास्क और पतों के लिए सबसे उपयुक्त क्या है? :)

route add -net $2 reject;! ping $1

चेतावनी: स्क्रिप्ट संभावित रूप से आपके इंटरनेट कनेक्टिविटी के लिए हानिकारक है, कृपया ध्यान से चलाएं।

इनपुट: स्क्रिप्ट परीक्षण आईपी पते को पहले तर्क और परीक्षण किए गए सबनेट के रूप में लेता है। दूसरे तर्क के रूप में।

आउटपुट: स्क्रिप्ट एक सत्य मान देता है (0) यदि स्क्रिप्ट का पहला तर्क दूसरे तर्क में इंगित सबनेट से संबंधित है। अन्यथा, यह कभी समाप्त नहीं होगा।

मान्यताओं: स्क्रिप्ट को रूट उपयोगकर्ता के रूप में चलाया जाना चाहिए, स्वच्छ वातावरण में ( अर्थात , व्यवस्थापक द्वारा कोई अन्य ब्लैकहोल मार्ग निर्धारित नहीं किया गया है, और यदि स्क्रिप्ट का पिछला उदाहरण चलाया गया है, तो इसे बनाया गया ब्लैकहोल रूट हटा दिया गया है )। स्क्रिप्ट "कार्यशील इंटरनेट कनेक्शन" भी मानती है ( यानी , एक वैध डिफ़ॉल्ट मार्ग मौजूद है)।


स्पष्टीकरण:

हम निर्दिष्ट सबनेट पर एक ब्लैकहोल मार्ग बनाते हैं । हम पिंग का उपयोग करके प्रदान किए गए आईपी पते से कनेक्टिविटी का परीक्षण करते हैं । यदि पता सबनेट से संबंधित नहीं है (और चूंकि हम ठीक से इंटरनेट कनेक्शन सेट करते हैं), तो पिंग उस पते पर पैकेट भेजने की कोशिश करेगा। ध्यान दें कि क्या यह पता वास्तव में प्रतिक्रिया करता है, इससे कोई फर्क नहीं पड़ता, क्योंकि पिंग हमेशा के लिए प्रयास करता रहेगा। इसके विपरीत, यदि पता सबनेट से संबंधित है, तो पिंग ENETUNREACH के साथ विफल हो जाएगा और 2 वापस आ जाएगा , और चूंकि हमने कमांड को नकार दिया था, लिपि सफल होगी।


उदाहरण

टेस्ट करें कि क्या 5.5.5.5 8.8.8.0/24 के अंतर्गत आता है

$ sudo ./a.sh 5.5.5.5 8.8.8.0/24
PING 5.5.5.5 (5.5.5.5) 56(84) bytes of data.
[...runs forever...]

( sudo ip route del 8.8.8.0/24कमांड चलाने के बाद साफ करें )।

परीक्षण करें कि क्या 5.5.5.5 5.5.5.0/24 के अंतर्गत आता है:

$ sudo ./a.sh 5.5.5.5 5.5.5.0/24
connect: Network is unreachable
$ echo $?
0

( sudo ip route del 5.5.5.0/24कमांड चलाने के बाद साफ करें )।

टेस्ट करें कि क्या 8.8.8.8 5.5.5.0/24 के अंतर्गत आता है:

$ sudo ./a.sh 8.8.8.8 5.5.5.0/24
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=122 time=2.27 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=122 time=1.95 ms
[...runs forever...]

( sudo ip route del 5.5.5.0/24कमांड चलाने के बाद साफ करें )।


47-बाइट संस्करण यदि हम गैर-समाप्ति स्क्रिप्ट को अस्वीकार करते हैं

route add -net $2 reject;ping -c1 $1;[ $? = 2 ]

@ ग्रैमी की टिप्पणी के अनुसार, यहां वह संस्करण जो हमेशा समाप्त होता है, और 0 (सत्य) लौटाता है यदि पता सबनेट में है, और 1 (झूठा) अन्यथा। हम पिंग को -c1ध्वज के साथ समाप्त करते हैं, जो भेजे गए पैकेट की संख्या को 1 तक सीमित करता है। यदि पते का जवाब दिया जाता है, तो पिंग 0 वापस आ जाएगा, और यदि नहीं, तो पिंग वापस आ जाएगा। 1. केवल यदि पता ब्लैकहोल्ड सबनेट से संबंधित है, तो पिंग 2 वापस आ जाएगा । इस प्रकार हम अंतिम आदेश में किसके खिलाफ परीक्षण करते हैं।


3
जबकि चतुर, इस उत्पादन के लिए आवश्यकता एक विशिष्ट और लगातार मूल्य को पूरा नहीं करता है, तो पता सबनेट में नहीं है ( हमेशा के लिए चल रहे एक आउटपुट के रूप में शामिल नहीं किये जाते , यह भी देखना यह )।
ग्रिम्मी

1
@ चिकना: लेकिन यह चुपचाप हमेशा के लिए नहीं चलता है, इसलिए केवल आपका 2 लिंक लागू होता है, पहले नहीं। इसके अलावा pingअगर मुझे लगता है कि यह SIGPIPE से मर जाएगा अगर यह stdout + stderr के साथ दूसरे प्रोग्राम में चला गया, और पाठक ने पाइप बंद कर दिया। और यह सबसे संभावित उपयोग-मामला है क्योंकि बाहर निकलने की स्थिति या तो सफलता हो सकती है (यदि हमने -c1गिनती सेट करने के लिए पिंग के लिए एक विकल्प जोड़ा है ।) लेकिन निश्चित रूप से, इसके आउटपुट को पढ़ना var=$(/a.sh)विफल हो जाएगा; आपको एक ऐसे पाठक की आवश्यकता होगी जो निर्णय लेने के बाद रुके, बल्कि पूरे आउटपुट को पढ़े और फिर उसे देखे।
पीटर कॉर्ड्स

@ ग्रैमी फेयर पॉइंट (हालांकि तर्क के लिए मैं कह सकता हूं कि हमारे यहां दो सुसंगत मूल्य हैं, क्योंकि pingब्लैकहोल पते के मामले में एक सेकेंड से भी कम समय में समाप्त होगा, कहते हैं)। मैंने एक अतिरिक्त 13 बाइट्स के लिए एक समाप्ति संस्करण जोड़ा! :)
योना

3

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

के रूप में इनपुट लेता है (address)(subnet)। एक बूलियन मान लौटाता है।

a=>s=>!([s,v]=s.split`/`,+v&&(g=s=>s.split`.`.map(k=v=>k=k<<8|v)|k>>32-v)(a)^g(s))

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


3

PHP , 101 92 88 बाइट्स

-13 बाइट्स @gwaugh से

function($i,$r){[$r,$n]=explode('/',$r);return(ip2long($i)&~(1<<32-$n)+1)==ip2long($r);}

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


2
कुछ मज़ा आया था इसे (Ty!):function($i,$r){return!((ip2long($i)^ip2long(strtok($r,'/')))>>32-strtok(_));}
क्रिस्टोफ़

@Christoph बहुत अच्छा! मेरे साथ ऐसा कभी नहीं हुआ कि आप दूसरी कॉल के लिए किसी भी टोकन का उपयोग कर सकें strtok()। तुम्हारा 4 बाइट्स मेरे बहुत समान जवाब से कम है। रंगमंच की सामग्री!
640KB

@Christoph आपको अपना समाधान एक अलग उत्तर के रूप में पोस्ट करना चाहिए क्योंकि यह मेरी तुलना में बेहतर है।
लुइस फेलिप डी जीसस मुनोज

3

PowerPC / PPC64 C, 116 114 बाइट्स

#include<stdio.h>
main(){unsigned u[4];char*p=u;for(;p<u+3;)scanf("%hhu%c",p++,u+3);return!((*u^u[1])>>32-p[-4]);}

(X86_64 Ubuntu 18.04 पर पॉवरपैक 64-लाइनक्स-ग्नू-जीसीसी-स्टैटिक और क्यूमू-उपयोगकर्ता का उपयोग करके परीक्षण किया गया।)

कार्यक्रम मानक इनपुट पर दो पंक्तियों को लेता है, और इसके बाहर निकलने के कोड के रूप में यह पता 1 से मेल खाता है और यदि ऐसा नहीं होता है तो 0। (तो यह एक मैच के लिए एक सत्य मूल्य और एक बेमेल के लिए एक गलत मूल्य की आवश्यकता नहीं है विनिर्देश पर निर्भर करता है।) ध्यान दें कि यदि आप अंतःक्रियात्मक रूप से चल रहे हैं, तो आपको ^Dदूसरी पंक्ति में प्रवेश करने के बाद तीन बार ईओएफ ( ) संकेत देना होगा ।

यह पावरपीसी के बड़े-एंडियन होने पर निर्भर करता है, और उस प्लेटफ़ॉर्म पर 0 भी है, जो 32-बिट अहस्ताक्षरित मान को दाईं ओर शिफ्ट करने के लिए 0 है। यह ऑक्टेट को अहस्ताक्षरित मानों में एक-एक करके पढ़ता है, साथ ही एक अन्य बाइट में नेटमास्क लंबाई के साथ। ; तब यह दो अहस्ताक्षरित 32-बिट पतों का xor लेता है और अप्रासंगिक बिट्स को स्थानांतरित करता है। अंत में, यह !केवल दो अलग-अलग मूल्यों पर लौटने की आवश्यकता को पूरा करने के लिए लागू होता है।

यह ध्यान दें u+3 साथ दो बाइट्स को शेव करना pऔर इसके साथ संकलन की आवश्यकता हो सकती है -O0। हालांकि मैं जितना देखभाल करता हूं उससे कहीं अधिक खतरनाक तरीके से जी रहा हूं।

इस समाधान के लिए प्रेरणा के लिए पीटर कॉर्ड्स का धन्यवाद।


अधिक पोर्टेबल सी, 186 171 167 बाइट्स

यहाँ मैं एक और अधिक पोर्टेबल संस्करण संरक्षित करूँगा जो 167 बाइट चलाता है।

#include<stdio.h>
main(){unsigned a,b,c,d,e,f,g,h,n;scanf("%u.%u.%u.%u %u.%u.%u.%u/%u",&a,&b,&c,&d,&e,&f,&g,&h,&n);return!(n&&((((a^e)<<8|b^f)<<8|c^g)<<8|d^h)>>32-n);}

यह प्रोग्राम मानक इनपुट पर दो पंक्तियों को लेता है, और यदि पता सबनेट में है, तो एग्ज़िट कोड 1 लौटाता है और यदि ऐसा नहीं है तो 0। (इसलिए यह विनिर्देशन पर निर्भर करता है कि मैचों के लिए सत्य मूल्य और गैर मैचों के लिए गलत मूल्य की आवश्यकता नहीं है।)

मुख्य अभिव्यक्ति का टूटना:

  • a^e, b^f, c^g, d^hपते की XOR और बाइट-दर-बाइट मुखौटा गणना करता है।
  • (((a^e)<<8|b^f)<<8|c^g)<<8|d^h फिर उन्हें हॉर्नर जैसी विधि द्वारा एकल अहस्ताक्षरित 32-बिट मान में संयोजित करता है।
  • ...>>32-nफिर xor अंतर के बिट्स को शिफ्ट करें जो सबनेट मास्क के लिए प्रासंगिक नहीं हैं (ध्यान में रखते हुए कि -C की तुलना में अधिक पूर्वता है <<)
  • एक गोटा है, हालांकि: अगर n = 0 तो ~0U<<32अपरिभाषित व्यवहार देगा यह मानते हुए unsignedकि 32 बिट्स है (जो कि लगभग सभी मौजूदा प्लेटफार्मों पर है)। दूसरी ओर, यदि n = 0 है तो कोई भी पता मेल खाएगा, इसलिए n&&...सही परिणाम देगा (व्यवहार के लघु-परिचालित व्यवहार का लाभ उठाते हुए)&& )।
  • अंत में, इस आवश्यकता को पूरा करने के लिए कि आउटपुट केवल दो मानों में से एक हो सकता है, हम !आउटपुट 0 या 1 पर लागू होते हैं ।

-सीलिंग और AdmBorkBork द्वारा टिप्पणियों के कारण 15 बाइट्स

पीटर कॉर्ड्स की टिप्पणी के कारण -4 बाइट्स


1
मान वापस करने के लिए निकास कोड का उपयोग करना डिफ़ॉल्ट I / O विधियों में से एक है और इस प्रकार इसकी अनुमति है।
AdmBorkBork

@ एसेलिंगकट, बेशक, मुझे याद करने के लिए कितना मूर्ख है।
डैनियल स्कल्पर

@AdmBorkBork ठीक है, धन्यवाद, मैंने इसे एक्जिट कोड का उपयोग करने के लिए बदल दिया है।
डैनियल स्कल्पर

विचार: एक छोटे-एंडियन या बड़े-एंडियन सी कार्यान्वयन (कोड-गोल्फ को पोर्टेबल कोड की आवश्यकता नहीं है) और एक के बाइट्स पर टाइप-पेन आउटपुट पॉइंटर्स को लक्षित करें unsigned। जैसे कि char*p=&aतब p++,p++,p++,...या p--,...स्कैनफ़ अर्ग्स के रूप में। प्रारूप स्ट्रिंग को "%hhu.%hhu..."हालांकि होने की आवश्यकता होगी , इसलिए यह उस अतिरिक्त आकार के बीच एक महत्वपूर्ण ट्रेडऑफ है जो कम संस्करण की घोषणा करता है और ऐसा करने में सक्षम है(a^b)>>(32-count)
पीटर कॉर्ड्स

1
@PeterCordes हाँ, सही बदलाव काम करता है, धन्यवाद।
डैनियल शेपलर

2

स्टेक्स , 22 बाइट्स

é.○▄╗jF⌐§╥§I╓☻lw«ç┴║╫┼

इसे चलाएं और डीबग करें

यह इनपुट मापदंडों को अंतरिक्ष-मानक इनपुट पर अलग करता है।

अनपैक्ड, अनगुल्फेड और टिप्पणी की गई, यह इस तरह दिखता है।

'/:/~       split on slash and push the last group back to the input stack
j{          split on space; for each group, run this code block
  './       split on period
  {emVB|E   evaluate integers and decode integer as base-256
  ;e|<      peek from input stack and shift left
  Vu/       integer divide by 2^32
F           end of for-each
=           two values left on stack are equal?

इसको चलाओ


2

x86-64 मशीन कोड फ़ंक्शन, 53 48 बाइट्स

चैंज:

  • विशेष मामले jzको संभालने के लिए 64-बिट शिफ्ट का उपयोग करने के बजाय शिफ्ट पर -2 >>(32-0)
  • एएल के बजाय जेडएफ में -3 ​​वापसी, ए के लिए 3 बाइट्स की बचत setnz al

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


सबनेट में ZF = 0 होस्ट के लिए नहीं , सबनेट में ZF = 1 के लिए लौटाता है , तो आप परिणाम के साथ शाखा कर सकते हैंje host_matches_subnet

X86-64 सिस्टम V कॉलिंग कन्वेंशन के साथ कॉल करने योग्य जैसे
bool not_in_subnet(int dummy_rdi, const char *input_rsi);कि आप में जोड़ते हैंsetnz al

इनपुट स्ट्रिंग में होस्ट और नेटवर्क दोनों शामिल होते हैं, जो बिल्कुल 1-अंकीय वर्ण द्वारा अलग किए जाते हैं। CIDR चौड़ाई के अंत के बाद वाली मेमोरी में पेज के अंत से पहले कम से कम 3 गैर-अंक बाइट्स होना चाहिए। (ज्यादातर मामलों में एक समस्या नहीं होनी चाहिए, जैसे कि cmdline arg के लिए।) डैनियल के 32-बिट संस्करण में यह सीमा नहीं है।

हम एक ही डॉटेड-क्वाड पार्स लूप को 3 बार चलाते हैं, दो आईपीवी 4 पते प्राप्त कर रहे हैं, और प्राप्त कर रहे हैं /mask एक डॉर्ड के उच्च बाइट में पूर्णांक रूप में । (यही कारण है कि बाद में पढ़ने योग्य मेमोरी होनी चाहिए /mask, लेकिन एएससीआईआई अंक होने पर कोई फर्क नहीं पड़ता।)

हम (host ^ subnet) >> (32-mask)मेजबान बिट्स (बेमेल की अनुमति देने वाले) को बाहर करने के लिए करते हैं, जिससे सबनेट और होस्ट के बीच का अंतर ही रह जाता है। उस /0विशेष मामले को हल करने के लिए जहां हमें 32 से शिफ्ट करने की आवश्यकता है, हम काउंट = 0 पर शिफ्ट में कूदते हैं। ( neg clZF सेट करता है, जिसे हम शिफ्ट कर सकते हैं और यदि हम शिफ्ट नहीं होते हैं तो रिटर्न वैल्यू के रूप में छोड़ सकते हैं ।) ध्यान दें कि 32-mask mod 32 = -mask, और x86 स्केलर शिफ्टर्स अपनी गिनती को मास्क करके & 31या & 63

    line  addr   machine                NASM source.  (from nasm -felf64 -l/dev/stdout)
    num          code bytes

     1                             %use smartalign
     2                             
     3                                 ;10.4.1.33 10.4.0.0/23         true
     4                                 ;10.4.1.33 10.4.0.0/24         false
     5                             
     6                             ;; /codegolf/185005/im-in-your-subnets-golfing-your-code
     7                             %ifidn __OUTPUT_FORMAT__, elf64
     8                             in_subnet:
     9                             
    10 00000000 6A03                   push 3
    11 00000002 5F                     pop  rdi                    ; edi = 3 dotted-quads to parse, sort of.
    12                             .parseloop:
    13                             
    14                                 ;xor  ebx,ebx             ; doesn't need to be zeroed first; we end up shifting out the original contents
    15                                 ;lea  ecx, [rbx+4]
    16 00000003 6A04                   push   4
    17 00000005 59                     pop    rcx                  ; rcx = 4 integers in a dotted-quad
    18                             .quadloop:
    19                             
    20 00000006 31D2                   xor   edx,edx               ; standard edx=atoi(rdi) loop terminated by a non-digit char
    21 00000008 EB05                   jmp  .digit_entry
    22                              .digitloop:
    23 0000000A 6BD20A                 imul   edx, 10
    24 0000000D 00C2                   add    dl, al
    25                              .digit_entry:
    26 0000000F AC                     lodsb
    27 00000010 2C30                   sub    al, '0'
    28 00000012 3C09                   cmp    al, 9
    29 00000014 76F4                   jbe   .digitloop
    30                                 ; al=non-digit character - '0'
    31                                 ; RDI pointing to the next character.
    32                                 ; EDX = integer
    33                             
    34 00000016 C1E308                 shl    ebx, 8
    35 00000019 88D3                   mov    bl, dl               ; build a quad 1 byte at a time, ending with the lowest byte
    36 0000001B E2E9                   loop .quadloop
    37                             
    38 0000001D 53                     push   rbx          ; push result to be collected after parsing 3 times
    39 0000001E FFCF                   dec    edi
    40 00000020 75E1                   jnz   .parseloop
    41                             
    42 00000022 59                     pop    rcx   ; /mask  (at the top of a dword)
    43 00000023 5A                     pop    rdx   ; subnet
    44 00000024 58                     pop    rax   ; host
    45 00000025 0FC9                   bswap  ecx   ; cl=network bits  (reusing the quad parse loop left it in the high byte)

    49 00000027 F6D9                   neg    cl
    50 00000029 7404                   jz   .all_net     ; skip the count=32 special case
    51                             
    52 0000002B 31D0                   xor    eax, edx   ; host ^ subnet
    53 0000002D D3E8                   shr    eax, cl    ; shift out the host bits, keeping only the diff of subnet bits
    54                             
    55                             .all_net:
    56                                ; setnz  al         ; return ZF=1 match,  ZF=0 not in subnet
    57 0000002F C3                     ret
    58 00000030 30                 .size:      db $ - in_subnet

              0x30 = 48 bytes

(नवीनतम संस्करण के साथ अद्यतन नहीं) इसे ऑनलाइन आज़माएं!

इसमें _startवह भी शामिल है जो इसे कॉल करता है argv[1]और एक निकास स्थिति देता है।

## on my desktop
$ ./ipv4-subnet "10.4.1.33 10.4.0.0/24"    && echo "$? : in subnet" || echo "$? : not in subnet"
not in subnet

$ ./ipv4-subnet "10.4.1.33 10.4.0.0/23"    && echo "$? : in subnet" || echo "$? : not in subnet"
in subnet

यह ठीक काम करता है यदि आप एक कमांड लाइन arg पास करते हैं जिसमें एक स्थान के बजाय एक नई रेखा होती है। लेकिन इसके बजाय होना है , साथ ही नहीं।


x86 32-बिट मशीन कोड फ़ंक्शन, 38 बाइट्स

9 पूर्णांक करें -> uint8_t पार्स और उन्हें स्टैक पर "पुश" करें, जहां हम उन्हें पासवर्ड के रूप में पॉप करते हैं या सीएल में अंतिम एक का उपयोग करते हैं। स्ट्रिंग के अंत में अतीत को पढ़ने से बचा जाता है।

इसके अलावा, dec 32-बिट मोड में केवल 1 बाइट है।

    72                             in_subnet:
    73 00000000 89E7                   mov   edi, esp
    74 00000002 51                     push  ecx
    75 00000003 51                     push  ecx                   ; sub esp,8
    76                             .byteloop:
    77                             
    78 00000004 31C9                   xor   ecx,ecx               ; standard ecx=atoi(rdi) loop terminated by a non-digit char
    79                                                             ; runs 9 times: 8 in two dotted-quads, 1 mask length
    80 00000006 EB05                   jmp  .digit_entry
    81                              .digitloop:
    82 00000008 6BC90A                 imul   ecx, 10
    83 0000000B 00C1                   add    cl, al
    84                              .digit_entry:
    85 0000000D AC                     lodsb
    86 0000000E 2C30                   sub    al, '0'
    87 00000010 3C09                   cmp    al, 9
    88 00000012 76F4                   jbe   .digitloop
    89                                 ; RDI pointing to the next character.
    90                                 ; EDX = integer
    91                             
    92 00000014 4F                     dec    edi
    93 00000015 880F                   mov    [edi], cl           ; /mask store goes below ESP but we don't reload it
    94 00000017 39E7                   cmp    edi, esp
    95 00000019 73E9                   jae   .byteloop
    96                             
    97                                 ;; CL = /mask still there from the last conversion
    98                                 ;; ESP pointing at subnet and host on the stack, EDI = ESP-1
    99                             
   100 0000001B 5A                     pop    edx   ; subnet
   101 0000001C 58                     pop    eax   ; host
   102                             
   103 0000001D 31D0                   xor    eax, edx             ; host ^ subnet
   104 0000001F F6D9                   neg    cl                   ; -mask = (32-mask) mod 32;  x86 shifts mask their count
   105 00000021 7402                   jz     .end                 ; 32-n = 32 special case
   106 00000023 D3E8                   shr    eax, cl
   107                             .end:
   108                                 ; setz  al                  ; just return in ZF
   109 00000025 C3                     ret

   110 00000026 26                 .size:      db $ - in_subnet
      0x26 = 38 bytes

परीक्षण करने वाला

   113                             global _start
   114                             _start:
   115 00000027 8B742408               mov    esi, [esp+8]   ; argv[1]
   116 0000002B E8D0FFFFFF             call   in_subnet
   117 00000030 0F95C3                 setnz  bl
   118 00000033 B801000000             mov    eax, 1         ; _exit syscall
   119 00000038 CD80                   int    0x80

मुझे उत्सुकता है कि 32-बिट asm बाइट की गिनती कैसे होगी यदि आप इसके बजाय cmp/jccउल्लेख करते हैं कि आपने कुछ ऐसा किया है xor edx,edx;neg cl;cmovz eax,edx;shr eax,cl- या शायद आपके पास पहले से ही कहीं न कहीं 0 मान लटका हुआ है। (और फिर आपको sub cl,32निर्देश की आवश्यकता नहीं होगी ।)
डैनियल शेपलर

1
हाँ, ऐसा लगता है ediकि लूप से बाहर निकलने पर 0 xor eax,edx;neg cl;cmovz eax,edi;shr eax,clहोना चाहिए , इसलिए काम करना चाहिए।
डैनियल शेपलर

1
अगर मैंने चीजों को सही गिना है, तो cmove eax,edi3 बाइट्स हैं, जो हटाए गए पर एक वॉश है sub cl,32तो shr cl,eaxएक बाइट को बचाता है shr cl,raxऔर 32-बिट dec edi64-बिट पर एक बाइट बचाता है dec edi। मेरी असेंबली तब .byte 0x33(GNU बिन्यूटिल सिंटैक्स में) = 51 देती है in_subnet.size
डैनियल शेपलर

अच्छा विचार है, धन्यवाद। (इंटेल सिंटैक्स में shr eax,cl, बनाम shr %cl, %eaxएटी एंड टी सिंटैक्स में, आपकी अंतिम टिप्पणी उलट है।) यह मशीन-कोड के जवाबों को अपडेट करने के लिए एक राग है (और _startकॉलर को पोर्ट करता है और 32-बिट मोड के लिए कॉलिंग कन्वेंशन का पुन: वर्णन करता है।) ।), तो मैं इसके आसपास नहीं मिल सकता है। आज आलस्य महसूस करेंगे। >। <
पीटर कॉर्डेस

1
मैंने सिर्फ दोहरे पाश से छुटकारा पाने के बारे में मेरे जवाब पर डाली गई टिप्पणी को लागू करने का प्रयास किया और इसके बजाय स्टैक चर में संग्रहित किया - और यहां तक ​​कि अतिरिक्त कोड के साथ लिखने के सूचक को प्रारंभिक करने के लिए edi, आउटपुट लिखें, आदि। यह 2 बाइट्स को बचाते हुए समाप्त हो गया। कुल मिलाकर। (एक बार मैंने महसूस किया कम से कम push ecx;push ecx;push ecxकी तुलना में कम था sub esp,12, और यह एक धोने लग रहा था कि क्या मैं predecremented ediऔर प्रयोग किया जाता std;stosb;cldहै या फिर मैं तो बस का उपयोग करके संग्रहीत dec edi;mov [edi],al
डैनियल Schepler

1

जेली , 23 बाइट्स

ṣ”/ṣ€”.Vḅ⁹s2+Ø%BḊ€ḣ€ʋ/E

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

मोनाडिक लिंक जो पते और सबनेट को एक स्लैश द्वारा अलग करता है और 1 सच के लिए और 0 झूठे के लिए देता है।

मूल में दोष को इंगित करने के लिए @gwaugh का धन्यवाद - यह सुनिश्चित करने में विफल रहा कि बाइनरी सूची 32 लंबी थी।



1

05AB1E , 21 बाइट्स

'/¡`U‚ε'.¡b8jð0:JX£}Ë

पते से पहले सबनेट लेता है।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

'/¡              '# Split the first subnet-input by "/"
   `              # Push both values separated to the stack
    U             # Pop and store the trailing number in variable `X`
                 # Pair the subnet-IP with the second address-input
     ε            # Map both to:
      '.¡        '#  Split on "."
         b        #  Convert each integer to binary
          8j      #  Add leading spaces to make them size 8
          ð0:     #  And replace those spaces with "0"
             J    #  Join the four parts together to a single string
              X£  #  And only leave the first `X` binary digits as substring
                # After the map: check if both mapped values are the same
                  # (which is output implicitly as result)

1

आर 120 बाइट्स

एक फ़ंक्शन - मैंने पहले कार्यकाल के लिए ".32" चिपकाया

w=function(a,b){f=function(x)as.double(el(strsplit(x,"[./]")));t=f(paste0(a,".32"))-f(b);sum(t[-5]*c(256^(3:0)))<2^t[5]}

और सिर्फ मनोरंजन के लिए:

require("iptools");w=function(a,b)ips_in_cidrs(a,b)[[2]]

जो 56 बाइट्स है


1

पीएचपी ,75 73, 71 बाइट्स

<?=strtok($argv[2],'/')==long2ip(ip2long($argv[1])&1+~1<<32-strtok(_));

कमांड लाइन आर्ग्स से इनपुट लेने वाले स्टैंडअलोन के रूप में @Luis felipe De jesus Munoz का उत्तर कांटा है । '1'सत्य के लिए आउटपुट , ''(खाली स्ट्रिंग) फस्ले के लिए।

$ php ipsn.php 127.0.0.1 127.0.0.0/24
1
$ php ipsn.php 127.1.2.3 127.0.0.0/24

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

-2 बाइट्स के लिए @Christoph की छोटी ट्रिक strtok()। उनका जवाब हालांकि अभी भी छोटा है!


1

x86 विधानसभा समारोह, 49 43 बाइट्स

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

यह फ़ंक्शन esiकिसी इनपुट स्ट्रिंग को इंगित करने की अपेक्षा करता है, जिसमें पता और सबनेट भागों के साथ या तो एक स्पेस या एक न्यूलाइन वर्ण द्वारा अलग किया जाता है, और रिटर्न वैल्यू जेडएफ फ्लैग में है (जो कि परिभाषा में केवल दो संभावित मान हैं)।

 1                                  %use smartalign
 2                                  
 3                                      ;10.4.1.33 10.4.0.0/23         true
 4                                      ;10.4.1.33 10.4.0.0/24         false
 5                                  
 6                                  ;; /codegolf/185005/im-in-your-subnets-golfing-your-code
 7                                  in_subnet:
 8                                  
 9                                      ;xor  ebx,ebx             ; doesn't need to be zeroed first; we end up shifting out the original contents
10                                      ;lea  ecx, [rbx+4]
11 00000000 6A09                        push   9
12 00000002 59                          pop    ecx                  ; ecx = 9 integers (8 in two dotted-quads,
13                                                                  ; 1 mask length)
14                                  
15 00000003 89E7                        mov   edi, esp
16 00000005 83EC0C                      sub   esp, 12
17                                  .quadloop:
18                                  
19 00000008 31D2                        xor   edx,edx               ; standard edx=atoi(rdi) loop terminated by a non-digit char
20 0000000A EB05                        jmp  .digit_entry
21                                   .digitloop:
22 0000000C 6BD20A                      imul   edx, 10
23 0000000F 00C2                        add    dl, al
24                                   .digit_entry:
25 00000011 AC                          lodsb
26 00000012 2C30                        sub    al, '0'
27 00000014 3C09                        cmp    al, 9
28 00000016 76F4                        jbe   .digitloop
29                                      ; al=non-digit character - '0'
30                                      ; RDI pointing to the next character.
31                                      ; EDX = integer
32                                  
33 00000018 4F                          dec    edi
34 00000019 8817                        mov    [edi], dl
35 0000001B E2EB                        loop .quadloop
36                                  
37 0000001D 59                          pop    ecx   ; /mask  (at the top of a dword)
38 0000001E 5A                          pop    edx   ; subnet
39 0000001F 58                          pop    eax   ; host
40 00000020 0FC9                        bswap  ecx   ; cl=network bits  (reusing the quad parse loop left it in the high byte)
41                                  
42                                  ;    xor    cl, -32    ; I think there's some trick like this for 32-n or 31-n, but maybe only if we're masking to &31?  Then neg or not work.
43                                  
44 00000022 31D0                        xor    eax, edx   ; host ^ subnet
45                                  ;    xor    edx, edx   ; edx = 0
46 00000024 F6D9                        neg    cl
47 00000026 7402                        jz     .end
48 00000028 D3E8                        shr    eax, cl    ; count=32 special case isn't special for a 64-bit shift
49                                  .end:    
50 0000002A C3                          ret
51 0000002B 2B                      .size:      db $ - in_subnet

और x86 लिनक्स रैपर हिस्सा:

53                                  global _start
54                                  _start:
55 0000002C 8B742408                    mov    esi, [esp+8]   ; argv[1]
56 00000030 E8CBFFFFFF                  call   in_subnet
57 00000035 0F95C0                      setnz  al
58 00000038 0FB6D8                      movzx  ebx, al
59 0000003B B801000000                  mov    eax, 1         ; _exit syscall
60 00000040 CD80                        int    0x80

जेडएफ में मूल्य वापस करने के लिए पीटर कॉर्ड्स के सुझाव के कारण -6 बाइट्स।


मुझे लगता है कि मैं एक बाइट को अंतिम हटाकर xor edx,edxऔर उसके cmovz eax,edxसाथ बदलकर बचा सकता हूं jz .nonzero; xor eax,eax; .nonzero:cmovzअभी भी अगर हम सम्मेलन बुला रहे हैं तो जीतता है ebx=0
डैनियल शेपलर

क्या हम सेटेज़ या रिट jzसे अधिक बस ले सकते हैं shr? हम इसमें मदद setnzकरने के लिए स्वैप कर सकते हैं setzऔर 1मैच के लिए लौट सकते हैं । या यहाँ तक कि कहते हैं कि हमारे द्वारा दिया गया मान है जेडएफ। मुझे अपने जवाब में ऐसा करना चाहिए था। (लेकिन मुझे नहीं लगता कि हम कॉल करने वाले को हमारे लिए स्थिरांक बनाने की आवश्यकता को सही ठहरा सकते हैं, जैसे ebx=0x86 / x64 मशीन कोड में गोल्फ के लिए युक्तियों पर मेरा जवाब तर्क है कि एक कस्टम कॉलिंग सम्मेलन को बहुत दूर तक खींचना होगा।
पीटर कॉर्डियो

BTW, मैं cutNASM लिस्टिंग आउटपुट से कुछ कॉलम हटाने का उपयोग करता हूं क्योंकि मेरे सभी निर्देश संक्षिप्त हैं nasm -felf foo.asm -l/dev/stdout | cut -b -34,$((34+6))-:। इसके अलावा, मैंने अपने _startकॉलर में movzx के बजाय mov का उपयोग किया क्योंकि बाहर निकलने की स्थिति आर्ग के निम्न बाइट से आती है sys_exit()। कर्नेल उच्च बाइट्स को अनदेखा करता है।
पीटर कॉर्डेस

मुझे लगता है कि काम करेगा। यह गिनती 43 बाइट्स तक ले जाती है और फिर मैं आवरण के setnz alबाद सम्मिलित करता हूं call in_subnet
डैनियल शेपलर

हाँ। आराम से सामान्य उपयोग के मामले की कल्पना करना के लिए इस समारोह होगा call/ je, बल्कि मुद्रण या परिणाम के साथ आगे गुजर से। जैसा कि मैंने "टिप्स" में बताया है, कुछ सिस्टम-कॉल कॉलिंग कन्वेंशन पहले से ही वास्तविक जीवन में करते हैं (आमतौर पर सीएफ = त्रुटि के साथ)।
पीटर कॉर्डेस

1

जावा 215 211 207 202 200 199 198 190 180 बाइट्स

Long k,c;boolean a(String i,String s){return(b(i)^b(s))>>32-k.decode(s.split("/")[1])==0;}long b(String i){for(c=k=0l;c<4;k+=k.decode(i.split("[./]")[3+(int)-c])<<8*c++);return k;}

सच्चाई के trueलिए और झूठे के लिए आउटपुट false

नोट: यह 32 की संभावित सही पारी के longबजाय उपयोग करता है int

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

सेविंग के लिए 1 बाइट धन्यवाद

पीटर कॉर्ड्स के लिए धन्यवाद 10 बाइट्स बचाए


यह फाल्सी के लिए "विशिष्ट और सुसंगत मूल्य" का उत्पादन नहीं करता है।
AdmBorkBork

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

64-बिट पूर्णांक 32 से बाईं ओर की शिफ्ट का समर्थन करता है। इसके अलावा, आप वास्तव में मास्क बनाने के बजाय उन बिट्स को स्थानांतरित करने के लिए सही शिफ्ट कर सकते हैं host ^ net। लेकिन मुझे लगता है कि पूर्णांक से बूलियन बनाने के लिए जावा को एक तुलना की आवश्यकता है। शायद a !, क्योंकि यह मायने नहीं रखता कि आप किस आउटपुट के लिए सही या गलत का उत्पादन करते हैं। (मैंने ओपी से स्पष्टीकरण के बारे में पूछा कि क्या वे 0 / गैर-शून्य को बाहर करने का इरादा रखते हैं, और उन्होंने कहा कि वे उस शब्द के परिणाम से अवगत थे:
पीटर कॉर्ड

1
@PeterCordes सब कुछ बदलने के लिए longमुझे कुछ बाइट्स खो देता है, लेकिन मैं आपके लिए सुझाव को दूर करने और एक्सओआर करने में सक्षम होने के नाते इसके लिए प्रयास करता हूं। मैं जाँच कर रहा हूँ पोस्टिंग से पहले और क्या मैं गोल्फ कर सकते हैं
प्रहार

1

चारकोल , 36 बाइट्स

≔⪪S/θ≔I⊟θζ⊞θSUMθ÷↨I⪪ι.²⁵⁶X²⁻³²ζ⁼⊟θ⊟θ

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। सबनेट को पहले पैरामीटर के रूप में लेता है और -केवल आउटपुट तब होता है जब पता सबनेट के भीतर होता है। स्पष्टीकरण:

≔⪪S/θ

सबनेट को विभाजित करें /

≔I⊟θζ

मुखौटा निकालें और इसे पूर्णांक पर डालें।

⊞θS

पते को सरणी में पुश करें।

UMθ÷↨I⪪ι.²⁵⁶X²⁻³²ζ

दोनों पते को विभाजित करें ., उन्हें पूर्णांक में बदलें, आधार 256 के रूप में व्याख्या करें, और नकाबपोश बिट्स को छोड़ दें।

⁼⊟θ⊟θ

दो मूल्यों की तुलना करें।


1

जाप , 26 बाइट्स

Ëq'/
ËÎq. Ë°¤ù8ì¯Ug1,1Ãr¶

कोशिश करो

-3 बाइट्स @ शुग्गी को धन्यवाद!

इनपुट 2 तत्वों के साथ एक सरणी है [address, subnet]। नीचे JS

// U: implicit input array
// split elements in U on the / and
// save back to U using a map function
U = U.m(function(D, E, F) {
  return D.q("/")
});
// map the result of the previous operation
// through another function
U.m(function(D, E, F) {
  return D
    // get the address portion of the / split
    // value and split again on .
    .g().q(".")
    // map each octet through another function
    .m(function(D, E, F) {
      // convert the octet to a base 2 string
      // left padded to a length of 8
      return (D++).s(2).ù(8)
    })
    // join the base 2 octets
    .q()
    // take the left bits of the joined octets
    // determined by subnet size
    .s(0, U.g(1, 1))
})
  // at this point, the intermediate result
  // contains 2 masked values, reduce
  // using === to check for equality
  .r("===")


दिलचस्प है - मुझे नहीं पता था कि आप एक स्ट्रिंग को एक संख्या के साथ ले जा सकते हैं ++
दाना

हाँ, जैसे आप जेएस में कर सकते हैं। यह कोई फायदा नहीं है, हालांकि, अगर आपको मूल मूल्य को बाद में फिर से उपयोग करने की आवश्यकता है, हालांकि, लेकिन यह अवसर पर आसान है।
झबरा

gविधि में अल्पविराम की आवश्यकता मुझे परेशान कर रही है; इसके चारों ओर एक तरह से समझ नहीं सकते। कम से कम ऐसा नहीं है कि आप एक बाइट बचा लेंगे।
झबरा

0

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 187 बाइट्स

a=>{var b=a.Select(x=>x.Split(".").SelectMany(g=>Convert.ToString(int.Parse(g.Split("/")[0]),2).PadLeft(8)).Take(int.Parse(a[1].Split("/")[1])));return b.First().SequenceEqual(b.Last());}

मैं निश्चित रूप से इसे और नीचे गिरा सकता हूं।

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


0

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 134 बाइट्स

a=>a.Select(x=>x.Split('.','/').Take(4).Aggregate(0L,(y,z)=>y<<8|int.Parse(z))>>32-int.Parse(a[1].Split('/')[1])).Distinct().Count()<2

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

LINQ स्टेटमेंट जिसमें इनपुट के रूप में 2-एलिमेंट स्ट्रिंग ऐरे को लिया गया है [address, subnet] फॉर्मेट ।

प्रत्येक बिंदीदार क्वाड को बिट हेरफेर के उपयोग से 32 बिट्स में परिवर्तित किया जाता है। बिट्स को सबनेट आकार द्वारा सही स्थानांतरित किया जाता है और समानता के लिए तत्वों की तुलना की जाती है।

उस समय C # उत्तर के एक जोड़े थे कि यह उत्तर पोस्ट किया गया था, लेकिन कोई भी जो शुद्ध बिट हेरफेर का उपयोग नहीं करता था।

// a: input array containing address and subnet
a=>a
  // iterate over input elements
  .Select(x=>x
    // split element on . and /
    .Split('.','/')
    // the subnet will have 5 elements,
    // we only want the parts before the /
    .Take(4)
    // use an aggregate function to convert dotted quad to 32 bits
    .Aggregate(0L,(y,z)=>y<<8|int.Parse(z))
    // shift bits of aggregate to the right
    >>
    // shift amount determined by subnet size
    32-int.Parse(a[1].Split('/')[1])
  )
  // test for equality by checking if number
  // of unique values is equal to 1
  .Distinct()
  .Count()<2

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