พื้นหลัง
Adaเป็นภาษาการเขียนโปรแกรมที่ไม่รู้จักกันอย่างแพร่หลายในเรื่องความตึง
อย่างไรก็ตามอาเรย์ของตัวอักษรอาเรย์สามารถในทางทฤษฎีอนุญาตให้มีข้อกำหนดส นี่คือคำอธิบาย EBNF แบบง่ายของ ไวยากรณ์ตัวอักษรอาร์เรย์ (ผ่านไปยังbottlecaps.de :
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
เราจะ จำกัด ตัวเองให้เป็นอาร์เรย์จำนวนเต็ม 1 มิติเพื่อความง่าย ซึ่งหมายความว่าเราจะใช้เฉพาะจำนวนเต็มสำหรับค่าการแสดงออก บางทีในความท้าทายในอนาคตเราสามารถลองอะไรที่สูงกว่านี้ได้ (เช่นการประกาศตัวแปรและอาร์เรย์หลายมิติ) คุณไม่ต้องกอล์ฟอักษรจำนวนเต็ม
นี่คือตัวอย่างบางส่วนของตัวอักษรอาร์เรย์ Ada และการแสดงที่เทียบเท่ากับ python-esque เพื่อความชัดเจน:
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
ท้าทาย
เป้าหมายของความท้าทายนี้คือการส่งออกอาเรย์อาร์เรย์ตัวอักษรนับที่สั้นที่สุดสำหรับอาเรย์อินพุตที่กำหนด โปรดทราบว่าอาร์เรย์ Ada สามารถเริ่มต้นจากดัชนีใดก็ได้ที่ต้องการดังนั้นคุณสามารถเลือกสิ่งที่คุณต้องการให้ดัชนีเริ่มต้นตราบเท่าที่แต่ละค่าเรียงตามลำดับ ในตัวอย่างนี้ฉันเลือกที่จะเริ่มต้นที่ 1 ซึ่งเป็นสำนวนสำหรับ Ada แต่คุณสามารถเลือกที่จะเริ่มต้นด้วยจำนวนเต็มอื่น ๆ
อินพุต
ข้อมูลที่คุณป้อนจะประกอบด้วยรายการจำนวนเต็มไม่ว่าจะสะดวกในรูปแบบใด
เอาท์พุต
ผลลัพธ์ของคุณจะเป็นสตริงข้อความที่แสดงถึงตัวอักษรอาร์เรย์ Ada ที่สั้นที่สุดที่ถูกต้องซึ่งแสดงรายการของจำนวนเต็มเข้า คุณอาจใช้ดัชนีเริ่มต้นใด ๆ ที่คุณต้องการในอาร์เรย์นี้ แต่ต้องระบุตัวเลือกของคุณ (อะไรก็ได้) ในคำตอบของคุณ (ดัชนีเริ่มต้นอาจเป็นแบบไดนามิก)
จำนวนเต็มจะแสดงเป็นเลขทศนิยมที่ลงนามเช่นเดียวกับในตัวอย่าง ความท้าทายนี้ไม่ครอบคลุมการเล่นกอล์ฟของค่าจำนวนเต็ม
ตัวอย่าง
นี่คือตัวอย่างบางส่วน:
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
ความต้องการขั้นต่ำ
รองรับอย่างน้อย 100 ตัวเลขและอินพุตอย่างน้อย 256 ตัวเลข
สร้างผลลัพธ์ที่ถูกต้องสำหรับอินพุตดังกล่าวทั้งหมด
- รวมถึงการวาง 'คนอื่น' ในตอนท้าย
- รวมถึงการวางดัชนีสำหรับอาร์เรย์รายการเดี่ยว
สิ้นสุด (ดีกว่าบน TIO) สำหรับอินพุตด้านบนแต่ละรายการภายในไม่กี่นาที
ทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ!
การดำเนินการอ้างอิง
การนำไปใช้งานนี้ใช้อินพุตเป็นอาร์เรย์โดยแต่ละอักขระจะเป็นตัวเลข อักษรตัวใหญ่เป็นค่าคงที่พิเศษสำหรับค่าขนาดใหญ่ อาร์กิวเมนต์ของโปรแกรมคือ 'ดัชนีเริ่มต้น' ที่จะใช้
ส่วน "รหัส" ในลิงก์ TIO เป็นวิธีแก้ไขปัญหาที่ถูกต้องในขณะที่ "ส่วนหัว" และ "ส่วนท้าย" ใช้โครงสร้างการทดสอบ
106..110=>3,others=>2
จะนานกว่า) กรณีสุดท้ายจำเป็นต้องมีดัชนีเนื่องจากไวยากรณ์ไม่อนุญาตให้มีองค์ประกอบตำแหน่งเดียว ( positional_array ::= expression ',' expression (',' expression)*
)
(1|3=>1234567,2=>1)
เป็นอีกหนึ่งการส่งออกที่ถูกต้องสำหรับ[1234567,1,1234567]
?
(-1)
?