เครื่องตัดโลภ


27

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

iBug ต้องการตัดแท่งเป็นชิ้นให้ได้มากที่สุด นอกจากนี้เขายังรักโปรแกรมสั้น ๆ และการตีกอล์ฟดังนั้นเขาจึงวิเคราะห์ปัญหาของเขาได้อย่างเป็นนามธรรม

แถบเวทของ iBug นั้นแสดงเป็นสตริง (หรืออาร์เรย์หรือลำดับของอักขระหากคุณต้องการ) เช่นนี้:

aaabbccccccbbbaaacccccaabbbaaaaa

ตัวอักษรแต่ละตัวในสตริงแสดงถึงวัสดุเวทมนตร์หนึ่งชิ้น บาร์ตรงกับ RegEx เสมอ^\w*$ดังนั้นอาจมีวัสดุถึง 63 รายการในบาร์ "ส่วน" เป็นลำดับต่อเนื่องของตัวละครใด ๆ ที่ไม่ได้คั่นด้วยช่องว่าง

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


ตัวอย่างที่ 1:

In:  aaabbccccccbbbaaacccccaabbbaaaaa
Out: 4

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

aaabbccccccbbbaaacccccaabbbaaaaa  # Original string
aaa  cccccc   aaacccccaa   aaaaa  # Remove 'b'
aaa           aaa     aa   aaaaa  # Remove 'b' and 'c'

และนั่นคือจำนวนชิ้นส่วนสูงสุดที่ iBug สามารถรับได้จากแถบนี้

ตัวอย่างที่ 2:

In:     111aa___9999____aaa99111__11_a_aa999
Result: 111aa   9999    aaa99111  11 a aa999
Out:    6

คำอธิบาย: การลบเฉพาะขีดล่าง, iBug สามารถรับได้ 6 ส่วนจากแถบและนั่นคือค่าสูงสุด

ตัวอย่างที่ 3:

In:  __________
Out: 1

คำอธิบาย: อะไร คุณต้องการที่จะตัดสิ่งนี้? เป็นไปได้ที่จะได้ 1 ส่วนถ้าคุณไม่ตัดเลย

ตัวอย่างที่ 4:

In:  
Out: 0

คำอธิบาย: ไม่มีอะไรจะตัดดังนั้นศูนย์


นอกจากนี้ยังมีกฎบางอย่างที่ iBug ต้องการให้โปรแกรมเชื่อฟัง:

  1. iBug ไม่ชอบช่องโหว่มาตรฐานและเป็นสิ่งต้องห้าม

  2. ตราบใดที่มันใช้งานได้มันไม่จำเป็นต้องเป็นโปรแกรมเต็มรูปแบบ ฟังก์ชั่นที่รับอินพุตจากพารามิเตอร์และให้เอาต์พุตผ่านค่าส่งคืนก็รับได้เช่นกัน

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


ตัวอย่างกรณีทดสอบ (แต่ไม่ จำกัด เฉพาะกรณีเหล่านี้)

aaabbbaaa           = 2
123456789           = 5
AaAaAaAa            = 4
aaabcccdedaaabefda  = 6
________            = 1
(empty)             = 0

ตั้งแต่นี้เป็นโปรแกรมที่สั้นที่สุด (เป็นไบต์) ในแต่ละภาษาชนะ!


พิเศษ

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


2
วิธีการที่ไม่123456789ให้ผลผลิต 5? และaaabcccdedaaabefdaให้ผลผลิต 6 อย่างไร? ฉันได้ 2 และ 4 ตามลำดับสำหรับกรณีทดสอบทั้งสองนี้
Mr. Xcoder

@ Mr.Xcoder สำหรับครั้งแรกหนึ่งลบสำหรับสองลบ2468 bd
Martin Ender

@ มาร์ตินเอนเดอร์ดังนั้นการลบลำดับใด ๆ หากตัวละครตัวใดตัวหนึ่งถูกลบออกแนะนำอย่างอื่น
Mr. Xcoder

1
@ Mr.Xcoder ถ้าฉันเข้าใจถึงความท้าทายที่ถูกต้องคุณต้องลบออก2,4,6,8จากรายการแรกและb,d,fจากรายการที่สอง
Shaggy

2
@ Mr.Xcoder หมายถึงการลบสำเนาทั้งหมดของชุดอักขระใด ๆ ฉันคิดว่าตัวอย่างที่ใช้งานได้แสดงให้เห็นว่าค่อนข้างดี
Martin Ender

คำตอบ:



6

JavaScript (ES6), 109 90 ไบต์

f=s=>Math.max((s.match(/\s+/g)||[]).length,...[...s].map(c=>c>` `&&f(s.split(c).join` `)))
<input oninput=o.textContent=/\s/.test(this.value)?``:f(this.value)><pre id=o>0

ค่อนข้างช้าใน123456789กรณีทดสอบ คำตอบ 109- ไบต์ก่อนหน้านี้ไม่ได้ จำกัด อยู่ที่!/\s/:

f=
s=>(g=a=>Math.max(a.filter(s=>s).length,...[...a.join``].map(c=>g([].concat(...a.map(s=>s.split(c)))))))([s])
<input oninput=o.textContent=f(this.value)><pre id=o>0



@AsoneTuhid โอ้ฉันไม่เห็นข้อ จำกัด ของตัวละคร รหัสของฉันใช้งานได้กับสตริงใด ๆ เลย
Neil

ตัวละครตัวเดียวที่ไม่ต้องทำงานคืออวกาศใช่ไหม?
Asone Tuhid

@AsoneTuhid พอร์ตของคุณใช้ได้กับอักขระที่จำเป็นต้องใช้เท่านั้น ดูเหมือนว่าต้นฉบับของคุณจะทำงานได้ทุกอย่างยกเว้นที่ว่าง
Neil

คำตอบดั้งเดิมของคุณใช้อักขระใดสำหรับตัวใหม่
Asone Tuhid

4

Python 2 , 111 93 72 ไบต์

-21 ไบต์ขอบคุณKirill L.

f=lambda s:max([len(s.split())]+[f(s.replace(c,' '))for c in s if'/'<c])

ลองออนไลน์!


ดูเหมือนว่าวิธีการที่ JS และ Ruby ใช้ในปัจจุบันนี้ค่อนข้างดีสำหรับ Python เช่นกัน: 73 bytes
Kirill L.

@KirillL ขอบคุณสำหรับคำแนะนำ
ovs

3

เยลลี่ ,  13  11 ไบต์

คำแนะนำ 2 ไบต์มากเกินไป
-2 ขอบคุณ Zgarb (ใช้ผลิตภัณฑ์ด้านนอกด่วนþ>. <)

eþŒPŒr¬S€ṀḢ

ลิงก์ monadic ยอมรับรายการของอักขระและส่งคืนจำนวนเต็มแบบไม่ลบ

ลองออนไลน์!

อย่างไร?

สำหรับแต่ละองค์ประกอบของอินพุต (ชุดที่เราอาจลบบวกกับรายการที่ซ้ำซ้อน) ได้รับรายการการดำรงอยู่เพื่อระบุว่าจะถูกลบออกจากนั้นอย่างมีประสิทธิภาพพบว่าจำนวนศูนย์ที่เหลืออยู่และผลตอบแทนสูงสุด ส่วนสุดท้ายทำงานในลักษณะที่แปลกเล็กน้อยเนื่องจากฉันพบว่านักเล่นกอล์ฟมีทางเลือกที่ไร้เดียงสามากกว่า - พบว่าการวิ่งเป็น[element, count]คู่, ปฏิเสธที่จะระบุเลขศูนย์เป็นคน, จำนวนเงินที่หาได้มากที่สุดคือนำหัว (ผลรวมขององค์ประกอบมากกว่าการนับ )

eþŒPŒr¬S€ṀḢ - Link: list of characters        e.g. "aabcde"
  ŒP        - power-set - gets all subsequences    ["","a","a","b",...,"bd",...,"aabcde"]
 þ          - outer-product with:
e           -   exists in?                         [[0,0,0,0,0,0],[1,1,0,0,0,0],[1,1,0,0,0,0],[0,0,1,0,0,0],..,[0,0,1,0,1,0]...,[1,1,1,1,1,1]]
    Œr      - run-length encode                    [[[0,6]],[[1,2],[0,4]],[[1,2],[0,4]],[[0,2],[1,1],[0,3]],...,[[0,2],[1,1],[0,1],[1,1],[0,1]],...,[[1,6]]]
      ¬     - NOT                                  [[[1,0]],[[0,0],[1,0]],[[0,0],[1,0]],[[1,0],[0,0],[1,0]],...,[[1,0],[0,0],[1,0],[0,0],[1,0]],...,[[0,0]]]
        €   - for €ach:
       S    -   sum                                [[1,0],[1,0],[1,0],[2,0],...,[3,0],...,[0,0]]
         Ṁ  - maximum                              [3,0]
          Ḣ - head                                 3

ผมคิดว่าอาจจะเป็น€Đ€ þ
Zgarb

3

Ruby , 98 89 75 64 61 ไบต์

f=->s{[s.split.size,*s.scan(/\w/).map{|c|f[s.tr c,' ']}].max}

ลองออนไลน์!

เล็กและช้ากว่าเดิม!

โดยทั่วไปจะมีพอร์ตของคำตอบ Javascriptของ@ Neil

Ungolfed และใส่คำอธิบายประกอบ

def f(input_string)
    # splits by / +/ by default
    size0 = input_string.split.size
    # an array of all non-space characters in input_string
    characters = input_string.scan(/\w/)
    size1 = characters.map {|i|
        # all letters and digits and _ are "bigger" than /, space isn't
        if i > '/'
            # tr replaces every occurrence of i in input_string with space
            next_string = input_string.tr(i, ' ')
            f(next_string) # recursive call
        else
            0
        end
    }
    # max value between size0 and any element in size1
    return [size0, *size1].max
end

ลองออนไลน์!


2

Husk , 12 11 bytes

▲mȯ#€0gM€¹Ṗ

ลองออนไลน์! สิ่งนี้ทำงานโดยใช้กำลังดุร้ายและค่อนข้างช้า เพิ่มuไปทางด้านขวาเพื่อให้ทำงานได้เร็วขึ้นโดยไม่ต้องเปลี่ยนซีแมนทิกส์

คำอธิบาย

▲mȯ#€0gM€¹Ṗ  Implicit input, say S = "abddccbdcaab"
          Ṗ  Powerset of S: P = ["","a","b","ab","d","ad"...,"abddccbdcaab"]
 m           Map this function over P:
              Argument is a subsequence, say R = "acc"
       M ¹    Map over S
        €     index of first occurrence in R: [1,0,0,0,2,2,0,0,2,1,1,0]
      g       Group equal elements: [[1],[0,0,0],[2,2],[0,0],[2],[1,1],[0]]
  ȯ#          Count the number of groups
    €0        that contain 0: 3
▲            Take maximum of the results: 4

2

Perl 5 , (เวอร์ชั่นที่เก่ากว่า) -p -I.,, 52 49 43 ไบต์

การนับแบบเก่า: +3สำหรับ-p: 46ไบต์ (เพราะมันจะต้องอยู่ในโปรแกรมก็ไม่สามารถเรียกใช้-e)

barsplit.pl:

#!/usr/bin/perl -pI.
$G[split]+=s%\S%do$0for s/$&/ /rg%eg;$_=$#G

รันด้วยสตริงบน STDIN:

echo aaabcccdedaaabefda | ./barsplit.pl; echo

ลองออนไลน์!

-I.ตัวเลือกที่จะมีการทำเรื่องนี้ยังทำงานใน perls ล่าสุดที่โดยค่าเริ่มต้นไม่มากใน. @INCใน Perl รุ่นเก่าไม่จำเป็นต้องใช้ตัวเลือก ฉันทดสอบว่าบนเครื่องรุ่นเก่าที่ยังมีอยู่perl 5.20ดังนั้นคะแนนจะเป็นไปตามนั้น (มิฉะนั้นฉันควรนับการ.โต้แย้งด้วย-I)

รุ่นเร็ว ( 49ไบต์):

#!/usr/bin/perl -pI.
$G[split]+=s%.%$$_++||do$0for s/$&/ /rg%eg;$_=$#G

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