การบีบอัดอาร์เรย์สตริง
UPDATE:เครื่องมือที่ให้ความสำคัญในปลายนี้มีตั้งแต่ถูกเขียนใหม่, การปรับปรุงและบูรณาการเข้าล่าม Japt ของฉัน เพื่อผลลัพธ์ที่ดีที่สุดขอแนะนำให้คุณใช้คอมเพรสเซอร์นั้นเหนือสิ่งใดก็ตามที่ลิงก์ด้านล่าง ฉันจะทบทวนเคล็ดลับนี้อีกครั้งเมื่อฉันมีเวลามากขึ้นแล้วเขียนมันใหม่โดยคำนึงถึงคอมเพรสเซอร์ใหม่
บทนำ
หากคุณมีอาเรย์ของสตริงในโค้ดของคุณวิธีที่ชัดเจนที่สุดในการบีบอัดมันก็คือการรันแต่ละสตริผ่านOc
แต่ละที สำหรับจุดประสงค์ของเคล็ดลับนี้เราจะทำงานร่วมกับอาร์เรย์["lollipop","marshmallow","nougat","oreo"]
ซึ่งมีน้ำหนักอยู่ที่ 42 ไบต์ในตอนแรก การใช้แต่ละสตริงผ่านOc
ทำให้เรา:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
นั่นคือตอนนี้ 33 ไบต์การประหยัดที่เหมาะสม
ขั้นตอนที่ 1
แต่เราทำได้ดีกว่า หากเราเข้าร่วมอาร์เรย์กับสตริงที่คั่นด้วยบรรทัดใหม่เราสามารถกำจัดวงเล็บเครื่องหมายจุลภาคและ backticks ภายนอกและแยกบนบรรทัดใหม่เพื่อรับอาร์เรย์ของเรา การนำไปใช้กับอาร์เรย์ตัวอย่างของเราจะให้สิ่งต่อไปนี้กับเรา:
`lo¥ipop
Ú\hÚaow
Í
eo`·
ลงไปที่ 26 ไบต์
ขั้นตอนที่ 2
แต่เราสามารถทำได้ดีกว่านี้! เราสามารถใช้อักษรตัวพิมพ์เล็กเพื่อกำหนดขอบเขตสตริงแทนการขึ้นบรรทัดใหม่ซึ่งอาจรวมอยู่ในการบีบอัด z
ไม่ได้ใช้ในสตริงของเราดังนั้นเราจะปล่อยสิ่งนั้นและดูว่าเราจะไปต่อได้อย่างไร
`lo¥ipopzÚ\hÚaowzÍzeo`qz
อ้าถั่ว - ไม่มีการปรับปรุงเลย จำนวนไบต์ของเราเพิ่มขึ้นหนึ่งตัว! อาจจะมีจดหมายอีกฉบับหนึ่งคุณสามารถใช้ แต่ทั้งนี้ขึ้นอยู่กับสายของคุณอาจจะมีค่อนข้างน้อยที่จะลอง - ในตัวอย่างของเรามี b,c,d,f,j,k,q,v,x,y,z
11: การลองใช้แต่ละครั้งจะค่อนข้างน่าเบื่อซึ่งเป็นที่ที่เครื่องมือที่มีประโยชน์นี้เข้ามา ป้อนสตริงขึ้นบรรทัดใหม่ของคุณให้แยกจากกันและจะพยายามกำหนดขอบเขตสตริงด้วยตัวอักษรแต่ละตัวที่ไม่มีอยู่ในสตริงเหล่านั้นและเอาต์พุต:
- สตริงที่บีบอัดที่สั้นที่สุด
- ตัวคั่นที่ใช้และ
- ความยาวของมัน
เรียกใช้สตริงตัวอย่างของเราผ่านมันแสดงให้เห็นว่าb
ให้ผลลัพธ์ที่ดีที่สุด:
`lo¥ipáæqrÚaowbÍÞo`qb
แล้วคุณก็มีเราเหลือเพียง 24 ไบต์
ขั้นตอนที่ 3
แต่ที่เราสามารถทำได้แม้จะดีกว่า! หากลำดับของสตริงในอาร์เรย์ของคุณไม่สำคัญอาจมีการเปลี่ยนแปลงที่แตกต่างกันรวมกับตัวคั่นอื่นที่สามารถทำงานได้สั้นลง การพยายามทำทุกสิ่งที่เป็นไปได้นั้นน่าเบื่อมากกว่า ด้วย 4 สายของเรามีการเปลี่ยนลำดับที่แตกต่างกัน 24 แบบให้ลอง ด้วยตัวอักษร 11 ตัวที่เป็นไปได้แต่ละข้อที่กลายเป็น 264! นั่นคือสิ่งที่เครื่องมือนี้เข้ามาเล่น อีกครั้งให้ป้อนสตริงขึ้นบรรทัดใหม่ของคุณและมันจะลองทุกการรวมกันของทุกการเปลี่ยนแปลงและจดหมายคั่นทุกฉบับ
- ลำดับของสตริงในสตริงที่บีบอัดสั้นที่สุด
- สตริงที่บีบอัด
- ตัวคั่นที่ใช้และ
- ความยาวของมัน
การรันสตริงตัวอย่างของเราผ่านมันแสดงให้เห็นว่า"nougat","oreo","lollipop","marshmallow"
ด้วยb
ตัวคั่นให้ผลลัพธ์ที่ดีที่สุดโดยมีจำนวนไบต์สุดท้ายเพียง 23:
`ÍÞo½o¥ipáæqrÚaow`qb
เคล็ดลับโบนัส: การบีบอัดอาร์เรย์จำนวนเต็ม
คุณสามารถใช้หลักการเดียวกันกับอาร์เรย์ของจำนวนเต็มโดยแปลงค่าแรกเป็นฐานที่สูงกว่า ใช้ตัวอย่างนี้อาร์เรย์ 36 ไบต์:
[588181,156859,595676,475330,680474]
เราสามารถลดขนาดได้ถึง 29 ไบต์โดยการแปลงมันเป็นอาเรย์ของสตริง 32 ตัวแรกแล้วรันมันผ่านโปรแกรมบีบอัดแรก:
`huclt4p5r5ÛÊg62tkogq`qt mnH
หรือต่ำสุดที่ 27 ไบต์โดยใช้โปรแกรมที่สอง:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
คุณอาจจะสามารถบันทึกไบต์อื่นหรือ 2 ที่ด้านบนของมันโดยการย้ายการแปลงจำนวนเต็มเป็นวิธีการที่คุณกำลังทำงานอยู่ในอาร์เรย์
หมายเหตุ
- อย่าลืมให้ปัจจัยใน 1 หรือ 2 ไบต์พิเศษค่าใช้จ่ายมากกว่า
q<letter>(<space>)
·
แม้ว่าคุณจะสามารถใช้ช็อตคัท Unicode ตัวใดตัวหนึ่งเพื่อรับไบต์กลับขึ้นอยู่กับตัวคั่นของคุณ ( qÊ
เช่นเดียวกับql<space>
ตัวอย่าง)
- คำเตือนเมื่อใช้เครื่องมือสุดท้าย: ยิ่งคุณมีจำนวนการเรียงสับเปลี่ยนมากขึ้นเท่าไหร่โปรแกรมก็จะยิ่งทำงานช้าลงจนกว่าจะหมดแรง ดังรายละเอียดข้างต้นด้วยสตริงตัวอย่าง 4 รายการของเราและตัวอักษรที่เป็นไปได้ 11 แบบให้ลองมีชุดค่าผสมที่เป็นไปได้ 264 ชุดเพิ่มจำนวนสายอักขระเพียง 1 ตัวด้วยตัวอักษร 11 ตัวเดียวกันและเรามี 1320 ชุดที่จะลอง (คุณสามารถใช้เครื่องมือนี้เพื่อนับจำนวนชุดค่าผสมได้หากต้องการ)
เครดิต
- โอลิเวอร์เป็นแรงบันดาลใจในการสร้างเครื่องมือที่พบในเคล็ดลับนี้
- ETHProductions สำหรับการพิสูจน์อักษร