Istnieje klasyczne kodowanie i dekodowanie długości przebiegu.
input output
a3b2c5 aaabbccccc
I to dość proste i zrobione wcześniej.
Wyzwanie polega również na uwzględnieniu niestandardowego zachowania, gdy wiele znaków poprzedza długość przebiegu ( jedna cyfra od 0–9). Każdy znak przed cyfrą długości przebiegu (ostatnią cyfrą przed cyfrą lub końcem ciągu) ma tę wartość przypisaną do niej indywidualnie i drukowaną w kolejności.
Niektóre wejścia i wyjścia testowe, w tym niektóre przypadki zbocza:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Po sekwencji znaków (
[a-zA-Z0-9]+
) musi następować długość jej przebiegu ([0-9]
) - Należy brać pod uwagę tylko prawidłowe dane wejściowe (
([a-zA-Z0-9]+[0-9])*
)- tak, pusty ciąg jest prawidłowym wejściem.
- Wejście odbywa się przez standardowe wejście, wyjście przez standardowe wyjście
To jest kod golfowy, liczba bajtów określa zwycięzcę.
Odpowiedzi:
Pip, 22 + 1 = 23 bajty
Używa
-r
flagi. Zauważ, że wymaga to albo 1) wprowadzenia EOF po wejściu (Ctrl-D w systemie Linux, Ctrl-Z w systemie Windows) lub 2) potokowania wejścia z innego miejsca.Wyjaśnienie:
Rezultatem operacji mapowania jest w rzeczywistości lista list, ale domyślnie listy są po prostu łączone podczas drukowania, więc nie jest wymagana ręczna konwersja na ciąg.
Przykład z wejściem
a13b1
:Pip ma podstawową obsługę wyrażeń regularnych od… 2 dni temu . Świetny czas!
źródło
-r
flagą. (Pytanie określa, że dane wejściowe muszą pochodzić ze STDIN.)q
zamiasta
bez dodatkowych flag, ale wydaje się, że jest błąd i dwukrotnie pyta o dane wejściowe.Perl / Bash
5440 + 1 = 41 bajtówZasadniczo jest to wyrażenie regularne w wyrażeniu regularnym. I trochę magii.
Wyjaśnienie
Wyrażenie zewnętrzne
/(\D*\d*)(\d)/g
wyodrębnia każdą zakodowaną grupę przebiegów. Przechwytujemy rzeczy do powtórzenia$1
i liczbę powtórzeń$2
. Teraz podstawiamy każdą taką grupę ekspansją tej grupy. W tym celu oceniamy kod"\$1=~s/./\$&x$2/egr"
dwa razy (jak za pomocą/ee
flagi na zewnętrznym podstawieniu).Pierwsza ocena interpoluje tylko liczbę powtórzeń w ciągu - pozostałe zmienne są chronione odwrotnym ukośnikiem. Przyjmując dane wejściowe
a14
, otrzymalibyśmy kod$1=~s/./$&x4/egr
, który zostanie ponownie oceniony.Spowoduje to zastosowanie podstawienia do treści
$1
(rzeczy do powtórzeniaa1
). Podstawienie pasuje do każdego znaku.
.$&
Zmienna posiada cały mecz, który powtarzamyx4
razy. Robimy to/g
lobalnie dla każdego dopasowania i/r
zwracamy podstawiony ciąg zamiast modyfikować$1
zmienną (która jest tylko do odczytu). Tak więc wynikiem wewnętrznej substytucji jestaaaa1111
.-p
Flaga zastosuje zmiany do każdej linii wejścia i wypisuje wynik.źródło
-p
modyfikatora. Liczę 45 bajtów. Ponadto powinieneś być w stanie używać\D
zamiast[a-z]
, co również wyeliminowało potrzebęi
.CJam,
33 3127 bajtówUhh, brak wyrażeń regularnych sprawia, że to dość długo ...
Jak to działa
Przechodzimy przez wszystkie znaki ciągu wejściowego i w każdej iteracji śledzimy ostatnio napotkany znak (zaczynając od pustego znaku po raz pierwszy). Następnie sprawdzamy, czy bieżący znak nie jest liczbą, a ostatni znak jest liczbą. Jeśli tak, to powtarzamy każdy poprzedni znak (który jeszcze się nie powtórzył) liczbę razy.
(Nieco przestarzałe rozszerzenie kodu)
Wypróbuj online tutaj
źródło
rs ,
4371 znakówCóż, to szybko się zmieniło. Głupie liczby ...
Wypróbuj tutaj!
Wersja oryginalna (nie działała z danymi wejściowymi podobnymi do
123
):Wyjaśnienie
Pierwszy wiersz umieszcza spacje między seriami zawierającymi liczby, np. Zwrot
a313
wa3 13
.Druga linia w sposób ciągły rozszerza skompresowane kodowanie
aa5
toa5a5
.Trzecia linia przekształca każde wystąpienie
a5
waaaaa
użycie operatora powtarzania .Ostatni wiersz usuwa spacje.
źródło
a123b1
?JavaScript ( ES6 ),
8683 bajtówSkomentowano:
źródło
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
zrobisz tego samego? Ma tylko 71 bajtów.Array(6).join('12')
a wróci'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(te same 71 bajtów długości, testowane na es6fiddle.net/ia7gocwg )CJam,
2725 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Pyth,
333228 bajtówWypróbuj online: Demonstracja lub Uprząż testowa
Wyjaśnienie
Wyjaśnię kod, używając przykładowego wejścia
aa1a23b2
. Mam nadzieję, że jest to nieco łatwiejsze do naśladowania niż bez.źródło
Ruby 73
Testy: http://ideone.com/L1fssb
źródło
JavaScript 112
źródło
Python 2.7, 98 bajtów
To po prostu wyszukuje wyrażenia regularne dla cyfr, po których nie występuje cyfra, a następnie wykonuje arytmetykę ciągów dla każdej grupy i łączy je wszystkie z powrotem.
źródło
raw_input
staje się,input
aleprint
potrzebuje nawiasów.Julia,
105999587 bajtówTworzy to nienazwaną funkcję, która pobiera ciąg znaków jako dane wejściowe i zwraca ciąg znaków. Aby to nazwać, nadaj mu nazwę, np
f=s->...
.Używane są tutaj dwa wyrażenia tablicowe, jedno zagnieżdżone w drugim. Zewnętrzne rozumienie działa na każde dopasowanie ciągu wejściowego względem wyrażenia regularnego
\D*\d*\d
. Wewnętrzne zrozumienie powtarza każdy znak dopasowania zgodnie z cyfrą końcową. Elementy tablicy wewnętrznej są połączone w ciąg, więc tablica zewnętrzna jest tablicą ciągów. Są one łączone i zwracane.W Julii ciągi znaków można traktować jak tablice znaków. Zauważ jednak, że typy
Char
iString
w Julii nie mają zdefiniowanych takich samych metod; w szczególności nie ma metody powtarzania^
znaków. Wykorzystuje to skomplikowane obejście:chop()
.string()
.int('4')
nie zwraca 4. Raczej zwraca kod, który w tym przypadku wynosi 52. W ten sposób możemy odjąć 48, aby odzyskać rzeczywistą liczbę całkowitą.string(b)
zgodnie zint(p[end]) - 48
.Przykłady:
źródło
Python 3,
148144136135 bajtówDzięki Pietu1998 i mbomb007 za sugestie.
Python 2,
161151147139 139138 bajtówMoże dzisiejszy dzień był długi w pracy, ale nie mogę przez całe życie wymyślić, jak grać w golfa ...
źródło
raw_
poza, nawiasy doprint
).len(d)>0
można zastąpić,d
ponieważ pusta lista jest fałszem, a niepusta lista jest prawdą.list(...)
można przejść bezpośrednio dofor
. Nawiasy kwadratowe ww([...])
są niepotrzebne, ponieważ jest to jedyny argument. Możesz usunąć miejsce w) for
. To wszystko, co do tej pory wymyśliłem.list()
ponieważ ciągi są iterowalne. Możesz użyćw=r=''
. Jeśli chcesz to bardzo zmienić, zobacz moje rozwiązanie. :)if c.isdigit()
może się staćif'/'<c<':'
, jeśli się nie mylę.Java 7, 175 bajtów
Wyzwanie jest trudniejsze niż się wydaje, imo ..
Kod niepoznany i testowy:
Wypróbuj tutaj.
Wynik:
źródło