Spędziłem trochę czasu na tej stronie i zacząłem cieszyć się możliwie najkrótszym czasem. To może być powód, dla którego ostatnio jestem obrażony ciągami zawierającymi te same znaki więcej niż jeden raz. Twoim zadaniem jest napisanie funkcji lub programu, który skondensuje dany ciąg znaków zgodnie z następującymi zasadami:
Rozpocznij od 0-kondensacji , czyli poszukaj pierwszej (najbardziej lewej) pary tych samych znaków z 0 innymi znakami między nimi. Jeśli taka para zostanie znaleziona, usuń jeden z dwóch znaków i ponownie uruchom algorytm, wykonując kolejną 0-kondensację . Jeśli nie znaleziono takiej pary, przejdź do następnego kroku. Przykłady:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Następnie wykonaj 1-kondensację , czyli poszukaj pierwszej pary takich samych znaków z 1 inną postacią między nimi. Jeśli taka para zostanie znaleziona, usuń jedną z nich i wszystkie znaki między nimi i uruchom ponownie z zerową kondensacją . Jeśli nie znaleziono takiej pary, przejdź do następnego kroku. Przykłady:
abacac
-C1->acac
java
-C1->ja
Kontynuuj od 2-kondensacji i tak dalej do n-kondensacji, gdzie n jest długością oryginalnej struny, za każdym razem, gdy wznawia się po kondensacji, usuwa niektóre litery. Przykłady:
programing
-C2-> -C3-praming
abcdafg
>afg
Powstały ciąg jest nazywany skondensowanym i zawiera każdy znak maksymalnie raz.
Wkład:
Ciąg małych liter znaków drukowalnych ascii.
Wydajność:
Skondensowane ciąg według powyższych zasad.
Przykłady:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Szczegółowe przykłady wyjaśniające, jak działa algorytm:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Twoje podejście nie musi implementować algorytmu z góry, o ile rozwiązanie i algorytm zwracają ten sam wynik dla wszystkich dozwolonych danych wejściowych. To wyzwanie dla golfa .
Dzięki @Linus za pomocne komentarze w piaskownicy!
Odpowiedzi:
JavaScript (ES6), 74 bajty
źródło
Perl,
38313029 bajtówTo powinno pozostawić języki inne niż golfowe daleko w tyle ...
-1 za
$-[0]
podziękowania dla Riley-1 za
@{-}
podziękowania dla DadyObejmuje +1 dla
-p
Podaj dane na STDIN
condense.pl
:Ta 27-bajtowa wersja powinna działać, ale nie działa, ponieważ Perl nie interpoluje
@-
w wyrażeniu regularnym (patrz /programming/39521060/why-are-etc-not-interpolated-in-strings )źródło
@{\@-}
część? Myślałem, że@-
trzyma indeksy każdego meczu, więc jak to się „liczy” na każdej iteracji. Ponadto, jeśli drukujesz@{\@-}
przed i po każdej zamianie, drukuje tylko 1 lub 2././g
każdym razem postępuje o 1 w ciągu, z wyjątkiem zmian łańcucha, następnie jest resetowany do 0. Jeśli drukujesz@-
po,/./g
ale przed nims///
zobaczysz, że idzie w górę (użyj testu, w którym pozostały ciąg jest wystarczająco duży)$-[0]
daje liczby, których bym się spodziewał. Czy@{\@-}
działa z$-[0]
powodu kontekstu wyrażenia regularnego, ale nie z jakiegoś powodu podczas drukowania?$-[0]
jest bajtem krótszym niż@{\@-}
jeśli są takie same."@{\@-}"
to nie to samo co@{\@-}
(bez"
)."@{\@-}"
jest taki sam jak"@-"
. I to powinno być również prawdą w przypadku podstawienia wyrażenia regularnego, ale tak nie jest. Podobnie$-[0]
powinno działać, ale nie działa. PS: Prawdopodobnie w jakiś sposób zastosowałeś kontekst skalarny,@-
kiedy robiłeś wydruk, więc zawsze masz 1 lub 2CJam , 35 bajtów
Wypróbuj online!
Po włożeniu można zobaczyć poszczególne skropliny
ed
źródło
Python 2,
117104101 bajtówRekurencyjnie wykonaj niezbędne wymiany. Wyrażenie regularne buduję dynamicznie.
Wypróbuj online
źródło
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
sieci o -4 bajtachreturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
, możesz usunąći=0
definicję funkcji, ale będziesz musiał wywoływać z 0 startem.Perl
5352Obejmuje +1 za -p
Wypróbuj na ideone .
źródło
Mathematica, 101 bajtów
Powinien być sposób na skrócenie tego ...
źródło
PHP, 90 bajtów
lub 92 bajtów
źródło
+$i
zamiast$i+=0
(-2). 2)for
zamiast pętliwhile
można zapisać dwa bajty i pozwolić usunąć nawiasy (-4). 3)$i=++$i*!$c
zamiast$i=$c?0:$i+1
(-1). 4)\\2
nie jest potrzebne, usuń nawiasy (-2). 5) Możesz zezwolić na ograniczenie9
zamiast1
prędkości (+0)+$i
nie działa w każdym przypadku. Spróbowaćhammer
. PHP nie narzeka na puste nawiasy klamrowe w wyrażeniu regularnym; ale nie pasuje tak, jak chciałem. Nawiasem mówiąc: liczę 91, a nie 90. Ale spróbuj nowego 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
i spróbuję później. Co znaczy młot?puzzle
czy coś w tym stylu,(.)//1
ale jest w porządku z twoją propozycją lub$i´=0
Rubinowy,
756457 bajtów(56 bajtów kodu +
p
opcja wiersza poleceń).Używanie interpolacji ciągów w wyrażeniu regularnym do kontrolowania długości dopasowywanych dopasowań.
Test:
źródło
Haskell ,
9788 bajtówWypróbuj online!
Stara 97 bajtowa wersja:
Wypróbuj na ideone .
Wyjaśnienie:
(!)
Pełni funkcję jednego n kondensacji przy podawaniu raz cały łańcuch a raz z pierwszych N znaków, na przykład usuwaneabcdbe
icdbe
dla 2-kondensacji rekurencyjnie przez porównanie tych dwóch głównych postaci.źródło