Para "anidar funciones" una cadena, debe:
Trate el primer carácter como una función, y los siguientes caracteres como argumentos para esa función. Por ejemplo, si la cadena de entrada era
Hello
, entonces el primer paso sería:H(ello)
Luego, repita este mismo paso para cada subcadena. Entonces obtenemos:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Su tarea es escribir un programa o función que "anide" una cadena. Por ejemplo, si la cadena de entrada era Hello world!
, entonces debería generar:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
La entrada solo contendrá ASCII imprimible , y puede tomar la entrada y la salida en cualquier formato razonable. Por ejemplo, STDIN / STDOUT, argumentos de función y valor de retorno, lectura y escritura en un archivo, etc.
En aras de la simplicidad, también puede suponer que la entrada no contendrá paréntesis y no estará vacía.
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 de costumbre, se aplican todas nuestras reglas y lagunas predeterminadas, ¡y gana la respuesta más corta obtenida en bytes!
fuente
You may take the input and the output in any reasonable format.
Una lista de personajes me parece perfectamente razonable.Respuestas:
Python,
413934 bytesIdeone
Bastante autoexplicativo.
Pone un paréntesis entre cada otro carácter y luego agrega uno menos que el paréntesis de longitud al final.
fuente
-
hace que el número sea negativo y el~
bit lo voltea. Puede leer un poco más al respecto en la página de consejos .Archivo .com de MS-DOS, 30 bytes
La cadena se pasa al ejecutable usando la línea de comando. (Un carácter de espacio entre el nombre del archivo .COM y la cadena).
El resultado se escribe en la salida estándar.
El desmontaje está aquí:
Nota: Puede salir de un archivo DOS .COM (a diferencia de los archivos con encabezados EXE) utilizando una instrucción "RET".
fuente
call 0xfoff
? El programa se carga en la memoria en la dirección0
por lo que puedo decir (o0x100
en CP / M-DOS, pero parecen ser instrucciones x86), ¿por qué serecursiveFunction
encuentra de repente en0xffof
? Parece comenzar 9 bytes después del comienzo del programa, y no hay virtualización o metadatos en el ejecutable.0x100
sin embargo, este programa incluso se ejecutaría en CUALQUIER dirección:e8 f0 ff
es una instrucción de llamada relativa : salta a la dirección de la instrucción que sigue a lacall
instrucción menos 0x10.JavaScript (ES6),
403433 bytesGuardado 6 bytes, gracias a ETHproductions
Una función recursiva.
Pruébalo en línea!
fuente
1/s
.([c,...s])
contigo debería escribir un consejoBrainfuck,
4240 bytesPruébalo en línea!
Sin golf:
fuente
05AB1E , 11 bytes
Pruébalo en línea!
Explicación:
fuente
Brainfuck, 44 bytes
Lee un byte a la vez, coloca un par abierto antes de cada uno, excepto el primero, coloca el mismo número de parentescos cercanos al final.
fuente
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
Es un poco más corto.Haskell, 30 bytes
Ejemplo de uso:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Tome el siguiente carácter, seguido de un
(
, seguido de una llamada recursiva con todos menos el primer carácter, seguido de un)
.fuente
f=Data.List.intersperse '$'
! Eso nos daf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
como un caso base en tu casof[x]=[x]
. No estoy familiarizado con Haskell, así que no sé si es legítimo o no, te dejaré juzgar.()
detrás de la última letra, por ejemplo,f "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
requiereimport Data.List
para otros 17 bytes.Jalea ,
98 bytes-1 byte gracias a @Dennis (use molde
ṁ
, en lugar de longitudL
, y repitax
)TryItOnline
¿Cómo?
fuente
³
realidad hace que Jelly imprima el valor de retorno actual, por lo que nunca tiene dos listas de caracteres.Retina ,
2217 bytesPruébalo en línea!
Alternativamente:
Explicación
Siempre olvido que es posible imprimir cosas en el camino en lugar de transformar todo en el resultado final y sacarlo de una vez ...
Aquí
\
le dice a Retina que imprima el resultado de esta etapa sin un salto de línea final. El1>
es un límite que significa que la primera coincidencia de la expresión regular debe ignorarse. En cuanto a la etapa en sí, simplemente reemplaza cada carácter (.
) excepto el primero con(
seguido de ese carácter. En otras palabras, se inserta(
entre cada par de caracteres. Para la entradaabc
, esto lo transforma en (e imprime)Todo lo que queda es imprimir los paréntesis de cierre:
Esto se hace con una transliteración que sustituye
(
con)
y elimina todos los demás caracteres ASCII imprimibles de la cadena.fuente
> <> ,
1918 bytesPruébalo en línea!
Explicación
La primera línea es un bucle de entrada que imprime todo hasta el último carácter de la entrada (incluyendo todos los
(
) y deja la cantidad correcta)
en la pila:Una vez que llegamos a EOF, el puntero de instrucción termina en la segunda línea y simplemente ejecutaremos
o
en un bucle, imprimiendo todo)
, hasta que la pila esté vacía y el programa falle.fuente
J, 13 bytes
J se ejecuta de derecha a izquierda, por lo que, usando el adverbio de inserción
/
, se puede usar un verbo para reducir las letras de la cadena de entrada.Uso
Puede observar las salidas parciales entre cada reducción.
Explicación
fuente
C #, 32 bytes
Este lambda debe ser un método estático, ¿necesitaría contar bytes adicionales para ese requisito? Normalmente no usaría una lambda para la recursión en C #, pero luego creo que sería más corto no usar la recursión.
fuente
R, 61 bytes
Regex encuentra y reemplaza espacios entre caracteres con "(". Luego
cat
yrep
agrega ")" n-1 veces al final.fuente
Java 7
8179 bytes1
Byte guardado. Gracias a Kevin.fuente
l!=a.length
->l<a.length
yb=b+'('+a[l],++l)+')'
->b+="("+a[l],++l)+")"
( -2 bytes )b+="("+a[l],++l)+")"
le ofrece 144141148))), y BTWb+"("+a[l],++l)+")"
es correcto. y este fue un error muy tonto mío (!=
).b+='('+a[l],++l)+')'
da144141148
, perob+="("+a[l],++l)+")"
no hace. Los paréntesis están rodeados de comillas en lugar de comillas.PowerShell v2 +, 46 bytes
Toma la cadena de entrada,
char
-array's it,-join
s the array junto con los pares abiertos(
, luego se concatena en el número apropiado de pares cerrados)
.fuente
APL, 19 bytes
Explicación:
Solución alternativa, también 19 bytes:
Explicación:
fuente
MATL , 16 bytes
Pruébalo en línea!
Explicación
fuente
Acc !! 129 bytes
No está mal para un tarpit de Turing bastante detallado ...
(Sí, todo ese espacio en blanco es obligatorio).
Nota: debido a las limitaciones de entrada de Acc !! , es imposible leer una cadena arbitraria de caracteres sin algún delimitador final. Por lo tanto, este programa espera una entrada (en stdin) como una cadena seguida de un carácter de tabulación.
Acc !! ?
Es un lenguaje que creé que solo parece inutilizable . El único tipo de datos son los enteros, la única construcción de flujo de control es el
Count x while y
bucle, y la única forma de almacenar datos es un único acumulador_
. La entrada y la salida se realizan un carácter a la vez, utilizando el valor especialN
y laWrite
declaración. A pesar de estas limitaciones, estoy bastante seguro de que Acc !! está Turing completo.Explicación
La estrategia básica en Acc !! La programación consiste en utilizar la
%
división de mods y enteros/
para particionar conceptualmente el acumulador, lo que le permite almacenar múltiples valores a la vez. En este programa, utilizamos tres de estas secciones: los siete bits de orden más bajo (_%128
) almacenan un código ASCII desde la entrada; el siguiente bit (_/128%2
) almacena un valor de bandera; y los bits restantes (_/256
) cuentan el número de parentescos cercanos que necesitaremos.Entrada en Acc !! proviene del valor especial
N
, que lee un solo carácter y evalúa su código ASCII. Cualquier declaración que consista únicamente en una expresión asigna el resultado de esa expresión al acumulador. Entonces, comenzamos almacenando el código del primer personaje en el acumulador._%128
almacenará el personaje leído más recientemente. Entonces, el primer ciclo se ejecuta mientras_%128-9
no es cero, es decir, hasta que el carácter actual sea una pestaña.Dentro del bucle, queremos imprimir a
(
menos que estemos en la primera iteración. Desde Acc !! no tiene una declaración if, tenemos que usar bucles para condicionales. Usamos el bit del acumulador de 128_/128%2
, como un valor de bandera. En la primera pasada, lo único en el acumulador es un valor ASCII <128, por lo que el indicador es 0 y se omite el bucle. En cada pase posterior, nos aseguraremos de que la bandera sea 1.Dentro del
Count x
bucle (siempre que la bandera sea 1), escribimos un par abierto (ASCII40
) y agregamos 128 al acumulador, estableciendo así la bandera en 0 y saliendo del bucle. Esto también aumenta el valor de_/256
, que usaremos como nuestro recuento de parentescos cercanos para la salida.Independientemente del valor de la bandera, escribimos el carácter de entrada más reciente, que es simplemente
_%128
.La siguiente asignación (
_+128-_%128+N
) hace dos cosas. Primero, al agregar 128, establece la bandera para la próxima vez a través del ciclo. En segundo lugar, pone a cero la_%128
ranura, lee otro personaje y lo almacena allí. Luego hacemos un bucle.Cuando se
Count i
cierra el ciclo, acabamos de leer un carácter de tabulación y el valor del acumulador se desglosa así:_%128
:9
(el carácter de tabulación)_/128%2
:1
(la bandera)_/256
: número de caracteres leídos, menos 1(El menos 1 se debe a que solo agregamos 128 al acumulador una vez durante la primera pasada a través del bucle principal). Todo lo que necesitamos ahora son los parentescos cercanos.
Count j while _/256-j
bucles_/256
veces, escribiendo un close-paren (ASCII41
) cada vez. Voila!fuente
Perl, 25 bytes
Gracias a @Ton Hospel por jugar 4 bytes.
24 bytes de código +
-F
.Necesidades
-F
y-E
banderas:Tenga en cuenta que si prueba esto en una versión anterior de perl, es posible que deba agregar un
-a
indicador.Otra forma interesante (aunque un poco más larga: 28 bytes):
Gracias a Ton Hospel una vez más por ayudarme a resolverlo.
(Para usarlo, coloque el código dentro de un archivo y llámelo con
echo -n "Hello" | perl nest.pl
)fuente
""
después del-F
. Tampoco necesita-l
si exige que la cadena de entrada se ingrese sin una nueva línea final:echo -n Hello | program
-F
, gracias. (Me preguntaba cómo obtener la entrada sin la nueva línea final, gracias por eso también)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, pero por supuesto no admite cadenas que contengan metacaracteres regex\Q
para admitir metacaracteres regex) :-)Rubí, 27 bytes
Explicación
fuente
Perl,
2423 bytesIncluye +1 para
-p
Dar cadena en STDIN sin nueva línea (o agregar una
-l
opción al programa)nest.pl
:fuente
PHP, 63 bytes
Versión anterior 64 Bytes
fuente
<?=
lugar deecho
y otro si configura $ s como resultado de lastr_split
llamada en lugar de$argv[1]
, y luego usa encount($s)
lugar destrlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
batiría el split / join combinación, pero desafortunadamente falla si la entrada contiene espacios en blanco.GNU sed,
373531 bytes (30 +1 para-r
argumento)Solución pura de linux sed
:
; luego llamándolo recursivamente cont
\1 ( \2 )
Editar : ¡Gracias a @manatwork por ayudar a eliminar 4 personajes!
Probador en línea
fuente
-e
para pasar el código al intérprete es gratis. (Ok,sed
es feliz sin eso también.) Entonces parased -re '…'
que cuentes +1.Medusa ,
1918 bytesEl carácter
␁
es el carácter de control no imprimible con valor de byte0x1
. Pruébalo en línea!Explicación
Este es un programa Jellyfish bastante complejo, ya que muchos valores se utilizan en varios lugares.
I
es una entrada sin formato, leída de STDIN como una cadena.'(
Es el carácter literal(
.{
(identidad izquierda) toma'(
yI
como entradas, y regresa'(
. El valor de retorno nunca se usa realmente.`
es hilo. Se modifica{
para devolver el carácter(
para cada carácter deI
, dando como resultado una cadena de(
s con la misma longitud queI
.>
es cola toma la cadena de(
s como entrada y corta el primer carácter.+
toma como argumentos la cadena de(
sy el byte no imprimible, y agrega el valor de byte (1) a cada carácter. Esto da una cadena de igual longitud de)
s. Usando el personaje␁
garantiza que el valor de retorno es una cadena y no una lista de enteros./
toma el byte no imprimible y devuelve una función que toma dos argumentos, y une el segundo argumento con el primero una vez (ya que el valor del byte es 1)._
toma esta función, toma los argumentos de la parte inferior{
(que eran'(
yI
), y llama a la función con ellos. Esto inserta el carácter(
entre cada par de caracteres enI
.,
concatena esta cadena con la cadena de)
s eP
imprime el resultado.fuente
05AB1E ,
22211918 bytesPruébalo en línea!
Explicación:
fuente
Vim, 17 bytes
$qqha(<Esc>A)<Esc>%h@qq@q
Va de principio a fin, porque de lo contrario te tropiezas con los
)
mensajes que ya has escrito. Utiliza enha
lugar dei
fallar cuando llega al principio.Por lo general, no haría dos inserciones separadas como esta; harías algo como
C()<Esc>P
salvar un derrame cerebral. Pero el posicionamiento no funciona tan bien esta vez.fuente
<End>
tecla en modo de inserción en lugar de salir del modo de inserción y hacerA
Convexo , 10 bytes
Pruébalo en línea!
fuente
> <> , 37 bytes
Fila por fila
Pruébalo en línea!
fuente
Brain-Flak
10397 BytesIncluye +3 para -c
Pruébalo en línea!
Explicación:
fuente
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
es dos bytes más largos ...-a
en Brain-Flak de todos modos?+3
bytes son estándar para las banderas especiales de línea de comando . Lo cual es lamentable, pero algo que puedo soportar. De hecho, he estado pensando en formas de acortar esto, pero aún no estoy seguro de cómo.-
y uno para la bandera? Podría tener una bandera para la ejecución normal como lo hace Perl con-e
. De esa manera solo sería 1 byte extra.Factor, 81 bytes
fuente