สตริงการเล่นกอล์ฟ


22

ฉันได้ล้มเหลวเสมอที่จะให้คำตอบสำหรับความท้าทายที่ต้องใช้การบีบอัดสตริงเหตุผลหลักที่ว่าผมไม่ทราบว่าจะใช้เครื่องมือการบีบอัดสตริงอย่างมีประสิทธิภาพเท่าที่ฉันควร

ด้วยเหตุนี้ฉันได้โพสต์คำถามนี้ แตกต่างจากคำถามเคล็ดลับอื่น ๆ ของฉันนี่ไม่ใช่ความหมายเฉพาะภาษาที่ถ้าคุณสามารถนึกถึงเคล็ดลับในภาษาของคุณเองคุณสามารถโพสต์ได้ (หากคุณระบุภาษา) เคล็ดลับทั่วไปยังชื่นชม

ดังนั้นฉันจะใช้เครื่องมือบีบอัดสตริงเพื่อให้ได้ประสิทธิภาพสูงสุดได้อย่างไร

คำตอบ:


9

การแปลงฐาน (CJam)

วิธีง่ายๆในการเข้ารหัสสตริง ASCII ที่ไม่ได้เริ่มต้นด้วยไบต์ว่างคือการแปลงจากฐาน 128 เป็นจำนวนเต็มจากนั้นเป็นฐาน 256:

128b256b:c              e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.

สิ่งนี้ใช้ 7 บิตเพื่อเข้ารหัสอักขระ ASCII แต่ละตัว

หากสตริงเดิมประกอบด้วยเพียงตัวอักษรตัวพิมพ์เล็กและไม่เริ่มต้นด้วยaเราสามารถเริ่มต้นด้วยการจับคู่"a...z"กับ[0 ... 25]แล้วดำเนินการตามข้างต้น:

'afm26b256b:c               e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.

ในที่สุดหากสตริงเดิมมีอักขระที่ไม่ซ้ำกันเพียงไม่กี่ตัว (ทั่วไปในศิลปะ ASCII) จะเป็นการดีกว่าที่จะระบุตัวอักษรอย่างชัดเจน

ตัวอย่างเช่น:

" +-/\|"f#6b256b:c                       e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.

ตามกฎของหัวแม่มือคุณต้องการให้อักขระตัวแรกของสตริงต้นฉบับเป็นอักขระตัวที่สองของตัวอักษรตัวอักขระถัดไปที่แตกต่างกันของสายอักขระดั้งเดิมจะเป็นอักขระตัวแรกของตัวอักษรอักขระตัวถัดไปของสตริงดั้งเดิม เป็นตัวละครตัวที่สามของตัวอักษรตัวละครที่แตกต่างกันต่อไปของสายเดิมที่จะเป็นตัวละครที่สี่ของตัวอักษร ฯลฯ

ตัวเข้ารหัสของตัวอย่างล่าสุดทำงานดังนี้:

" +-/\|"f# e# Replace each character by its index in that string.
6b256b     e# Convert from base 6 (length of the alphabet) to base 256.
:c         e# Cast each digit to character.

ตัวถอดรหัสของตัวอย่างล่าสุดทำงานดังนี้:

256b6b     e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.

2
ฉันจะเจาะจงมากขึ้น: ตามกฎของหัวแม่มือที่คุณต้องการให้ตัวอักษรตัวแรกของสตริงต้นฉบับเป็นตัวอักษรตัวที่สองของตัวอักษรตัวละครที่แตกต่างกันต่อไปของสายเดิมที่จะเป็นตัวอักษรตัวแรกของ ...
Peter Taylor

@PeterTaylor เพิ่มแล้ว ขอบคุณ!
Dennis

9

คำถามซับซ้อนที่มีขนาดใหญ่กว่า Kolmogorov ที่มีโครงสร้างบางส่วน แต่ไม่มีสูตรง่าย ๆ (เช่นเนื้อเพลง) โดยทั่วไปแล้วจะได้รับประโยชน์จากวิธีการที่ใช้ไวยากรณ์ ในสาระสำคัญคุณแยกสารตั้งต้นซ้ำแล้วเข้ารหัสพวกเขาอย่างใด นี่คือสิ่งที่ Lempel-Ziv ทำได้โดยใช้ไวยากรณ์ที่มีข้อ จำกัด ถ้าคุณใช้ไวยากรณ์ทั่วไปมากขึ้นคุณต้องเข้าใจวิธีการเข้ารหัสกฎ เช่นวิธีการอย่างใดอย่างหนึ่ง "การเข้ารหัสชดเชย" ที่นี่คือที่ที่คุณชดเชยแต่ละไบต์แหล่งที่มาจากจำนวนของกฎ (คนn) ไบต์กำหนด1ไปnกับกฎระเบียบของใช้0ไบต์กับกฎระเบียบที่แยกต่างหากและซ้ำ ๆ แทนที่ไบต์หลักเกณฑ์การประเมินi iในที่สุดคุณก็เลิกทำการชดเชยโดยการลบออกnจากแต่ละไบต์

ฉันได้เขียนโปรแกรม Javaจริง ๆซึ่งใช้วิธีการต่าง ๆ :

วิธีการส่วนใหญ่เป็นไปตามกระบวนการสองเฟส ในระยะแรกสตริงจะถูกแปลงเป็นไวยากรณ์ที่สร้างมัน ในระยะที่สองไวยากรณ์จะถูกแปลงเป็นโปรแกรม GolfScript การใช้งานในช่วงแรกนั้นส่วนใหญ่จะอยู่บนพื้นฐานของ Charikar, Lehman, Liu, Panigrahy, Prabhakaran, Sahai, & Shelat (2005) ปัญหาไวยากรณ์ที่เล็กที่สุดทฤษฎีข้อมูลธุรกรรม IEEE บน 51 (7), 2554-2576

นอกจากนี้ยังรวมถึงวิธีการ Lempel-Ziv วิธีการเข้ารหัสพื้นฐานและวิธีการเข้ารหัสแบบเข้ารหัสความยาวและระบุวิธีที่ให้โปรแกรมที่สั้นที่สุด


0

สแตกซ์

ในสแตกซ์รหัสภาษาการเล่นกอล์ฟมีเครื่องมือเล็ก ๆ น้อย ๆ ที่เป็นประโยชน์เรียกว่าสตริงตัวอักษรคอมเพรสเซอร์ ผมไม่ทราบว่าวิธีการทำงานว่า แต่มีอีกที่ผมไม่ทราบวิธีการทำงาน มันแปลงสตริงเป็นตัวเลขจากนั้นเป็นฐาน 256 เป็นCP437โดยมีการแปลง 0x00 และ 0xFF สำหรับการคัดลอก มันเป็น PackedStax คุณสามารถแปลงสตริงของคุณด้วยตัวบีบอัดสตริงตามตัวอักษรแล้วแพ็คมันสำหรับการบีบอัดที่ดี

การใช้กระบวนการนี้สตริง "สตริงนี้คือสามสิบสองไบต์" สามารถแปลงเป็น v * "A] - | W4]} 3"% (สตริงที่บีบอัดมักจะล้อมรอบด้วย backticks เพื่อบอกความแตกต่างระหว่างสตริงปกติใน Stax ) และในที่สุดก็ถึงüvìë! [┴╩qJu←▓αสำหรับการบีบอัด / ลดขนาด 18 ไบต์มากกว่าครึ่ง

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