El arte ASCII es divertido. Los editores de texto modernos son muy buenos manipulando texto. ¿Los lenguajes de programación modernos están a la altura?
Una tarea común en la manipulación de arte ASCII es recortar texto en un rectángulo entre dos caracteres. Esta es la tarea que debe implementar en este desafío.
Detalles
Su programa tomará 3 entradas:
- el primero es el carácter de "inicio" del bloque, que marca la esquina superior izquierda
- el segundo es el carácter 'final' del bloque, que marca la esquina inferior derecha
- el tercero es alguna forma de texto de varias líneas, ya sea una cadena, o una lista de cadenas, o nombre de archivo, o lo que sea
El resultado será texto multilínea (nuevamente, en cualquiera de los formatos anteriores) recortado en el rectángulo entre las entradas dadas. Tenga en cuenta que las dos primeras entradas pueden no ser únicas.
Casos de borde
Las cajas siempre deben tener un volumen de al menos 2. Por lo tanto, estas:
() (
)
son cajas pero estas:
)( ) (
( )
no lo son (con inicio = (
y fin = )
).
La entrada solo contendrá una caja. Por lo tanto, los caracteres iniciales y finales solo deben aparecer una vez, a menos que sean el mismo carácter, en cuyo caso deben aparecer exactamente dos veces.
Además, cada línea en la entrada debe ser al menos tan larga como la distancia desde el inicio de una línea hasta el borde derecho del cuadro en la entrada.
Su programa no necesita manejar entradas inválidas; pueden dar lugar a un comportamiento indefinido.
Reglas
Se aplican las reglas típicas de código de golf. El código más corto gana.
Ejemplos
Día soleado: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Salida:
(but this text
is in a box )
Tenga en cuenta la eliminación del espacio horizontal también. Los cultivos de arte ASCII son 2d.
Día lluvioso: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Salida:
(
)
Mismo inicio / final: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Salida:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Entrada inválida: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Entrada inválida 2: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Respuestas:
Vim,
16, 12 bytes / pulsaciones de teclasPruébalo en línea! en el intérprete V
¡Apuesto a que los viejos editores de texto son aún mejores! :RE
Aunque no necesariamente tiene que hacerlo, esta respuesta funciona con las dos entradas "inválidas" dadas, generando
y
Explicación:
fuente
/\/<cr><c-v>nygv$o0dp
o algo así durante demasiado tiempo :)Jalea , 13 bytes
Un enlace diádico que acepta una lista de caracteres iniciales y finales a la izquierda y una lista de líneas (como listas de caracteres) a la derecha que produce una lista de líneas (como listas de caracteres).
Pruébalo en línea! (programa completo: si las entradas son Python válidas, requerirán el uso de comillas).
¿Cómo?
Como ejemplo, con left =
['a', 'b']
y right (como una lista de listas de caracteres: las líneas):=€
produce una lista de dos listas de listas (la primera realiza'a'=
, la segunda'b'=
):sumando esto produce una sola lista de listas (sumando elementos sabios):
ŒṪ
luego nos da los índices multidimensionales (1 indexados) de los no ceros,[[2,3],[4,6]]
es decir[[top,left],[bottom,right]]
.r/
luego realiza lo[2,3]r[4,6]
que, comor
vectoriza, es como[2r4, 3r6]
evaluar a[[2,3,4],[3,4,5,6]]
, es decir[rows,columns]
.,þ/
luego realiza[2,3,4],þ[3,4,5,6]
dondeþ
es una instrucción de podio externo y,
es par. Esto produce todos los[row,column]
valores por columna, en este caso:Queremos estos por fila, por lo que
Z
se utiliza para transponer esto a:Finalmente los
œị
índices vuelven a las líneas de entrada:Vale la pena señalar que cuando ambos caracteres delimitadores son iguales, los
=€
identifica dos veces peroSŒṪ
termina haciendo lo correcto, ya que2
es verdad, por ejemplo, con['a','a']
:fuente
APL (Dyalog) ,
3830 bytes4 bytes guardados gracias a @EriktheOutgolfer
Pruébalo en línea!
fuente
⍸matrix∊separators
, y hacer de tener / gota con ellos(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
con⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, con 3 quads finales) que es aún más corto. O... ⎕⎕(↑⎕)
si no se permite una matriz premezclada.Jalea , 14 bytes
Pruébalo en línea!
fuente
()
) vacía (Python ), no'()'
. Si es parseable, necesita ser citado, sin embargo, my//
no necesita ser citado (operador de división entera sin operandos? Hm ...).()
Jelly lo está interpretando como una especie de personaje especial. La mayoría de los pares de personajes que intento funcionan. Me encantaría saber qué piensan las personas más familiarizadas con Jelly. EDITAR: ninja-ed por erik the outgolferPython 2 , 130 bytes
Pruébalo en línea!
fuente
Lienzo , 37 bytes.
Pruébalo aquí!
36 bytes para obtener las coordenadas de los caracteres (y convertirlos a x, y, w, h porque eso es lo que se
@
necesita) y 1 byte para obtener la subsección. Debe haber un mejor enfoquefuente
JavaScript (ES6), 98 bytes
Toma la entrada como dos enteros y una serie de cadenas. Devuelve una matriz de cadenas.
Pruébalo en línea!
Comentado
fuente
filter
ymap
?! ¿Construir una nueva matrizreduce
o una solución recursiva no funcionaría más corto? En mi teléfono, en el pub o lo probaría yo mismo.X
yY
son seguros.Java 10, 204 bytes
Modifica la matriz de entrada en lugar de devolver una nueva para guardar bytes. Sin embargo, esto significa que las líneas eliminadas se convierten en su
""
lugar. Si esto no está permitido, lo cambiaré.Pruébalo en línea.
Explicación:
Por ejemplo:
Con las entradas
start = "("
,end = ")"
ylines =
el primer bucle lo recortará en la parte superior e izquierda, cambiándolo a esto:
el segundo ciclo lo recortará en la parte inferior y derecha, cambiándolo a esto:
fuente
Retina 0.8.2 , 110 bytes
Pruébalo en línea! Explicación:
Elimine las líneas de entrada que preceden a la primera línea del cuadro.
Si el carácter inicial está en la columna izquierda de la entrada, elimínelo.
Si el carácter inicial aún no se ha eliminado, cambie todas las columnas de entrada a la izquierda por una y repita desde el principio.
Elimine el carácter final y todo en la entrada después del carácter final.
Truncar todas las líneas a la longitud de la siguiente línea. Esto funciona contando todos los caracteres menos uno en cada línea, y luego tratando de hacer coincidir tantos caracteres en la línea siguiente; Si esto tiene éxito, la segunda línea es más corta, por lo que se elimina el último carácter y se repite el ciclo.
fuente
C (gcc) , 237 bytes
Pruébalo en línea!
Estoy 99% seguro de que esto se puede acortar usando algún tipo de función auxiliar para encontrar el índice horizontal y el puntero a un personaje, ya que se repite dos veces. Por desgracia, no pude encontrar una manera lo suficientemente corta para hacerlo, puedo intentarlo más tarde si encuentro el tiempo.
Descripción
fuente
Stax , 15 bytes
Ejecutar y depurarlo
Toma el conjunto de caracteres delimitadores de caja (1 o 2) en la primera línea de entrada. El resto de las líneas son el cuerpo de entrada.
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
fuente