Tengo un pseudocódigo de Java que usa espacios en blanco en lugar de llaves, y quiero que lo conviertas.
I / O
Su programa debe tomar un archivo de entrada junto con un número que designe cuántos espacios se usan para sangrar un bloque. Aquí hay un ejemplo:
$ convert.lang input.p 4 // Convertir usando 4 espacios como delimitador de bloque $ convert.lang input.p 2 // Convertir usando 2 espacios como delimitador de bloque
A continuación, debe convertir el resultado utilizando el delimitador de bloque especificado y generar el resultado en stdout.
La carne del programa.
Los bloques se abren :y cada línea dentro del bloque se sangra usando el delimitador de bloque, como el código Python.
while (verdadero):
System.out.println ("Prueba");
Cada uno :se reemplaza con a {, y a }se agrega al final del bloque.
while (verdadero) {
System.out.println ("Prueba");
}
Ejemplos
Entrada:
Prueba de clase pública:
public static void main (String [] args):
System.out.println ("Java es detallado ...");
Salida:
$ convert Test.pseudojava 4
Prueba de clase pública {
public static void main (String [] args) {
System.out.println ("Java es detallado ...");
}
}
Entrada:
principal():
printf ("Hola mundo");
Salida:
$ convert test.file 2
principal() {
printf ("Hola mundo");
}
Entrada:
def generic_op (the_stack, func):
# Código de manejo de operaciones genérico
b = the_stack.pop ()
if isinstance (b, list):
si b:
regreso
top = b.pop (0)
mientras b:
top = func (top, b.pop (0))
the_stack.push (arriba)
más:
a = the_stack.pop ()
func de retorno (a, b)
Salida:
$ convert code.py 4
def generic_op (the_stack, func) {
# Código de manejo de operaciones genérico
b = the_stack.pop ()
if isinstance (b, list) {
si b {
regreso
}
top = b.pop (0)
mientras que b {
top = func (top, b.pop (0))
}
the_stack.push (arriba)
}
más {
a = the_stack.pop ()
func de retorno (a, b)
}
}
Puntuación
¡El código con la menor cantidad de bytes gana!

Respuestas:
Perl, 41 bytes
Contando el shebang como dos, la entrada se toma de stdin. No es necesario proporcionar un argumento de línea de comando. Cualquier contexto de anidamiento válido puede determinarse (y coincidir) sin conocer el tamaño de sangría.
Desglose de expresiones regulares
Uso de muestra
in1.dat
Salida
in2.dat
Salida
in3.dat
Salida
fuente
Python 3,
299265 bytesBoom bam pow.
Algoritmo utilizado:
// vars globales cadena total // programa modificado total int b // sangrado buffer line thru lines: // itera sobre cada línea string mline = "" // línea que se agregará al total // calcula la cantidad de espacios antes de la línea (podría ser mucho más fácil) espacios int = 0 // espacios totales c a través de la línea: // revisa todos los caracteres de la línea if c! = "": // si el carácter actual no es un espacio (lo que significa que los revisamos todos) romper // salir de iterar a través de caracteres espacios ++ // incrementa los espacios porque hemos golpeado un espacio (hurr derr) si espacios / SPACE_SETTING <b: // si el recuento de sangría de la línea actual es menor que el búfer de sangría mline = "} \ n" + línea // agrega el corchete de cierre al comienzo de la línea b-- // decremento buffer if line.endswith (":"): // si la línea termina con un `:` eliminar: de la línea mline + = "{" // agregar { b ++ // incremento de búfer total + = mline // agrega línea modificada al total imprimir (total)fuente
Rubí, 70
Agrega una nueva línea final. No necesita el parámetro sangrar tamaño de bloque.
Ejecute esto con
-n0(esto es realmente 68 + 2). Muchas gracias a @primo por guardar más de una docena de bytes.fuente
-p0también funciona para ruby (-0lee todas las entradas a la vez,-palmacena stdin$_y las imprime automáticamente al final).x=$<.readlines*''. Mientras yo estoy haciendo eso,sub!también tiene una sobrecarga de dos parámetros (en lugar de un parámetro de bloque +) que acepta una cadena de reemplazo, para que pueda utilizar\1,\2, etc., en lugar de tener que concatenar todo.