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 -AB
es equivalente a la notación de postfix AB-
, donde A
y B
son 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.U
Tambié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-01
convierte en lo-0¶1
que luego se reemplaza con01-
. Ahora, si tengo,--010
es decir--0¶1¶0
, quiero cambiar el interior-0¶1
a01-
para poder reemplazar el-01-¶0
con01-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-00
debería ser0000---
.Haskell ,
6259 bytesPruébalo en línea! Uso:
fst.f $ "--01-0-01"
.0
y1
pueden ser caracteres arbitrarios que son más grandes que el carácter-
.Editar: -3 bytes gracias a Zgarb!
La función
f
analiza 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
a
de la cadena de entrada es mayor que-
, estamos en una expresión atómica y devolvemos una tupla de una cadena con caráctera
y el resto de la cadena de entrada.Si encontramos a
-
, se deben analizar dos expresiones. Esto se puede lograr(a,x)<-f r
obteniendo la primera expresióna
y luego analizar la cadena de descansox
nuevamente(b,c)<-f x
para obtener la segunda expresiónb
y la cadena de descanso finalc
.(a,(b,c))<-f<$>f r
hace 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
v
toma 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ónh
responde al desafío y sev
llama a sí misma como un primer argumento ficticio.fuente
v f l=l
si la mueve en segundo lugar.v id
.last
truco en un byte.Perl 5 , 57 bytes
Lo uso
x
como 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:x
a 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)
, yx
se agrega al final (.x
).fuente
Python 3,
1171121051009876626159 bytesRegistro de cambios:
!=
a>
(-1 byte, copiado de la sugerencia de @ovs)Úselo así:
fuente
return
lambda x:p(x)[0]
Probablemente podría reemplazar suf
funció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
y
que espera una cadena como parámetro.Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
La función
y
analizará 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