ReRegex , 294 275 ไบต์
บันทึก 19 ไบต์โดยใช้นิยาม 'ฟังก์ชั่น' ที่ดีขึ้น
ฉันจะบอกว่านี่เป็นสิ่งที่ดีสำหรับภาษา Regex เท่านั้น
lib พื้นฐานอนุญาตให้มีการแปลงระหว่าง Unary และทศนิยม (ซึ่งจำเป็นสำหรับความท้าทายที่ระบุอย่างชัดเจนโดยระบุเป็นทศนิยม) แต่ไม่รองรับ Binary ดังนั้นฉันจึงต้องเขียนมันเป็นส่วนหนึ่งของสคริปต์เพิ่ม 120 ไบต์ลงไป
#import base
b(\d*):(_*)\2_b/b1$1:$2b/b(\d*):(_+)\2b/b0$1:$2b/b(\d+):b/$1/b:b/0/B(_*):1/B$1$1_:/B(_*):0/B$1$1:/B(_*):B/$1/j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/j(\d*),\1\d{0,7}:,?(.*)/,$2,/,((_+)_+),(\2),/,$1,/,(_+),(\1_*),/,$2,/^,(_*),$/d<$1>/j,b:u<(?#input)>b:
ลองออนไลน์!
โดย Regexes ส่วนบุคคล
#import base
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
^,(_*),$/d<$1>/
j,b:u<(?#input)>b:
ขั้นตอน
ประการแรกเรานำเข้าไลบรารี 'ฐาน' ซึ่งให้สอง regexes หนึ่งซึ่งแปลงu<numbers>
เป็นเอกภาพ และอีกอันหนึ่งที่แปลงd<unary_underlines>
กลับเป็นทศนิยม นี่เป็นเพราะความท้าทายต้องใช้ IO ใน base10
จากนั้นเราจะกำหนดจำนวนหนึ่งของ regexes ซึ่งแปลงเอกนารีเป็นไบนารี
b(\d*):(_*)\2_b/b1$1:$2b/
b(\d*):(_+)\2b/b0$1:$2b/
b(\d+):b/$1/
b:b/0/
ครั้งแรกของเหล่านี้b(\d*):(_*)\2_b/b1$1:$2b/
ค้นหาb
ตามด้วยตัวเลขไบนารีบางแล้วจากนั้นปริมาณของการขีดเส้นใต้ตามด้วยจำนวนเดียวกันที่แน่นอนของการขีดเส้นใต้บวกหนึ่งและสุดท้ายอีก:
b
จากนั้นเราจะแทนที่ด้วยb1
ตามด้วยตัวเลขไบนารีจากก่อนและเพียงแค่ช่วงครึ่งแรกของขีดและสุดท้ายสุดท้าย:
b
ดังนั้นนี่จะตรวจสอบว่าเอกภาพไม่หารด้วยสองหรือไม่และถ้าเป็นเช่นนั้นจะเป็นการรวม 1 ให้เป็นเลขฐานสองแล้วแบ่งออกเป็นลบทีละสอง
อันที่สองb(\d*):(_+)\2b/b0$1:$2b/
นั้นเกือบจะเป็น idendical แต่ไม่ได้ตรวจสอบสิ่งที่เพิ่มขึ้น_
ซึ่งหมายความว่าจะตรงกับถ้ามันหารด้วยสองและในกรณีนี้เป็นการเตรียมการ0
แทน
อันที่สามตรวจสอบว่าเราไม่มีเลขหลักเลขหรือไม่และถ้าใช่ให้ตัดการขยายออกเพื่อให้เหลือเลขฐานสอง
สุดท้ายการตรวจสอบหากมีไม่เคยได้รับตัวเลขไบนารีใด ๆ 0
ที่จัดทำและในกรณีที่เพิ่งใบ
Regexes กลุ่มถัดไปที่เรากำหนดคือการแปลงไบนารีกลับเป็นเอกภาพและง่ายขึ้นเล็กน้อย
B(_*):1/B$1$1_:/
B(_*):0/B$1$1:/
B(_*):B/$1/
ครั้งแรกของกลุ่มนี้B(_*):1/B$1$1_:/
มากเช่นสิ่งที่ตรงกันข้ามมันตรวจพบB
ตามด้วยจำนวนตัวเลขเอกใด ๆ :1
แล้ว ไม่ได้ตรวจสอบการจับคู่B
ในกรณีนี้เนื่องจากจะค้นหาเพียงหนึ่งหลักในแต่ละครั้ง หากตรงกับนี้มันจะเพิ่มจำนวนของเลขคู่หลักที่ตรงกันก่อนหน้านี้และเพิ่มหนึ่งหลักจากนั้นลบหนึ่งหลัก
ประการที่สองB(_*):0/B$1$1:/
คือเกือบเป็นไปตามหลักแรกยกเว้นตรงกับ a 0
มากกว่า1
และไม่เพิ่มตัวเลขหลักเดียวเพิ่มเติม
สุดท้ายของสิ่งเหล่านี้B(_*):B/$1/
ตรวจสอบว่าไม่มีเลขฐานสองอีกหรือไม่ ซึ่งแตกต่างจากสิ่งที่ตรงกันข้ามมันไม่จำเป็นต้องเป็นกรณีพิเศษ 0
ต่อไปเราจะกำหนดj
regexes ซึ่งทำหน้าที่เป็นตัวแยก
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
ครั้งแรกj(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
ทำส่วนใหญ่ของการยกของหนัก จะค้นหาj
ตามด้วยตัวเลขไบนารีซึ่งเป็น "incrementer" แล้วตามด้วยเครื่องหมายจุลภาค incrementer แล้วว่าตัวเลข 8 :
หลักเลขฐานสองตามด้วยส่วนที่เหลือของเลขฐานสองที่แล้ว ครั้งแรกของ 8 หลักถูกผนวกเข้ากับ incrementer จึง incrementing มันแล้วทุกอย่าง แต่ผู้ที่ 8 หลักจากอินพุตไบนารีถูกผนวกหลังจากที่ดังต่อไปนี้:
,
ดังนั้น (ถ้าเราได้ใช้ตัวเลข 2 หลักแทน 8) j,1001:
จะกลายเป็นแล้วj1:1001:,01
j10:1001,01,11
นอกจากนี้องค์ประกอบอาร์เรย์ที่ต่อท้ายจะถูกห่อB
เป็น s เพื่อแปลงกลับเป็นเอกภาพ
อีกอันหนึ่งj(\d*),\1\d{0,7}:,?(.*)/,$2,/
ตรวจสอบว่ามีเลขฐานสองเหลืออยู่น้อยกว่า 8 หลักเพื่อตรวจสอบหลังจากตัวเพิ่มหรือไม่ถ้าใช่ให้ลบทุกอย่างที่ไม่ใช่อาร์เรย์ที่ล้อมรอบด้วย,
s เช่น.,_,___,
ระหว่างและหลังการสร้างอาร์เรย์เราจะกำหนด regexes การเปรียบเทียบ
,((_+)_+),(\2),/,$1,/
,(_+),(\1_*),/,$2,/
ครั้งแรกของเหล่านี้,((_+)_+),(\2),/,$1,/
ตรวจสอบเครื่องหมายจุลภาคตามด้วยจำนวนของขีดล่างแล้วบางส่วนเพิ่มเติมตามด้วยเครื่องหมายจุลภาคจากนั้นจำนวนแรกขีดล่างกว่าเครื่องหมายจุลภาค จากนั้นจะแทนที่ด้วยขีดล่างทั้งหมดในองค์ประกอบแรกที่ล้อมรอบด้วย,
s
หลัง,(_+),(\1_*),/,$2,/
ตรวจสอบเครื่องหมายจุลภาคตามด้วยขีดล่างจำนวนหนึ่งตามด้วยเครื่องหมายจุลภาคอื่นจากนั้นจำนวนเดียวกันหรือขีดล่างมากกว่าและเครื่องหมายจุลภาคสุดท้าย สิ่งนี้จะปล่อยองค์ประกอบที่เหมาะสมไว้แทน
ในที่สุดเมื่อมีองค์ประกอบที่เหลือจึงจับคู่เราเอาเครื่องหมายจุลภาคโดยรอบและแปลงกลับไปทศนิยมผ่าน^,(_*),$
d<>
จากนั้นไม่มี regexes อีกต่อไปที่สามารถยิงและแสดงผลได้
อินพุตถูกวางไว้ในเทมเพลตj,b:u<(?#input)>b:
ซึ่งจะแปลงทศนิยมอินพุตเป็น unary เช่น5
-> j,b:_____b:
จากนั้นส่งผลให้ยูนารี่เป็นไบนารี่j,101:
จากนั้นแยกไบนารี่ (ซึ่งไม่ได้ผลกับตัวอย่าง) ได้รับองค์ประกอบที่ใหญ่ที่สุดแปลง กลับไปเป็นทศนิยมและเสร็จสิ้น