Para "aninhar a função" uma sequência, você deve:
Trate o primeiro caractere como uma função e os seguintes caracteres como argumentos para essa função. Por exemplo, se a sequência de entrada fosse
Hello
, o primeiro passo seria:H(ello)
Em seguida, repita esta mesma etapa para cada substring. Então temos:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Sua tarefa é escrever um programa ou função que "a função aninhe" uma string. Por exemplo, se a sequência de entrada foi Hello world!
, você deve gerar:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
A entrada sempre conterá apenas ASCII imprimível e você poderá levar a entrada e a saída em qualquer formato razoável. Por exemplo, STDIN / STDOUT, argumentos de função e valor de retorno, leitura e gravação em um arquivo, etc.
Por uma questão de simplicidade, você também pode assumir que a entrada não conterá parênteses e não estará vazia.
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)
Como sempre, todas as nossas regras e brechas padrão se aplicam e a resposta mais curta registrada em bytes vence!
fonte
You may take the input and the output in any reasonable format.
Uma lista de caracteres me parece perfeitamente razoável.Respostas:
Python,
413934 bytesIdeone it
Bastante auto-explicativo.
Ele coloca um parêntese entre todos os outros caracteres e depois adiciona um a menos que o comprimento dos parênteses ao final.
fonte
-
torna o número negativo e o~
bit o vira. Você pode ler um pouco mais sobre isso na página de dicas .Arquivo .com do MS-DOS, 30 bytes
A cadeia é passada para o executável usando a linha de comando. (Um caractere de espaço entre o nome do arquivo .COM e a sequência).
O resultado é gravado na saída padrão.
A desmontagem está aqui:
Nota: Você pode sair de um arquivo .COM do DOS (diferente dos arquivos com cabeçalhos EXE) usando uma instrução "RET".
fonte
call 0xfoff
? O programa é carregado na memória no endereço0
, tanto quanto eu posso dizer (ou0x100
no CP / M-DOS, mas estas parecem ser instruções x86), por que estárecursiveFunction
localizado repentinamente0xffof
? Parece começar 9 bytes após o início do programa e não há virtualização ou metadados no executável.0x100
no entanto, esse programa seria executado em QUALQUER endereço:e8 f0 ff
é uma instrução de chamada relativa : Salta para o endereço da instrução após acall
instrução menos 0x10.JavaScript (ES6),
403433 bytesEconomizou 6 bytes graças a ETHproductions
Uma função recursiva.
Experimente online!
fonte
1/s
.([c,...s])
você deve escrever uma dicaBrainfuck,
4240 bytesExperimente online!
Ungolfed:
fonte
05AB1E , 11 bytes
Experimente online!
Explicação:
fonte
Brainfuck, 44 bytes
Lê um byte de cada vez, coloca um ponto aberto antes de cada um, exceto o primeiro, coloca o mesmo número de pontos próximos no final.
fonte
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
é um pouco mais curto.Haskell, 30 bytes
Exemplo de uso:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Pegue o próximo caractere, seguido de a
(
, seguido de uma chamada recursiva com todos, exceto o primeiro, seguido de a)
.fonte
f=Data.List.intersperse '$'
! Isso nos dáf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
como um caso básico instaurado por vocêf[x]=[x]
. Não conheço Haskell, então não sei se é legítimo ou não, deixarei você julgar.()
atrás da última letra, por exemplof "abc"
- ->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
requerimport Data.List
outros 17 bytes.Geléia ,
98 bytes-1 byte graças a @Dennis (use molde,,
ṁ
no lugar do comprimentoL
, e repitax
)TryItOnline
Quão?
fonte
³
na verdade , o Jelly imprime o valor de retorno atual, para que você nunca tenha duas listas de caracteres.Retina ,
2217 bytesExperimente online!
Alternativamente:
Explicação
Eu sempre esqueço que é possível imprimir coisas ao longo do caminho, em vez de transformar tudo no resultado final e produzi-lo de uma só vez ...
Aqui,
\
diz ao Retina para imprimir o resultado desse estágio sem avanço de linha à direita. O1>
limite é o que significa que a primeira correspondência da regex deve ser ignorada. Quanto ao próprio palco, ele simplesmente substitui cada caractere (.
), exceto o primeiro, por(
seguido por esse caractere. Em outras palavras, ele insere(
entre cada par de caracteres. Para entradaabc
, isso a transforma em (e imprime)Tudo o que resta é imprimir os parênteses de fechamento:
Isto é feito com uma transliteração que substitui
(
com)
e exclui todos os outros caracteres ASCII imprimíveis do string.fonte
> <> ,
1918 bytesExperimente online!
Explicação
A primeira linha é um loop de entrada que imprime tudo até o último caractere da entrada (incluindo todos os
(
) e deixa a quantidade certa)
na pilha:Quando pressionamos o EOF, o ponteiro da instrução termina na segunda linha e simplesmente executamos
o
um loop, imprimindo tudo)
, até que a pilha esteja vazia e o programa com erros.fonte
J, 13 bytes
J é executado da direita para a esquerda, portanto, usando o advérbio de inserção
/
, um verbo pode ser usado para reduzir as letras da sequência de entrada.Uso
Você pode observar as saídas parciais entre cada redução.
Explicação
fonte
C #, 32 bytes
Esse lambda deve ser um método estático. Preciso contar bytes extras para esse requisito? Normalmente, eu não usaria um lambda para recursão em C #, mas acho que seria mais curto não usar recursão.
fonte
R, 61 bytes
O Regex localiza e substitui os espaços entre os caracteres por "(". Então
cat
erep
adicione ")" n-1 vezes no final.fonte
Java 7,
8179 bytesSalvo
1
byte.Thanks para kevin.fonte
l!=a.length
->l<a.length
eb=b+'('+a[l],++l)+')'
->b+="("+a[l],++l)+")"
( -2 bytes )b+="("+a[l],++l)+")"
fornece 144141148)))) e o BTWb+"("+a[l],++l)+")"
está correto. e esse foi um erro muito bobo meu (!=
).b+='('+a[l],++l)+')'
dá144141148
, masb+="("+a[l],++l)+")"
não. Os parênteses são colocados entre aspas em vez de aspas.PowerShell v2 +, 46 bytes
Pega a string de entrada,
char
e-join
a matriz é junto com as parênteses abertas(
e concatena o número apropriado de parênteses fechadas)
.fonte
APL, 19 bytes
Explicação:
Solução alternativa, também 19 bytes:
Explicação:
fonte
MATL , 16 bytes
Experimente online!
Explicação
fonte
Acc !! , 129 bytes
Nada mal para um tarpit de Turing bastante detalhado ...
(Sim, todo esse espaço em branco é obrigatório.)
Nota: devido às limitações de entrada do Acc !! , é impossível ler uma sequência arbitrária de caracteres sem um delimitador final. Portanto, este programa espera entrada (no stdin) como uma sequência seguida por um caractere de tabulação.
Acc !! ?
É uma linguagem que criei que parece apenas inutilizável . O único tipo de dados são números inteiros, a única construção de fluxo de controle é o
Count x while y
loop, e a única maneira de armazenar dados é um único acumulador_
. A entrada e a saída são executadas um caractere de cada vez, usando o valor especialN
e aWrite
instrução Apesar dessas limitações, tenho certeza de que Acc !! é Turing completo.Explicação
A estratégia básica em Acc !! A programação é usar a
%
divisão mod e número inteiro/
para particionar conceitualmente o acumulador, permitindo que ele armazene vários valores ao mesmo tempo. Neste programa, usamos três seções: os sete bits de ordem mais baixa (_%128
) armazenam um código ASCII da entrada; o próximo bit (_/128%2
) armazena um valor de flag; e os bits restantes (_/256
) contam o número de parênteses necessárias.Entrada em Acc !! vem do valor especial
N
, que lê um único caractere e avalia seu código ASCII. Qualquer declaração que consiste apenas em uma expressão atribui o resultado dessa expressão ao acumulador. Então, começamos armazenando o código do primeiro caractere no acumulador._%128
irá armazenar o caractere lido mais recentemente. Portanto, o primeiro loop é executado enquanto_%128-9
é diferente de zero - ou seja, até o caractere atual ser uma guia.Dentro do loop, queremos imprimir, a
(
menos que estejamos na primeira iteração. Desde Acc !! não tem declaração if, temos que usar loops para condicionais. Usamos o bit 128 do acumulador_/128%2
, como valor de flag. Na primeira passagem, a única coisa no acumulador é um valor ASCII <128, portanto, o sinalizador é 0 e o loop é ignorado. Em cada passe subsequente, garantiremos que a bandeira seja 1.Dentro do
Count x
loop (sempre que o sinalizador é 1), escrevemos um paren aberto (ASCII40
) e adicionamos 128 ao acumulador, configurando o sinalizador para 0 e saindo do loop. Isso também aumenta o valor de_/256
, que usaremos como registro de proximidade a ser produzido.Independentemente do valor da flag, escrevemos o char de entrada mais recente, que é simplesmente
_%128
.A próxima tarefa (
_+128-_%128+N
) faz duas coisas. Primeiro, adicionando 128, ele define o sinalizador para a próxima vez no loop. Segundo, zera o_%128
slot, lê outro caractere e o armazena lá. Então nós fazemos um loop.Quando o
Count i
loop termina, acabamos de ler um caractere de tabulação, e o valor do acumulador se divide assim:_%128
:9
(o caractere de tabulação)_/128%2
:1
(a bandeira)_/256
: número de caracteres lidos, menos 1(O menos 1 é porque nós adicionamos 128 ao acumulador apenas uma vez durante a primeira passagem pelo loop principal.) Tudo o que precisamos agora são os parênteses.
Count j while _/256-j
loops_/256
vezes, escrevendo um parêntese (ASCII41
) a cada vez. Voila!fonte
Perl, 25 bytes
Agradecemos a @Ton Hospel por jogar fora 4 bytes.
24 bytes de código +
-F
.Necessidades
-F
e-E
sinalizadores:Observe que, se você tentar fazer isso em uma versão antiga do perl, poderá ser necessário adicionar um
-a
sinalizador.Outra maneira interessante (embora um pouco mais longa: 28 bytes):
Agradeço a Ton Hospel mais uma vez por me ajudar a corrigir esse problema.
(Para usá-lo, coloque o código dentro de um arquivo e chame-o com
echo -n "Hello" | perl nest.pl
)fonte
""
depois do-F
. Você também não precisa-l
se você exigir que a string de entrada seja inserida sem nova linha final:echo -n Hello | program
-F
, obrigado. (Eu estava querendo saber como obter a entrada sem a nova linha final, obrigado por isso também)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, mas é claro que não suporta strings contendo metacharacters regex\Q
para suportar metacharacters regex) :-)Ruby, 27 bytes
Explicação
fonte
Perl,
2423 bytesInclui +1 para
-p
Atribua string ao STDIN sem nova linha (ou adicione uma
-l
opção ao programa)nest.pl
:fonte
PHP, 63 bytes
Versão anterior 64 Bytes
fonte
<?=
em vez deecho
e outra se você definir $ s para o resultado dastr_split
chamada em vez de$argv[1]
, e então usarcount($s)
em vez destrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
venceria a combinação de divisão / junção, mas infelizmente falha se a entrada contiver espaço em branco.GNU sed,
373531 bytes (30 +1 para-r
argumento)Solução linux sed pura
:
; então chamando recursivamente comt
\1 ( \2 )
Edit : Obrigado a @manatwork por ajudar a remover 4 caracteres!
Testador online
fonte
-e
para passar o código para o intérprete é de graça. (Ok, tambémsed
fica feliz sem ele.) Então, parased -re '…'
você contar +1.Água-viva ,
1918 bytesO caractere
␁
é o caractere de controle não imprimível com valor de bytes0x1
. Experimente online!Explicação
Este é um programa Jellyfish bastante complexo, pois muitos valores são usados em vários lugares.
I
é uma entrada bruta, leia STDIN como uma sequência.'(
é o caractere literal(
.{
(identidade à esquerda) assume'(
eI
como entradas e retorna'(
. O valor de retorno nunca é realmente usado.`
é fio. Ele modifica{
para retornar o caractere(
para cada caractere deI
, resultando em uma sequência de(
s com o mesmo comprimento queI
.>
é cauda; pega a sequência de(
s como entrada e corta o primeiro caractere.+
toma como argumento a sequência de(
s e o byte não imprimível e adiciona o valor do byte (1) a cada caractere. Isso fornece uma seqüência de comprimento igual de)
s. O uso do caractere␁
garante que o valor de retorno seja uma sequência e não uma lista de números inteiros./
pega o byte não imprimível e retorna uma função que aceita dois argumentos e junta o segundo argumento ao primeiro uma vez (já que o valor do byte é 1)._
pega essa função, pega os argumentos dos inferiores{
(que eram'(
eI
) e chama a função com eles. Isso insere o caractere(
entre cada par de caracteres emI
.,
concatena essa sequência com a sequência de)
s eP
imprime o resultado.fonte
05AB1E ,
22211918 bytesExperimente online!
Explicação:
fonte
Vim, 17 bytes
$qqha(<Esc>A)<Esc>%h@qq@q
Vai do fim ao começo, porque, caso contrário, você tropeça nos
)
s que já escreveu. Usa emha
vez dei
falhar quando chega ao início.Normalmente, você não faria duas inserções separadas como esta; você faria algo como
C()<Esc>P
salvar um derrame. Mas o posicionamento não funciona tão bem desta vez.fonte
<End>
chave no modo de inserção em vez de sair do modo de inserção e fazendoA
Convexo , 10 bytes
Experimente online!
fonte
> <> , 37 bytes
Linha por linha
Experimente online!
fonte
Brain-Flak
10397 BytesInclui +3 para -c
Experimente Online!
Explicação:
fonte
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
que é de dois bytes mais tempo ...-a
no Brain-Flak?+3
bytes são padrão para sinalizadores de linha de comando especiais . O que é lamentável, mas algo que eu posso suportar. Na verdade, estive pensando em maneiras de encurtar isso, mas ainda não sei exatamente até agora.-
e outro para a bandeira? Você pode ter um sinalizador para execução normal, como o Perl faz-e
. Dessa forma, seria apenas 1 byte extra.Fator, 81 bytes
fonte