D,g,@~~,L2_|*;;*|_2L,@,g,D
D,ff,@^^,BG€gBF;;FBg€GB,@D1:?:
xx:?
aa:1
`bb
Bxx;;B
Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy
O;;O:,B,`,|,`,>$,`,*W`
ลองออนไลน์!
ความจริงแล้วสนุก: นี่คือ 272 ไบต์นานก่อนที่คำอธิบายจะเริ่มขึ้นตอนนี้มันเต้นจาวา
เอาต์พุตTrue
สำหรับสตริงที่สมดุลอย่างสมบูรณ์และFalse
อื่น ๆ
เพื่อความพึงพอใจอันยิ่งใหญ่ของฉันนี่เป็นการตีรุ่น palindromize ที่น่าเบื่อด้วย2ไบต์เพื่อป้องกันผลลัพธ์ที่พิมพ์ออกมาสองครั้ง ฉันยังมุ่งที่จะมีรหัสตายตัวน้อยที่สุดเท่าที่จะทำได้อย่างไรก็ตามยังมีบางส่วนที่ถูกคอมเม้นต์และรหัสออกด้วยรหัสข้อผิดพลาด1หลังจากพิมพ์ค่าที่ถูกต้อง
NB : ข้อผิดพลาดกับBF
คำสั่งได้รับการแก้ไขในขณะที่คำตอบนี้อยู่ในการพัฒนา
มันทำงานอย่างไร
ฉฉก.ฉฉฉฉก.Sฉ f (S))S
Sขขขขคค[ [ a ] , [ b b b ] , [ a a ] , [ b ] , [ a ] , [ c c ] ]ก.และแทนที่รายการย่อยด้วยผลลัพธ์ของฟังก์ชัน
ก.2x[ a ][ b b ][ c c c ]
[ a ] ⇒ [ a , 1 ]
[ b b ] ⇒ [ b , b , 0 ]
[ c c c ] ⇒ [ c , c , c , 1 ]
อย่างที่เห็น xระบุจำนวนตัวอักษรถัดไปที่เราต้องการเก็บ สำหรับคู่ที่เรียบง่ายเราจะลบพวกเขาทั้งหมด (ให้ผลเป็น0ของตัวละครถัดไป) สำหรับตัวอักษรตัวเดียวที่เราปล่อยให้พวกเขาแตะต้องหรือให้ผล1ของพวกเขาและสำหรับกลุ่มที่x > 2, พวกเราต้องการ x - 2ของตัวละคร เพื่อที่จะสร้างxของตัวละครเราทำซ้ำตัวละครด้วย*
และฟังก์ชั่นส่งกลับองค์ประกอบบนสุดของสแต็กโดยธรรมชาติ: สตริงซ้ำ
หลังจาก ก.( s ) ถูกแมปผ่านแต่ละกลุ่ม sBF
เราอาร์เรย์แดงไปยังกองที่จะได้รับผลแต่ละบุคคลที่มี ในที่สุด^
แฟล็กที่นิยามฟังก์ชัน ( D,ff,@^^,
) จะบอกให้ฟังก์ชันส่งคืนเชื่อมสตริงในสแต็กและส่งคืนเป็นสตริงเดียว สำหรับคู่ซึ่งให้สตริงว่างจากก.สิ่งนี้จะลบมันออกโดยที่สตริงว่างตัดกับสตริงใด ๆ R ผลลัพธ์ใน R. อะไรก็ตามหลังจากทั้งสอง;;
คือความคิดเห็นและจะถูกเพิกเฉย
สองบรรทัดแรกกำหนดฟังก์ชันทั้งสอง ฉฉ และ ก.แต่ไม่ต้องดำเนินการ ฉฉเพียงแค่ จากนั้นเราก็นำเข้าและเก็บไว้ในตัวแปรแรกของเรา 4 ตัว ตัวแปรเหล่านั้นคือ:
- x x : อินพุตเริ่มต้นและผลลัพธ์ก่อนหน้าของการใช้ ฉฉ
- Y Y : ผลการสมัครปัจจุบัน ฉฉ
- aa : สภาพลูป
- ขข : ไม่ว่าจะเป็น Y Y เป็นความจริง
อย่างที่คุณเห็นตัวแปรและฟังก์ชั่นทั้งหมด (นอกเหนือจาก ก.) มีชื่อตัวอักษรสองตัวซึ่งช่วยให้สามารถลบออกจากซอร์สโค้ดได้ค่อนข้างรวดเร็วแทนที่จะมีความคิดเห็นที่มีจำนวนมาก x y a b. ก. ไม่ได้ทำสิ่งนี้ด้วยเหตุผลหลักประการหนึ่ง:
หากผู้ประกอบการเช่น€
ถูกเรียกใช้มากกว่าฟังก์ชั่นที่ผู้ใช้กำหนดa b cชื่อฟังก์ชั่นจะต้องมีการล้อมรอบ{...}
เพื่อให้ชื่อทั้งหมดจะถูกดำเนินการโดยผู้ประกอบการ อย่างไรก็ตามหากชื่อนั้นเป็นอักขระตัวเดียวเช่นก.ที่{...}
สามารถละเว้น ในกรณีนี้ถ้าชื่อฟังก์ชั่นเป็นกรัมกรัมรหัสสำหรับ ฉฉ และ ก. จะต้องเปลี่ยนเป็น
D,gg,@~~,L2_|*;;*|_2L,@D (NB: -2 bytes)
D,ff,@^^,BG€{gg}BF;;FB}gg{€GB,@D?: (NB: +6 bytes)
อันไหนยาวกว่า 4 ไบต์
คำสำคัญที่จะแนะนำในตอนนี้คือตัวแปรที่ใช้งานอยู่ คำสั่งทั้งหมดยกเว้นการกำหนดให้กำหนดค่าใหม่ให้กับตัวแปรที่ใช้งานและหากตัวแปรที่ใช้งานอยู่กำลังดำเนินการอยู่ก็สามารถละเว้นได้จากอาร์กิวเมนต์ของฟังก์ชัน ตัวอย่างเช่นถ้าตัวแปรที่ใช้งานอยู่x = 5จากนั้นเราสามารถตั้งค่า x = 15 โดย
x+10 ; Explicit argument
+10 ; Implicit argument, as x is active
ตัวแปรที่ใช้งานคือ x โดยค่าเริ่มต้น แต่สามารถเปลี่ยนแปลงได้ด้วย `
คำสั่ง เมื่อเปลี่ยนตัวแปรที่ใช้งานเป็นสิ่งสำคัญที่จะต้องทราบว่าตัวแปรแอคทีฟใหม่ไม่จำเป็นต้องมีอยู่ก่อนและจะถูกกำหนดเป็น 0 โดยอัตโนมัติ
ดังนั้นหลังจากกำหนด ฉฉ และ ก.เรากำหนดอินพุตให้ x xxx:?
กับ จากนั้นเราต้องจัดการกับเงื่อนไขลูปของเราเล็กน้อย อันดับแรกเราต้องการตรวจสอบให้แน่ใจว่าเราป้อนขณะที่ลูปเว้นแต่x xมันว่างเปล่า. ดังนั้นเราจึงกำหนดค่าความจริงให้กับaaด้วยaa:1
ค่าที่สั้นที่สุดเช่นนี้1. จากนั้นเราจะกำหนดความจริงของx x ไปยัง ขข ด้วยสองบรรทัด
`bb
Bxx
ซึ่งก่อนอื่นทำ ขข ตัวแปร active จากนั้นรันคำสั่ง boolean x x. ทางเลือกที่เกี่ยวข้องของ: = 1 และ ขข : = ¬¬ x x เรื่องตามที่จะแสดงในภายหลัง
จากนั้นเราเข้าไปในห่วงของเราในขณะที่:
Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy
ห่วงในขณะที่เป็นโครงสร้างใน Add ++: มันทำงานโดยตรงกับรหัสมากกว่าตัวแปร โครงสร้างใช้ชุดของคำสั่งรหัสแยกจากกัน,
ซึ่งพวกเขาทำงานบน คำสั่ง while และ if ยังใช้เงื่อนไขโดยตรงก่อนคำสั่งแรก,
ซึ่งประกอบด้วยคำสั่งที่ถูกต้องเพียงคำเดียวเช่นคำสั่ง infix ที่มีตัวแปร สิ่งหนึ่งที่ควรทราบ: ตัวแปรที่ใช้งานอยู่ไม่สามารถละเว้นได้จากเงื่อนไข
aa*bb
ห่วงในขณะที่นี่ประกอบไปด้วยเงื่อนไข นี่หมายถึงการวนซ้ำในขณะที่ทั้งสองaa และ ขขเป็นความจริง เนื้อความของรหัสแรกทำY Y ตัวแปรที่ใช้งานเพื่อเก็บผลลัพธ์ f f (x). สิ่งนี้ทำได้ด้วย
`yy,$ff>xx
จากนั้นเราจะเปิดใช้งานเงื่อนไขลูปของเรา aa. เรามีสองเงื่อนไขสำหรับการวนซ้ำอย่างต่อเนื่อง:
- 1) ค่าใหม่ไม่เท่ากับค่าเก่า (วนซ้ำในขณะที่ไม่ซ้ำกัน)
- 2) ค่าใหม่ไม่ใช่สตริงว่าง
หนึ่งในข้อเสียที่ใหญ่ที่สุดของ Add ++ คือการขาดคำสั่งผสมซึ่งจำเป็นต้องมีตัวแปรลูปที่สอง เรากำหนดตัวแปรสองตัวของเรา:
: = x x ≠ Y Y
ขข : = ¬¬( Y Y )
ด้วยรหัส
`aa,xx|yy,`bb,Byy
ในกรณีที่|
เป็นความไม่เท่าเทียมกันผู้ประกอบการและแปรรูปบูลB
จากนั้นเราอัพเดทx x ตัวแปรที่จะเป็น Y Yตัวแปรที่มีxx:yy
ในการเตรียมการสำหรับลูปถัดไป
สิ่งนี้ในขณะที่วนรอบในที่สุดก็ลดการป้อนข้อมูลเป็นหนึ่งในสองสถานะ: สตริงที่ว่างเปล่าหรือสตริงคงที่แม้เมื่อนำไปใช้กับ ฉฉ. เมื่อสิ่งนี้เกิดขึ้นเช่นกันaa หรือ ขข ส่งผลให้เป็นเท็จแยกออกจากวง
หลังจากวนซ้ำมันสามารถแตกได้ด้วยหนึ่งในสองเหตุผลดังที่กล่าวไว้ข้างต้น จากนั้นเราจะส่งออกค่าของaa. หากลูปเสียเพราะx = yจากนั้นทั้งเอาต์พุตและ aaเป็นเท็จ ถ้าลูปเสียเพราะY Y เท่ากับสตริงว่างแล้ว ขข เป็นเท็จและ aa และผลลัพธ์เป็นความจริง
จากนั้นเราก็มาถึงคำสั่งสุดท้ายของเรา:
O
โปรแกรมสามารถอยู่ในสถานะหนึ่งในสามสถานะซึ่งตัวแปรแอ็คทีฟทั้งหมด ขข:
- 1) อินพุตว่างเปล่า ในกรณีนี้ลูปไม่ทำงาน=1 และ b b = F a l s e. ผลลัพธ์ที่ถูกต้องคือF a l s e.
- 2) อินพุตมีความสมดุลอย่างสมบูรณ์แบบ ถ้าเป็นเช่นนั้นลูปจะวิ่ง= T R ยูอี และ b b = F a l s e. ผลลัพธ์ที่ถูกต้องคือF a l s e
- 3) อินพุตไม่สมดุลอย่างสมบูรณ์ ถ้าเป็นเช่นนั้นลูปจะวิ่ง= F ลิตรs อี และ ขข = T R ยูอี. ผลลัพธ์ที่ถูกต้องคือT R ยูอี
อย่างที่เห็น, ขขเท่ากับเอาท์พุทที่คาดหวัง (แม้ว่าจะกลับจากคำตอบเชิงตรรกะ ) ดังนั้นเราก็แค่เอาท์พุท ไบต์สุดท้ายที่ช่วยเราเอาชนะ Java มาจากความจริงที่ว่าขข เป็นตัวแปรที่ใช้งานอยู่ดังนั้นสามารถตัดออกจากการโต้แย้งทำให้เราออกผลลัพธ์เช่นกัน T R ยูอี หรือ F a l s eขึ้นอยู่กับว่าอินพุตนั้นมีความสมดุลอย่างสมบูรณ์หรือไม่