Descargo de responsabilidad: No, este no es un desafío de broma para invertir una cadena.
Tarea
Solo hay una operación que admitir: sustracción ( -).
También solo tiene dos átomos para soportar: cero ( 0) y uno ( 1).
Aquí, la notación de prefijo -ABes equivalente a la notación de postfix AB-, donde Ay Bson expresiones.
Su tarea es convertir (recursivamente) una expresión en notación de prefijo a su equivalente en notación de postfix.
Definiciones
La siguiente gramática genera una expresión en notación de prefijo:
S > -SS
S > 0
S > 1
La siguiente gramática genera una expresión en notación postfix:
S > SS-
S > 0
S > 1
Ejemplo
Prefix notation:  --01-0-01
Parentheses:      -(-01)(-0(-01))
Convert:          (01-)(0(01-)-)-
Postfix notation: 01-001---
Reglas y libertad
- Puede cambiar el nombre de la operación y los átomos a cualquier carácter, siempre que sea coherente.
- El formato de entrada debe ser coherente con el formato de salida (aparte del hecho de que la entrada está en notación de prefijo y la salida está en notación postfix).
Caso de prueba
Input       Output
1           1
0           0
-01         01-
-10         10-
--01-0-01   01-001---
Créditos de casos de prueba a Dada .

Respuestas:
brainfuck , 32 bytes
Pruébalo en línea!
Utilicé
@como operación, porque su punto de código (64) es conveniente.UTambién es posible con el mismo número de bytes, usando 3 * 85 + 1 = 256 = 0.Explicación
La cinta se usa como una pila. En cada iteración del bucle principal, el puntero de datos inicia dos celdas a la derecha de la parte superior de la pila.
fuente
Retina ,
373029 bytesPruébalo en línea! Ahorré 7 bytes al darme cuenta de que los términos siempre comienzan con un dígito, por lo que ya no tengo que limitar la coincidencia a la última
-(anteriormente era el único garantizado para ser seguido por dos términos). Se salvó 1 byte al no poner-s en su propia línea. Por ejemplo, se-01convierte en lo-0¶1que luego se reemplaza con01-. Ahora, si tengo,--010es decir--0¶1¶0, quiero cambiar el interior-0¶1a01-para poder reemplazar el-01-¶0con01-0-, pero en realidad no importa cuál de los dos-s elimino, por lo que elimino el que está al comienzo de la línea, como eso es más fácil de probar.fuente
-0-0-00debería ser0000---.Haskell ,
6259 bytesPruébalo en línea! Uso:
fst.f $ "--01-0-01".0y1pueden ser caracteres arbitrarios que son más grandes que el carácter-.Editar: -3 bytes gracias a Zgarb!
La función
fanaliza de forma recursiva una expresión y devuelve una tupla de esta expresión en notación postfix y la cadena de resto, siguiendo la gramática simple a partir de la cual se pueden construir expresiones de prefijo válidas:Si el primer carácter
ade la cadena de entrada es mayor que-, estamos en una expresión atómica y devolvemos una tupla de una cadena con carácteray el resto de la cadena de entrada.Si encontramos a
-, se deben analizar dos expresiones. Esto se puede lograr(a,x)<-f robteniendo la primera expresiónay luego analizar la cadena de descansoxnuevamente(b,c)<-f xpara obtener la segunda expresiónby la cadena de descanso finalc.(a,(b,c))<-f<$>f rhace exactamente esto porque<$>en tuplas asigna una función dos, el segundo elemento de una tupla, mientras que es tres bytes más corta que(a,x)<-f r,(b,c)<-f x. Después de obtener las dos expresiones y la cadena de reposo, las expresiones se concatenan y un "-" se adjunta:(a++b++"-",c).fuente
f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)cuando busqué una versión con ambos casos combinados, que es un byte más largo.Haskell, 54 bytes
La función
vtoma una cadena y una función, reorganiza la subexpresión inicial, luego aplica la función al resto de la cadena hasta que todo se haya reorganizado. La pila de llamadas y el argumento de la función juntos hacen un seguimiento de qué expresión se analiza. La funciónhresponde al desafío y sevllama a sí misma como un primer argumento ficticio.fuente
v f l=lsi la mueve en segundo lugar.v id.lasttruco en un byte.Perl 5 , 57 bytes
Lo uso
xcomo operador en lugar de-(ver el enlace TryItOnline a continuación).Pruébalo en línea!
Explicaciones:
/x((?0)|.)((?0)|.)/coincide recursivamente con una expresión completa:xa al principio, luego una expresión(?0)(es una llamada recursiva) o un átomo (.), seguido de otra expresión o átomo.Luego necesito guardar la segunda expresión / átomo (
my$n=$2;) porque de lo contrario las llamadas recursivas lo anularán.La función se llama recursivamente en la primera expresión (
f($1)), luego en la segundaf($n), yxse agrega al final (.x).fuente
Python 3,
1171121051009876626159 bytesRegistro de cambios:
!=a>(-1 byte, copiado de la sugerencia de @ovs)Úselo así:
fuente
returnlambda x:p(x)[0]Probablemente podría reemplazar suffunción.else, me parece.d="-"realmente guardar bytes?def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]para 59 bytesPyth, 20 bytes
Esto crea una función
yque espera una cadena como parámetro.Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
La función
yanalizará y convertirá la primera expresión de prefijo en una expresión de postfix. Entonces, si se llama asíy"10", solo regresará1.fuente
Retina ,
343129 bytesPruébalo en línea!
;se usan para indicar nodos, que inicialmente están compuestos por un solo número y luego se convierten en algo que ya se ha analizado.-se convierten en nuevas líneas para que.+podamos tomar cualquier cosa que no se haya analizado-.fuente
Perl 6 , 45 bytes
Pruébalo en línea!
fuente