Napisz program, który przechodzi przez ciąg znaków non-białych (można założyć, że są cyfry 0
do 9
, ale nie w sposób, w jaki mają być przetwarzane zależy od tego) i dodaje spacje zgodnie z następującymi zasadami.
- Niech bieżący token będzie pustym ciągiem, a poprzednio emitowane tokeny będą pustym zestawem.
- Iteruj po znakach łańcucha. Dla każdej postaci najpierw dodaj postać do bieżącego tokena. Następnie, jeśli bieżący token nie znajduje się już w zestawie wcześniej emitowanych tokenów, dodaj bieżący token do tego zestawu i niech nowy bieżący token będzie pustym ciągiem.
- Jeśli po osiągnięciu końca łańcucha bieżący token jest pusty, wyślij poprzednio wyemitowane tokeny w kolejności emisji, oddzielając je spacją. W przeciwnym razie wypisz oryginalny ciąg znaków dosłownie.
Wkład
Dane wejściowe do STDIN powinny być ciągiem cyfr.
Wydajność
Program powinien wydrukować wynik, jak określono w kroku 3.
Próbki
Przykładowe dane wejściowe
2015
10101010
4815162342
101010101010
3455121372425
123456789101112131415
314159265358979323846264338327950288419716939937
Przykładowe wyniki
2 0 1 5
10101010
4 8 1 5 16 2 3 42
1 0 10 101 01 010
3 4 5 51 2 1 37 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 95 0 28 841 971 69 39 937
To jest kod golfowy, więc obowiązują standardowe zasady CG. Najkrótszy program w bajtach wygrywa.
(Poproś o wyjaśnienia w komentarzach. Nadal jestem nowy. Dzięki!)
4815162342
Widzę, co tam zrobiłeś, bracie .1 0 10
, pojawi się następna iteracja1
(już używana), następnie przejdź do jednej10
(już używana), a następnie przejdź do jednej101
, która jest nowa i zostanie dodana. Dodałoby to spację i dostałbyś nowy0
, który był już używany, ale znajduje się tutaj na końcu łańcucha. Dlatego wynik byłby1 0 10 101 0
niepoprawny (0
jest powtarzany), a skrypt musi po prostu wyprowadzić ciąg wejściowy. Mógłby to zrobić tylko,1010
jeśli101
był już używany.If a unique number cannot be formed at the end of the string, then the input should be printed verbatim
nie można podzielić, więc jest drukowany w niezmienionej postaci.1
, co będzie powtórzeniem. Zamiast tego poruszasz się w prawo na polu 5, a następnie ponownie w prawo w kroku 4, a następnie ponownie wchodzisz do kroku 5 i tworzysz101
.Odpowiedzi:
Pyth, 22 bajty
Wiodąca przestrzeń jest ważna.
źródło
Siatkówka ,
6861 bajtów<empty>
jest pustą linią. Zwróć uwagę na końcowe miejsce w linii 3. Możesz uruchomić powyższy kod z jednego pliku z-s
flagą.Wyjaśnienie
Ten pierwszy krok implementuje reguły od 1 do 6. Jest to substytucja wyrażeń regularnych, która jest stosowana wielokrotnie, aż łańcuch przestanie się zmieniać (po to
+
jest). W każdym kroku dodajemy pojedynczą spację do łańcucha od lewej do prawej (zgodnie z regułami wyzwania). Wyrażenie regularne dopasowuje najkrótszy ciąg cyfr, który nie pojawił się w już przetworzonej części ciągu. Zapewniamy, że patrzymy na prefiks pozostałego łańcucha z granicą słowa\b
i sprawdzamy, czy możemy dotrzeć do końca łańcucha bez przekazywania spacji(\w+)$
. Ten ostatni zapewnia również, że wykonujemy tylko jedną wymianę na krok.Odpowiada to dowolnej spacji (znajdującej się na końcu wyrażenia regularnego), pod warunkiem, że ostatni segment łańcucha jest taki sam jak każdy inny segment łańcucha i zastępuje je pustym ciągiem. Oznacza to, że cofamy pierwszy krok, jeśli spowodował niepoprawny końcowy segment, wdrażając zasadę 7.
źródło
Pyth
2423 bajtyWypróbuj tutaj .
Dzięki @FryAmTheEggman za zapisanie bajtu: o)
źródło
Python 3, 92 bajty
Zasadniczo mocno golfowa wersja rozwiązania @ Willema.
źródło
[" ".join(o),i][n>""]
bool(n)
ale nie myślałemn>""
.Python 3,
10099 bajtówźródło
else "
.Brachylog , 91 bajtów
Uświadomiłem sobie, że w składni jest wiele rzeczy, które muszę zmienić ...
Wyjaśnienie
źródło
CJam, 26 bajtów
Sprawdź to tutaj.
Wyjaśnienie
źródło
JavaScript (ES6), 109
Mój format wyjściowy nie jest dokładnie taki sam jak próbek wyjściowych w questioin (istnieje spacja wiodąca). Nie uważam tego za wadę, ponieważ format wyjściowy nie jest określony (po prostu program powinien wydrukować liczbę po liczbie ... )
Przetestuj poniższy fragment kodu w przeglądarce zgodnej z EcmaScript 6. Opracowany w przeglądarce Firefox, przetestowany i działający na najnowszym Chrome.
źródło
GNU sed,
83777371 bajtów(Zdobądź jeden dodatkowy, ponieważ wymagamy
-r
flagi)Wewnętrzna pętla sprawdza powtarzalność sekwencji i dodaje znaki w razie potrzeby, aż po separatorze pojawi się unikalna liczba
_
. Pętla zewnętrzna porusza się_
wzdłuż.Rozszerzona wersja z adnotacjami:
źródło
t
w jeden./((\b[^ ]+).*\b\2)_/{
może być zapisane jako/(\b[^ ]+).*\b\1_/{
, bez powodu, dla 2 grup przechwytujących.\1
!Rubinowy, 57 + 1 = 58 bajtów
Używa flagi wiersza polecenia
-p
(lubpl
jeśli dane wejściowe mają końcowy znak nowej linii). Wykorzystuje kilka cech słowników Ruby Hash: możesz bezpiecznie mutować łańcuch użyty do zdefiniowania klucza bez zmiany klucza (co nie działa dla innych typów zmiennych),.keys
zwraca klucze w kolejności, w której zostały wstawione, a[]||=
operator zapewnia zwięzły sposób rozgałęziania, czy dany klucz już tam jest.źródło
Haskell, 105 bajtów
f
czy to.źródło
PHP - 148 bajtów
Fajne wyzwanie, dużo zabawy!
źródło