Açgözlü kesici


27

iBug kısa süre önce kompozit, ancak değerli malzemelerden yapılmış uzun bir çubuk aldı. Bar o kadar uzundur ki, iBug krediler için kolayca satamaz, bu yüzden kesmek istiyor. Çubuk, bir parça kırılırsa, aynı malzemeden yapılmış çubuğun tüm parçaları da kırılacak ve keyfi bir şekilde kesilmesini zorlaştıracak kadar kırılgan ve sihirli malzemelerden yapılır.

iBug, çubuğu mümkün olduğu kadar çok parçaya ayırmak istiyor. Ayrıca çok kısa programları ve kod-golf oynamayı seviyor, bu yüzden probleminin soyut bir analizini yaptı.

iBug'un sihirli çubuğu bir dizge (ya da eğer istersen bir dizi ya da karakter dizisi) olarak temsil edilir, şöyle:

aaabbccccccbbbaaacccccaabbbaaaaa

İpteki her harf bir sihirli maddeyi temsil eder. Çubuk her zaman RegEx ile eşleşir ^\w*$, bu nedenle çubukta en fazla 63 malzeme olabilir. Bir "kısım", boşluklarla ayrılmamış herhangi bir karakterin arka arkaya dizisidir.

iBug, sıfır veya daha fazla karakter kümesi tamamen kaldırılırsa (boşluklarla değiştirilirse) alabileceği maksimum parçaları hesaplayan bir program yazmanızı ve bu numarayı iBug'a bildirmenizi ister.


Örnek 1:

In:  aaabbccccccbbbaaacccccaabbbaaaaa
Out: 4

Açıklama: bÇubuktan tamamen çıkarılmışsa, iBug 4 parça alabilir. O da kaldırarak 4 parçalar alabilirsiniz bve caşağıda gösterildiği gibi,

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

İBug'un bu çubuktan alabileceği maksimum parça sayısı budur

Örnek 2:

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

Açıklama: Yalnızca alt çizgiyi kaldırarak, iBug çubuktan 6 parça alabilir ve bu maksimumdur.

Örnek 3:

In:  __________
Out: 1

Açıklama: Ne? Bunu kesmek ister misin? Eğer hiç kesmezseniz sadece 1 kısım almak mümkündür.

Örnek 4:

In:  
Out: 0

Açıklama: Kesilecek bir şey yok, bu yüzden sıfır.


İBug'un programların uymasını istediği bazı kurallar da var:

  1. iBug standart boşlukları beğenmez ve yasaktır.

  2. Çalıştığı sürece, tam bir program olması gerekmez. Parametreden girdi alan ve geri dönüş değeri ile çıktı veren bir işlev de kabul edilir.

  3. Esnek giriş ve çıkış izin verilir. Programınız veya işleviniz bir karakter dizisi veya bir karakter dizisi veya başa çıkılması en kolay olan şeyi alabilir. Çıktıyı sayıyı yazdırarak veya geri vererek verebilirsiniz.


Örnek test durumları (ancak bunlarla sınırlı değildir)

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

Bu bir olduğu için, her dilde en kısa program (bayt cinsinden) kazanır!


Ekstra

Puanınızı etkilemese de iBug, programınız için bir açıklamada bulunabildiğiniz için teşekkür eder (hala bayt cinsinden).


2
123456789Verim 5 nasıl ? Ve nasıl aaabcccdedaaabefda6 verir? Bu iki test için sırasıyla 2 ve 4 puan alıyorum.
Bay Xcoder

@ Mr.Xcoder ilki 2468, ikincisi için çıkarın bd.
Martin Ender

@MartinEnder Ah yüzden herhangi altdizi çıkarılabilir? Karakterlerden herhangi biri tamamen kaldırılırsa , aksi takdirde önerilir.
Bay Xcoder

1
@ Mr.Xcoder, mücadeleyi doğru anladıysam 2,4,6,8, ilk ve b,d,fikinci olanları kaldırırsınız .
Shaggy

2
@ Mr.Xcoder, herhangi bir karakter kümesinin tüm kopyalarını kaldırmak anlamına gelir. Bence çalışılan örnek oldukça iyi gösteriyor.
Martin Ender

Yanıtlar:



6

JavaScript (ES6), 109 90 bayt

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

123456789Test durumunda biraz yavaş . Önceki 109-byte cevabı ile sınırlı değildi !/\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 Oh, karakter setindeki kısıtlamaları görmedim; kodum, herhangi bir dizgide çalışıyor.
Neil

Çalışması gerekmeyen tek karakter boşluk değil mi?
Asone Tuhid

@AsoneTuhid Limanız yalnızca tam olarak çalışması gereken karakterler için çalışır; Orijinalin boşluklar dışındaki her şey için çalışıyor gibi görünüyor
Neil

Asıl cevabınız hangi karakterin işe yarıyor?
Asone Tuhid

4

Python 2 , 111 93 72 bayt

-21 bayt teşekkürler Kirill L.

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

Çevrimiçi deneyin!


Şu anda JS ve Ruby tarafından kullanılan yaklaşım, Python için de oldukça iyi çalışıyor gibi gözüküyor: 73 byte
Kirill L.

@KirillL. öneri için teşekkürler
ovs

3

Jöle ,  13  11 bayt

Çok fazla 2 bayt talimatları
-2 Zgarb sayesinde (dış ürün hızlı kullanımþ>. <)

eþŒPŒr¬S€ṀḢ

Bir karakter listesini kabul eden ve negatif olmayan bir tamsayı döndüren monadik bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

Girdinin her bir alt sırası için (çıkarabileceğimiz kümeler, artı yedek eşdeğerler) hangisinin çıkarıldığını belirlemek için bir varlık listesi elde edilir, ardından kaç tane sıfır sırasının kaldığını etkin bir şekilde bulur ve maksimum verimi verir. Son bölüm biraz daha garip bir şekilde çalışıyor, çünkü daha naif alternatiflerden daha golfçü buldum - pistleri [element, count]çiftler olarak bulur, sıfırları tanımlamayı ihmal eder, toplamlar maksimumları bulur ve sonra kafaları alır (sayılardan ziyade elementlerin toplamı) ).

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

Bence €Đ€olabilir þ.
Zgarb

3

Ruby , 98 89 75 64 61 bayt

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

Çevrimiçi deneyin!

öncekinden daha küçük ve daha yavaş!

Temelde @ Neil'in Javascript cevabının bir limanı

Ungolfed ve açıklamalı

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

Çevrimiçi deneyin!


2

Kabuğu , 12 11 bayt

▲mȯ#€0gM€¹Ṗ

Çevrimiçi deneyin! Bu kaba kuvvetle çalışır ve oldukça yavaştır. uSemantiği değiştirmeden, daha hızlı çalışmasını sağlamak için sağ tarafa ekleyin .

açıklama

▲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 , (eski sürümler) -p -I.,, 52 49 43 bayt

Eski stil sayımı: +3for -p: 46bytes ( bir programda olması gerektiği için çalıştırılamaz -e)

barsplit.pl:

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

STDIN'deki dizeyle çalıştırın:

echo aaabcccdedaaabefda | ./barsplit.pl; echo

Çevrimiçi deneyin!

Bu -I., varsayılan .olarak artık bulunmayan son perls üzerinde çalışmasını sağlamak için seçenek @INC. Eski perl sürümlerinde bu seçeneğe gerek yoktur. Bunu hala sahip olduğum eski bir makinede test ettim perl 5.20, bu yüzden skor buna dayanıyordu (aksi halde .argümanı da saymalıyım -I)

Hızlı versiyon ( 49bayt):

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.