สายวัดเทป


15

แรงจูงใจ : บางครั้งคุณต้องรู้ว่าคุณอยู่ที่ไหนในสตริง คุณต้องการที่จะสามารถดูส่วนใด ๆ ของสตริงและรู้ว่าคุณอยู่ที่ไหนเท่าที่จะทำได้

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

กฎ :

  1. โปรแกรมของคุณต้องใช้พารามิเตอร์จำนวนเต็มบวกหนึ่งตัวสำหรับความยาวทั้งหมดของสตริงวัดเทป
  2. สำหรับแต่ละสายที่ต่อเนื่องกันของตัวเลขในการส่งออก, ตัวเลขเหล่านี้ได้อย่างถูกต้องจะต้องรายงานความยาวของการส่งออกเพื่อให้ห่างไกล - รวม !
    1. ความยาววัดจากจุดเริ่มต้นของสตริงจนถึงจุดสิ้นสุดของแต่ละหมายเลข
  3. ควรมีตัวเลขความยาวมากที่สุดเท่าที่เป็นไปได้ในสตริง
  4. หลีกเลี่ยงความคลุมเครือ ตัวคั่น / ตัวคั่นสามารถใช้เพื่อหลีกเลี่ยงตัวเลขที่ถูกวางในที่หนึ่ง12กล่าวคือสิบสองไม่ใช่หนึ่งสอง
  5. สตริงต้องรายงานความยาวทั้งหมดที่ถูกต้องเสมอโดยไม่มีตัวคั่นต่อท้าย
  6. คุณอาจต้องการตัวคั่นหลายตัวเพื่อรักษาความยาวให้ถูกต้องเช่นนี่คือตัวอย่างเทปวัดความยาว 4: 1--4

ตัวอย่างที่ไม่ใช่แบบกำหนด / ละเอียด

  • สายวัดความยาว 1: 1
  • สายวัดความยาวเทป 2: -2
  • สายวัดความยาว 3: 1-3
  • เทปวัดสตริงความยาว 4: 1--4หรือ-2-4(ความยาวรายงานทั้งสองบ่อยที่สุดเท่าที่จะทำได้คือสองครั้งและสิ้นสุดด้วยความยาวทั้งหมดที่ถูกต้อง)
  • สายวัดความยาว 10: 1-3-5-7-10
  • สตริงเทปวัดความยาว 11: 1-3-5-7--11หรือ1-3-5--8-11หรือ1-3--6-8-11หรือ1--4-6-8-11หรือ-2-4-6-8-11(ทุกคนมีความเป็นตัวเลขมากระยะเวลาที่เป็นไปได้และเสร็จสิ้นด้วยความยาวสายรวม)

ดังนั้นตัวเลขทุกตัวในสตริงนั้นไม่ได้อยู่ติดกับตัวเลขอื่น ๆ สตริงนั้นประกอบด้วยเครื่องหมายขีดกลางทั้งหมด-และคุณต้องมีเครื่องหมายยาวมากเท่าที่คุณจะทำได้ในสตริง?
Rɪᴋᴇʀ

เราสามารถใช้การจัดทำดัชนีตาม 0
Rɪᴋᴇʀ

@EasterlyIrk Rule 3 มีจำนวนมากที่สุดเท่าที่เป็นไปได้จะต้องใส่ลงในสตริง
โพสต์ Rock Garf Hunter


@EasterlyIrk คุณไม่สามารถมีขีดกลางทั้งหมดได้เนื่องจากไม่สามารถทำตามแรงบันดาลใจและทำลายกฎข้อที่ 3 และ 5 ไม่มีการจัดทำดัชนี แค่ความยาว ไม่เลยเทปวัดความยาวสายหนึ่งไม่สามารถเป็น0ได้
Tom Viner

คำตอบ:


12

Python, 50 48 47 46 ไบต์

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

คำอธิบาย

วิธีแก้ปัญหาแลมบ์ดาแบบเรียกซ้ำได้ง่าย

กรณีพื้นฐานของเราคือ 1 และ 0 ซึ่งครอบคลุมโดย "1"*xมิฉะนั้นเราจะได้รับสตริง-xด้วย`-x`และเสริมผลลัพธ์ของการเรียกใช้ฟังก์ชันlen(`-x`)น้อย


1
คุณสามารถบันทึก bytes โดย stringifying -x?
Martin Ender

@MartinEnder ตกลงฉันได้ไปทำงาน ขอบคุณสำหรับทิป! ฉันรู้สึกโง่ที่ไม่สังเกตเห็นก่อนหน้านี้
โพสต์ Rock Garf Hunter

5

Mathematica, 67 57 ไบต์

ขอบคุณ Martin Ender สำหรับการโยนทิ้ง 10 ไบต์!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

ฟังก์ชั่นที่ไม่มีชื่อการใช้อาร์กิวเมนต์จำนวนเต็มไม่ใช่ค่าลบและส่งคืนสตริง สวยมากขั้นตอนวิธี recursive ชัดเจน: ให้แน่ใจว่าปลายสตริงที่มีจำนวนการป้อนข้อมูลที่นำหน้าด้วยแล้วเรียกใช้ฟังก์ชันอีกครั้งโดยใช้"-"#0

แต่มีความสนุกที่ต้องใช้ในการติดตั้งอัลกอริทึม ""["1"][[#]]หมายถึง#อาร์กิวเมนต์ th ของนิพจน์""["1"]: อาร์กิวเมนต์ 0 คือส่วนหัว""และอาร์กิวเมนต์อันดับที่ 1 สามารถมองเห็นได้อย่างชัดเจน"1"ซึ่งจะให้กรณีฐานของการเรียกซ้ำ หาก#มีค่าเกินกว่า 1 ""["1"][[#]]ให้แสดงข้อความแสดงข้อผิดพลาดและยังคงเป็นฟังก์ชันที่ประเมินค่าไม่ได้ แต่แล้ว/._@__:>เป็นกฎที่ใช้ฟังก์ชันใด ๆ ที่ไม่ได้ประเมินค่าและแปลงเป็นนิพจน์ที่มาถัดไปซึ่งเป็นการเรียกซ้ำไปยังฟังก์ชันดั้งเดิม

ส่งต้นฉบับ:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&ช่วยประหยัดหนึ่งไบต์โดยหลีกเลี่ยงIfและพวงของไบต์โดยการหลีกเลี่ยงและIntegerString "-"<>
Martin Ender

1
พระเจ้า_@__เป็นเวทมนตร์ที่ชั่วร้าย
Greg Martin เมื่อ

3

JavaScript (ES6), 49 ไบต์

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
ฉันคิดว่าคุณต้องให้คำจำกัดความf
Tom Viner

@TomViner ฉันทำอย่างนั้นเสมอ (อย่างน้อยฉันก็นับจำนวนไบต์ที่ถูกต้อง)
Neil


1

Perl 6 , 43 ไบต์

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

คำอธิบาย:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

ตัวอย่างเช่นสำหรับอินพุต 10 มันสร้างลำดับ(-10, -7, -5, -3, -1)และจากสตริง-1-3-5-7-10นั้นและจากนั้นสตริงสุดท้าย1-3-5-7-10และจากที่สตริงสุดท้าย

ลองมันออนไลน์

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