Aby „zagnieździć funkcję” ciągu, należy:
Traktuj pierwszy znak jako funkcję, a kolejne znaki jako argumenty tej funkcji. Na przykład, jeśli ciąg wejściowy był
Hello
, to pierwszym krokiem byłoby:H(ello)
Następnie powtórz ten sam krok dla każdego podciągu. Otrzymujemy więc:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Twoim zadaniem jest napisanie programu lub funkcji, która „funkcja zagnieżdża” ciąg znaków. Na przykład, jeśli ciąg wejściowy był Hello world!
, to powinieneś wypisać:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
Dane wejściowe zawsze będą zawierały tylko drukowalne ASCII , a dane wejściowe i wyjściowe można pobrać w dowolnym rozsądnym formacie. Na przykład STDIN / STDOUT, argumenty funkcji i zwracana wartość, odczyt i zapis do pliku itp.
Dla uproszczenia można również założyć, że dane wejściowe nie będą zawierać nawiasów i nie będą puste.
Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
Input:
foobar
Output:
f(o(o(b(a(r)))))
Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))
Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))
Input:
a
Output:
a
Input:
42
Output:
4(2)
Jak zwykle obowiązują wszystkie nasze domyślne zasady i luki, a najkrótsza odpowiedź w bajtach wygrywa!
źródło
You may take the input and the output in any reasonable format.
Lista znaków wydaje mi się całkowicie rozsądna.Odpowiedzi:
Python,
413934 bajtówIdeone to
Dość oczywiste.
Umieszcza nawias między każdą inną postacią, a następnie dodaje jeden koniec mniejszy niż długość nawiasu na końcu.
źródło
-
sprawia, że liczba jest ujemna i~
bit ją odwraca. Możesz przeczytać więcej na ten temat na stronie porad .Plik MS-DOS .com, 30 bajtów
Ciąg jest przekazywany do pliku wykonywalnego za pomocą wiersza polecenia. (Jeden znak spacji między nazwą pliku .COM a łańcuchem).
Wynik jest zapisywany na standardowe wyjście.
Demontaż jest tutaj:
Uwaga: Możesz wyjść z pliku DOS .COM (w przeciwieństwie do plików z nagłówkami EXE) za pomocą instrukcji „RET”.
źródło
call 0xfoff
? Program jest ładowany do pamięci pod adresem,0
o ile mogę powiedzieć (lub0x100
na CP / M-DOS, ale wydaje się, że są to instrukcje x86), dlaczegorecursiveFunction
nagle znajduje się pod0xffof
? Wygląda na to, że zaczyna się 9 bajtów po uruchomieniu programu i nie ma wirtualizacji ani metadanych w pliku wykonywalnym.0x100
jednak ten program działałby nawet na DOWOLNYM adresie:e8 f0 ff
jest instrukcją wywołania względnego : przeskakuje na adres instrukcji pocall
instrukcji minus 0x10.JavaScript (ES6),
403433 bajtówOszczędność 6 bajtów dzięki produktom ETH
Funkcja rekurencyjna.
Wypróbuj online!
źródło
1/s
.([c,...s])
tobą powinna napisać napiwekBrainfuck,
4240 bajtówWypróbuj online!
Nie golfowany:
źródło
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Brainfuck, 44 bajty
Odczytuje bajt na raz, stawia przed otwartymi paren przed każdym oprócz pierwszego, umieszcza na końcu taką samą liczbę parens.
źródło
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
jest nieco krótszy.Haskell, 30 bajtów
Przykład użycia:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Weź następny znak, a następnie a
(
, a następnie rekurencyjne połączenie ze wszystkimi znakami oprócz pierwszego, a następnie)
.źródło
f=Data.List.intersperse '$'
! To daje namf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
jako podstawowego przypadkuf[x]=[x]
. Nie znam Haskella, więc nie wiem, czy jest legalny, czy nie, pozwolę ci osądzić.()
literę za ostatnią literą, np.f "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
wymagaimport Data.List
kolejnych 17 bajtów.Galaretka ,
98 bajtów-1 bajt dzięki @Dennis (użyj formy,
ṁ
zamiast długościL
i powtórzx
)TryItOnline
W jaki sposób?
źródło
³
faktycznie powoduje , że Jelly wypisuje bieżącą wartość zwracaną, więc nigdy nie masz dwóch list znaków.Siatkówka ,
2217 bajtówWypróbuj online!
Alternatywnie:
Wyjaśnienie
Zawsze zapominam, że po drodze można drukować różne rzeczy zamiast przekształcać wszystko w końcowy wynik i drukować za jednym razem ...
\
Mówi tutaj Retina, aby wydrukowała wynik tego etapu bez podawania końcowego.1>
Jest limit, co oznacza, że pierwszy mecz regex powinny być ignorowane. Jeśli chodzi o sam etap, po prostu zastępuje on każdy znak (.
), z wyjątkiem pierwszego,(
po którym następuje ten znak. Innymi słowy, wstawia(
pomiędzy każdą parę znaków. W przypadku danych wejściowychabc
przekształca to w (i drukuje)Pozostało tylko wydrukować nawiasy zamykające:
Odbywa się to za pomocą transliteracji która zastępuje
(
się)
i usuwa wszystkie inne druku znaków ASCII z łańcucha.źródło
> <> ,
1918 bajtówWypróbuj online!
Wyjaśnienie
Pierwszy wiersz to pętla wejściowa, która wypisuje wszystko do ostatniego znaku wejścia (w tym wszystkie
(
) i pozostawia odpowiednią ilość)
na stosie:Po trafieniu w EOF wskaźnik instrukcji kończy się na drugim wierszu i po prostu wykonamy
o
pętlę, drukując wszystko)
, aż stos będzie pusty i program się nie wyłączy.źródło
C #, 32 bajty
Ta lambda musi być metodą statyczną, czy musiałbym policzyć dodatkowe bajty dla tego wymagania? Zwykle nie używałbym lambda do rekurencji w C #, ale myślę, że krótsze byłoby nie używanie rekurencji.
źródło
J, 13 bajtów
J wykonuje się od prawej do lewej, więc używając przysłówka wstawiania
/
, czasownik może być użyty do zmniejszenia liter ciągu wejściowego.Stosowanie
Możesz obserwować częściowe wyniki między każdą redukcją.
Wyjaśnienie
źródło
R, 61 bajtów
Regex znajduje i zamienia spacje między znakami na „(”. Następnie
cat
irep
dodaje „)” n-1 razy na końcu.źródło
PowerShell v2 +, 46 bajtów
Pobiera ciąg wejściowy,
char
-array's it,-join
s tablicę wraz z otwartymi parens(
, a następnie konkatenuje odpowiednią liczbę zamkniętych parens)
.źródło
Acc !! , 129 bajtów
Nieźle jak na dość gadatliwą Tarpit Turinga ...
(Tak, wszystkie te białe znaki są obowiązkowe).
Uwaga: z powodu ograniczeń wejściowych Acc !! , nie można odczytać dowolnego ciągu znaków bez ogranicznika końcowego. Dlatego ten program oczekuje, że wejście (standardowe wejście) jest ciągiem, po którym następuje znak tabulacji.
Acc !! ?
To język, który stworzyłem, który wydaje się być bezużyteczny . Jedynym typem danych są liczby całkowite, jedyną konstrukcją przepływu sterującego jest
Count x while y
pętla, a jedynym sposobem przechowywania danych jest pojedynczy akumulator_
. Dane wejściowe i wyjściowe są wykonywane po jednym znaku za pomocą wartości specjalnejN
iWrite
instrukcji. Pomimo tych ograniczeń jestem pewien, że Acc !! jest ukończony przez Turinga.Wyjaśnienie
Podstawowa strategia w Acc !! programowanie polega na użyciu
%
dzielenia mod i liczb całkowitych,/
aby koncepcyjnie podzielić akumulator, umożliwiając mu przechowywanie wielu wartości jednocześnie. W tym programie wykorzystujemy trzy takie sekcje: siedem bitów najniższego rzędu (_%128
) przechowuje kod ASCII z wejścia; następny bit (_/128%2
) przechowuje wartość flagi; a pozostałe bity (_/256
) policzą liczbę potrzebnych skróconych części.Wejście w Acc !! pochodzi ze specjalnej wartości
N
, która odczytuje pojedynczy znak i ocenia na kod ASCII. Każda instrukcja, która składa się wyłącznie z wyrażenia, przypisuje wynik tego wyrażenia do akumulatora. Zaczynamy więc od zapisania kodu pierwszego znaku w akumulatorze._%128
zapisze ostatnio przeczytaną postać. Tak więc pierwsza pętla działa, gdy_%128-9
jest niezerowa - to znaczy, dopóki obecny znak nie będzie tabulatorem.Wewnątrz pętli chcemy drukować,
(
chyba że wykonamy pierwszą iterację. Ponieważ Acc !! nie ma instrukcji if, musimy używać pętli dla warunkowych. Używamy bitu 128 akumulatora_/128%2
, jako wartości flagi. Przy pierwszym przejściu jedyną rzeczą w akumulatorze jest wartość ASCII <128, więc flaga ma wartość 0, a pętla jest pomijana. Przy każdym kolejnym przejściu upewnimy się, że flaga ma wartość 1.Wewnątrz
Count x
pętli (ilekroć flaga ma wartość 1), piszemy otwarty paren (ASCII40
) i dodajemy 128 do akumulatora, ustawiając w ten sposób flagę na 0 i wychodząc z pętli. Zdarza się to również, aby zwiększyć wartość_/256
, której użyjemy jako naszą sumę przybliżeń do wygenerowania.Bez względu na wartość flagi piszemy najnowszy znak wejściowy, który jest po prostu
_%128
.Następne przypisanie (
_+128-_%128+N
) robi dwie rzeczy. Po pierwsze, dodając 128, ustawia flagę po raz kolejny przez pętlę. Po drugie, wyzerowuje_%128
miejsce, odczytuje inną postać i zapisuje ją tam. Potem zapętlamy.Kiedy
Count i
pętla kończy pracę, właśnie odczytaliśmy znak tabulacji, a wartość akumulatora rozkłada się w następujący sposób:_%128
:9
(znak tabulacji)_/128%2
:1
(flaga)_/256
: liczba odczytanych znaków minus 1(Minus 1 wynika z tego, że dodajemy 128 do akumulatora tylko raz podczas pierwszego przejścia przez główną pętlę.) Wszystko, czego teraz potrzebujemy, to zbliżenia.
Count j while _/256-j
pętle_/256
razy, za41
każdym razem pisząc ścisły paren (ASCII ). Voila!źródło
Java 7,
8179 bajtówZapisane
1
bajty. Dzięki Kevin.źródło
l!=a.length
->l<a.length
ib=b+'('+a[l],++l)+')'
->b+="("+a[l],++l)+")"
( -2 bajty )b+="("+a[l],++l)+")"
daje 144141148))), a BTWb+"("+a[l],++l)+")"
ma rację. i to był bardzo głupi błąd mojego (!=
).b+='('+a[l],++l)+')'
daje144141148
, aleb+="("+a[l],++l)+")"
nie robi. Nawiasy są otoczone cudzysłowami ciągowymi zamiast cudzysłowów znakowych.APL, 19 bajtów
Wyjaśnienie:
Alternatywne rozwiązanie, również 19 bajtów:
Wyjaśnienie:
źródło
MATL , 16 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Perl, 25 bajtów
Dzięki @Ton Hospel za grę w golfa na 4 bajty.
24 bajty kodu +
-F
.Potrzeby
-F
i-E
flagi:Zauważ, że jeśli spróbujesz tego na starej wersji Perla, może być konieczne dodanie
-a
flagi.Kolejny interesujący sposób (choć nieco dłuższy: 28 bajtów):
Jeszcze raz dziękuję Tonowi Hospelowi za pomoc w poprawieniu tego.
(Aby go użyć, umieść kod w pliku i wywołaj go za pomocą
echo -n "Hello" | perl nest.pl
)źródło
""
po-F
. Nie potrzebujesz również,-l
jeśliecho -n Hello | program
-F
, dzięki. (Zastanawiałem się, jak uzyskać dane wejściowe bez ostatniego nowego wiersza, również za to dziękuję)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, ale oczywiście nie obsługuje ciągów zawierających metaznaki wyrażenia regularnego\Q
do obsługi metaznaków wyrażeń regularnych) :-)Rubinowy, 27 bajtów
Wyjaśnienie
źródło
Perl,
2423 bajtówObejmuje +1 dla
-p
Podaj ciąg znaków na STDIN bez znaku nowej linii (lub dodaj
-l
opcję do programu)nest.pl
:źródło
GNU sed,
373531 bajtów (30 +1 za-r
argument)Czysty roztwór linux sed
:
; następnie nazywając to rekurencyjniet
\1 ( \2 )
Edycja : Dzięki @manatwork za pomoc w usunięciu 4 znaków!
Tester online
źródło
-e
do przekazania kodu do tłumacza jest za darmo. (Ok,sed
bez niego też jest szczęśliwy.) Więc zased -re '…'
liczyć +1.Meduza ,
1918 bajtówZnak
␁
jest niedrukowalnym znakiem kontrolnym z wartością bajtu0x1
. Wypróbuj online!Wyjaśnienie
Jest to dość złożony program Meduza, ponieważ wiele wartości jest używanych w wielu miejscach.
I
jest surowym wejściem, odczytywanym ze STDIN jako ciąg.'(
jest dosłowny charakter(
.{
(Lewa tożsamość) wykonuje'(
iI
jak wejść i powraca'(
. Zwracana wartość nigdy nie jest faktycznie używana.`
jest wątkiem. Zmienia,{
aby zwracać znak(
dla każdego znakuI
, w wyniku czego powstaje ciąg(
s o tej samej długości coI
.>
jest ogonem; pobiera ciąg(
s jako dane wejściowe i odcina pierwszy znak.+
przyjmuje jako argument ciąg(
s i bajt niezadrukowany i dodaje wartość bajtu (1) do każdego znaku. To daje ciąg)
s równej długości . Użycie znaku␁
gwarantuje, że zwracana wartość jest łańcuchem, a nie listą liczb całkowitych./
pobiera niedrukowalny bajt i zwraca funkcję, która przyjmuje dwa argumenty i łączy drugi argument z pierwszym jeden raz (ponieważ wartość bajtu wynosi 1)._
przyjmuje tę funkcję, pobiera argumenty niższe{
(które były'(
iI
) i wywołuje z nimi funkcję. To wstawia znak(
między każdą parą znaków wI
.,
łączy ten ciąg z ciągiem)
s iP
wypisuje wynik.źródło
05AB1E ,
22211918 bajtówWypróbuj online!
Wyjaśnienie:
źródło
PHP, 63 bajtów
Poprzednia wersja 64 bajtów
źródło
<?=
zamiastecho
i kolejny, jeśli ustawisz $ s na wynikstr_split
połączenia zamiast$argv[1]
, a następnie użyjcount($s)
zamiaststrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
pobiłby kombinację podziału / łączenia, ale niestety nie udaje się, jeśli dane wejściowe zawierają spacje.Vim, 17 bajtów
$qqha(<Esc>A)<Esc>%h@qq@q
Przechodzi od końca do początku, ponieważ w przeciwnym razie potkniesz się o
)
napisane wcześniej. Używaha
zamiasti
zawieść, gdy osiągnie początek.Zwykle nie robiłbyś dwóch osobnych wstawek w ten sposób; zrobiłbyś coś,
C()<Esc>P
by uratować udar. Tym razem pozycjonowanie nie działa tak dobrze.źródło
<End>
klawisza w trybie wstawiania zamiast wychodzić z trybu wstawiania i robićA
Brain-Flak
10397 bajtówZawiera +3 dla -c
Wypróbuj online!
Wyjaśnienie:
źródło
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
to dwa bajty dłuższe ...-a
w Brain-Flak są to 3 bajty ?+3
Bajtów jest norma na specjalne flagi linii poleceń . Co jest niefortunne, ale mogę się z tym pogodzić. Właściwie zastanawiałem się, jak to skrócić, ale nie jestem jeszcze pewien, jak to zrobić.-
i jeden za flagę? Możesz mieć flagę do normalnego wykonania, tak jak robi to Perl-e
. W ten sposób będzie to tylko 1 dodatkowy bajt.Dyalog APL , 14 bajtów
⊃{⍺,1⌽')(',⍵}/
to jest na szczycie od
⊃
i{ }/
⊃
(zdobądź pierwszy element) zostanie zastosowane po{ }/
(redukcji lambda)⍺,1⌽')(',⍵
- lewy argument (⍺
) połączony z (,
) obrotem o jeden element w lewo (1⌽
) ciągu')('
połączonego z (,
) prawy argument (⍵
)zmniejszenie fałd APL od prawej do lewej, zgodnie z wymaganiami tutaj
źródło
Wypukły , 10 bajtów
Wypróbuj online!
źródło
> <> , 37 bajtów
Rząd po rzędzie
Wypróbuj online!
źródło