เข้ารหัส - สลับ - ถอดรหัส


23

ท้าทาย

งานของคุณคือการเข้ารหัสจำนวนเต็มเป็นสตริงของอักขระ ASCIIจากนั้นถอดรหัสสำเร็จหลังจากสตริงดังกล่าวได้รับการสับแบบสุ่ม

คุณจะเขียนสองโปรแกรม / ฟังก์ชั่นซึ่งจะถูกเรียกว่าเข้ารหัสและถอดรหัส

Encoder

  • การป้อนข้อมูล:จำนวนเต็มnในช่วง[0,2วันที่ 31-1] ]
  • เอาต์พุต:สตริงsของอักขระ ASCII (ไม่จำเป็นต้องพิมพ์ได้)

ถอดรหัส

  • การป้อนข้อมูล:สุ่มการเปลี่ยนแปลงs'ของสตริงss
  • เอาท์พุท:จำนวนเต็มnn

เกณฑ์การให้คะแนน

ให้เป็นความยาวสูงสุดของsข้ามค่าที่เป็นไปได้ทั้งหมดของn ถ้าตัวเข้ารหัสทำหน้าที่ไม่ได้กำหนดไว้ล่วงหน้า (ซึ่งได้รับอนุญาตให้ดูด้านล่าง) จากนั้นAจะเป็นความยาวสูงสุดของsที่อาจเกิดขึ้น (อาจ )AsnAs

ให้LEเป็นความยาวของตัวเข้ารหัสในหน่วยไบต์และLDคือความยาวของตัวถอดรหัสในหน่วยไบต์

แล้วคะแนนของคุณเป็น( L E + L D )A(LE+LD)

ชัยชนะที่ได้รับรางวัลในการยื่นคะแนนต่ำสุด

เวลาที่ จำกัด

มีข้อจำกัดเกี่ยวกับเวลาในการดำเนินการของEncoderและDecoderสำหรับการทดสอบครั้งเดียว (เช่นค่าเดียวคือn )

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

กฎระเบียบ

  • เข้ารหัสและถอดรหัสจะต้องเขียนในภาษาเดียวกัน
  • ถอดรหัสต้องส่งออกที่ถูกต้องจำนวนเต็มnสำหรับการเปลี่ยนแปลงเป็นไปได้ทุกs'ของสตริงsส่งกลับโดยEncoder
  • เข้ารหัสและถอดรหัสจะไม่ได้รับอนุญาตให้ใช้ข้อมูลร่วมกันในทางใด ๆ (เช่นโดยวิธีการของตัวแปรทั่วโลกหรือไฟล์)
  • การส่งออกของEncoderต้องไม่เป็นที่กำหนด (นั่นคือการป้อนข้อมูลเดียวกันnอาจผลิตสตริงเอาท์พุทที่แตกต่างกันถ้าEncoderจะดำเนินการหลายครั้ง) แต่ถอดรหัสมักจะต้องเดาถูกต้องจำนวนเต็มnn
  • เข้ารหัสและถอดรหัสอาจใช้เวลาและกลับจำนวนเต็มnในวิธีที่สะดวกใด ๆ (เช่นถ้าn=14มันเป็นเรื่องปกติสำหรับการป้อนข้อมูลที่จะเป็น14, "14"หรือ[1,4])
  • Encoderอาจเอาท์พุทสตริงsทั้งโดยการพิมพ์บนstdout หรือโดยการกลับสตริงรายการ / อาร์เรย์ของตัวอักษรหรือรายการ / อาร์เรย์ของจำนวนเต็มในช่วง[0,127] ; ทราบว่าถอดรหัสจะได้รับเป็น input การเปลี่ยนแปลงของsที่ส่งกลับโดยEncoderดังนั้นจึงควรยอมรับสตริงs'ในรูปแบบเดียวกันเป็นss
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • หากเป็นไปได้ให้อธิบายวิธีการทำงานของรหัสของคุณและเหตุผลที่คะแนนที่คุณอ้างนั้นถูกต้อง

ตัวอย่าง

สมมติn=14 14

  • ตัวเข้ารหัสได้รับ14เป็นอินพุต "qwerty"มันส่งออกเดือนพฤษภาคม
  • ถอดรหัสได้รับการเปลี่ยนแปลงของ"qwerty"เป็น input "tweyqr"ตัวอย่างเช่น มันจะต้องส่งออก14(ในรูปแบบที่สะดวก)

Encoderจะได้กลับมา[113,119,101,114,116,121]เป็นอย่างดีซึ่งในกรณีถอดรหัสจะได้รับ [116,119,101,121,113,114](ตัวอย่างเช่น)

โปรดทราบว่าสตริงที่ส่งคืนโดยEncoderอาจมีอักขระ ASCII ที่ไม่สามารถพิมพ์ได้ (แต่มักจะอยู่ในช่วง[0x00, ..., 0x7F])


แน่นอน
ว่าความ

@ H.PWiz ไม่สามารถทำได้ แต่ความยาวอาจไม่ได้รับการ จำกัด หากตัวเข้ารหัสไม่ได้กำหนดไว้
Delfad0r

"ตัวเข้ารหัสและตัวถอดรหัสไม่ได้รับอนุญาตให้แบ่งปันข้อมูลในทางใด ๆ " สิ่งนี้รวมถึงฟังก์ชั่นตัวช่วยหรือไม่? ie ฟังก์ชั่นที่กำหนดเองที่คำนวณ N factorial บวกสาม (ตัวอย่างแบบสุ่ม)
pizzapants184

Encoder ของเราสามารถส่งคืนสตริง / รายการที่ว่างเปล่าได้หรือไม่?
pizzapants184

2
@Kroppeb ใช่ ณ ตอนนี้กฎบอกว่าคุณควรนับจำนวนสองครั้ง ฉันสนใจที่จะเห็นการส่งบทความสองรายการที่เหมือนกัน
Delfad0r

คำตอบ:


12

เยลลี่ , (17 ไบต์ + 18 ไบต์) ×ยาว 6 = 210 คะแนน

b36μỤỤ + ×3μŒ¿b3U + S
S: 3_J
s% 3Uḅ3œ? Çḅ36

ลองออนไลน์! (หรือด้วยข้อมูลการดีบักเพิ่มเติม)

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

คำอธิบาย

การเข้ารหัส

ขั้นตอนแรกในการเข้ารหัสคือการแสดงอินพุตเป็นฐาน 36 ( b36) 36 6 = 2176782336> 2147483647 ดังนั้นผลลัพธ์จะมีได้สูงสุด 6 หลักแต่ละผลลัพธ์อยู่ในช่วง 0–35

ต่อไปเราเปลี่ยนสิ่งนี้เป็นตัวแทนที่มี 6 หลักที่แตกต่างกัน มีอัลกอริธึมที่เป็นไปได้หลายอย่างสำหรับสิ่งนี้ แต่สิ่งที่ใช้ในที่นี้คือการเพิ่ม 1 ถึงหลักที่เล็กที่สุด 2 ถึง 2 ที่เล็กที่สุด 3 ถึง 3 ถึงเล็กที่สุดและอื่น ๆ ซึ่งหมายความว่าหากตัวเลขสองหลักเหมือนกันหนึ่งในนั้นจะถูกพิจารณาว่ามีขนาดเล็กกว่าและจะแตกต่างกัน และแน่นอนว่าอัลกอริทึมนี้ไม่สามารถทำให้ตัวเลขสองหลักที่แตกต่างกันกลายเป็นเหมือนเดิมได้ เพื่อแสดงสิ่งนี้ในเยลลี่เราใช้("เรียงลำดับดัชนีตามค่า") เพื่อรับรายการของดัชนีเรียงตามลำดับ อีกครั้งเพื่อกลับด้านนั้นทำการแมปองค์ประกอบของต้นฉบับกับตำแหน่งตามลำดับอย่างมีประสิทธิภาพ และµ…+เพื่อเพิ่มต้นฉบับลงในรายการใหม่ ผลลัพธ์คือการแสดงหมายเลขอินพุตเป็นหกหลักที่แตกต่างกันในช่วง 1–41 (ต่ำสุด 0 + 1, สูงสุด 35 + 6)

จากนั้นเราแบ่งสิ่งนี้เป็นรูปแบบอื่น: รายการที่เรียงลำดับของตัวเลขในช่วง 1-41 พร้อมกับตัวเลขจาก 1 ถึง 720 ที่แสดงถึงการเปลี่ยนลำดับที่เป็นไปได้ 720 รายการที่เป็นตัวเลข (Œ¿และแยกหมายเลขการเรียงสับเปลี่ยนและเรียงลำดับ รายการตามลำดับ.)

สุดท้ายเราแปลงตัวเลขจาก 1 เป็น 720 เป็นเบส 3 ( b3), ย้อนกลับ ( U) และเข้ารหัสหกหลัก 3 หลักและหก 1-41 หลักผ่านการบรรจุแต่ละอักขระเป็น ASCII เดียวโดยใช้ reverse divmod (ค่าของ อักขระ mod 3 คือฐาน 3 หลักค่าที่หารด้วย 3 คือ 1–41 หลัก) ช่วงของผลลัพธ์ที่เป็นไปได้คือ (1 × 3) + 0 = 3 ที่ต่ำสุดและ (41 × 3) + 2 = 125 ที่สูงสุดปรับให้อยู่ในช่วง ASCII ของเรา การบรรจุจะกระทำผ่าน×3และ+พร้อมกับส่วนเพิ่มเติมµเพื่อให้แน่ใจว่าทุกคำสั่งทำงานบนบิตที่ถูกต้องของข้อมูล (มีเคล็ดลับการเล่นกอล์ฟที่นี่ในการที่เราทำการคูณด้วย 3 ก่อนที่จะแยกการเรียงสับเปลี่ยน; ที่ช่วยประหยัดความจำเป็นในการใช้ไบต์บนอักขระการจัดกลุ่ม)

อนึ่งเหตุผลในการกลับหมายเลข 3 ฐานเป็นเพราะอาจมีตัวเลขน้อยกว่าหมายเลข 1–41 (ไม่สามารถมีได้มากกว่านั้นจำนวนที่น้อยที่สุดที่n !> 3 nนั้นสูงกว่าเล็กน้อย 6) เจลลี่จะแทรกเลขศูนย์ต่อท้ายได้อย่างมีประสิทธิภาพเมื่อรวมความยาวที่แตกต่างกันสองตัวเลขเข้าด้วยกัน เลขศูนย์ต่อท้ายจะมีผลต่อการตีความหมายเลข แต่เลขศูนย์นำหน้าจะไม่ใช้ดังนั้นจะใช้การย้อนกลับเพื่อให้แน่ใจว่าเลขศูนย์พิเศษจบลงที่ไหนสักแห่งที่จะไม่ทำให้คำตอบของเรายุ่งเหยิง

ถอดรหัส

ขั้นตอนแรกในการถอดรหัสคือการแยกตัวเลขสองตัว (หมายเลขฐาน 3 และหมายเลข 1–41) เราสามารถรับตัวเลขของพวกเขาได้อย่างง่ายดายด้วยการหาร ( ดังนั้นการแยกทั้งสองเริ่มต้นด้วยตามด้วยหรือตามความเหมาะสม:3 ) และโมดูโล ( %3) ตามลำดับ แต่จะรู้ได้อย่างไรว่าพวกเขาอยู่ในลำดับใด หมายเลข 1–41 มีตัวเลขเรียงตามลำดับและตัวเลขในตำแหน่งที่สอดคล้องกันของตัวเลขสองตัวนั้นถูกเก็บไว้ในตัวละครเดียวกัน ดังนั้นเราสามารถคำนวณได้ว่าจะเรียงสับเปลี่ยนตัวเลข 1–41 หลัก (โดยดูจากค่าสัมพัทธ์ของพวกมัน) และรู้ว่าตัวเลขฐาน 3 ต้องถูกสับด้วยวิธีเดียวกัน ในความเป็นจริงเนื่องจากอักขระของการเข้ารหัส ASCII ของเราเรียงลำดับเช่นเดียวกับตัวเลขของตัวเลข 1-41 (สิ่งเหล่านี้ล้วนแตกต่างกันและพวกมันมีความสำคัญมากกว่าตัวเลข 3 หลัก)%3:3

ในขณะที่ตัวเลขของหมายเลข 1–41 ยังคงเรียงตามลำดับเรามีวิธีที่สะดวก / สั้นมากในการกลับไปที่หมายเลข 0-35 ของฐาน 36; เพียงแค่ลบ 1 จากแรก 2 จากสอง 3 จากสามและอื่น ๆ ในเยลลี่เราสามารถทำได้ด้วย_J("ดัชนีลบ")

ในขณะเดียวกันในสาขาอื่น ๆ ของการถอดรหัสเรากลับตัวเลขจำนวนฐาน 3 กลับเข้ามาในการสั่งซื้อ ( U) และแปลงจากฐาน 3 ḅ3กลับเข้ามาในดัชนีการเปลี่ยนแปลงด้วย

จากนั้นเราสามารถรวมสองสาขาเข้ากับœ?Ç; œ?หมายถึง "เปลี่ยนแปลงตามดัชนีการเปลี่ยนแปลงนี้" และÇหมายถึง "ผลลัพธ์ของการใช้บรรทัดด้านบน" นั่นคือสิ่งที่บอกให้ Jelly รันทั้งสองบรรทัดแยกกันในอินพุตเดียวกัน

สิ่งที่เรามีตอนนี้คือตัวเลขของตัวเลขดั้งเดิมในฐาน 36 (เนื่องจาก_J) และในลำดับเดิม (เนื่องจากœ?) ดังนั้นเราสามารถทำการḅ36แปลงกลับจากฐาน 36 เป็นจำนวนเต็มเดียว

ความเห็น

TIO! ลิงก์ด้านบนใช้ 312699167 เป็นหมายเลขที่จะเข้ารหัส หมายเลขนี้ในฐาน 36 คือ[5, 6, 6, 8, 7, 35]และแสดงให้เห็นทุกด้านของการเข้ารหัส: 35 ทดสอบขีด จำกัด ของช่วง 0–127 ที่เรามี; 6s ที่ซ้ำกันทดสอบความละเอียดของตัวเลขที่เหมือนกันในฐานเดิม 36; และความจริงที่ว่าตัวเลขเกือบ (แต่ไม่มาก) เรียงหมายความว่าจำนวนการเรียงสับเปลี่ยนมีขนาดเล็กมากทำให้มันมีจำนวนน้อยกว่าฐาน 36 จำนวนและแสดงให้เห็นว่าจำเป็นต้องย้อนกลับไปก่อนที่จะเพิ่มมันเข้าไป

มันสะดวกจริง ๆ ว่าค่าคงที่ทั้งหมดตรงนี้เข้ากันได้อย่างไร 36 6เป็นเพียงแค่สูงพอเพื่อให้พอดีกับ 2 31 3 6เป็นเพียงแค่สูงพอเพื่อให้พอดีกับ 6 !, และ (36 + 6) × 3 เป็นเพียงแค่สูงพอเพื่อให้พอดีกับความเป็นไปได้ 128 เรามี (ข้อ จำกัด สุดท้ายที่นี่คือข้อ จำกัด น้อยที่สุดเพราะเราสามารถใช้การจัดทำดัชนี 0 มากกว่าการทำดัชนี 1 ตัวเพื่อใช้อักขระในช่วง 0-2 แต่ถึงกระนั้นนั่นก็เพียงพอแล้วที่จะใช้ 37 เป็นฐานแทน กว่า 36. )


9

เยลลี่ , ( 4 3 ไบต์ + 6 5 ไบต์) ×ยาว 8 = 80 64 คะแนน

b⁴Ä
ṢŻIḅ⁴

ลองออนไลน์!

เยลลี่ , ( 2 1 ไบต์ + 4 3 ไบต์) ×ยาว 10 = 60 40 คะแนน

Ä
ṢŻI

ลองออนไลน์!

คำอธิบาย

โซลูชันที่ 1

นี่คือการใช้อัลกอริทึมที่แตกต่างจากคำตอบส่วนใหญ่ เราเริ่มต้นด้วยการเข้ารหัสค่าเป็นเลขฐานสิบหก ( b⁴) เช่นเดียวกับคำตอบอื่น ๆ จากนั้นนำผลรวมสะสม ( Ä) แต่ละอินพุตจะให้เอาต์พุตที่แตกต่างกันอย่างชัดเจน (เนื่องจากทั้งสองการดำเนินการเหล่านี้สามารถย้อนกลับได้) และกำหนดว่าการเข้ารหัสเลขฐานสิบหกจะมีจำนวนสูงสุด 8 หลักซึ่งสูงสุดคือ 7 (สำหรับตัวเลข 8 หลักสุดท้าย) และ 15 (สำหรับสุดท้ายถึง 7 - ตัวเลขสุดท้าย) จำนวนสูงสุดในรายการผลลัพธ์จะเป็น 7+ (7 × 15) = 112 น้อยกว่า 127 ที่คำถามต้องการ นอกจากนี้เอาต์พุตจะต้องเรียงตามลำดับช่วยให้เราสามารถสลับการสลับแบบได้

สำหรับตัวถอดรหัสก่อนอื่นเราสลับการสลับแบบเรียง ( ); จากนั้นย้อนกลับผลรวมสะสมโดยการเติมศูนย์ ( Ż) และรับผลต่างของคู่ที่ต่อเนื่องกัน ( I); จากนั้นแปลงกลับจากเลขฐานสิบหก ( ḅ⁴)

โซลูชันที่ 2

คำถามที่จริงช่วยให้เราสามารถนำเข้าเป็นรายการของหลัก (ทศนิยมน่าจะเป็น) เพื่อให้เราสามารถ "โกง" โดยเพียงแค่ลบการแปลงฐาน; จำนวนสูงสุดที่ใช้ในเอาต์พุตจะเป็น 2 + (9 × 9) = 83 (อันที่จริง 82 เพราะ 2999999999 อยู่นอกช่วงดังนั้นอินพุตที่แย่ที่สุดคือ 1999999999) การเข้ารหัสที่ได้นั้นเป็นสิ่งที่แย่มากเมื่อการเข้ารหัสสำหรับปัญหานี้เกิดขึ้น แต่มันมีข้อได้เปรียบในการสร้างเสียงที่สั้นมากซึ่งมีค่ามากกว่าความ verbosity ของการเข้ารหัส

คำตอบนี้ให้ความรู้สึกเหมือนการโกงไม่ใช่คำตอบหลักของฉันสำหรับปัญหานี้ แต่ดูเหมือนว่ามันคุ้มค่าที่จะเพิ่มเพราะมันสอดคล้องกับกฎระเบียบทางเทคนิคและให้คะแนนดีกว่า

ความเห็น

ฉันมีอัลกอริทึมบางอย่างในการรับความยาวต่ำกว่า 8 แต่ดูเหมือนว่าคุณไม่สามารถใช้อัลกอริธึมความยาว -7 ใน≤9ไบต์ (ไม่ใช่การโกง) หรือ by5 ไบต์ (การโกง) ดังนั้นโดยการให้คะแนนในคำถามนี้ น่าจะเป็นวิธีที่ดีที่สุดที่จะทำ (ฉันอาจต้องหาทางแก้ปัญหาสำหรับทางเลือก "ลดความยาวของการเข้ารหัส" แต่อย่างไรก็ตามเพื่อความสนุก)

ไม่เหมือนกับโซลูชันบางตัวการใช้ 16 เป็นฐานที่นี่ไม่สำคัญ มีตัวเลขอื่น ๆ อีกมากมายที่ใช้งานได้สำหรับโซลูชันความยาว 8 (เช่น 18) ฉันเลือก 16 วิธีแรกเนื่องจาก Jelly มีวิธี 1 ไบต์เพื่อแสดงว่าและฐานที่ทำงานได้อื่น ๆ จะต้องใช้หลายไบต์จากโปรแกรม แน่นอนทางออกที่สองต้องใช้ 10 เป็นฐานในการใช้ช่องโหว่

ขอบคุณ @Dennis ที่ชี้ให้เห็นถึงคำสั่ง Jelly รุ่นใหม่บางคำสั่งที่ทำให้อัลกอริทึมนี้ยิ่งใช้งานได้ดี


3
Äสั้นสำหรับ+\, สั้นสำหรับŻ 0;
เดนนิส

7

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 10 * (264 + 494) = 8650 7910 7580

ตัวเข้ารหัส: 264 ไบต์

,.Ajax,.Ford,.Act I:.Scene I:.[Exeunt][Enter Ajax and Ford]Ajax:Open mind.Be you nicer zero?You be the sum ofyou the product ofthe sum ofI a big big pig the sum ofa big big big big cat a big big pig.If soSpeak thy.Ford:You are the sum ofyou a cat.If soLet usAct I.

ลองออนไลน์!

ถอดรหัส: 494

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Exeunt][Enter Ajax and Ford]Ajax:Open mind.Is you nicer a pig?If soRemember you.If soLet usAct I.Scene V:.Ford:Remember I.Ajax:Recall.Is you worse the sum ofPage twice the sum ofa big big cat a cat?If soYou be the difference betweenyou Page.If soOpen heart.If notlet usScene V.Scene X:.Ford:Recall.Ajax:Be I nicer zero?If soRemember I.If soLet usScene X.[Exit Ajax][Enter Page]Ford:You be the sum ofyou twice twice the sum ofa big big cat a pig.Let usAct I.

ลองออนไลน์!

นี่คือสิ่งที่

ตัวเข้ารหัสจะเข้ารหัสแต่ละหลักเป็นตัวเลขบวกกับดัชนีของหลักสิบสองครั้ง เครื่องถอดรหัสจะเก็บอินพุตทั้งหมดไว้ในหน่วยความจำของฟอร์ดแล้ววนซ้ำไปที่เคาน์เตอร์นับจากนั้นจึงลบตัวเลขแต่ละตัวที่ต่ำกว่าตัวนับ * 12 + 10

คำอธิบาย:

Encoder

,.Ajax,.Ford,.Act I:.Scene I:.      Boilerplate introducing the two characters
[Exeunt][Enter Ajax and Ford]       Enter the two characters Ajax and Ford
                                    Ford will be handling the input
                                    Ajax will be the counter
Ajax:Open mind.                     Set Ford to the next character of input
Be you nicer zero?                  Check if it is EOF
You be the sum of                   Set Ford to the sum of 
    you                             His original value (48 to 58)
    the product of                 
          the sum of               
              I                     Ajax's value
              a big big pig         Minus 4 (this handles the offset of 48)
          the sum of                Multiplied by
              a big big big big cat 2^4
              a big big pig.        + -2^2 = 12
                                    This essentially sets Ford to (F+12*(A-4))
If soSpeak thy.                      If not EOF, print Ford's value
Ford:You are the sum ofyou a cat.   Increment Ajax's value
If soLet usAct I.                   If not EOF, Repeat again.

ถอดรหัส

,.Ajax,.Ford,.Page,.Act I:.Scene I:.  Boilerplate introducing three characters
                                      Ajax is the spare stack
                                      Ford is the storage stack
                                      Puck is the counter, increasing by 12
[Exeunt][Enter Ajax and Ford]            Enter Ajax and Ford onto the stage
Ajax:Open mind.                          Get the next character of input
Is you nicer a pig?                      If not EOF
If soRemember you.                         Store the value in Ford's memory
If soLet usAct I.                          And repeat the loop
Scene V:.                                Otherwise move to the next scene
Ford:Remember I.                         Store Ford's value (initially -1 from EOF) in Ajax's memory
Ajax:Recall.                             Get the next value from Ford's memory
Is you worse the sum of                  Is the value smaller than
        Puck                                  Puck's value
        twice the sum ofa big big cat a cat?  + 10 ?
                                              i.e. is it the next digit?
If soYou be the difference betweenyou Puck.   If so, subtract Puck's value from Ford
If soOpen heart.                              And print Ford's value
If notlet usScene V.                     If that was not the digit, repeat
Scene X:.
Ford:Recall.                             Get the next value from Ajax's memory
Ajax:Be I nicer zero?                    Until the -1
If soRemember I.                         Returning the values to Ford's memory
If soLet us Scene X.                     Repeat until Ajax's memory is exhausted
[Exit Ajax][Enter Page]                  Swap Ajax and Page
Ford:You be the sum of                   Set Puck's value to
              you                        Puck +   
              twice twice the sum of     2*2*(
                           a big big cat      4
                           a pig.             -1) = 12
Let usAct I.                             And start from the beginning again, having removed one number

5

Python 2.7, 31 * (52 + 37) = 2759

ตัวเข้ารหัส ( 69 52 ไบต์):

lambda n:[chr(i)if n&(1<<i)else""for i in range(32)]

ถอดรหัส ( 41 37 ไบต์):

lambda s:sum([1<<(ord(c))for c in s])

เก็บบิตที่ไม่เป็นศูนย์ทั้งหมดในหมายเลขอินพุตเป็นค่า ascii ค่าของตัวอักษร ascii เก็บตำแหน่งของบิตที่ตั้ง เช่นค่า 'a' จะหมายถึงการตั้งค่าบิตที่ 97

การปรับปรุงเล็กน้อยขอบคุณ @ Delfad0r

ลองออนไลน์!


ยินดีต้อนรับสู่ PPGC! คุณสามารถวางe = และd = จุดเริ่มต้น - ฟังก์ชั่นที่ไม่ระบุชื่อได้อย่างสมบูรณ์แบบ นอกจากนี้โปรดทราบว่าข้อความแจ้งปัญหาชัดเจนว่าโปรแกรมเข้ารหัสอาจส่งคืนรายการจำนวนเต็มแทนอักขระดังนั้นคุณสามารถหลีกเลี่ยงการแปลงจำนวนเต็ม -> อักขระ -> จำนวนเต็ม นอกจากนี้คุณสามารถใช้n&(1<<i)แทนn&(1<<i)>0และบันทึก 2 ไบต์ ในที่สุดขอบเขตบนของi(127) นั้นมากเกินไป 32 ก็เพียงพอแล้วบันทึก 1 ไบต์
Delfad0r

1
โปรดระบุคะแนนของคุณตามหัวข้อการให้คะแนนในคำแถลงปัญหา
Delfad0r

@ Delfad0r การให้คะแนนถูกต้องหรือไม่ และขอบคุณสำหรับเคล็ดลับ
Hein Wessels

ฉันคิดว่าคะแนนนั้น(52+37)*31=2759ยาวที่สุดเมื่อตั้งค่าทั้งหมด 31 บิต
Jonathan Allan

เอนโค้ดเดอร์สามารถlambda n:[chr(i)*(n&1<<i>0)for i in range(32)]บันทึกได้ 6 ไบต์
mypetlion

5

Staxคะแนน 8 × (10 + 9) = 152

ตัวเข้ารหัส 10 ไบต์

Ç·MÉJ'♀τ│½

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

16|E{i16*+m Full program, implicit input
16|E        Get hexadecimal digits
    {     m Map:
     i16*+    Add 16 * loop index
            Implicit output as string

เครื่องเข้ารหัสจะส่งออกสตริงตามลำดับที่เพิ่มขึ้น

ถอดรหัส 9 ไบต์

üL∟n╫k∞‼9

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

o{16%m16|E Full program, implicit input
o          Sort string
 {16%m     Module each element by 16
      16|E Interpret as array of hex digits


5

Python 3 , 8 * (45 + 38) = 664

ตัวเข้ารหัส (45 ไบต์):

lambda n:[16*i+(n>>4*i)%16 for i in range(8)]

ถอดรหัส (38 ไบต์):

lambda l:sum(x%16<<x//16*4 for x in l)

ลองออนไลน์!


1
คุณสามารถลบช่องว่างก่อน "สำหรับ" ใช้lambda l:sum(x%16<<x//16*4for x in l)งานได้ดี :)
FatalError

4
สิ่งนี้ใช้ไม่ได้ เอาต์พุตไม่ได้เป็น ASCII ธรรมดา (ในช่วง 0..127)
GB

2
@GB ความผิดพลาดของฉัน ฉันทำลายมันด้วยการแก้ไขครั้งล่าสุดของฉัน กำลังเปลี่ยนกลับในขณะนี้
Curtis Bechtel

บันทึก 3 ไบต์ในตัวเข้ารหัส: lambda n:[n>>4*i&15|i<<4for i in range(8)]และอีก 1 ตัวในตัวถอดรหัส: lambda l:sum(x%16<<x//16*4for x in l)สำหรับคะแนนรวม 632
แอรอน

4

JavaScript (ES6), 8 * (40 + 32) = 576

08

ตัวเข้ารหัส (40 ไบต์)

E=(n,k=0)=>n?[k|n&15,...E(n>>4,k+16)]:[]

ถอดรหัส (32 ไบต์)

s=>s.map(c=>s|=c%16<<(c/4&~3))|s

การสาธิต

ลองออนไลน์!

อย่างไร?

อินพุตถูกแบ่งออกเป็น 8 บล็อก 4 บิตและแต่ละบล็อกถูกเข้ารหัสด้วย 1 ใน 16 ตัวอักษรที่เป็นไปได้ บิตที่สำคัญที่สุดของบล็อกสุดท้ายจะไม่ถูกตั้งค่า

       3222222222211111111110000000000
bit:   0987654321098765432109876543210
       \_/\__/\__/\__/\__/\__/\__/\__/
block:  7  6   5   4   3   2   1   0

block #0 is encoded with char. 00 to 0F (NUL to SI)
block #1 is encoded with char. 10 to 1F (DLE to ES)
block #2 is encoded with char. 20 to 2F (' ' to '/')
block #3 is encoded with char. 30 to 3F ('0' to '?')
block #4 is encoded with char. 40 to 4F ('@' to 'O')
block #5 is encoded with char. 50 to 5F ('P' to '_')
block #6 is encoded with char. 60 to 6F ('`' to 'o')
block #7 is encoded with char. 70 to 77 ('p' to 'w')

4

เยลลี่ , (8 +9) ไบต์ * 8 ความยาวสูงสุด = 136

b⁴+J’Ɗ⁴¡

Encoder (ส่วนท้ายจัดรูปแบบรายการตามที่ Python ต้องการเพื่อความชัดเจน)

Ṣ_J‘Ɗ⁴¡ḅ⁴

ถอดรหัส

เป็นไปได้ในทางทฤษฎีที่จะมีความยาวสูงสุดหกอันสามารถทำได้ใน 22 ไบต์หรือน้อยกว่า?

Σผม=0ผม=5(127+ผม127)=321402081<2วันที่ 31-1

อย่างไร?

2วันที่ 31-17fffffff[7,15,15,15,15,15,15,15][7,15,15,15,15,15,15,15] + [0,16,32,48,64,80,96,112] = [7,31,47,63,79,95,111,127]

ตัวเข้ารหัส :

b⁴+J’Ɗ⁴¡ - Link: integer, n    e.g. 1234
 ⁴       - literal 16               16          
b        - convert to base          [4,13,2]
       ¡ - repeat...
      ⁴  - ...16 times:
     Ɗ   -   last 3 links as a monad:
   J     -     range of length        [1,2,3]     iter 2    iter 3    ...  iter 16
  +      -     add                    [5,15,5]   [5,16,7]   [5,17,9]  ...  [5,30,35]
    ’    -     decrement              [4,14,4]   [4,15,6]   [4,16,8]  ...  [4,29,34]
         -                                                                 [4,29,34]

ถอดรหัส :

Ṣ_J‘Ɗ⁴¡ḅ⁴ - Link: list of integers   e.g. [29,34,4]
Ṣ         - sort                          [4,29,34]
      ¡   - repeat...
     ⁴    - ...16 times:
    Ɗ     -   last 3 links as a monad:
  J       -     range of length           [1,2,3]
 _        -     subtract                  [3,27,31]   [3,26,29]   [3,25,27]  ...  [3,12,1]
   ‘      -     increment                 [4,28,32]   [4,27,30]   [4,26,28]  ...  [4,13,2] 
        ⁴ - literal 16                    16
       ḅ  - from base                     1234

"เลขฐานสิบหก" แน่นอน ("ตัวเลขที่ใช้เลขฐานสิบหกธรรมดา" ยาวกว่าและ "ตัวเลข" เพียงอย่างเดียวก็หมายถึงทศนิยม)
Erik the Outgolfer

ฉันเปลี่ยนมันแม้ว่ามันควรจะชัดเจนจากบริบทในขณะนั้นจากนั้นฉันก็อ้างถึงเลขฐานสิบหกทันที
Jonathan Allan

การคำนวณของคุณถูกปิดหนึ่งรายการ: มีชุดค่าผสม 321402081 แทนที่ด้วยความยาวสูงสุด 5 และ 7177979809 ที่มีความยาวสูงสุด 6
Anders Kaseorg

@AndersKaseorg อุ๊ปส์ดังนั้นจึงเป็น - ดังนั้นจึงเป็นไปได้ที่มีความยาวสูงสุด 6 ... ให้ 22 ไบต์เล่นด้วย!
Jonathan Allan

4

ภาษาโปรแกรมของเช็คสเปียร์ , 31 * (472 + 383 379 344) = 26505 26381 25296

คะแนนก่อนหน้า: 16909322 * (246 + 217) = 7829016086

นี้ยังคงสูงมาก แต่มันต่ำสุดที่ฉันสามารถคิดได้ในขณะนี้

Encoder:

,.Ajax,.Ford,.Act I:.Scene I:.[Enter Ajax and Ford]Ajax:Remember a pig.Ford:Listen tothy.Scene V:.Ajax:Remember the remainder of the quotient betweenI a big cat.Ford:You be the quotient betweenyou a big cat.Be you nicer zero?If solet usScene V.Remember a pig.Scene X:.Ajax:Recall.Ford:Am I worse zero?If notremember I.If notlet usScene X.Ajax:You zero.Scene L:.Ford:Recall.Ajax:You be the sum ofyou a cat.Am I nicer zero?If sospeak thy.Am I worse zero?If notlet usScene L.

ลองออนไลน์!

ถอดรหัส:

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Exeunt][Enter Ajax and Ford]Ajax:You cat.Ford:Open mind.Remember the sum ofyou I.Scene V:.Ajax:Am I nicer a cat?If soyou be twice you.Ford:If soyou be the sum ofyou a pig.If solet usScene V.[Exit Ford][Enter Page]Page:Recall.Ajax:Am I worse a cat?If notyou be the sum ofyou Ford.If notlet usAct I.Open heart

ลองออนไลน์!

โดยทั่วไปถ้าสตริงมีอักขระที่มีรหัส ASCII (n + 1) ตัวเลขฐานสองจะถูกตั้งค่า


344 ไบต์สำหรับตัวถอดรหัส
Jo King

3

Python 3, (208 bytes + 200 bytes) * 6 length = 2448

ลองออนไลน์! (มีทั้งคู่ไบต์พิเศษคือบรรทัดใหม่ระหว่างกัน)

-4 ไบต์ (-24 คะแนน) โดยใช้รายการที่ว่างเปล่า (ซึ่งอนุญาตให้เริ่มสิ่งเพิ่มเติมได้ที่ 0)

ตัวเข้ารหัส (208 ไบต์)

def E(n,h=128):
    T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
    d=l=0
    s=[]
    while n>=T(h,d):
        n-=T(h,d)
        d+=1
    for i in range(d):
        while n>=T(h-l,d+~i):
            n-=T(h-l,d+~i)
            l+=1
        s+=[l]
    return s

ถอดรหัส (200 ไบต์)

def D(s):
    T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1
    s.sort()
    l=0
    d=len(s)
    n=sum(T(128,D)for D in range(d))
    for i in s:
        for j in range(l,i):
            n+=T(128-j,d-1)
        l=i
        d-=1
    return n

ข้อสังเกต:

  • สามารถสลับสับเปลี่ยนแบบ losslessly สำหรับรายการที่ไม่เพิ่ม (เช่นเรียงลำดับ) อย่างเคร่งครัด

  • รายการตัวเลขที่ไม่เพิ่มความยาวเดียวกันอย่างเคร่งครัดสามารถจัดเรียงได้ทั้งหมด (เหมือนใน Python)

  • เราสามารถกำหนดว่ารายการเรียงลำดับตามความยาวก่อนเพื่อจัดเรียงลำดับทั้งหมดของรายการที่เรียงลำดับทั้งหมด

  • เราสามารถสร้างลำดับที่สามารถจัดทำดัชนีของรายการเหล่านี้ได้หากเรากำหนดว่าค่าที่ถูกต้องในรายการนั้นคือจำนวนเต็มตั้งแต่0ถึง127รวม (เช่นมีจำนวนรายการที่ถูกต้องที่มีความยาว จำกัดL)

กลยุทธ์:

  • Encoder: กำหนดตัวเลขNค้นหารายการที่Nไม่ถูกต้องเพิ่มขึ้น

  • ตัวถอดรหัส: กำหนดรายการที่ถูกต้อง (สับ) เรียงลำดับและส่งคืนดัชนีในลำดับของรายการที่ถูกต้อง

คำอธิบายรหัสทั่วไป:

  • T=lambda n,d:n*T(n+1,d-1)//d if d>1else d and n or 1

  • คำนวณจำนวนn th d-simplex

    • สำหรับd=0เสมอ1

    • สำหรับd=1, n(จำนวนจุดในบรรทัดที่มีความยาวn)

    • d=2Σผม=1nผมn

    • d=3ΣJ=1nΣผม=1Jผมn

คำอธิบายตัวเข้ารหัส:

  • def E(n,h=128): d=l=0, s=[]

  • nคือหมายเลขอินพุตhคือ "ค่าสูง" (เช่นจำนวนสูงสุดที่อนุญาต + 1) dคือความยาวที่เอาต์พุตจะsเป็นเอาต์พุตlคือ "ค่าต่ำ" (เริ่มที่ 0 อธิบายเพิ่มเติมภายหลัง)

  • while n>=T(h,d):, n-=T(h,d),d+=1

  • มีรายการความยาวที่T(h,d)ถูกต้องdและการคำนวณของเราง่ายขึ้นถ้าnเป็นดัชนีที่สัมพันธ์กับรายการ[0]*d(ที่ดัชนี0) แทนที่จะเป็นดัชนีจริงดังนั้นจึงลดลงnตามลำดับ นอกจากนี้ยังปรับd(ความยาว) nให้เป็นที่ถูกต้องสำหรับรับ

  • for i in range(d):

  • อย่างมีประสิทธิภาพ: "สำหรับi+1หมายเลข th ในรายการ"

    • ที่นี่ฉันจะอธิบายlว่า "ค่าต่ำ"

    • หลังจากใส่หมายเลขลงในรายการแล้วจะต้องใส่ตัวเลขไม่น้อยกว่าในรายการ (เพื่อเรียงลำดับ) ดังนั้นจึงlเป็นหมายเลขสุดท้ายที่ถูกเพิ่มลงในรายการ

    • while n>=T(h-l,d+~i):, n-=T(h-l,d+~i),i+=1

    • หากnมีขนาดใหญ่เกินไปที่จะเข้ารหัสด้วยl"หลัก" นี้ให้ปรับnและเพิ่มตามนั้นl

    • s+=[l]

    • เข้ารหัสnด้วยl"หลัก" ที่

    • ในตอนแรกเรามีhตัวเลือกสำหรับ "หลัก" ที่จะใส่ถัดไป แต่เมื่อเราใส่ "หลัก" (ซึ่งกำหนดให้l) เราจะ จำกัดh-lตัวเลือกสำหรับ "หลัก" ถัดไป

    • ตอนแรกมีT(h,d)รายการที่ถูกต้อง แต่เราได้เพิ่ม "หลัก" lลดจำนวน "หลัก" เหลือd-1และจำนวน "หลัก" ถัดไปที่ถูกต้องไปยังh-lดังนั้นจำนวนรายการที่ถูกต้องหลังจากนี้คือT(h-l,d-1)

คำอธิบายตัวถอดรหัส:

  • def D(s):, s.sort(), l=0,d=len(s)

  • sคือรายการอินพุต (สับเปลี่ยน) ดังนั้นs.sort()มัน; lคือ "ค่าต่ำ" ( h"ค่าสูง" เป็นเพียงตัวอักษร128ในรหัสเพื่อบันทึกไบต์) nคือหมายเลขผลลัพธ์dคือความยาว

  • n=sum(T(128,D)for D in range(d))

  • ปรับnไปยังจุดตามลำดับ[0]*length

  • for i in s:

  • สำหรับแต่ละหลัก:

    • for j in range(l,i):, n+=T(128-j,d-1)

    • ปรับnไปยังจุดตามลำดับ[...prevdigits, thisdigit, 0...]

      • l=i: ตั้งค่า "ค่าต่ำ" เป็นตัวเลขล่าสุด

      • d-=1: ลดความยาวเนื่องจากเราใช้ตัวเลข

  • return n: หลังจากnปรับตัวเลขทั้งหมดแล้วมันคือหมายเลขที่ถูกต้อง; กลับมา

ขออภัยหากนี่ยังไม่ชัดเจน แต่นี่คือเวอร์ชัน debugดั้งเดิมของฉันลองใช้ออนไลน์! ซึ่งไม่ได้ใช้รายการที่ว่างเปล่าจึงเป็น 1 จากตัวเลขทั้งหมดที่ใช้ในรุ่นนี้


3

Ruby , (36 + 29 bytes) * 8, คะแนน 520

เข้ารหัส:

->n{(0..7).map{|x|(n>>x*=4)%16+x*4}}

ลองออนไลน์!

Decode:

->a{a.sum{|x|x%16<<(x/4&28)}}

ลองออนไลน์!

มันทำงานอย่างไร:

จำนวนถูกเข้ารหัสโดยใช้ชิ้น 4 บิตและดัชนี 3 บิต

ตัวถอดรหัสใช้อาร์เรย์อินพุตและทำให้ทุกแทร็คกลับเข้าที่อีกครั้ง


3

Charcoalคะแนน 10 * (10 + 15) = 250

ใช้ทศนิยม โซลูชันพื้นฐาน 16 รายการก่อนหน้านี้ได้คะแนน328 296 264

อาจส่งออกอักขระที่ไม่สามารถพิมพ์ได้ โดยเฉพาะอย่างยิ่งตัวละครที่ 10 นั้นยากที่จะป้อนเข้าสู่ Charcoal

ตัวเข้ารหัส 10 ไบต์:

⭆⮌S℅⁺Iι×χκ

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน

ถอดรหัสขนาด 15 ไบต์:

IΣES×﹪℅ιχXχ÷℅ιχ

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน

เวอร์ชันที่ใช้รายการจำนวนเต็มคะแนน360 296 (ฐาน 16; ฐานสิบจะได้คะแนน 310):

ตัวเข้ารหัส, 19 ไบต์:

NθIE⁸⁺﹪÷θX¹⁶ι¹⁶×¹⁶ι

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน

ถอดรหัส 18 ไบต์:

IΣEE⁸N×﹪ι¹⁶X¹⁶÷ι¹⁶

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน

เวอร์ชันที่ใช้อักขระที่พิมพ์ได้คะแนน 360 (คือ416 384 368 ในฐาน 16):

ตัวเข้ารหัส, 19 ไบต์:

⭆⮌S℅⁺Iι×χ⁺κ×⁵⊕׳÷κ⁵

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน

ถอดรหัสขนาด 17 ไบต์:

Fθ⊞υ⌈Φθ¬№υκ⭆υ﹪℅ιχ

ลองออนไลน์! การเชื่อมโยงคือการสร้างรหัสเวอร์ชัน


2

Brachylog , 17 + 18 ไบต์ * 8 length = 280

Encoder:

ḃ₁₆I∧7⟧₁;Iz₁~ḃ₁₆ᵐ

ถอดรหัส:

ḃ₁₆I∧7⟧₁;Iz₁~ḃ₁₆ᵐp

สามารถเพิ่ม p ไปยังจุดสิ้นสุดของโปรแกรมเปลี่ยนไฟล์ได้โดยไม่มีผลกระทบ ตัวถอดรหัสจะดำเนินการโดยใส่ผลลัพธ์ (สับ) เป็นผลลัพธ์และรับตัวเลขดั้งเดิมในอินพุต

หากจะมีการสรุปผลรวมสะสม (ดำเนินการอย่างถูกต้อง) คะแนนอาจลดลงถึง 20

ลองออนไลน์!


@ Delfad0r เพิ่ม P เพื่อเข้ารหัสจะทำให้มันเป็นรหัสเดียวกันสำหรับการเข้ารหัสและถอดรหัส
Kroppeb

2

05AB1Eคะแนน: (2 + 2 ไบต์ ) * 11 ความยาวสูงสุด = 44

ตัวเข้ารหัส (2 ไบต์ ):

ลองออนไลน์

ถอดรหัส (2 ไบต์ ):

ลองออนไลน์

อินพุตของตัวเข้ารหัสและเอาต์พุตของตัวถอดรหัสเป็นรายการของตัวเลข

ท่าเรือ@ ais523 's คำตอบ

คำอธิบาย:

    # Undelta (automatically prepends a 0)
      #  i.e. [3,0,4,7,8,2,0,1,9] → [0,3,3,7,14,22,24,24,25,34]

{     # Sort
      #  i.e. [14,7,22,25,24,3,0,24,34,3] → [0,3,3,7,14,22,24,24,25,34]
 ¥    # Deltas
      #  i.e. [0,3,3,7,14,22,24,24,25,34] → [3,0,4,7,8,2,0,1,9]

2วันที่ 31-1


2

Gol> <> , 8 * (14 + 13) = 216

เข้ารหัสลองออนไลน์! 14 ไบต์:

I8FfPSD8*L+o|;

ถอดรหัสลองออนไลน์! 13 ไบต์:

iEh8SD4*2$X*+

เนื่องจากสิ่งนี้สามารถส่งออกอักขระ ASCII ที่ไม่สามารถพิมพ์ได้ดังนั้นจึงยุ่งกับตัวถอดรหัสดังนั้นจึงมีรุ่นที่ใช้ตัวเลขในเอาต์พุต / อินพุต:

เข้ารหัสลองออนไลน์! 14 ไบต์:

I8FfPSD8*L+N|;

ถอดรหัสลองออนไลน์! 13 ไบต์:

IEh8SD4*2$X*+

การเข้ารหัส:

การเข้ารหัสทำงานโดยการแบ่งจำนวนที่กำหนดออกเป็น 8 x 4 บิต ชิ้นส่วนเหล่านี้จะถูกเลื่อนไปทางขวา 3 บิตและตำแหน่งดั้งเดิมของชิ้นข้อมูลจะถูกต่อท้ายด้วยตัวเลขระหว่าง 0 ถึง 7 ดังนั้นการเข้ารหัสจะมีลักษณะดังนี้:

0AAAABBB
 |__|    -> the original part of the number
     |_| -> the position of the chunk inside the original number 0 = LSB and 7 = MSB

2

Perl 6 , 10 * (10 + 12) = 340 220

Encoder:

{^@_ Z~@_}

ถอดรหัส:

{.sort X%10}

ลองออนไลน์!

ฟังก์ชั่นเครื่องเข้ารหัสจะซิปแต่ละหลักด้วยดัชนี 0 ของตัวเลข จากนั้นตัวเข้ารหัสจะเรียงลำดับรายการของตัวเลขและรับโมดูโล 10 โดยกล่าวอีกนัยหนึ่งคือตัวเลขที่สองของตัวเลข

ผลรวมคือ 10 เนื่องจากนั่นคือความยาวสูงสุด 2 31 -1


1

Haskell , 10 * (23 + 51) = 740

นี่คือโปรแกรมที่เข้ารหัส, สับ, ถอดรหัสและตรวจสอบค่า: ลองออนไลน์!

ตัวเข้ารหัส 23 ไบต์

zipWith((+).(10*))[0..]

ลองออนไลน์!

ถอดรหัส 51 ไบต์

map snd.sortOn fst.map(`divMod`10)
import Data.List

ลองออนไลน์!

คำอธิบาย

เนื่องจากเราได้รับอนุญาตให้ป้อนข้อมูลใช้เป็นตัวเลขทศนิยมเราจะใช้ว่า .. เข้ารหัสแผนที่แต่ละหลักที่เกิดขึ้นเพื่อให้10*index + digitทราบว่าทุกdigitท่านจะอยู่ในเพื่อให้เราสามารถย้อนกลับด้านบนโดยใช้[0..9] divModหลังจากเรียกคืนดัชนีและตัวเลขมันเป็นเรื่องของการจัดเรียงดัชนีและกำจัดพวกมัน

2วันที่ 31-1=214748364799=81<128



1

LE+LD=36;A=8288

d←{16n-16×⍳≢n←⍵[⍋⍵]}
e←(⊢+16×⍳∘≢)16⊥⍣¯1

ลองออนไลน์! (มี 5 ไบต์พิเศษสำหรับการกำหนดและการขึ้นบรรทัดใหม่)

การใช้ประโยชน์ ⎕IO←0

วิธี:

(⊢+16×⍳∘≢)16⊥⍣¯1  Encoder; input 1234
          16⊥⍣¯1  Convert input to base 16  4 13 2
      ⍳∘≢           [0..length of the list-1]  0 1 2
   16×              times 16  0 16 32
 ⊢+                 plus the original list  4 29 34

{16n-16×⍳≢n←⍵[⍋⍵]}  Decoder; input   34 4 29
              [⍋⍵]   Grade  up  2 0 1
                    Index  with that list  4 29 34
           n        assign that to n
      16×⍳≢          16×[0..length(n)-1]  0 16 32
    n-               subtract that from n  4 13 2
 16                 Decode from base 16  1234

1

PHP, 8 * (44 + 53) = 776

ตัวเข้ารหัส 44 ไบต์:

for(;$n=&$argn;$n>>=4)echo$n&15|16*$i++," ";

พิมพ์รายการจำนวนเต็มคั่นด้วยช่องว่าง -nRทำงานเป็นท่อด้วย

สูงสุด 8 ไบต์พร้อม 4 บิตข้อมูล (ตอดต่ำกว่า) และ 3 บิตน้ำหนัก (ตอดเล็กบน)

ใส่เพียง:
ใส่เลขฐานสิบหกแต่ละตัวในตัวของตัวเองและใช้ครึ่งบนของไบต์เพื่อเก็บตำแหน่งของตัวเลข

ตัวอย่าง:

1457893891( 0x56e5b203) จะกลายเป็น
0x03, 0x10, 0x22, 0x3b, 0x45, 0x5e, 0x66, 0x75
3 16 34 59 69 94 102 117

ถอดรหัส 53 ไบต์:

while($i++<8)$n+=(15&$x=$argv[$i])<<($x>>4)*4;echo$n;

หรือ

while($i++<8)$n+=(15&$x=$argv[$i])<<($x/4&~3);echo$n;

หรือ

for(;$i<9;$x=$argv[++$i])$n+=$x%16<<($x/4&~3);echo$n;

ใช้จำนวนเต็มจากอาร์กิวเมนต์บรรทัดคำสั่ง -nrทำงานด้วย


ลองพวกเขาออนไลน์


0

Python 2 , 10 * (68 + 54) = 1220

e=lambda n:"".join(chr(int(`i`+j))for i,j in enumerate(`n`)if j<'L')
d=lambda s:int("".join(`ord(c)%10`for c in sorted(s)))

ลองออนไลน์!

แก้ไข: ขอบคุณ Jo King สำหรับพอยน์เตอร์ - ไม่แน่ใจว่าทำไมฉันชดเชยด้วย 32 ในการหวนกลับ

เข้ารหัสตำแหน่งและค่าของแต่ละสถานที่เป็นอักขระเดียวเริ่มต้นด้วย[ช่องว่าง] (ตำแหน่ง 0, ค่า 0) NUL ไบต์ 0x0

ถอดรหัสโดย:

  • การเรียงลำดับสตริง (Python จะเรียงลำดับอักขระตามค่าลำดับ)
  • แปลงอักขระแต่ละตัวเป็นค่าตามลำดับ
  • ใช้ตัวเลขสุดท้ายของแต่ละเลขจำนวนเต็ม
  • รวมจำนวนเต็มเข้ากับสตริง
  • แปลงสตริงที่รวมกลับเป็น int

คุณต้องการ32ออฟเซ็ตหรือไม่? นอกจากนี้ยัง[-1]สามารถใช้%10แทนสถานที่ที่เหมาะสม
Jo King

0

C (gcc) , 10 * 112 = 1120

c,i;e(i,s)char*s;{for(c=1;i;c+=10,i/=10)*s++=c+i%10;*s=0;}
d(char*s){for(i=0;c=*s++;i+=--c%10*pow(10,c/10));s=i;}

ลองออนไลน์!

ฉันมีตัวแปรทั่วโลก แต่พวกเขาไม่ได้ผ่านข้อมูลใด ๆ ระหว่างสองฟังก์ชั่น ประกาศตัวแปรสำหรับcใช้ในฟังก์ชั่นทั้งสองช่วยฉัน 2 ไบต์ในความยาวรหัส

เวอร์ชันที่ใช้ ASCII ที่พิมพ์ได้สำหรับการลงโทษ3 5 ไบต์อยู่ที่นี่:

c,i;e(i,s)char*s;{for(c=32;i;c+=10,i/=10)*s++=c+i%10;*s=0;}
d(char*s){for(i=0;c=*s++;i+=(c-=32)%10*pow(10,c/10));s=i;}

ขอบคุณ @ceilingcat สำหรับการปรับปรุง 70 คะแนน

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