Napisz najkrótszy kod w wybranym języku, aby wykonać dekodowanie długości ciągu danego ciągu.
Ciąg zostanie dostarczony jako wejście na stdin w formie
CNCNCNCNCNCNCNCN
gdzie każdy C
może być dowolnym drukowalnym znakiem ASCII, a każdy N
jest cyfrą 1
na 9
(włącznie).
Przykładowe dane wejściowe:
:144,1'1
Odpowiednia wydajność:
:4444,'
Język programowania Szekspira , 406 bajtów
Wersja bez golfa:
Używam kompilatora Pythona SPL drsam94 , który ma kilka błędów (dlatego na przykład używam
Open your mind
zamiastOpen thy mind
w wersji golfowej).Aby uruchomić ten program, użyj:
Jak to działa
SPL to ezoteryczny język programowania zaprojektowany tak, aby programy wyglądały jak sztuki Szekspira. Robi to za pomocą znaków jako zmiennych, a przetwarzanie odbywa się poprzez to, że znaki mówią sobie nawzajem.
To jest tytuł sztuki; jest ignorowany przez kompilator.
Tutaj deklarujemy zmienne używane w pozostałej części programu. Wszystko pomiędzy
,
i.
jest ignorowane przez kompilator. W tym przypadku deklarujemyRomeo
, używane do przechowywania dekodowanej postaci, iJuliet
używane do przechowywania długości przebiegu znaku.Tutaj deklarujemy pierwszy i jedyny akt w programie. Akty i sceny są jak etykiety; można do nich wskoczyć w dowolnym momencie za pomocą
let us return to scene II
lub jakiejś jego wariantu. Używamy tylko jednego aktu, ponieważ jest on wystarczający dla naszych potrzeb. Ponownie, wszystko pomiędzy:
i.
jest ignorowane przez kompilator.Tutaj ogłaszamy pierwszą scenę. Sceny są ponumerowane cyframi rzymskimi: pierwsza to
Scene I
drugaScene II
i tak dalej.To jest kierunek sceny; w nim mówimy zmiennym
Romeo
iJuliet
, aby przyszły na „etap”. Tylko dwie zmienne mogą znajdować się jednocześnie na „scenie”; etap jest używany, aby kompilator mógł dowiedzieć się, która zmienna jest adresowana, a kiedy mówi. Ponieważ mamy tylko dwie zmienne, Romeo i Julia pozostaną na scenie przez cały czas trwania programu.Kolejna deklaracja sceny. Scena II zostanie przeskoczona w celu odkodowania kolejnego przebiegu.
Ta forma deklaracji oznacza, że Juliet zacznie mówić. Wszystko do następnego
Romeo:
, reżyserii scenicznej lub deklaracji sceny / aktu będzie wierszem wypowiedzianym przez Juliet, a zatem „ja” będzie odnosić się do Julii, „ty” / „ty” do Romeo itp.To polecenie przechowuje wartość porządkową pojedynczego znaku z STDIN w
Romeo
.W języku SPL rzeczowniki tłumaczą się na 1 lub -1 w zależności od tego, czy są dodatnie czy ujemne. W tym przypadku
my mother
tłumaczy się na 1. Przymiotniki (dodatnie lub ujemne) mnożą ich rzeczownik przez 2.To jest pytanie; w tym Juliet pyta, czy
my mother
(AKA 1) jest „bardziej wesoły” niż Romeo. Porównania tłumaczą się naless than
(jeśli są negatywne, jakworse
) lubgreater than
(jeśli są pozytywne, jakjollier
). Dlatego pytanie sprowadza się doIs 1 greater than you?
.Powodem, dla którego zadajemy to pytanie, jest wykrycie końca danych wejściowych. Ponieważ wartość
EOF
różni się w zależności od platformy, ale zwykle jest mniejsza niż 1, używamy tego do jej wykrycia.Jeśli poprzednie pytanie zostanie ocenione
true
, przejdziemy do sceny IV - która jest po prostu końcem programu. Krótko mówiąc, jeśli wykryjemy EOF, kończymy program.Teraz linia Romeo: „ja” i „ty” odnoszą się odpowiednio do Romea i Julii.
Ponownie, to polecenie umieszcza wartość porządkową pojedynczego znaku z STDIN w Juliet, która w tym przypadku jest długością przebiegu znaku zapisanego w
Romeo
.Ten jest zbyt długi, aby przejść do niego bardzo szczegółowo, ale zaufaj mi, że to się tłumaczy
Juliet -= 48
. Robimy to, ponieważ Juliet posiada wartość ASCII liczby, orazord('0') == 48
; odejmując 48, tłumaczymy z wartości ASCII liczby na samą liczbę.Kolejna deklaracja sceny. Ten jest dla pętli, w której wielokrotnie drukujemy wartość znaku
Romeo
,Juliet
razy.To stwierdzenie powoduje, że Romeo wypisuje swoją wartość jako postać; to znaczy, dowolna wartość znaku wcześniej zapisana w Romeo jest teraz wyprowadzana.
Wieprz jest rzeczownikiem przeczącym, więc
a hog
tłumaczy się na -1; dlatego oświadczenie to oceniaJuliet -= 1
.Romeo pyta, czy Julia jest „tak zepsuta jak”, czy równa 0.
Jeśli wartość Juliet wynosi 0, wracamy do sceny II, aby dekodować długość przebiegu innej postaci.
W przeciwnym razie powrócimy do sceny III, aby ponownie przedstawić postać Romea.
Ta ostateczna deklaracja sceny jest tylko znacznikiem końca programu.
[Exeunt]
Kierunek etap jest konieczny, aby uzyskać kompilator faktycznie generuje ostateczną scenę.źródło
GolfScript, 10 znaków
źródło
perl, 27 znaków
źródło
print<>=~s/(.)(.)/$1x$2/ger
. Jestem też całkiem pewien, że miałeś na myśli$1x$2
, a nie na odwrót./r
jest udokumentowane w perlop i zostało dodane w wersji 14.14-p
flagi pozwalają spaśćprint
i<>
tak będzie po prostu odpowiedź:s/(.)(.)/$1x$2/ge
-> 17chars +1 do-p
-> 18 .R 67
źródło
rep
że automatycznie zmuszatimes
argument ze znaków do liczb całkowitych. Znakomity.Python 3, 52
Python 3 pozwala mi łączyć podejścia moich dwóch rozwiązań python2.
źródło
raw_input
pasuje do Python 3input
. Tak więc pierwsza linia musis=input()
s=input() while s:a,b,*s=s;print(a*int(b),end='')
APL (22)
Wyjaśnienie:
T←⍞
: zapisz dane wejściowe wT
T⊂⍨~⎕D∊⍨T
: podziałT
na znaki, które nie są cyframi↑
:2
zamień wN/2
macierz{⍺/⍨⍎⍵}/
: w każdym wierszu macierzy (/
) powtórz (/
) pierwszy znak (⍺
) przez eval (⍎
) drugiego znaku (⍵
),/
: konkatenuje dane wyjściowe każdego wierszaźródło
Rubinowy, 30 bajtów
Kod 27 bajtów + 3 bajty, aby uruchomić go z
-p
flagą:źródło
Zestaw 8086,
10698 znakówGdyby liczby znajdowały się przed znakami w strumieniu wejściowym, można by z tego wygolić dwie linie (18 znaków).
źródło
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
na 53 znaki? Nie widzę, gdzie radzi sobie z dużymi lubGNU SED, 122 + 2 (-r)
Musi być uruchomiony z
-r
flagąmoże być zmniejszona do 110 + 2, zastępując
\v
z niecenzuralny0x0B
i\a
ze0x07
źródło
\2.{9}
to świetny pomysł) świetnie!C, 65 znaków
Pobiera dane wejściowe jako parametr.
źródło
error: first parameter of 'main' (argument count) must be of type 'int'
. Czy jest przełącznik linii poleceń?Perl,
1918 znakówZasady liczenia przełączników w wierszu poleceń znajdują się tutaj .
źródło
Dalej, 45 znaków
Testowane z pforth na OS X.
źródło
Python,
6362 znakówźródło
iter
... Myślę, że sam jej użyję!Windows PowerShell, 55 znaków
Mam wrażenie, że można to bardziej pograć w golfa, szczególnie w obsadach od char do string i int, ale nie mam teraz czasu, aby nad tym popracować.
źródło
C, 68 znaków
Odpowiedź @ ugorena w C jest nieco krótsza, ale ta odpowiedź jest zgodna z wymogiem, że „ciąg będzie dostarczany jako wejście na standardowe wejście ”.
źródło
main(c,n){ ... }
która domyślnie przejdzie 1, gdy program zostanie uruchomiony.int
argumentu, ale kompilator (y) używam narzekania,error: second parameter of 'main' (argument array) must be of type 'char **'
więc nie mogę uciecmain(c,n)
; Muszę użyćmain(int c,char **n)
. Może to być platforma lub gcc.n;main(c)
ale niemain(n,c)
- wystarczająco dobrze! :)Haskell,
5856 znakówMoja pierwsza prawdziwa próba gry w golfa, więc prawdopodobnie jest tu coś do zrobienia.
źródło
read[y]
zapisuje dwie postaciereplicate x y
z[1..x]>>[y]
. W ten sposób twoja druga linia może zostać zastąpionaf(x:y:s)=(['1'..y]>>[x])++f s
, co sprowadza ją do 53 bajtów.Japt
-P
, 8 bajtówDane wejściowe jako tablica znaków, dane wyjściowe jako ciąg znaków.
Spróbuj
źródło
ò crÏ°îX
jeśli uważasz, że jest zbyt przerażający!Malbolge Unshackled (wariant rotacji 20-trytów), 4 494e6 bajtów
Rozmiar tej odpowiedzi przekracza maksymalny rozmiar programu do wysłania (eh), więc kod to się w moim repozytorium GitHub .
Jak to uruchomić?
Może to być trudna część, ponieważ naiwny tłumacz Haskell będzie potrzebował wieków, aby to uruchomić. TIO ma przyzwoitego tłumacza Malbogle Unshackled, ale niestety nie będę mógł go używać (ograniczenia).
Najlepszy, jaki udało mi się znaleźć, to stały wariant szerokości rotacji 20 trytów, który działa bardzo dobrze, dekompresując 360 bajtów na godzinę .
Aby nieco przyspieszyć tłumacza, usunąłem wszystkie kontrole z nieskrępowanego tłumacza Matthiasa Luttera.
Moja zmodyfikowana wersja może działać o około 6,3% szybciej.
To działa!
źródło
05AB1E ,
65 bajtów-1 bajt dzięki @Grimy .
Wyjście jako lista znaków.
Wypróbuj online.
Stare 6 bajtów odpowiedzi bez wbudowanego dekodowania długości przebiegu:
Wypróbuj online.
Wyjaśnienie:
źródło
2ι`ÅΓ
ma 5 bajtów. Byłoby smutno, gdyby wbudowane RLE nie wygrało wyzwania RLE.Python,
787266 znakówźródło
GolfScript (10 znaków)
źródło
J - 24
Celem tego przesłania jest użycie przysłówka infix.
źródło
Befunge, 49 znaków
źródło
K, 35
źródło
,/{(. y)#x}.'0N 2#
dla 18 bajtów .Python 2, 58
Jest to inspirowane pythonowym rozwiązaniem Darrena Stone'a - nadużyciami iteratora!
To jest moje oryginalne rozwiązanie (60 znaków)
Inne podejście jest dłuższe o 3 znaki:
źródło
Java: 285 znaków
źródło
Befunge-98, 22 znaki
źródło
Biała spacja, 135
(Zamień S, T, L na spację, tabulację, znak linii.)
Wypróbuj online [tutaj] .
Wyjaśnienie:
źródło
Clojure (107)
To wyjątkowo długo jest byciem Clojure, jeśli ktoś może zrobić lepiej, opublikuj to.
źródło