Fin de las pestañas versus guerra espacial
Por lo tanto, se ha debatido mucho sobre si usar pestañas o espacios para sangrar / formatear código. ¿Puedes ayudar a la universidad a resolver la disputa yendo a un método de formateo increíblemente loco ?
Su trabajo es escribir un programa o función completa que expanda todas las pestañas en cuatro espacios. Y luego reemplaza una serie de n espacios iniciales con "/ (n - dos estrellas aquí) /". Recibirá información sobre varias líneas en cualquier formato razonable (matriz de cadenas de una sola cadena para cada nueva línea. Matriz de columnas, etc.)
Entrada de muestra robada descaradamente . Tenga en cuenta que, dado que las pestañas se expanden automáticamente a cuatro espacios en SE, lo represento como el carácter "^", pero también debe manejar las pestañas (punto de código 0x09). Todos los caracteres "^" representan una tabulación.
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
Not zero so multiply by 256 again to get 65536
[>++++<-]>[<++++++++>-]<[>++++++++<-]
+>[>
# Print "32"
++++++++++[>+++++<-]>+.-.[-]<
<[-]<->] <[>>
# Print "16"
+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
# Print "8"
++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
^this is preceded by a tab
^^two tabs
^^^three tabs etcetera!
Salida de muestra
Calculate the value 256 and test if it's zero
If the interpreter errors on overflow this is where it'll happen
++++++++[>++++++++<-]>[<++++>-]
+<[>-<
/**/Not zero so multiply by 256 again to get 65536
/**/[>++++<-]>[<++++++++>-]<[>++++++++<-]
/**/+>[>
/******/# Print "32"
/******/++++++++++[>+++++<-]>+.-.[-]<
/**/<[-]<->] <[>>
/******/# Print "16"
/******/+++++++[>+++++++<-]>.+++++.[-]<
<<-]] >[>
/**/# Print "8"
/**/++++++++[>+++++++<-]>.[-]<
<-]<
# Print " bit cells\n"
+++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<.
>>.++.+++++++..<-.>>-
Clean up used cells.
[[-]<]l
/**/this is preceded by a tab
/******/two tabs
/**********/three tabs etcetera!
Debido a que la universidad necesita espacio para descargar tanto Vim como Emacs, se le permite muy poco almacenamiento para su código. Por lo tanto, este es el código de golf y gana el código más corto. Puede suponer que la entrada está bien formada y que las líneas con menos de cuatro espacios (después del reemplazo de pestañas) pueden dar lugar a un comportamiento indefinido.
Renuncia
Esta estrategia de formato "excelente" surgió por cortesía de Geobits y se reproduce con su permiso. Ningún programador resultó dañado durante la producción de este desafío.
fuente
/*
, o se puede suponer que no es una "entrada bien formada"? Un archivo fuente de C ++ habría sido una mejor prueba, porque su comentario multilínea/* */
posiblemente rompería algunas respuestas que reemplazan primero y último de los espacios iniciales con an/
, y luego proceda a llenar espacios con*
./* */
código C ++, pero esta vez al principio de la línea. Según su especificación, debe dejarse como está. Aquí la trampa es, y ya detectó respuestas incorrectas, que una expresión regular como, por ejemplo,/\** /
utilizada para llenar esos espacios entre // con asteriscos convertiría la línea/***/
. También he visto esta conversión/*//*/
. Asumo que ambos son incorrectos.Respuestas:
V ,
21, 20 bytesPruébalo en línea!
Esto es literalmente solo un puerto directo de mi respuesta vim. Las diferencias notables:
El
Í
comando (sustituto global) rellena automáticamente la/g
bandera, lo que ahorra dos bytesô
es idéntico a\t
Î
Es un mnemónico para:%norm
, y también llena el espacio necesario entre:%norm
y el conjunto de pulsaciones de teclas.El retorno del carro final al final se agrega implícitamente.
fuente
Vim,
37, 34, 33,32 bytesPruébalo en línea!
Tenga en cuenta que esto requiere un retorno de carro final (enter) en vim, aunque no en el intérprete en línea.
Esto utiliza el intérprete de V porque es compatible con versiones anteriores. Una solución muy sencilla.
Aquí hay un gif que te permite ver la solución en tiempo real. Utiliza una versión un poco más antigua, y agregué algunas pulsaciones de teclas adicionales para que se ejecute más lentamente para que pueda ver lo que sucede:
Y aquí está la explicación de cómo funciona:
fuente
g
:g
porque abusa de una característica menos conocida: elnorm
comando se cancela si^F<space>
falla. Entonces,:%norm ^F<space>foo
es esencialmente lo mismo que los:g/^ /norm foo
divertidos trucos de Vim. : Dnorm
?^F
, no,<C-f>
notación clave de Silly Vim. En este caso es^
, salta al primer carácter que no sea un espacio en blanco, yF<space>
que es encontrar el primer espacio detrás del cursor.Perl, 41 bytes
Corre con la
-p
bandera, así:Reemplazar
␉
por una pestaña (en Bash, intente escribir Control-V Tab).fuente
perl
reemplazó esa referencia en el lugar, desearíased
tener eso también.Cheddar ,
605756 bytesGuardado 3 bytes gracias a @Conor O'Brien
Ojalá Cheddar tuviera un mejor formato de cadena.
Pruébalo en línea!
Explicación
Esta es una función.
@
es una propiedad representada funcionalizada (por ejemplo, ruby&:
) que le permite hacer cosas como: `ar.map (@. head (-1))Si no está familiarizado con regex, el:
Esto básicamente coincidía con uno o más (
+
) espacios () al principio (
^
) de cada (g
) línea (m
).fuente
/^ +/
suficiente como expresión regular, ya que podemos suponer que los espacios iniciales tendrán al menos 4 de longitud.Mathematica, 97 bytes
Función anónima. Toma una cadena como entrada y devuelve una cadena como salida.
fuente
Python 3, 124 bytes
Utiliza una buena expresión regular.
Ideone it!
fuente
Java
210207 bytesEsta es la solución de referencia que lo implementa ingenuamente.
fuente
for(int j=0;++j<i-1;)
. Además, puede eliminar elint
antesj
y ponerlo después del int ya presente:int i=s.length()-(x=s.replaceAll("^\\s+", "")).length(),j;
JavaScript ES6, 75 bytes
Reemplace
\t
con una pestaña literal en su código.fuente
Java,
185184167152 bytesDada la definición muy suelta de matriz de cadenas dada en la publicación inicial, la he usado, lo
Stream<String>
que permite algunos ahorros de bytes consecuentes.Utilicé diferentes técnicas que RI para lograr el mismo objetivo. El algoritmo en sí es bastante el mismo.
Pruebas y sin golf :
fuente
Retina , 25 bytes
El
\t
debe ser reemplazado con un carácter de tabulación real (0x09).Pruébalo en línea!
Explicación
Reemplace cada pestaña con cuatro espacios.
Transforme cada línea por separado (
%
) haciendo coincidir los2+N
espacios al comienzo de la línea y reemplazándola por/.../
donde...
hayN
copias de*
.fuente
Pitón,
125111 byteshttps://repl.it/DGyh/2
fuente
SED (56 + 1 para -r) 57
Dónde
⇥
hay una pestaña1. reemplaza las pestañas con espacios.
2. reemplaza el primer y último espacio inicial con
/
.3. reemplaza el primer espacio después
/
y 0+*
s con un*
hasta que no haya una coincidencia.fuente
-f
. Cualquier indicador adicional utilizado como nor debería contarse como un byte cada uno. Por lo tanto, aquí guarda 2 bytes.;
comando después de t tampoco es necesario. En cuanto al código en sí, necesita un ^ al comienzo del tercers
comando, de lo contrario, una entrada como esta "3/5" se convierte en "3 / * 5". En el primers
comando, en realidad tiene una pestaña allí, pero no se muestra correctamente y es engañosa, así que use \ t o especifique después, que char era una pestaña.La universidad debería considerar permitir un poco más de espacio para los programas en Emacs Lisp (o por defecto
tabify
yuntabify
solo), ya que se vuelven aún más detallados que Java. También debe prestar mucha atención a los estudiantes (o maestros) cuyo tamaño de ideación es menor a cuatro o que codifican en un lenguaje no similar a C.La siguiente solución tiene 206 bytes
Suponiendo que
tab-width
no es necesario establecerlo explícitamente, podemos guardar 20 de ellos.Y la versión sin golf se vería así
Primero,
untabify
la región antes de saltar a su inicio. Luego, mientras vemos espacios en blanco al comienzo de una línea, los reemplazamos con un comentario que es tan largo como dicho espacio en blanco. Para ser exactos, el comentario a insertar está construido porque en sí ocupa 97 bytes. Una solución más corta para copiar algunas cadenas n veces es muy apreciada.
fuente
Ruby,
5247 + 1 (bandera p) = 48 bytesEditar : guardado 5 bytes completos, gracias a Value Ink
fuente
p
bandera para aprovechar el hecho de que (g) sub modifica$_
y por lo tanto cambia el valor impreso?ruby -pe 'gsub ?\t," "*4;sub(/^ +/){?/+?**($&.size-2)+?/}'
(g)sub
sin Bang puede modificar$_
aquí.GNU sed,
6664 + 1 (r flag) = 65 bytesEditar: 1 byte menos gracias a la sugerencia de Riley .
Ejecutar: sed -rf formatter.sed input_file
La razón para separarse con
\n
los espacios iniciales del resto del texto en esa línea es porque, de lo contrario, una línea C ++ que comience con un comentario como este/* */
se convertiría en/*****/
una línea 4 más simple comos,^(/\**) ,\1*,
o inclusos,^(/\**) ( */),\1*\2,
. Dado que sed ejecuta el script para cada línea de entrada, no\n
se introduce ningún en el espacio del patrón en la lectura.fuente
/
hasta que reemplace el\n
. Eso te ahorra tener que igualarlo en la línea 4.\t
con un carácter de tabulación.