ฉันอยู่ในซับเน็ตของคุณเล่นกอล์ฟรหัสของคุณ


17

ท้าทาย

รับ IPv4 addressในสัญกรณ์ประสี่เหลี่ยมและ IPv4 subnetในรูปแบบ CIDR , ตรวจสอบว่าอยู่ในaddress subnetการส่งออกมีมูลค่าที่แตกต่างกันและสอดคล้องกันถ้ามันอยู่ในและค่าที่แตกต่างกันและสอดคล้องแยกต่างหากถ้ามันไม่ได้อยู่ในsubnet subnetค่าเอาต์พุตไม่จำเป็นต้องเป็นความจริง / เท็จในภาษาของคุณ

ไพรเมอร์ย่อของ subnet สัญกรณ์ CIDR

ที่อยู่เครือข่าย IPv4 มีความยาว 32 บิตแบ่งออกเป็นสี่กลุ่ม 8 บิตเพื่อความสะดวกในการอ่าน สัญกรณ์ซับเน็ต CIDR เป็นรูปแบบของจำนวนบิตที่ระบุเริ่มต้นซ้ายสุด ตัวอย่างเช่นสำหรับ/24ซับเน็ตหมายความว่าแอดเดรส 8 บิตที่ถูกต้องที่สุดมีอยู่ในซับเน็ตนั้น ดังนั้นสองแอดเดรสที่ถูกคั่นด้วยอย่างมาก255และมี subnet mask เดียวกันอยู่ใน subnet เดียวกัน โปรดทราบว่า CIDR ที่ถูกต้องจะมีการตั้งค่าโฮสต์บิต (ด้านขวามือ) ทั้งหมด (ศูนย์)

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 และซับเน็ตมาสก์ที่ถูกต้อง
  • input และ output จะได้รับโดยวิธีการที่สะดวกใด
  • คุณสามารถพิมพ์ผลลัพธ์ไปที่ STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน โปรดระบุในการส่งของคุณสิ่งที่มีค่าเอาท์พุทสามารถใช้
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

เราจำเป็นต้องป้อนข้อมูลในรูปแบบเดียวกับกรณีทดสอบของคุณหรือไม่?
ศูนย์รวมแห่งความไม่รู้

1
@EmbodimentofIgnorance คุณไม่จำเป็นต้องใช้พวกเขาเป็นหนึ่งต่อบรรทัดในตัวอย่าง แต่คุณจำเป็นต้องใช้พวกเขาเป็นรูปสี่เหลี่ยมประและรูปสี่เหลี่ยมจัตุรัสย่อยในตัวอย่าง (เช่นดูคำตอบ JavaScript โดย Arnauld)
AdmBorkBork

มันเป็นการตกลงที่จะให้พวกเขาคั่นด้วยเครื่องหมายทับ10.0.0.1/10.0.0.0”/16หรือไม่?
Nick Kennedy

1
@ โผล่ฉันยอมรับว่าคุณถูกต้องในสัญกรณ์ CIDR นั้นจะอธิบายที่อยู่ IP และขนาดซับเน็ต ในขณะที่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 ของความท้าทายนี้ด้วย
Ferrybig

คำตอบ:


13

Python 3 (62 ไบต์)

ตรงไปตรงมามาก:

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

9
ดีมาก แต่ไพ ธ อนมีระบบในตัวสำหรับจดจำแพะด้วยหรือไม่
Benjamin Urquhart

3
แน่นอนว่า Mathematica มีทุกสิ่งในตัว - สำหรับดาวเคราะห์นอกระบบ ! ไม่มีอะไรสามารถชนะที่ ... แต่เท่าที่คุณจะได้เห็นงูหลามตรง Mathematica ของแพะ formace
agtoever

ฉันสงสัยว่าip_adressวัตถุและip_networkวัตถุเป็นany convenient methodไปได้หรือไม่ที่จะปล่อยให้ Python ชนะเว้นแต่ว่าภาษาที่ใช้สนามกอล์ฟที่ใช้ Python จะเป็นประเภทของสิ่งเหล่านี้หรือไม่?
สรรพนามของฉันคือ monicareinstate

คุณจะไม่ได้รับในช่วง 20 ไบต์ใน Python ปกติ เฉพาะการนำเข้าและแลมบ์ดาเท่านั้นที่ยาวกว่าคำตอบของ Stax ไม่น่าแปลกใจที่ภาษากอล์ฟชนะจากภาษา "ปกติ" ... :-(
agtoever

@someone: ผมตีงูหลามกับ53 ไบต์ของรหัสเครื่อง :) ไม่ใช่ภาษาการเล่นกอล์ฟแบบดั้งเดิมและส่วนใหญ่ของขนาดรหัสคือการแยกสตริง -> int ด้วยตนเอง (host^net)>>(32-mask)มีขนาด 10 ไบต์เท่านั้น แต่ครึ่งทางระหว่างงานที่ไม่เกี่ยวข้องกับรายการของรายการหรือการทำแผนที่ฟังก์ชั่นลงในรายการเพราะการดำเนินการเซนต์คิตส์และเนวิสสามารถทำได้ด้วยคำสั่ง 2 หรือ 3 ไบต์และสามารถสร้างวงรอบสิ่งต่าง ๆ ในไม่กี่ไบต์
Peter Cordes

4

C # (คอมไพเลอร์ Visual C #) , 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);};

Bytecount รวมถึง using System;using System.Linq;

ลองออนไลน์!

ฉันเขียนสิ่งนี้ใน JS ทันทีที่มีการโพสต์ความท้าทาย แต่ Arnauld เอาชนะฉันไปที่หมัดด้วยคำตอบที่ดีกว่ามากดังนั้นนี่คือใน C # แทน

มีห้องสำหรับเล่นกอล์ฟอย่างแน่นอน

คำอธิบาย:

ฟังก์ชั่นประกอบด้วยฟังก์ชั่นย่อยที่เรียกว่า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;
    }
);

ฟังก์ชั่นย่อยนี้แยกที่อยู่ IP เปิด.แปลงตัวเลขแต่ละตัวให้เป็นสตริงไบนารีซ้ายแผ่นแต่ละสตริงด้วยความ0ยาว 8 บิตจากนั้นเชื่อมสตริงเป็นสตริงไบนารี 32 บิตหนึ่งสตริง

สิ่งนี้จะเกิดขึ้นทันทีพร้อมกับที่a=h(a);อยู่ IP ที่กำหนด
จากนั้นเราแบ่ง Subnet mask เป็น IP Address และหมายเลข Mask ด้วย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เป็นสตริงในตัว pastebin เชื่อมโยงไปยังลิงค์ TIO ที่ยาวเกินไปคนเดียว
สรรพนามของฉันคือ monicareinstate

2
@someone ขนาดเล็ก FYI: ตัวย่อ URL เช่นtinyurl.comได้รับอนุญาตในความคิดเห็นใน SE นี้ซึ่งแตกต่างจากส่วนใหญ่ :)
Kevin Cruijssen

1
188 - tinyurl.com/y6xfkbxt - เคล็ดลับการย่อ URL ที่ดี @KevinCruijssen
dana

4

Linux POSIX เชลล์ (พร้อมด้วย net-tools / iputils) (34 ไบต์ไม่สิ้นสุด, 47 ไบต์สิ้นสุด)

อะไรคือความเหมาะสมที่ดีที่สุดในการแยกมาสก์เครือข่ายและที่อยู่กว่าตัวสาธารณูปโภคเครือข่ายเอง? :)

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

คำเตือน:สคริปต์อาจสร้างความเสียหายต่อการเชื่อมต่ออินเทอร์เน็ตของคุณโปรดเรียกใช้ด้วยความระมัดระวัง

อินพุต:สคริปต์ใช้ที่อยู่ IP ที่ผ่านการทดสอบเป็นอาร์กิวเมนต์แรกและเครือข่ายย่อยที่ทดสอบ เป็นอาร์กิวเมนต์ที่สอง

เอาต์พุต:สคริปต์ส่งคืนค่าความจริง (0) หากอาร์กิวเมนต์แรกของสคริปต์เป็นของซับเน็ตที่ระบุในอาร์กิวเมนต์ที่สอง มิฉะนั้นจะไม่สิ้นสุด

ข้อสันนิษฐาน:สคริปต์จะต้องถูกเรียกใช้ในฐานะผู้ใช้รูทในสภาพแวดล้อมที่สะอาด ( เช่นไม่มีการกำหนดเส้นทาง blackhole อื่นโดยผู้ดูแลระบบและหากอินสแตนซ์ก่อนหน้าของสคริปต์ได้รับการทำงานเส้นทาง blackhole ที่สร้างขึ้นจะถูกลบออก ) สคริปต์ยังถือว่า "การเชื่อมต่ออินเทอร์เน็ตที่ใช้งานได้" ( เช่นมีเส้นทางเริ่มต้นที่ถูกต้องอยู่)


คำอธิบาย:

เราสร้างเส้นทางblackholeไปยัง subnet ที่ระบุ จากนั้นเราจะทดสอบการเชื่อมต่อไปยังที่อยู่ IP ให้โดยใช้ปิง หากที่อยู่ไม่ได้อยู่ในเครือข่ายย่อย (และเนื่องจากเราถือว่าการเชื่อมต่ออินเทอร์เน็ตที่ตั้งไว้ถูกต้อง) pingจะพยายามส่งแพ็กเก็ตไปยังที่อยู่นั้น โปรดทราบว่าการตอบกลับที่อยู่นี้ไม่สำคัญหรือไม่เพราะpingจะพยายามตลอดไป ในทางกลับกันหากที่อยู่ไม่ได้อยู่ในเครือข่ายย่อยpingจะล้มเหลวด้วย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 ]

ตามความคิดเห็นของ @ Grimy ต่อไปนี้เป็นเวอร์ชันที่จะยุติและส่งคืน 0 (ความจริง) หากที่อยู่นั้นอยู่ในเครือข่ายย่อยและ 1 (เป็นเท็จ) เป็นอย่างอื่น เราทำการpingสิ้นสุดด้วย-c1ค่าสถานะซึ่ง จำกัด จำนวนของแพ็กเก็ตที่ส่งไปที่ 1 หากที่อยู่ตอบpingจะคืนค่า 0 และถ้าไม่ ping จะคืนค่า 1 หากที่อยู่เป็นของ subnet blackholed เท่านั้นจะpingคืน 2 ซึ่งเป็นสิ่งที่เราทดสอบกับในคำสั่งสุดท้าย


3
ในขณะที่ฉลาดสิ่งนี้ไม่เป็นไปตามข้อกำหนดในการส่งออกค่าที่ชัดเจนและสอดคล้องกันหากที่อยู่ไม่ได้อยู่ในเครือข่ายย่อย (การเรียกใช้ตลอดไปจะไม่นับรวมเป็นผลลัพธ์โปรดดูที่นี่ )
Grimmy

1
@Grimy: แต่มันไม่ได้ทำงานอย่างเงียบ ๆตลอดไปดังนั้นมีเพียงลิงค์ที่ 2 ของคุณเท่านั้นไม่ใช่ลิงค์แรก นอกจากนี้ฉันคิดว่าpingจะตายจาก SIGPIPE หากมีการเรียกใช้ stdout + stderr ไปยังโปรแกรมอื่นและผู้อ่านปิดท่อ และนั่นก็เป็นกรณีใช้งานที่น่าจะเป็นไปได้มากที่สุดเนื่องจากสถานะทางออกสามารถประสบความสำเร็จได้ด้วยวิธีใดวิธีหนึ่ง (ถ้าเราเพิ่ม-c1ตัวเลือกในการ ping เพื่อตั้งค่าการนับ) แต่แน่นอนว่าการอ่านเอาต์พุตด้วยvar=$(/a.sh)จะล้มเหลว คุณต้องมีผู้อ่านที่หยุดหลังจากตัดสินใจแทนที่จะอ่านเอาต์พุตทั้งหมดแล้วดูที่มัน
Peter Cordes

@Grimy Fair point (แม้ว่าจะมีเหตุผลสำหรับข้อโต้แย้งฉันสามารถพูดได้ว่าเรามีสองค่าที่สอดคล้องกันที่นี่เนื่องจากpingจะยุติในเวลาที่น้อยกว่าพูดหนึ่งวินาทีในกรณีของที่อยู่ blackholed) ฉันได้เพิ่มเวอร์ชันที่ยกเลิกสำหรับ 13 ไบต์พิเศษ! :)
yoann


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

@Christoph ดีมาก! ไม่เคยเกิดขึ้นกับผมว่าคุณก็สามารถใช้โทเค็นใด ๆ strtok()สำหรับสายที่สองไป ของคุณสั้นกว่าคำตอบที่คล้ายกันมากของฉัน 4 ไบต์ด้านล่าง อุปกรณ์ประกอบฉาก!
640KB

@Christoph คุณควรโพสต์คำตอบของคุณเป็นคำตอบแยกต่างหากเพราะดีกว่าของฉัน
Luis felipe De jesus Munoz

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 โดยใช้ powerpc64-linux-gnu-gcc -static และ qemu-user)

โปรแกรมใช้สองบรรทัดในอินพุตมาตรฐานและเป็นรหัสออกมันจะส่งคืน 1 ถ้าแอดเดรสตรงกันและ 0 หากไม่ตรง (ดังนั้นสิ่งนี้จะขึ้นอยู่กับสเปคที่ไม่ต้องการค่าความจริงสำหรับการแข่งขันและค่าความเท็จสำหรับการจับคู่ที่ไม่ตรงกัน) โปรดทราบว่าหากคุณใช้การโต้ตอบคุณจะต้องส่งสัญญาณ EOF ( ^D) สามครั้งหลังจากป้อนบรรทัดที่สอง

สิ่งนี้ขึ้นอยู่กับ PowerPC ว่าเป็นผู้ยิ่งใหญ่และบนแพลตฟอร์มนั้นที่คืนค่า 0 สำหรับการเปลี่ยนค่าที่ไม่ได้ลงนามแบบ 32 บิตโดย 32 โดยการอ่านค่าทางขวานั้นจะอ่านค่า octet เป็นค่าที่ไม่ได้ลงนามแบบหนึ่งต่อหนึ่ง ; จากนั้นจะใช้ xor ของที่อยู่ 32 บิตที่ไม่ได้ลงชื่อสองตัวและเลื่อนบิตที่ไม่เกี่ยวข้องออกไป ในที่สุดมันใช้!เพื่อตอบสนองความต้องการของการคืนค่าที่แตกต่างกันเพียงสองค่า

หมายเหตุ: มันอาจจะเป็นไปได้ที่จะโกนไบต์ที่สองโดยการแทนที่u+3ด้วยและต้องรวบรวมกับp -O0แม้ว่าจะมีชีวิตที่อันตรายกว่าที่ฉันใส่ใจ

ขอบคุณ Peter Cordes สำหรับแรงบันดาลใจในการแก้ปัญหานี้


พกพามากกว่า C 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 บิตที่ไม่ได้ลงชื่อโดยวิธีการของ Horner
  • ...>>32-nจากนั้นเลื่อนบิตของความแตกต่างของ xor ที่ไม่เกี่ยวข้องกับ subnet mask (โปรดทราบว่า-มีความสำคัญสูงกว่าใน C มากกว่า<<)
  • มีหนึ่ง gotcha แม้ว่า: ถ้า n = 0 จากนั้น~0U<<32จะให้พฤติกรรมที่ไม่ได้กำหนดสมมติว่าunsignedเป็น 32 บิต (ซึ่งมันอยู่ในแทบทุกแพลตฟอร์มปัจจุบัน) ในทางกลับกันหาก n = 0 ที่อยู่ใด ๆ จะตรงกันดังนั้นn&&...จะให้ผลลัพธ์ที่ถูกต้อง (ใช้ประโยชน์จากพฤติกรรมการลัดวงจรของ&&)
  • สุดท้ายเพื่อให้เป็นไปตามข้อกำหนดที่ว่าเอาต์พุตสามารถเป็นหนึ่งในสองค่าเท่านั้น !กับเอาต์พุต 0 หรือ 1

-15 ไบต์เนื่องจากความคิดเห็นโดย ceilingcat และ AdmBorkBork

-4 ไบต์เนื่องจากความคิดเห็นโดย Peter Cordes


1
การใช้รหัสออกเพื่อคืนค่าเป็นหนึ่งในวิธีการ I / O เริ่มต้นและได้รับอนุญาต
AdmBorkBork

@ceilingcat แน่นอนว่าข้าโง่แค่นี้
Daniel Schepler

@AdmBorkBork ตกลงขอบคุณฉันเปลี่ยนให้ใช้รหัสออก
Daniel Schepler

ความคิด: กำหนดเป้าหมายเล็ก ๆ น้อย ๆ หรือ endian big-การดำเนินงาน C (รหัสกอล์ฟไม่ต้องใช้โค้ดแบบพกพา) unsignedและประเภทเล่นสำนวนชี้การส่งออกไปยังไบต์ของนั้น เช่นchar*p=&aจากนั้นp++,p++,p++,...หรือp--,...เป็น scanf args สตริงรูปแบบจะต้องเป็น"%hhu.%hhu..."ดังนั้นจึงเป็นข้อเสียอย่างมีนัยสำคัญระหว่างขนาดที่เพิ่มขึ้นเมื่อเทียบกับการประกาศ vars ที่น้อยลงและความสามารถในการทำ(a^b)>>(32-count)
Peter Cordes

1
@PeterCordes Yup การเปลี่ยนที่ถูกต้องขอบคุณ
Daniel Schepler

2

Stax , 22 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

ใช้พารามิเตอร์อินพุตที่คั่นด้วยช่องว่างบนอินพุตมาตรฐาน

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

'/:/~       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 ไบต์

การเปลี่ยนแปลง:

  • -2 jzข้ามกะแทนที่จะใช้กะ 64- บิตเพื่อจัดการกับ>>(32-0)กรณีพิเศษ
  • -3 ผลตอบแทนใน ZF แทน AL ประหยัด 3 setnz alไบต์สำหรับ

(โปรดดูคำตอบของรหัสเครื่อง 32 บิตของ Daniel Scheplerตามสิ่งนี้ซึ่งพัฒนาขึ้นเพื่อใช้ความคิดอื่น ๆ ที่เรามีฉันกำลังรวมรุ่นล่าสุดของฉันไว้ที่ด้านล่างของคำตอบนี้)


ส่งคืน ZF = 0 สำหรับโฮสต์ที่ไม่ได้อยู่ในเครือข่ายย่อย ZF = 1 สำหรับในเครือข่ายย่อยดังนั้นคุณจึงสามารถแยกผลลัพธ์ได้ด้วยje host_matches_subnet

Callable กับ x86-64 System V เรียกประชุมเป็นถ้าคุณเพิ่มใน
bool not_in_subnet(int dummy_rdi, const char *input_rsi);setnz al

สตริงอินพุตมีทั้งโฮสต์และเครือข่ายโดยคั่นด้วยอักขระที่ไม่ใช่ตัวเลข 1 ตัว หน่วยความจำที่ตามหลังจุดสิ้นสุดของความกว้าง CIDR ต้องมีอย่างน้อย 3 ไบต์ที่ไม่ใช่ตัวเลขก่อนที่จะสิ้นสุดหน้า (ไม่ควรเป็นปัญหาในกรณีส่วนใหญ่เช่น cmdline arg) รุ่น 32 บิตของ Daniel ไม่มีข้อ จำกัด นี้

เราเรียกใช้การแยกวิเคราะห์วงกลมจุดประเดียวกัน 3 ครั้งรับที่อยู่ IPv4 สองแห่งและรับ/maskจำนวนเต็มเป็นไบต์สูงของ dword (นี่คือสาเหตุที่ต้องมีหน่วยความจำที่สามารถอ่านได้หลังจาก/maskนั้น แต่ไม่สำคัญว่าจะมีตัวเลข ASCII)

เราทำการ(host ^ subnet) >> (32-mask)เลื่อนบิตโฮสต์ออก ( บิตที่ได้รับอนุญาตให้ไม่ตรงกัน) โดยเหลือเพียงความแตกต่างระหว่างซับเน็ตและโฮสต์เท่านั้น ในการแก้ปัญหา/0กรณีพิเศษที่เราจำเป็นต้องเลื่อนด้วย 32 เราจะกระโดดข้าม shift บน count = 0 ( neg clชุด ZF ซึ่งเราสามารถสาขาในและลาเป็นค่าตอบแทนถ้าเราไม่เปลี่ยน.) หมายเหตุที่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 แยกวิเคราะห์และ "ดัน" พวกมันบนสแต็กที่เราป๊อปออกเป็น dwords หรือใช้อันสุดท้ายยังคงอยู่ใน CL หลีกเลี่ยงการอ่านผ่านจุดสิ้นสุดของสายเลย

นอกจากนี้decเป็นเพียง 1 ไบต์ในโหมด 32 บิต

    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

ฉันอยากรู้ว่าจำนวนไบต์ asm แบบ 32 บิตจะเป็นอย่างไรถ้าแทนที่จะcmp/jccบอกว่าคุณทำสิ่งที่ชอบxor edx,edx;neg cl;cmovz eax,edx;shr eax,cl- หรือบางทีคุณอาจมี 0 ค่าที่แขวนอยู่ที่ไหนสักแห่ง (และจากนั้นคุณไม่จำเป็นต้องมีsub cl,32คำแนะนำ)
Daniel Schepler

1
ใช่ดูเหมือนว่าediควรเป็น 0 เมื่อออกจากวงดังนั้นxor eax,edx;neg cl;cmovz eax,edi;shr eax,clควรทำงาน
Daniel Schepler

1
หากฉันนับสิ่งที่ถูกต้องcmove eax,ediมี 3 ไบต์ซึ่งเป็นการล้างมากกว่าการลบsub cl,32แล้วshr cl,eaxช่วยประหยัดมากกว่าหนึ่งไบต์shr cl,raxและ 32 บิตdec ediจะช่วยประหยัดหนึ่งไบต์มากกว่า dec edi64 ฉันชุมนุมจากนั้นให้.byte 0x33(ในไวยากรณ์ GNU binutils) = in_subnet.size51
Daniel Schepler

เป็นความคิดที่ดีขอบคุณ (ใน Intel ไวยากรณ์มันshr eax,clเทียบกับshr %cl, %eaxใน AT & T ไวยากรณ์ความคิดเห็นล่าสุดของคุณย้อนกลับไปที่.) เป็นบิตของงานที่น่าเบื่อที่จะตอบการปรับปรุงเครื่องรหัส (และพอร์ต_startโทรและอีกอธิบายการประชุมเรียกร้องให้มีโหมด 32 บิต .. .) ดังนั้นฉันอาจไม่ได้ไปไหน รู้สึกขี้เกียจวันนี้ >. <
Peter Cordes

1
ฉันเพิ่งลองใช้ความคิดเห็นที่คุณใส่ไว้ในคำตอบของฉันเกี่ยวกับการกำจัด double loop และแทนที่จะเก็บไว้ในตัวแปรสแต็ก - และถึงแม้จะมีรหัสพิเศษเพื่อเริ่มต้นตัวชี้การเขียนใน 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

ลองออนไลน์!

ลิงก์ Monadic ที่รับแอดเดรสและซับเน็ตคั่นด้วยเครื่องหมายทับและส่งคืน 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

R 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

PHP ,75 73, 71 ไบต์

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

ส้อมของ@Luis felipe De jesus Munozคำตอบเป็นแบบสแตนด์อโลนนำเข้าข้อมูลจาก args บรรทัดคำสั่ง เอาต์พุต'1'สำหรับ Truthy, ''(สตริงว่าง) สำหรับ Fasley

$ 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 ไบต์

ส่วนใหญ่จะถูกโพสต์เพื่อตอบสนองคำขอของ Peter Cordes สำหรับรุ่นที่แก้ไขที่ฉันสร้างขึ้น มันอาจจะหายไปหนึ่งครั้ง / ถ้าเขารวมไว้ในคำตอบของเขา

ฟังก์ชันนี้คาดว่าesiจะชี้ไปที่สตริงอินพุตโดยที่อยู่และส่วนย่อยจะคั่นด้วยช่องว่างหรืออักขระบรรทัดใหม่และค่าส่งคืนจะอยู่ในแฟล็ก ZF (ซึ่งโดยนิยามมีเพียงสองค่าที่เป็นไปได้)

 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 Linux:

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 ไบต์เนื่องจากคำแนะนำจาก Peter Cordes เพื่อส่งคืนค่าใน ZF


ผมคิดว่าผมจะสามารถประหยัดหนึ่งไบต์โดยการเอาสุดท้ายxor edx,edxและแทนที่ด้วย cmovz eax,edx ยังคงชนะถ้าหากเราได้เรียกประชุม jz .nonzero; xor eax,eax; .nonzero:cmovzebx=0
Daniel Schepler

เราสามารถเพียงแค่jzข้ามshrไป setz หรือเกษียณหรือไม่ เราสามารถสลับsetnzไปsetzและกลับ1สำหรับการจับคู่หากช่วยได้ หรือแม้แต่บอกว่าค่าตอบแทนของเราคือ ZF ฉันควรทำอย่างนั้นในคำตอบของฉัน (แต่ฉันไม่คิดว่าเราสามารถพิสูจน์ได้ว่าผู้โทรต้องสร้างค่าคงที่ให้เราเช่นebx=0คำตอบของฉันสำหรับเคล็ดลับการเล่นกอล์ฟในรหัสเครื่อง x86 / x64ระบุว่าจะยืดการประชุมที่กำหนดเองมากเกินไป
Peter Cordes

BTW ผมใช้cutในการลบคอลัมน์บางส่วนจากการส่งออกรายชื่อ NASM nasm -felf foo.asm -l/dev/stdout | cut -b -34,$((34+6))-เพราะคำแนะนำของฉันทั้งหมดเป็นระยะสั้น: นอกจากนี้ผมใช้ MOV แทน movzx ในของฉันโทรเพราะสถานะออกมาจากไบต์ต่ำของหาเรื่องไป_start sys_exit()เคอร์เนลจะละเว้นไบต์ที่สูงกว่า
Peter Cordes

ฉันเดาว่ามันจะใช้ได้ ที่ใช้เวลานับถอยหลังถึง 43 ไบต์แล้วฉันแทรกsetnz alหลังจากcall in_subnetในเสื้อคลุม
Daniel Schepler

ได้. ง่ายต่อการจินตนาการกรณีการใช้งานปกติสำหรับฟังก์ชั่นนี้จะเป็นcall/ jeแทนที่จะพิมพ์หรือส่งผ่านผลลัพธ์ต่อไป เช่นเดียวกับที่ฉันชี้ให้เห็นใน "เคล็ดลับ" การประชุมการเรียกใช้ระบบบางอย่างได้ทำสิ่งนี้ในชีวิตจริงแล้ว (โดยปกติจะมีข้อผิดพลาด CF =)
Peter Cordes

1

Java 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เท็จ

หมายเหตุ: สิ่งนี้ใช้longแทนintการเลื่อนขวาที่มีค่าเป็น 32

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณไปที่catcat

บันทึก 10 ไบต์ขอบคุณPeter Cordes


สิ่งนี้ไม่ได้ส่งออก "ค่าที่แตกต่างและสอดคล้องกัน" สำหรับความเท็จ
AdmBorkBork

ฉันยืนยันว่ามันไม่ชัดเจนและสม่ำเสมอไม่ใช่ศูนย์ แต่ถ้านั่นไม่ใช่วิญญาณของความท้าทายฉันสามารถเปลี่ยนได้
Poke

จำนวนเต็ม 64 บิตรองรับการเลื่อนซ้าย 32 และคุณสามารถเลื่อนไปทางขวาhost ^ netเพื่อเลื่อนบิตที่คุณต้องการลบออกแทนที่จะสร้างมาสก์จริง แต่ฉันคิดว่า Java ต้องการการเปรียบเทียบเพื่อสร้างบูลีนจากจำนวนเต็ม อาจจะเป็น!เพราะมันไม่สำคัญว่าคุณจะผลิตออกมาเป็นความจริงหรือเท็จ (ฉันขอ OP เพื่อชี้แจงเกี่ยวกับว่าพวกเขาตั้งใจจะยกเว้น 0 / ไม่เป็นศูนย์หรือไม่และพวกเขาตอบว่าใช่พวกเขาทราบถึงผลที่จะตามมาของถ้อยคำนั้น:
Peter Peter Cordes

1
@PeterCordes การแปลงทุกอย่างจะlongทำให้ฉันสูญเสียไบต์ไป แต่ฉันทำมันด้วยการลบส่วนที่สามและทำ XOR ตามที่คุณแนะนำ ฉันกำลังตรวจสอบสิ่งอื่นที่ฉันสามารถเล่นกอล์ฟก่อนโพสต์ได้
Poke

1

ถ่าน , 36 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รับซับเน็ตเป็นพารามิเตอร์แรกและเอาต์พุต-เฉพาะเมื่อที่อยู่นั้นอยู่ในซับเน็ต คำอธิบาย:

≔⪪S/θ

/แยกเครือข่ายย่อยใน

≔I⊟θζ

ลบหน้ากากและโยนให้เป็นจำนวนเต็ม

⊞θS

ผลักที่อยู่ไปยังอาร์เรย์

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

แยกที่อยู่ทั้งสองบน.แปลงให้เป็นจำนวนเต็มตีความว่าเป็นฐาน 256 และละทิ้งบิตที่ถูกปกปิด

⁼⊟θ⊟θ

เปรียบเทียบค่าทั้งสอง


1

Japt 26 ไบต์

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

ลองมัน

-3 ไบต์ขอบคุณ @Shaggy!

การป้อนข้อมูลเป็นอาร์เรย์มี 2 [address, subnet]องค์ประกอบ Transpiled 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("===")


ที่น่าสนใจ - ++ผมไม่ทราบว่าคุณสามารถบีบบังคับสตริงไปยังหมายเลขที่มี
dana

ใช่เช่นเดียวกับที่คุณทำได้ใน JS แม้ว่าจะไม่มีประโยชน์ก็ตามหากคุณต้องการนำค่าดั้งเดิมมาใช้ในภายหลังแม้ว่าจะมีประโยชน์ก็ตาม
Shaggy

ความต้องการเครื่องหมายจุลภาคในgวิธีการนั้นทำให้ฉันรำคาญ; ไม่สามารถหาวิธีรอบ ๆ ได้เลย อย่างน้อยไม่ใช่หนึ่งที่จะช่วยให้คุณประหยัดไบต์
Shaggy


0

C # (Visual C # Interactive Compiler) , 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.