욕심 많은 커터


27

iBug는 최근 복합 재료이지만 가치있는 재료로 만든 긴 막대를 얻었습니다. 막대가 너무 길어서 iBug가 크레딧으로 쉽게 팔 수 없기 때문에이를 줄이려고합니다. 막대는 깨지기 쉬운 마법 재료로 만들어져 부품이 부러지면 동일한 재료로 만들어진 막대의 모든 부분도 부러져 임의로 절단하기가 어렵습니다.

iBug는 막대를 가능한 한 많은 조각으로 자르려고합니다. 그는 매우 짧은 프로그램과 코드 골프를 좋아하기 때문에 자신의 문제를 추상적으로 분석했습니다.

iBug의 마술 막대는 다음과 같이 문자열 (또는 원하는 경우 배열 또는 일련의 문자)로 표시됩니다.

aaabbccccccbbbaaacccccaabbbaaaaa

줄의 각 글자는 하나의 마법 재료를 나타냅니다. 막대는 항상 RegEx와 일치하므로 막대에 ^\w*$최대 63 개의 재료가있을 수 있습니다. "부분"은 공백으로 구분되지 않은 연속 된 문자 시퀀스입니다.

iBug는 0 개 이상의 문자 세트가 완전히 제거되고 (공백으로 대체 됨) iBug에 해당 번호를 알려 주면 최대 부품 수를 계산하는 프로그램을 작성하려고합니다.


예 1 :

In:  aaabbccccccbbbaaacccccaabbbaaaaa
Out: 4

설명 : b막대에서 완전히 제거하면 iBug에서 4 개의 부품을 얻을 수 있습니다. 그는 또한 제거하여 4 개 부분을 얻을 수 있습니다 bc아래와 같습니다,

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

설명 : 잘라낼 것이 없으므로 0입니다.


iBug가 프로그램이 준수하기를 원하는 규칙도 있습니다.

  1. iBug는 표준 허점을 싫어하며 금지되어 있습니다.

  2. 작동하는 한 전체 프로그램 일 필요는 없습니다. 매개 변수에서 입력을 가져오고 리턴 값을 통해 출력하는 기능도 허용됩니다.

  3. 유연한 입력 및 출력이 허용됩니다. 프로그램이나 함수는 문자열이나 문자 배열 또는 다루기 쉬운 항목을 취할 수 있습니다. 숫자를 인쇄하거나 반환하여 출력을 줄 수 있습니다.


샘플 테스트 사례 (단, 이에 한하지 않음)

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

이것은 이기 때문에 각 언어에서 가장 짧은 프로그램 (바이트)이 이깁니다!


특별한

iBug는 스코어링에 영향을 미치지 않더라도 프로그램에 대한 설명을 제공 할 수 있으면 대단히 감사합니다 (길이는 바이트 단위 임).


2
1234567895를 어떻게 산출합니까? 그리고 어떻게 aaabcccdedaaabefda6을 산출합니까? 이 두 테스트 사례에 대해 각각 2와 4를 얻습니다.
Mr. Xcoder

첫 번째는 @ Mr.Xcoder 2468, 두 번째는 remove bd.
Martin Ender

@MartinEnder 아 하위 시퀀스 를 제거 할 수 있습니까? 의있는 경우 문자가 완전히 제거됩니다 그렇지 않으면 제안했다.
Mr. Xcoder

1
@ Mr.Xcoder, 도전을 올바르게 이해했다면 2,4,6,8첫 번째와 b,d,f두 번째에서 제거 합니다.
Shaggy

2
@ Mr.Xcoder는 모든 문자 집합의 모든 복사본을 제거하는 것을 의미합니다. 나는 작동 한 예가 그것을 잘 보여 준다고 생각합니다.
Martin Ender

답변:



6

자바 스크립트 (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 23.44에


3

젤리 ,  13  11 바이트


Zgarb 덕분에 너무 많은 2 바이트 명령어 -2 (외부 제품 빠른 사용þ>. <)

eþŒPŒr¬S€ṀḢ

문자 목록을 승인하고 음이 아닌 정수를 리턴하는 모나드 링크.

온라인으로 사용해보십시오!

방법?

입력의 각 서브 시퀀스 (우리가 제거 할 수있는 세트와 여분의 등가물)에 대해 존재 목록을 가져와 제거 할 항목을 찾은 다음 남아있는 0의 런 수를 효과적으로 찾고 최대 값을 산출합니다. 마지막 부분은 좀 더 순진한 대안보다 골퍼임을 발견 한 이후 약간 이상한 방식으로 작동합니다. 런을 [element, count]쌍으로 찾고 0을 1로 식별하는 것을 부정하고 합계는 최대 값을 찾은 다음 머리를 가져옵니다 (횟수 대신 요소의 합) ).

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

루비 , 98 89 75 64 61 바이트

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

온라인으로 사용해보십시오!

이전보다 작고 느리다!

기본적으로 @Neil의 Javascript 답변 포트

언 골프 및 주석 달기

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

껍질 , 12 11 바이트

▲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 바이트

오래된 스타일 계산 : +3for -p: 46bytes ( 프로그램에 있어야 하기 때문에를 사용하여 실행할 수 없음 -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.