Wyzwanie polega na przeanalizowaniu łańcucha, podobnie jak Python, i wydrukowaniu jego zawartości.
- Dane wejściowe (argument wiersza polecenia lub standardowe wejście) : literał ciągu (np.
"hello"
) (Lub wiele literałów, patrz konkatenacja literału ciągu poniżej) - Dane wyjściowe (standardowe wyjście) : zawartość ciągu (np.
hello
)
Zasady parsowania łańcucha:
- Dosłowny ciąg jest ujęty w pasujące pary pojedynczych cudzysłowów (
'a'
), podwójnych cudzysłowów ("a"
), potrójnych pojedynczych cudzysłowów ('''a'''
) lub potrójnych podwójnych cudzysłowów ("""a"""
). Pierwszy powtórzenie typu cudzysłowów, które otworzyły łańcuch, kończy łańcuch. - Odwrotny ukośnik ucieka:
\'
w ciągu staje się'
,\"
staje się"
i\\
staje\
. Nie musisz implementować żadnych innych znaków ucieczki odwrotnego ukośnika. Ukośnik odwrotny, który nie jest częścią sekwencji ucieczki, pozostaje ukośnikiem odwrotnym. - Łączenie literałów łańcuchowych: zawartość sąsiadujących literałów łańcuchowych jest łączona. Na przykład
"hello" 'world'
staje sięhelloworld
. - Dane wejściowe mogą zawierać spacje, które nie są częścią żadnego literału.
- Nie musisz obsługiwać żadnych innych białych znaków, ani w literałach, ani poza nimi.
Dodatkowe zasady:
eval
,exec
i podobne rzeczy nie są parsowane przy analizie literału lub jego części.- Możesz założyć, że dane wejściowe są prawidłowe.
- Możesz założyć, że maksymalna długość wejściowa wynosi 1023 znaki.
Przykłady:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(bez nawiasów, ale ze spacjami) ->"""'''
Najkrótszy kod wygrywa.
Odpowiedzi:
Perl, 54 znaki
Właśnie kiedy to pisałem, zauważyłem, że jest prawie identyczny z rozwiązaniem Ruby Jana Dvoraka. Jestem trochę zdziwiony tym, jak bardzo jest ono podobne, ale powiem „Wielkie umysły myślą podobnie” i pozwól temu odejść.
Ten program podkreśla dziwny przypadek narożny w liczeniu znaków w skryptach Perla: Po przeczytaniu obecność pojedynczych cudzysłowów w skrypcie oznacza, że muszę policzyć
-p
opcję jako dwa znaki w stosunku do mojej sumy. Zazwyczaj przy obliczaniu rozmiarów skryptu Perla początkowy znak myślnika na opcjach jest uważany za wolny, z uzasadnienia, że można go połączyć z tym,-e
który wprowadza odpowiedni program ... ale wtedy musisz również uwzględnić wszelkie dodatkowe znaki ucieczki musisz wpisać skrypt w wierszu polecenia. Pojedyncze cudzysłowy wymagają dużej liczby#!/usr/bin/perl
znaków ucieczki, więc aby uniknąć kary, muszę je liczyć jako skrypt uruchamiany z pliku, a zatem otrzymuję za darmo, ale nie żadnych znaków opcji. To trochę mylące.źródło
(('|")\2{2}?)
ma taką samą długość jak("""|'''|"|')
C, 178 znaków
Jest to jedno z tych rozwiązań C, w których wszystko odbywa się w łańcuchu operatorów trójskładnikowych.
Program działa, kopiując znaki z powrotem do tego samego bufora, zastępując metaznaki.
d
trzyma separator, gdy znajduje się w ciągu, it
jest prawdą, jeśli separator jest potrójny.źródło
'foo\\'
odnosi się do ciągu foo \, po którym następuje znak, który nie jest ani białą spacją, ani ogranicznikiem łańcucha.Rubin,
7473 znakiRdzeniem są tutaj dwa wyrażenia regularne: pierwszy określa granice ciągów i wybiera tylko zawartość. Zmiana polega na usunięciu wszystkiego, co nie jest wewnątrz łańcuchów, a także upuszcza niezamknięte łańcuchy.
Odwrotne ukośniki są traktowane jako dodatnie-opcjonalne, po których następuje cokolwiek. A zatem,Ponieważ silnik(\\?.)
wyrażeń regularnych nie będzie się przesuwał w celu uzyskania prawidłowych danych wejściowych (dzięki @breadbox), jedyny ukośnik odwrotny nie może się tam znaleźć. Cytaty są przetwarzane przez leniwe powtarzanie. Drugi regex następnie usuwa ukośnik przed każdą możliwą do ucieczki postacią. Wyrażenie regularne zależy od silnika, aby zawsze najpierw wybierać najbardziej lewą alternatywę.Rozważyłem również podejście stan-maszyna, ale okazało się dość duże (19 stanów x 4 klasy znaków) w porównaniu do rozwiązania wyrażenia regularnego. Nadal mogę opublikować automat państwowy, jeśli ktoś jest zainteresowany.
źródło
'foo\\'
jest pierwszym ciągiem ibar'
znajduje się poza kontekstem ciągu, gdy dane wejściowe to'foo\\'bar'