Alternesting to czynność polegająca na wzięciu łańcucha i zagnieżdżeniu go w naprzemiennych nawiasach. Oto jak zmienić ciąg.
W przypadku ciągu o długości N weź środkowe N znaków i otocz je nawiasami. Więc jeśli nasz ciąg miał
Hello world!
(12 znaków), to skończymy(Hello world!)
Następnie weź pozostałe środkowe
n-2
postacie i otocz je nawiasami kwadratowymi. W tym przypadku środkowych 10 znaków toello world
, więc następna iteracja to:(H[ello world]!)
Dopóki na środku ciągu pozostaną więcej niż dwa znaki, powtórz ostatnie dwa kroki, naprzemiennie między
()
i[]
. Oto ostatnie kroki:(Hello world!) (H[ello world]!) (H[e(llo worl)d]!) (H[e(l[l(o[ w]o)r]l)d]!)
Ponieważ na ostatniej iteracji na środku pozostały tylko dwie postacie, zatrzymujemy się. Nasz ostatni ciąg to
(H[e(l[l(o[ w]o)r]l)d]!)
Zwróć uwagę, że w środkowych nawiasach znajdują się dwa znaki. Dzieje się tak, gdy wejście ma równą długość. Gdyby dane wejściowe miały nieparzystą długość (na przykład
Hello, world!
z dodanym przecinkiem), mielibyśmy tylko jeden znak pośrodku:(H[e(l[l(o[,( )w]o)r]l)d]!)
W dzisiejszym wyzwaniu musisz napisać program lub funkcję, która pobiera ciąg znaków jako dane wejściowe i zmienia go, generując nowy ciąg. Możesz pobierać dane wejściowe i wyjściowe w dowolnym rozsądnym formacie. Dane wejściowe zawsze będą miały co najmniej jeden znak i będą zawierać tylko drukowalne ASCII. Możesz również założyć, że dane wejściowe nie będą zawierać nawiasów ani nawiasów kwadratowych. W przypadku języków tradycyjnych nie powinno to mieć większego znaczenia, ale może to ułatwić niektóre języki ezoteryczne.
Jak zwykle są to zawody z golfem , więc postaraj się udzielić możliwie najkrótszej odpowiedzi w wybranym języku. Baw się dobrze!
Przetestuj IO
#Input #Output
"Alternesting is fun!" --> (A[l(t[e(r[n(e[s(t[in]g) ]i)s] )f]u)n]!)
"PPCG" --> (P[PC]G)
"Code-golf" --> (C[o(d[e(-)g]o)l]f)
"4 8 15 16 23 42" --> (4[ (8[ (1[5( [1]6) ]2)3] )4]2)
"a" --> (a)
"ab" --> (ab)
"abc" --> (a[b]c)
źródło
()
), czy możemy zaczynać od nawiasów ([]
)?()
HelloWorld
.Odpowiedzi:
Python 3 ,
706965 bajtów-1 bajtów dzięki @Uriel
-4 bajtów dzięki @xnor
Wypróbuj online!
źródło
C,
143137135 135 bajtówWypróbuj online!
Wyjaśnienie:
źródło
0
. Dlatego nie powinieneś potrzebowaćk=i=0,
. Mogę się mylić. Zobacz tę SO odpowiedźSiatkówka , 52 bajty
Wypróbuj online! Pierwszy etap wstawia pary nawiasów między każdą parą znaków wejściowych, natomiast drugi i trzeci etap korygują naprzemienne nawiasy w nawiasach.
źródło
Sed, 78
Wynik obejmuje +1 dla
-r
opcji przekazanej do sed.Wypróbuj online .
źródło
JavaScript (ES6),
6968 bajtówPrzypadki testowe
Pokaż fragment kodu
źródło
V ,
252625 bajtów12 bajty wyłączone dzięki @DJMcMayhemWypróbuj online!
Pożyczył niektóre pomysły @ udioca.
W końcu użyłem też wtyczki surround zawartej w V jako odpowiedzi, choć może nie był to najlepszy sposób, kto wie.Wtyczka NIE chce być używana.Hexdump:
Wyjaśnienie:
źródło
;
zamiast ostatniegof)
Wypróbuj online!()
i[]
jest bajt krótszy, ale o wiele mniej fajnyHaskell ,
9691817977 bajtówWypróbuj online!
źródło
(x:y)
i(init y)
.k==""=""
jest krótszy jakk==""=k
.cycle["()","[]"]
na"()[]"
: Wypróbuj online!cycle
jest jeszcze krótsze. Nadal możesz usunąć nawias wokół(init y)
.k==""=k
na koniec i zmienić ją na0<1=k
.Rubinowy ,
7977 bajtów-2 bajty dzięki @Value Ink
Wypróbuj online!
źródło
s.insert k=i*2,'(['[i%2];s[~k]+=')]'[i%2]
aby zapisać 2 bajty. Wypróbuj online!JavaScript (ES6)
110105 bajtówDzięki @powelles za przypomnienie mi
x%y<1
.Dzięki @Luke za
a-b?y:x
Pokaż fragment kodu
Pierwszą rzeczą w zrozumieniu tej bestii jest jej odkrycie:
Prawie każda linia jest częścią wersji golfowej, więc krok po kroku:
Wiersz 1: Instrukcja funkcji staje się funkcją strzałki , zmieniając
input
jej nazwę nai
. Stajei=>
.Wiersz 2:
Array.from
to nowy, właściwy sposób konwersji łańcucha na tablicę i to, czego używamy w tej linii. Jednak wraz z nim operator rozprzestrzeniania jest tańszym sposobem niż stary.split('')
, aby to zrobić, co jest używane w wersji golfowej. Kończy jako[...i]
.Wiersz 3:
.map
zapętla tablicę, podając trzy argumenty:item
(a
w golfie)index
,; grał w golfa jakob
ibaseArray
lubc
. Chociaż dbamy tylko oitem
iindex
, zachowaliśmybaseArray
(dlaczego w linii 4). Golfy do.map((a,b,c,...)=>...
.Wiersz 4: Zmienna
middle
, lub argumentd
w wersji golfowej jest tworzony, aby zapisać kilka bajtów, gdy zostanie powtórzony. Argumentc
musiał zostać zachowany,d
aby powstał argument . Jest konwertowany na(...,d=i.length/2-1,...)
.Wiersz 5 : Zmienna
alternate
lub argumente
służy do sprawdzenia, jaki znak znajdował się na „(” lub „[” lub jeśli przekroczył środek, „)” i „]”.b%2<1
jest równa,b%2==0
ponieważ nie może być mniejsza niż 1, ale w tym przypadku 0. Równa(...,e=b%2<1)
.Linia 6: Zmienna pomocnika A do pozwala mi przekonwertować
ternary operators
doif
sprawozdania. Nie ma nic w prawdziwym codegolfie.Linie 7-8 : Jeśli indeks jest mniejszy niż środek ciągu, ustaw symbol na przemian „[” i „(”
d>b?e?'[':'(':...
.Linie 9-12 : W przeciwnym razie (jeśli indeks jest większy niż środek), sprawdź, czy środek jest liczbą całkowitą, jeśli tak, zmień alternatywę. Następnie ustaw symbol na przemian „)” i „]”. Zaciemniony do
(d%1==0?!e:e)?')':']'
.Linie 13-15 : Jeśli w środku ustaw symbol na pusty ciąg. Nie dotyczy to dziwnych alternesterów, ponieważ środek ma przecinek dziesiętny. Postać:
d==b?'':...
.Wiersz 16 : Łączy tablicę znaków z powrotem w ciąg. Odpowiada
.join``
.Wiersz 17 : zwraca symbol początkowy „(” i wynik. Koreluje z
'('+...
.źródło
%2==0
się%2<1
i używać[...i]
zamiasti.split
[..i] idea
, ale zapomniałem o%2<1
podziękowaniach.b%2<1
może zostać zastąpiony przez!b%2
d==b?x:y
może stać sięd-b?y:x
id%1==0
może stać się!d%1
.!d%1
działa tylko z nawiasami:!(d%1)
i nie goli żadnych bajtów. Zapomniałem, że 0 to jedyna liczba fałszów, z jakiegoś powodu myślałem, że -1 to fałsz. Popraw mnie, jeśli coś jest nie tak z drugim.Galaretka ,
2321 bajtówWypróbuj online!
-2 bajty dzięki @EricTheOutgolfer
źródło
ị
do linku pomocnika na -2, w ten sposób:LHĊRị¶ç⁾)]żUFUż@ç⁾([$
SCALA,
140138 znaków,140138 bajtówPrzepraszam, że nie mogłem nic lepszego ... Jestem pewien, że istnieje wiele sposobów, aby to poprawić. Nadal:
Wypróbuj online!
Dzięki za to wyzwanie, było to dla mnie dość trudne.
EDYCJA: -2 bajty dzięki Mar Dev.
PS: Zapytam jednak o coś. Rozumiem, dlaczego ten kod utrzymuje powielenie centralny char mojego ciąg jeśli mam nieparzystej długości (po prostu nie sprawdzić i dodać go dwukrotnie, w obu
l
ir
smyczki). Ale dlaczego dostaję parę nawiasów, gdy próbuję je poprawić TAK ? W ogóle nie rozumiem.źródło
i%2==0
, abyi%2<1
zapisać dwa bajty.Perl,
7774 (73 + 1) bajtówWyrażenia regularne to chwalebne rzeczy. Uruchom z
-p
flagą wiersza poleceń.źródło
05AB1E , 31 bajtów
Wypróbuj online!
Wyjaśnienie
Z przykładami danych wejściowych:
abcd
/abcde
źródło
C ++ 14,
154145 bajtów[Rekurencyjny]
C ++ 14, 177 bajtów
[Wielokrotny]
źródło
Pyth , 42 (!) Bajtów
Przetestuj online! Dane wejściowe należy zacytować.
Objaśnienia
Zasadniczo więc stopniowo usuwam nagłówek i koniec litery H (która jest łańcuchem wejściowym na początku), jednocześnie łącząc nawiasy / nawiasy. G to po prostu wartość logiczna, która pamięta, czy muszę używać nawiasów lub nawiasów.
źródło
05AB1E ,
4942 bajtówWypróbuj online!
źródło
PowerShell,
125119111 bajtówWypróbuj online!
Poprzednia wersja*
* Dzięki @ uraz cyfrowy.
źródło
QuadR , 82 bajty
(81 bajtów +1 dla
≡
flagi)Wypróbuj online!
źródło
AWK, 118 bajtów
Testowane z gawk, ale powinno działać z każdym zgodnym tłumaczem awk
źródło
JavaScript, 101 bajtów
Nie był zwycięzcą, ale interesujące było wypróbowanie tego
replace
podejścia. Można to zdecydowanie poprawić, ale szybko wymknęło się spod kontroli ...źródło
Java (OpenJDK 8) , 124 bajty
Wypróbuj online!
Kredyty
źródło