Załóżmy, że stosujemy następujące reguły, aby wyciągnąć pojedynczy ciąg z innego ciągu, który zawiera tylko znaki drukowalne ASCII i nazywany jest *
ciągiem. Jeśli ciąg skończy się, zanim proces się zatrzyma, jest to błąd, a wynik procesu jest niezdefiniowany w takim przypadku:
- Zacząć od
d=1, s=""
- Ilekroć napotkasz znak
*
, pomnóżd
przez 2. Ilekroć spotkasz inną postać, połącz ją do końcas
i odejmij 1 odd
. Jeśli terazd=0
, zatrzymaj się i wróćs
Zdefiniowane przykłady :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Niezdefiniowane przykłady : (zauważ, że pusty ciąg również będzie jednym z nich)
*7
**769
*7*
*a*b
*
Twoim zadaniem jest pobranie łańcucha i zwrócenie najkrótszego ciągu, *
który go tworzy.
Przykłady programów :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Twój program powinien obsługiwać dowolny ciąg znaków zawierający co najmniej jeden znak i tylko *
znaki drukowalne inne niż ASCII. Nigdy nie możesz zwrócić łańcuchów, dla których proces jest niezdefiniowany, ponieważ z definicji nie mogą tworzyć ŻADNYCH łańcuchów.
Obowiązują standardowe luki i reguły we / wy.
*
?Odpowiedzi:
Pyth (
3627 bajtów)Dzięki Jakube za ulepszenie o 9 bajtów! Obecnie nie jest tak dobra jak odpowiedź błotniaka , ale cokolwiek
Pakiet testowy
Tłumaczenie na python:
źródło
JavaScript (ES6), 61 bajtów
Funkcja rekurencyjna, która wykonuje następujące czynności:
Jeśli
d
jest mniejsza lub równa pozostałej długości ciągu podzielonej przez 2:Dołącz
*
do wyniku i pomnóżd
przez 2Jeszcze:
Przesuń ciąg i dołącz do wyjścia, odejmij 1 od
d
.Zobacz to w akcji:
źródło
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927(zauważono uszkodzenie)272625 bajtówWyjaśnienie, które nastąpi.
Pakiet testowy
źródło
C, 125 bajtów
Wykorzystuje to bardzo regularny wzór pozycji gwiazd, aby uzyskać prawidłowe kodowanie. Początkowo próbowałem rekurencyjnego rozwiązania bruteforce, ale z perspektywy czasu powinno być oczywiste, że istnieje prostsze rozwiązanie matematyczne.
Zasadniczo zawsze będziesz mieć
2^floor(log_2(length))
gwiazdki na początku swojej produkcji, a ostatnią gwiazdkę za2^ceil(log_2(length)) - length
postaciami (jeśli to da wynik co najmniej 1 postaci).Wersja (nieco) niestrzeżona jest następująca
źródło
JavaScript (ES6),
8877 bajtówNa początku tak myślałem
abcde
musi być,*a**bcde
ale okazuje się, że**abc*de
działa równie dobrze. Oznacza to, że moc wyjściową można łatwo skonstruować przy użyciu gwiazd wiodących na podłodze (log₂ (s.length)) oraz dodatkowej gwiazdy dla łańcuchów, których długość nie jest potęgą dwóch.Edycja: Zapisano 8 bajtów, obliczając rekurencyjnie liczbę wiodących gwiazd. Kolejne 3 bajty zostały zapisane przez specjalne łańcuchy o długości 1, dzięki czemu mogę traktować łańcuchy o długości 2 jako dodatkową gwiazdę wiodącą.
źródło
Haskell, 68 bajtów
Tak samo jak inne odpowiedzi, naprawdę. Jeśli EOF, wypisz pusty ciąg. Jeśli pozostała długość jest ponad dwukrotnie
d
, wyślij gwiazdkę i podwójd
. W przeciwnym razie wypisz następny znak i odejmij jedend
.Nie golfowany:
źródło