Escuché que su código puede ejecutarse más rápido si lo sangra al revés, de modo que el compilador pueda procesarlo como un patrón de diseño de árbol desde la parte superior de las "ramas" hacia abajo. Esto ayuda porque la gravedad acelerará el tiempo que toma compilar su código y la eficiencia de la estructura de datos mejora. Aquí hay un ejemplo, en las secuencias de comandos Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Pero por alguna razón, el Bloc de notas no tiene una configuración para hacer esto automáticamente, por lo que necesito un programa que lo haga por mí.
Descripción
Las presentaciones deben tomar un fragmento de código como entrada, revertir la sangría y generar el código resultante.
Esto se realiza mediante el siguiente procedimiento:
Divide el código en líneas. Cada línea comenzará con cero o más espacios (no habrá pestañas).
Encuentra todos los niveles de sangría únicos en el código. Por ejemplo, para el ejemplo anterior, esto sería
0 4 8 12
Invierta el orden de esta lista de niveles de sangría y asigne la lista invertida a la lista original. Esto es difícil de explicar con palabras, pero por ejemplo, se vería como
0 — 12 4 — 8 8 — 4 12 — 0
Aplique esta asignación al código original. En el ejemplo, una línea con sangría de 0 espacios quedaría sangrada por 12 espacios, 4 espacios se convertirían en 8 espacios, etc.
De entrada y salida
La entrada y la salida se pueden proporcionar como desee (STDIN / STDOUT, parámetro de función / valor de retorno, etc.); Si su idioma no admite entrada de |
líneas múltiples (o simplemente no desea), puede usar el carácter para separar las líneas.
La entrada consistirá solo en nuevas líneas ASCII + imprimibles, y no contendrá líneas vacías.
Casos de prueba
Entrada:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Salida: el código de ejemplo anterior.
Entrada:
a
b
c
d
e
f
g
h
Salida:
a
b
c
d
e
f
g
h
Entrada:
1
2
3
2
1
Salida:
1
2
3
2
1
Entrada:
foo
Salida:
foo
fuente
Respuestas:
CJam,
43 39 3635 bytesEsto parece demasiado largo. ¡Estoy seguro de que no estoy optimizando lo suficiente!Cómo funciona:
La idea básica es dividir la entrada en la nueva línea, calcular el número de espacios iniciales en cada línea, ordenar y obtener números únicos, copiar esa matriz e invertir la copia, transliterar los números originales en orden con estas dos matrices y finalmente formar el cadena final con esta información.
La parte más larga es averiguar cuántos espacios iniciales hay en cada línea, ya que CJam no tiene una manera fácil de hacerlo.
Expansión de código:
Y en el espíritu de la pregunta. Una verdadera expansión del código:
7 bytes guardados gracias a Martin y 1 byte gracias a Dennis
Pruébalo en línea aquí
fuente
{}#
tiene un error: devuelve un entero, pero debería devolver un largo. Irónicamente,i
(convertir a entero) arregla esto. 2. Como""#
no tiene el mismo error,_Sm0=#
es un byte más corto.Python 2 -
137131 bytesToma entrada con en
|
lugar de\n
.Explicación
Las primeras tres líneas son bastante sencillas. Haga una lista de todas las líneas en la entrada, defina una función que le indique cuánto espacio en blanco inicial tiene una cadena y haga una lista ordenada de valores que la función escupe para cada línea de entrada.
La última línea es mucho más divertida.
fuente
()
guardar 4raw_
)f(s)for s in i
debería sermap(f,i)
.d=[];d+=set(L)
es una versión más corta ded=sorted(set(L))
.JavaScript, ES6,
113 103101 bytesEstoy bastante seguro de que esto se puede jugar al menos un poco más, pero aquí va.¡Nunca hubiera pensado que habrá una solución JS de 101 bytes, superando a Python!
Esto crea un método llamado
f
que se puede llamar con la cadena de entrada. Si tiene una versión más reciente de Firefox, tiene cadenas de plantilla y puede llamar al método comoDe lo contrario, también puede llamarlo como
o prueba el fragmento a continuación:
fuente
\s
con un carácter de espacio) y eliminando los paréntesisx
en la función de reemplazo.(x)
: /b
yc
¿verdad? Simplemente se refieren a la misma matriz de todos modos.Ruby, 63 bytes
Esto define una función sin nombre que toma y devuelve una cadena. Puede llamarlo agregando
["string here"]
o asignándolo a una variable, y luego llamando a esa variable.Cómo funciona:
s.scan(r=/^ */)
proporciona una lista de todos los espacios y tiendas principales que se regexanr
para su uso posterior.uniq
elimina duplicadossort
... clases.Ahora salte al final,
l.zip(l.reverse)
da una serie de pares que queremos sustituir.to_h
convierte eso en un hash, interpretando los pares como pares clave-valor.Ahora
s.gsub
reemplazó todas las coincidencias de la expresión regular (todos los espacios iniciales) utilizando ese hash como una tabla de búsqueda para encontrar el reemplazo.fuente
Pyth 39
Pruébalo en línea.
Utiliza la
|
opción delimitador.fuente
Japt
-R
, 27 bytesPruébalo en línea!
Desempaquetado y cómo funciona
Cómo funciona realmente
fuente
Scala,
176171Agregará una nueva línea adicional al final. Si no tuviera que preservar espacios al final de la línea, puedo llegar a 167:
Sin golf:
fuente
PowerShell , 112 bytes
Pruébalo en línea!
Menos golfizado:
fuente
Haskell, 116
fuente
PHP - 173 bytes
El código no optimizado debe almacenarse en la
$v
variable:Aquí está la versión no comentada y comentada:
Probablemente nunca haya escrito algo tan sucio. Estoy avergonzado.
fuente
JavaScript, 351
Versión sin golf:
Pruebas
Mostrar fragmento de código
Mostrar fragmento de código
Mostrar fragmento de código
Mostrar fragmento de código
fuente
Perl 5, 112
111 + 1 para
-n
(-E
es gratis)Estoy seguro de que se puede hacer con menos golpes, pero no veo cómo en este momento.
fuente