Dane wejściowe to słowo pisane małymi literami, które nie są oddzielone spacjami. Nowa linia na końcu jest opcjonalna.
To samo słowo musi być wyprowadzone w zmodyfikowanej wersji: Dla każdego znaku dwukrotnie go za drugim razem, gdy pojawia się w oryginalnym słowie, potrój go za trzecim razem itp.
Przykładowe dane wejściowe:
bonobo
Przykładowe dane wyjściowe:
bonoobbooo
Obowiązują standardowe zasady we / wy. Najkrótszy kod w bajtach wygrywa.
Testy dostarczone przez @Neil:
tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii
Pyth, 6 bajtów
Dzięki @Doorknob za zdjęcie 1 bajtu.
Dzięki @Maltysen za zdjęcie 5 bajtów.
Wypróbuj online!
Jak to działa
Na przykład weź ciąg
"bonobo"
.._
tworzy listę:['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']
VQ._
oznacza „poprzednią funkcję wektoryzowaną (zastosowaną równolegle) nadQ
i._
”, co oznaczaQ
(dane wejściowe ocenione) będą traktowane jako lista:['b', 'o', 'n', 'o', 'b', 'o']
a następnie zostaną sparowane w@
następujący sposób:W związku z tym,
@VQ._
będzie produkować['b', 'o', 'n', 'oo', 'bb', 'ooo']
.s
Następnie łączy je w całość, tworząc łańcuch'bonoobbooo'
, który następnie jest domyślnie drukowany staćbonoobbooo
.źródło
VQ
oznacza tylko,for N in Q
gdy nie ma go w funkcji. W tym przypadku tak naprawdę dzieje się to, co@V
oznacza, że@
funkcja jest wektoryzowana (stosowana równolegle) w stosunku do dwóch kolejnych argumentów,Q
oraz._
. Tego brakuje w dokumentacji, więc naprawię to.Retina ,
3419 bajtówZaoszczędź 15 bajtów, czerpiąc inspirację z rozwiązania isaacg.
Liczba bajtów zakłada kodowanie ISO 8859-1.
Znaczące są wiodące i końcowe puste linie.
Wypróbuj online!
Wyjaśnienie
Jest to etap zastępowania, który pasuje do pustego wyrażenia regularnego (tj. Każdej pozycji o zerowej szerokości w łańcuchu) i zastępuje
$`¶
go, gdzie$`
jest prefiksem dopasowania i¶
wstawia znak linii. To w zasadzie oblicza wszystkie prefiksy i umieszcza je w osobnej linii wraz z ostatnim znakiem tego prefiksu:Będą pewne wiodące i końcowe linie, ale możemy je zignorować.
Z każdego z tych przedrostków chcemy zachować znaki równe ostatniemu znakowi. W tym celu wykorzystujemy kolejny etap wymiany:
To pasuje do wszystkiego, czego nie chcemy zachować i zastępuje je niczym. Dopasowujemy dowolny znak (używając,
\D
ponieważ wiemy, że na wejściu nie będzie cyfr), a następnie upewniamy się, że nie ma innej kopii tego znaku na końcu wiersza.źródło
Python, 56 bajtów
Wydaje mi się, że utknąłem z dwiema odpowiedziami o tej samej długości:
Edycja: Zobacz odpowiedź @ pacholik na krótsze, alternatywne podejście do Pythona.
źródło
+1
jest wystarczająco wysoki, abyHaskell, 39 bajtów
Przykład użycia:
f "bonobo"
->"bonoobbooo"
.Wystarczająco różni się od odpowiedzi @ Damiena . Tworzy ciąg od prawej strony, wyodrębniając wszystkie wystąpienia ostatniego znaku z ciągu i przygotowując wywołanie rekurencyjne ze wszystkimi znakami oprócz ostatniego.
źródło
> <> , 27 bajtów
Wymaga oficjalnego tłumacza, który kończy się błędem podczas próby wydrukowania kodu punktu -1. Wypróbuj online!
Kod odczytuje dane wejściowe jeden znak na raz i używa pierwszego rzędu szafy kodowej jako dużej tablicy, która przechowuje liczbę wyświetleń każdego znaku (> <> inicjuje komórki nieprogramowe na 0). Drugi rząd to pętla wielokrotnego wyprowadzania znaku.
Alternatywnie, oto wersja, która wychodzi czysto (37 bajtów, źle golfowana):
źródło
chr(-1)
. Animowany tłumacz świetnie nadaje się do wizualizacji, ale niestety niektóre rozbieżności z oficjalnym tłumaczem są nieco denerwujące: /JavaScript (ES6),
4845 bajtówEdycja: Zapisano 3 bajty dzięki @ user81655.
źródło
Haskell,
504241 bajtówZaoszczędź 8 bajtów dzięki Lynn
źródło
f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
MATL , 8 bajtów
Wypróbuj online! Lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Wyjaśnienie
źródło
Labirynt ,
5425 bajtówInnym collab z @ MartinBüttner, kto faktycznie zrobił
najbardziejprawie wszystkie gry w golfa dla tego jednego. Przebudowując algorytm, udało nam się znacznie zmniejszyć rozmiar programu!Wypróbuj online!
Wyjaśnienie
Szybki podkład Labrinth:
Labirynt to język 2D oparty na stosie. Istnieją dwa stosy, główny i pomocniczy, a wyskakiwanie z pustego stosu daje zero.
Na każdym skrzyżowaniu, gdzie istnieje wiele ścieżek, w których wskaźnik instrukcji przesuwa się w dół, sprawdzana jest góra głównego stosu, aby zobaczyć, gdzie iść dalej. Negatyw to skręt w lewo, zero to kierunek na wprost, a dodatni to zwrot w prawo.
Dwa stosy liczb całkowitych o dowolnej precyzji nie są zbyt elastyczne pod względem opcji pamięci. Aby wykonać zliczanie, ten program faktycznie używa dwóch stosów jako taśmy, przy czym przesunięcie wartości z jednego stosu na drugi jest podobne do przesunięcia wskaźnika pamięci w lewo / prawo o komórkę. Nie jest to jednak to samo, ponieważ po drodze w górę musimy przeciągnąć licznik pętli.
Po pierwsze,
<
i>
na obu końcach pop offset i obrócić wiersz kodu, który offsetowej z dala od jednego prawej lub lewej strony. Ten mechanizm służy do uruchamiania kodu w pętli -<
wyskakuje zero i obraca bieżący wiersz w lewo, umieszczając adres IP po prawej stronie kodu, a>
wyskakuje o kolejne zero i naprawia wiersz z powrotem.Oto, co dzieje się z każdą iteracją, w odniesieniu do powyższego schematu:
źródło
Perl, 17
(16-bajtowy kod, +1 dla -p)
Stosowanie:
źródło
Pyth, 7 bajtów
Zestaw testowy
Zestaw testowy dzięki DenkerAffe
Wyjaśnienie:
źródło
Python 3, 52
źródło
f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
PowerShell v2 +,
5247 bajtówKonstruuje pustą tablicę mieszającą, przechowuje ją
$b
. To jest nasz „licznik” listów, które widzieliśmy. Następnie pobieramy dane wejściowe$args[0]
, rzutujemy je jako tablicę znaków i wysyłamy przez pętlę. Przy każdej iteracji bierzemy bieżący znak"$_"
i mnożymy go przez wstępnie zwiększony licznik o podanej wartości, co spowoduje, że pierwsze wystąpienie zostanie pomnożone przez1
, drugie przez2
itd. Podsumowujemy to-join
tak, że wypisywane jest tylko jedno słowo.Zaoszczędź 5 bajtów dzięki TessellatingHeckler , używając tablicy hashtowej zamiast tablicy, więc nie musieliśmy zmniejszać znaku ASCII,
97
aby osiągnąć odpowiedni indeks. Działa to, ponieważ wstępne zwiększenie indeksu skrótu domyślnie wywołuje.Add()
w tle, jeśli ten indeks nie istnieje, ponieważ tabele skrótów można modyfikować.źródło
Dyalog APL , 6 bajtów
TryAPL!
4 funkcje są na szczycie (2 pociągi) widelca (3 pociągi):
Najpierw
⊢
(z prawej - no-op) na danym ciągu, dając'bonobo'
Następnie
,\
(skan konkatenacji) na łańcuchu, dając'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'
Obie są rozwidlone razem z (podanymi jako prawy i lewy argument do)
∩¨
(każdy przecięcie), tj.('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o')
Którym jest'b' 'o' 'n' 'oo' 'bb' 'ooo'
Na koniec
∊
(wynik) zostaje zastosowany do wyniku, aby go spłaszczyć, dając'bonoobbooo'
Hej, przynajmniej pasuje do Pytha ! Oczywiście Jelly jest krótszy, ponieważ jest golfową wersją J, która z kolei jest zaawansowanym dialektem APL z 2 znakami na funkcję.
źródło
Pyth, 11 bajtów
Wypróbuj tutaj!
Wyjaśnienie
źródło
J, 11 bajtów
To jest czasownik monadyczny. Wypróbuj tutaj. Stosowanie:
Wyjaśnienie
źródło
05AB1E , 10 bajtów
Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
CJam, 14
Wypróbuj online
Wyjaśnienie:
źródło
Perl 6, 37 bajtów
źródło
> <> , 52 bajty
Układa każdą przeczytaną literę, drukuje je raz za razem dla każdej podobnej litery na stosie.
Wykorzystuje
&
rejestr, ponieważ konieczność obsługi 3 zmiennych na stosie (bieżąca czytana litera, pozycja na stosie, litera w tej pozycji) jest uciążliwa.Możesz spróbować tutaj !
źródło
Rdza, 176 bajtów
To używa mapy do przechowywania ciągu dla każdego znaku na wejściu. Dla każdego znaku ciąg zostanie usunięty z mapy, połączony ze znakiem, wstawiony z powrotem do mapy i dołączony do wyniku.
Chciałbym użyć
get(...)
zamiastremove(...)
, ale sprawdzanie pożyczek kazało mi zmienić zdanie.źródło
Mathcad, 66 bajtów
Niestety Mathcad nie ma szczególnie dobrej obsługi ciągu, więc przekonwertowałem ciąg wejściowy na wektor, a następnie użyłem wektora (indeksowanego kodem znaków), aby śledzić liczbę napotkanych znaków, dodając znak, że ile razy wektor wynikowy. Na koniec wektor wynikowy jest konwertowany z powrotem na ciąg. Niestety dość długa.
Zauważ, że Mathcad korzysta z interfejsu 2D „tablicy” z mieszanką normalnego tekstu i operatorów; operatory są zwykle wprowadzane za pomocą paska narzędzi lub skrótu klawiaturowego; na przykład, ctl- # wchodzi do operatora pętli for, który zawiera słowo kluczowe symbol elementu-symbol i 3 puste „symbole zastępcze” odpowiednio dla zmiennej iteracji, zakresu i wyrażeń treści. Wpisywanie [po wprowadzeniu nazwy zmiennej do trybu indeksu tablicowego, Wpisanie „wprowadza dopasowaną parę nawiasów ( przeważnie ... są wyjątki w zależności od tego, co jeszcze znajduje się w otaczającym wyrażeniu )
źródło
JavaScript ES6 44 bajty
stara odpowiedź
JavaScript ES6 46 bajtów
źródło
x
do tablicy wejściowej ->q=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
Julia,
3835 bajtówI / O pochodzi z tablic znaków. Wypróbuj online!
Jak to działa
Definiujemy operator monadyczny ! do naszych celów.
Kiedy ! jest wywoływany, sprawdza, czy jego argument s jest pusty. Jeśli tak, zwraca argument.
Jeśli s nie jest puste, przecinamy s jego ostatnim znakiem (
s[end]
), co daje wszystkie wystąpienia tego znaku w s . Ten wynik jest łączony z wartością zwrotną wywołania rekurencyjnego do ! ze s minus ostatni znak (s[1:end-1]
) jako argument.źródło
PHP,
54515047 bajtówUruchom tak:
Poprawki
null
naint
dla przesunięcia łańcucha, ponieważ przesunięcie łańcucha jest rzutowane na int$argn
zamiast$argv
(thx Titus)źródło
$argn
pomocą,-R
aby zapisać jeszcze trzy bajty.-n
powinieneś zrobić to samo, co twój-d error_reporting
:n
oznaczano config file
, a powiadomienia są wyłączone w domyślnej konfiguracji; więc-nr
(odpowiednio-nR
) powinno wystarczyć.Mathematica, 57 bajtów
Używamy
c[x]
jako tabeli przeglądowej tego, jak często postaćx
już występowała. Jest to zwiększane za każdym razem, gdy jest pobieranex~StringRepeat~++c[x]
. Niestety, aby funkcja była wielokrotnego użytku, musimy za każdym razem resetować tabelę wyszukiwaniaClear@c;c@_=0;
, co jest dość kosztowne.źródło
awk, 72 bajty
Chodzi o to, aby zapisać liczbę pojawiających się znaków w tablicy asocjacyjnej i wydrukować liczbę razy.
źródło
Belka, 32
3342bajtówPowinno to być mniejsze, ale straciłem kilka bajtów inicjujących gniazda pamięci do 0. Zamiana niektórych kierunków przepływu pozwoliła wyeliminować dużo pustej przestrzeni.
Wypróbuj w tym fragmencie
Ogólne wyjaśnienie.
źródło
Python,
6662 bajtówWypróbuj tutaj
Grał w golfa
Bez golfa
źródło