W Vimie możesz powtórzyć polecenie poprzedzając je liczbą, podobnie jak 3dd
odpowiednik dd dd dd
. Ten powtarzający się wzorzec nie jest ograniczony do poleceń Vima. Ciąg można również replikować w ten sposób.
Specyfikacja:
Biorąc pod uwagę ciąg znaków, składający się wyłącznie z cyfr, znaków alfabetu (zarówno wielkich, jak i małych) oraz spacji, z opcjonalnym końcowym znakiem nowej linii jako napisem, napisz program, który wykonuje następujące zadanie:
Każde „słowo” składa się z cyfr i alfabetów. Jeśli litera poprzedza cyfra (może występować więcej niż jedna cyfra w cyfrze lub liczba wynosi zero), powtórz tę literę dla podanych czasów. Na przykład:
a2bc -> abbc 3xx1yz -> xxxxyz 10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero 2A2a2A2a -> AAaaAAaa
Słowa są oddzielone spacjami. Pomiędzy dwoma sąsiednimi słowami jest maksymalnie jedna spacja.
Łatwe, prawda? Oto dodatkowe rzeczy:
Jeśli przed spacją jest liczba, powtórz następne słowo dla podanych czasów. Liczba będzie zawsze dołączana na końcu poprzedniego słowa lub na początku łańcucha. Przykład:
a2bc3 2d -> abbc dd dd dd 3 3a -> aaa aaa aaa 33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 abcd0 efgh3 2x -> xx xx xx a3 0xc b -> a c c c b
Jeśli puste słowo powinno zostać powtórzone, nie wypisuj wielu spacji z rzędu. Squash je:
a3 0x2 b -> a b b # NOT 'a b b'
Innymi słowy, twój program nigdy nie powinien wypisywać razem dwóch spacji.
Dane wejściowe nigdy nie są puste, ale nie jest konieczne, aby dane wyjściowe były niepuste:
0 3x -> (empty)
Dane wejściowe i wyjściowe można przyjmować na dowolne preferowane sposoby. Dopuszczalna jest również funkcja pobierająca dane wejściowe z argumentów i przekazująca dane wyjściowe za pomocą zwracanych wartości.
Jeśli jest to program, nie może wyjść z błędem (tzn. Zwracana wartość wynosi zero).
Liczby są zawsze dziesiętne i nigdy nie zaczynają się od zera, chyba że sama liczba wynosi zero, w którym to przypadku jest tylko jedno zero. Czyli nie musisz brać pod uwagę
077a
ani000a
podawać danych wejściowych.Wszystkie liczby są poniżej 2 ^ 31 (2 147 483 648). Maksymalna długość wyjściowa jest mniejsza niż 2 ^ 32 (4 294 967 296) bajtów.
Program może opcjonalnie wypisać jedną końcową spację i / lub jedną końcową nową linię. Te odstępy i znak nowej linii nie wpływają na ważność danych wyjściowych. Nawet jeśli poprawne wyjście powinno być puste, kwalifikuje się wyjście spacji, po której następuje nowa linia.
Krótko mówiąc, prawidłowe dane wejściowe pasują do tego wyrażenia regularnego:
([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)
I dla prawidłowego wyniku:
([A-Za-z]+)( [A-Za-z]+)*( ?\n?)
Przykładowe przypadki testowe:
abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc
To jest golf golfowy , więc wygrywa najkrótszy program w bajtach w każdym języku!
a3 0xc b
->a c c c b
, ponieważ pierwotnie miałem kod, który działał dla wszystkich powyższych przypadków testowych, ale nie działał poprawnie dla tego.Odpowiedzi:
JavaScript (Node.js) ,
102129110106 bajtówWypróbuj online!
Dzięki za @Arnauld za -4 bajty.
źródło
Perl 6, 88 bajtów
Sprawdź to
Rozszerzony:
Ta
~(…).words
kombinacja usuwa zewnętrzne przestrzenie, co jest przydatne, gdy „słowo” zostanie usunięte.źródło
Python 2,
286275260257238 bajtów-19 bajtów dzięki ovs
f
bierze ciąg jako argument i wypisuje sformatowany ciąg.Oto repl.it z przypadkami testowymi.
Nieskluczony kod:
Nadal pracuję nad ulepszeniami.
źródło
exec
, ponieważ jest to jedyna linia w funkcji.Perl 5 , 77 + 1 (
-p
) = 78 bajtówWypróbuj online!
źródło
Czysty ,
443... 306 bajtówWypróbuj online!
źródło
Lua , 113 bajtów
Wypróbuj online!
źródło