Escriba un programa o función que tome una cadena garantizada que solo contenga caracteres ASCII imprimibles , excepto el espacio, y que sea un número triangular positivo (1, 3, 6, 10, 15, ...) de longitud.
Imprima o devuelva la misma cadena, pero en forma de triángulo usando espacios. Algunos ejemplos mostrarán mejor lo que quiero decir:
Si la entrada es R
entonces la salida será
R
Si la entrada es cat
entonces la salida será
c
a t
Si la entrada es monk3y
entonces la salida será
m
o n
k 3 y
Si la entrada es meanIngfu1
entonces la salida será
m
e a
n I n
g f u 1
Si la entrada es ^/\/|\/[]\
entonces la salida será
^
/ \
/ | \
/ [ ] \
Si la entrada es
Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?
entonces la salida será
T
h i
s r u
n o f c
h a r a c
t e r s i s
m e a n t t o
h a v e a l e n
g t h t h a t c a
n b e e x p r e s s
e d a s a t r i a n g
u l a r n u m b e r . D
i d i t w o r k ? Y o u t
e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
Básicamente, se insertan nuevas líneas entre las subcadenas de longitud triangular, se agregan espacios entre todos los caracteres y cada línea se sangra con espacios para ajustarse a la forma del triángulo.
Opcionalmente, se permite una nueva línea final y líneas con espacios finales, pero de lo contrario su salida debería coincidir exactamente con estos ejemplos. La última línea del triángulo no debe tener espacios iniciales.
El código más corto en bytes gana.
Respuestas:
Pyth, 22 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
fuente
Python, 81 bytes
Una función recursiva. Va desde el final de
s
, cortando e imprimiendo personajes. El número de caracteres a tomar se calcula a partir de la longitud des
. La función está configurada para imprimir en orden inverso a las llamadas recursivas, que finalizan cuandos
está vacía y luego resuelven una copia de seguridad de la línea. Cada capa, el prefijop
tiene un espacio extra agregado.En Python 3,
if
se puede hacer a través de cortocircuito, aunque esto no parece guardar caracteres:Una alternativa igualmente larga con cadena de desigualdad:
Ambos
print
yf
volverNone
, que es difícil de usar.fuente
Retina ,
1081029487826463 bytesGracias a Sp3000 por hacerme seguir mi enfoque original, que redujo el conteo de bytes de 108 a 82.
Un enorme agradecimiento a Kobi que encontró una solución mucho más elegante, lo que me permitió guardar otros 19 bytes además de eso.
Donde
<space>
representa un solo carácter de espacio (que de otro modo sería eliminado por SE). Para fines de conteo, cada línea va en un archivo separado y\n
debe reemplazarse con un carácter de salto de línea real. Para mayor comodidad, puede ejecutar el código tal como está desde un único archivo con la-s
bandera.Pruébalo en línea.
Explicación
Bueno ... como siempre, no puedo dar una introducción completa a los grupos de equilibrio aquí. Para una introducción, vea mi respuesta de desbordamiento de pila .
La primera etapa es una
S
etapa de división, que divide la entrada en líneas de longitud creciente. El_
indica que los fragmentos vacíos deben omitirse de la división (lo que solo afecta al final, porque habrá una coincidencia en la última posición). La expresión regular en sí está completamente contenida en un vistazo, por lo que no coincidirá con ningún personaje, sino solo con las posiciones.Esta parte se basa en la solución de Kobi con algo de golfitud adicional que encontré yo mismo. Tenga en cuenta que las retrospectivas coinciden de derecha a izquierda en .NET, por lo que la siguiente explicación debería leerse de abajo hacia arriba. También he insertado otro
\G
en la explicación para mayor claridad, aunque eso no es necesario para que el patrón funcione.Todavía estoy admirando el trabajo de Kobi aquí. Esto es incluso más elegante que la expresión regular de prueba principal. :)
Pasemos a la siguiente etapa:
Simple: inserte un espacio después de cada carácter sin salto de línea.
Esta última etapa sangra todas las líneas correctamente para formar el triángulo. El
m
es sólo el modo multilínea habitual para hacer^
que coincida con el comienzo de una línea. El+
le dice a Retina que repita esta etapa hasta que la cadena deje de cambiar (lo que, en este caso, significa que la expresión regular ya no coincide).Entonces esto coincide con el comienzo de cualquier línea que no tenga una sangría más grande que la siguiente. En cualquiera de esas posiciones, insertamos un espacio. Este proceso termina, una vez que las líneas se arreglan en un triángulo ordenado, porque ese es el diseño mínimo donde cada línea tiene una sangría más grande que la siguiente.
fuente
Candy ,
675957 bytes&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j
o:
forma larga:
fuente
CJam,
2726 bytesGracias a Sp3000 por guardar 1 byte.
Sorprendentemente cerca de Pyth, veamos si se puede jugar al golf ...Pruébalo aquí.
Explicación
fuente
'
aS
???S
es una cadena, no un carácter, por lo que sef
asignará sobre esa cadena en lugar de la lista de líneas.Ruby,
847773 bytes77 bytes
Se
r
redujeron algunos bytes más al eliminar la variable como sugiere steveverrill.84 bytes
Sin golf:
Primero calcular el número triangular de la cadena de entrada
es decir, por ejemplo, el tamaño de la cadena de entrada es 120 y nuestro número triangular n será 15.
En la línea anterior, imprime espacios seguidos de series de cadenas que se obtienen de la cadena de entrada utilizando el siguiente patrón
[[0,0],[1,2],[3,5],[6,9]]
Uso:
fuente
upto
que no requiere un argumento entero (times
ciertamente lo hace). He incorporado parte de su sintaxis en una revisión de mi respuesta. El mayor consejo que tengo para ti es que no necesitas esa variabler
. Simplemente use un en,
lugar de..
y el número después de la coma es el número total de elementos a devolver, en lugar del final del rango.Pyth, 27 bytes
Banco de pruebas
Un enfoque interesante - imperativo, y usos
.I
. Probablemente golfable.fuente
C,
138136134 bytesToma una cadena como entrada:
fuente
printf(" ")
yprintf("\n")
conputs(" ")
yputs("\n")
. Cada sustitución le ahorrará 2 bytes. :)Enfoque de Ruby 2 rev 1, 76 bytes
Optimizado usando ideas de sintaxis de la respuesta de Vasu Adari, más algunos giros míos.
Enfoque de Ruby 2 rev 0, 93 bytes
Enfoque completamente diferente. Primero agregamos espacios entre los caracteres de la entrada. Luego imprimimos las filas línea por línea.
Enfoque de rubí 1, 94 bytes
Esto terminó mucho más tiempo de lo previsto.
w
contiene el número de caracteres imprimibles en la fila inferior, o de manera equivalente, el número de líneas.Cada línea contiene
w
caracteres de espacio en blanco (el último de los cuales es la nueva línea), por lo que la idea es imprimir estos caracteres de espacio en blanco e insertar los caracteres imprimibles cuando sea necesario.fuente
Minkolang 0.14 , 42 bytes
Pruébalo aquí
Explicación
fuente
Python 2,
8885 bytesGracias xnor por guardar 3 bytes.
fuente
s
el cálculo del número de espacios?S=s=raw_input()
?CJam, 50 bytes
Pruébalo aquí
Explicación
fuente
JavaScript (ES6), 135 bytes
De-golf + demo:
fuente
for (s = j = 0; j < w.length; j += s++);
? Además, dentro de a<pre>
, puede usar en\n
lugar de<br>
. Además, olvidó mencionar que es ES6.Java,
258194Golfizado:
Sin golf:
Salida del programa:
fuente
import static System.out;
tiene 25 bytes ySystem.
tiene 7 bytes. Se usa tres veces y 21 <25, por lo que en realidad aumentaría el tamaño en 4 bytes. Sin embargo, una buena ventaja, las importaciones estáticas pueden ahorrar espacio y no todos saben sobre ellas.JavaScript (ES6), 106 bytes
Utiliza recursividad en lugar de un bucle for para construir la cadena.
Para encontrar la longitud de la fila más larga, utilizar la fórmula para el enésimo número triangular
T_n
esT_n = (n^2 + n)/2
. Dadon
y resolviendo elT_n
uso de la fórmula cuadrática, tenemos:Resulta que después del piso, agregar 1/4 dentro de la raíz cuadrada no cambia el resultado, por lo tanto, la fórmula para la fila más larga es
Math.sqrt(2*a.length)|0
.fuente
TeaScript , 44 bytes
Utiliza el mismo método que mi respuesta de JavaScript , pero es mucho más corto.
Sin golf
fuente
Powershell, 69 bytes
Menos guión de prueba de golf:
Salida:
fuente
C #, 202
No sé si esto es legal en el código de golf, pero, ¿pasar una lista en la función cuenta? No puedo encontrar una manera de repetir esto sin una Lista <cadena> declarada fuera de la función, así que lo puse como parámetro.
Uso:
fuente
C, 102 bytes
fuente
Bash + sed, 87
fuente
R, 142 bytes
Estoy bastante seguro de que puedo entender esto más. Aunque todavía estoy trabajando en eso. Siento que me falta una recursión fácil, pero no he podido acortarla correctamente.
sin golf
fuente
05AB1E , 11 bytes
Pruébalo en línea!
fuente