Arte ASCII alineado horizontalmente


20

Su tarea es aceptar como entrada dos "Arte ASCII" y alinear cada obra de arte una al lado de la otra horizontalmente.

Por ejemplo, digamos que tiene dos cadenas, "abc\ndef"y "123\n456". Necesitas alinearlos horizontalmente para producir la cadena "abc123\ndef456". Lo llamo" alinear horizontalmente "porque mientras las entradas, cuando se imprimen, se ven así:

abc
def

y:

123
456

La salida, cuando se imprima, se verá así:

abc123
def456

Tenga en cuenta cómo se coloca una entrada junto a la otra.


Entrada

  • La entrada será cadenas y puede ser como dos argumentos separados, o como una secuencia de cadenas.
  • Los personajes en las artes tendrán códigos decimales en el rango de 32-126 (inclusive).
  • Está bien admitir un número arbitrario de artes para alinear en lugar de solo dos (pero obviamente debe admitir al menos dos).
  • Puede suponer que cada arte tendrá las mismas dimensiones y que contendrán al menos una línea.
  • Debes ser capaz de admitir al menos 100x100 artes de personajes.

  • Para alinearse con las convenciones del sitio, el orden de los argumentos no importa. No importa qué arte esté a la izquierda o a la derecha.


Salida

  • La salida será el arte alineado como se mencionó anteriormente, ya sea devuelto o enviado a la salida estándar.

  • Cualquier espacio en blanco al final en opcional.

  • No debe haber un separador visual entre las artes alineadas.


Las artes de entrada y salida deben ser \no \rcadenas delimitadas. Sería demasiado trivial permitir matrices 2D.

Las presentaciones pueden ser funciones o programas completos.

Casos de prueba:

"abc\ndef", "123\n456" -> "abc123\ndef456".

"qwertyuiop\n asdfghjkl", "Some other\nTextFiller" -> "qwertyuiopSome other\n asdfghjklTextFiller"

"  *  \n *** \n*****\n *** \n  *  \n", "  +  \n  +  \n+++++\n  +  \n  +  \n" -> "  *    +  \n ***   +  \n*****+++++\n ***   +  \n  *    +  \n"

1
¿Podemos usar un delimitador personalizado en lugar de líneas nuevas? es decir "|"o " "?
Rɪᴋᴇʀ

10
Voy a decir que no, eso arruinaría cualquier arte.
Carcigenicate

¿Podemos usar en \rlugar de \n?
Adám

@ Adám Claro. Actualizaré la redacción.
Carcigenicate

¿Está bien el espacio en blanco?
Adám

Respuestas:


20

66
Porque, ¿quién no solo tiene algo para esto? : P
caird coinheringaahing

55
Eso ni siquiera es justo. ; -;
totalmente humano

3
@KevinCruijssen En PPCG, generalmente se permite tomar entradas en el orden que desee, y para un lenguaje basado en pila, el orden actual tiene más sentido que el reverso.
dzaima

55
@KevinCruijssen, aunque acabo de recordar que tengo incorporado un complemento inverso, así que estoy actualizando la publicación: p
dzaima

2
¿Entonces Canvas tiene dos incorporados para esto? ¿OK por qué no?
caird coinheringaahing


6

Python 2 , 59 bytes

lambda y:'\n'.join(map(str.__add__,*map(str.splitlines,y)))

Pruébalo en línea!


También se puede acortar eliminando el espacio. : P
totalmente humano

Si desea ingresar y generar listas de líneas, como lo hizo anteriormente, puede reducirlo a 30: ¡ Pruébelo en línea!

Me senté allí durante unos 5 minutos tratando de decidir si debía permitir eso. Como muestra la respuesta de Haskell, reduciría el desafío a algo mucho más trivial. Sin embargo, supongo que las soluciones demasiado triviales simplemente no serían tan populares.
Carcigenicate



3

Perl 5 -0F , 28 bytes

Incluye +2para el \nargumento de-F (es "código", por lo que debe contar)

Dé entradas directamente una tras otra en STDIN.

#!/usr/bin/perl -0F\n
say@F[$%++,$_]for@F/2..$#F

Pruébalo en línea!


3

Bash + coreutils, 14

  • 4 bytes guardados gracias a @DavidFoerster.
paste -d "" $@

La entrada se proporciona como dos nombres de archivo como parámetros de línea de comandos.

Pruébalo en línea .


Puede guardar 4 bytes:paste -d "" $@
David Foerster

@DavidFoerster ¡Gracias! Extraño: lo intenté antes y no funcionó. Editar - Ahora veo - en lugar de -d ""intentarlo -d"", lo que por supuesto no es diferente a-d
Digital Trauma


2

APL (Dyalog Unicode) , SBCS de 9 bytes

Programa completo Solicitudes (STDIN) para cualquier lista de longitud de \rcadenas delimitadas. Las cadenas pueden ser desiguales y de diferentes anchos siempre que tengan el mismo número de líneas. Imprime (STDOUT) resultante ASCII art.

⊃,/⎕FMT¨⎕

Pruébalo en línea!

 solicitud de entrada evaluada

⎕FMT¨ formato (evaluar todos los caracteres de control y devolver la matriz de caracteres) cada uno

,/ combinarlos horizontalmente (reducción de la catenificación)

 revelar (porque la reducción redujo el rango de 1 a 0)


2

Java 8, 100 84 78 bytes

a->b->{for(int i=0;;)System.out.println(a.split("\n")[i]+b.split("\n")[i++]);}

Sale con un ArrayIndexOutOfBoundsExceptionSTDERR después de haber impreso el resultado en STDOUT, que está permitido .

-6 bytes gracias a @ OlivierGrégoire .

Explicación:

Pruébalo en línea.

a->b->{                        // Method with two String parameters and no return-type
  for(int i=0;;)               //  Loop over the substrings of the first input
    System.out.println(        //   Print:
     a.split("\n")[i]          //    The substring of the first input
     +b.split("\n")[i++]);}    //    plus the same-indexed substring of the second input

1
a->b->{for(int i=0;;)System.out.println(a.split("\n")[i]+b.split("\n")[i++]);}78 bytes. No se dice nada acerca de no tener ningún efecto secundario adicional. Entonces podríamos simplemente contar hasta que ocurra una excepción.
Olivier Grégoire

@ OlivierGrégoire Gracias! Y salir con un error a STDERR está permitido después de haber impreso todo en STDOUT.
Kevin Cruijssen

2

Ruby , 48 bytes

->a,b{$;=$/;a.split.zip(b.split).map(&:join)*$/}

Pruébalo en línea!

Una lambda que toma dos hilos y devuelve un hilo. Establecer el splitdelimitador predeterminado en nueva línea con$;=$/; no guarda ningún byte, pero hace que el resto se vea un poco mejor.

Ruby , 49 bytes (arbitrariamente muchas cadenas)

->s{s.map{|a|a.split$/}.transpose.map(&:join)*$/}

Pruébalo en línea!

Solo por diversión. Resulta que podemos aceptar una serie de cadenas a un costo adicional de solo 1 byte.


2

JavaScript (ES6), 51 bytes

f=
(a,b)=>a.replace(/.+/g,a=>a+b.shift(),b=b.split`
`)
;document.write("<pre>"+f("abc\ndef", "123\n456")+"</pre>")


2

Maravilla , 21 bytes

->#oN.zip#++.-> <>"
"

Ejemplo de uso:

(->#oN.zip#++.-> <>"
")["abc#ndef" "abc#ndef"]

#n se usa en lugar de \n denotar nuevas líneas.

Explicación

Versión detallada:

(map #oN) . (zip #con) . (map split "#n")

Dividir cada cadena en la matriz de entrada a lo largo de nuevas líneas, comprimir con concatenación de cadena y generar cada elemento.







1

PowerShell , 51 49 bytes

param($a,$b)$a-split"
"|%{$_+($b-split"
")[$i++]}

Pruébalo en línea!

Toma la entrada como cadenas literales con nuevas líneas. También podría usar `n(el delimitador de nueva línea en PowerShell, no \n) en su lugar.

Nosotros primero -split la cadena de entrada izquierda en las nuevas líneas, que crea una matriz, y la recorremos |%{...}. En cada iteración, la cadena se concatena con la cadena de entrada correcta nuevamente dividida en nuevas líneas, indexada e incrementada.

Los que quedan en la tubería y lo implícito Write-Outputal finalizar nos da salida como una serie de cadenas, que se imprimen con nuevas líneas entre ellas.




1

Japt -R , 8 7 bytes

·íV· m¬

Intentalo


Explicación

             :Implicit input of strings U & V
·            :Split U on newlines
  V·         :Split V on newlines
 í           :Interleave
     m       :Map
      ¬      :  Join
             :Implicitly join with newlines and output

Alternativa

·Ë+V·gE

Intentalo

             :Implicit input of strings U & V
·            :Split U on newlines
 Ë           :Map over each element at index E and rejoin with newlines
   V·        :  Split V on newlines
     gE      :  Get the element at index E
  +          :  Append to the current element
             :Implicitly join with newlines and output

1

Bash , 92 bytes

a=();for b;do c=;while IFS= read -r d;do a[c++]+=$d;done<<<"$b";done;printf '%s\n' "${a[@]}"

Pruébalo en línea!

Sin golf:

array=()                             # Initialize the array
for argument in "${@}"; do           # Loop over the arguments list
  index='0'                          # Reset the index
  while IFS='' read -r 'line'; do    # Loop over every line of the current argument
    array[index]+="${line}"          # Append the line to its corresponding place
    (( index++ ))                    # Increment the index
  done <<< "${argument}"             # End while loop
done                                 # End for loop
printf '%s\n' "${array[@]}"          # Print array's content

Ejemplos:

$ foo $'abc\ndef' $'123\n456'
abc123
def456

$ foo $'qwertyuiop\n asdfghjkl' $'Some other\nTextFiller'
qwertyuiopSome other
 asdfghjklTextFiller

$ foo \
>   $'  *  \n *** \n*****\n *** \n  *  \n' \
>   $'  +  \n  +  \n+++++\n  +  \n  +  \n'
  *    +  
 ***   +  
*****+++++
 ***   +  
  *    +  


# https://gist.github.com/nxnev/dad0576be7eb2996b860c320c01d0ec5
$ foo "$(< input1)" "$(< input2)" "$(< input3)" > output

También tengo uno más corto pero falla si la segunda readdeclaración devuelve un valor distinto de cero.

Bash , 55 bytes

while IFS= read -r a;IFS= read b<&3;do echo "$a$b";done

Nota: <&3no parece funcionar en tio.run

Este usa descriptores de archivo ( 1y 3) en lugar de argumentos:

$ foo <<< $'qwertyuiop\n asdfghjkl' 3<<< $'Some other\nTextFiller'
qwertyuiopSome other
 asdfghjklTextFiller

1

Carbón de leña , 8 bytes

PθM⌕θ¶→η

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

 θ          First input
P           Print without moving the cursor
    θ       First input
     ¶      Literal newline
   ⌕        Find index
  M   →     Move that many squares right
       η    Implicitly print second input

Agregue 2 bytes para aceptar múltiples entradas:

FA«PιM⌕ι¶→

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

 A          Input
F «         Loop over all entries
   Pι       Print current entry
     M⌕ι¶→  Move to next entry

Agregue 4 bytes para aceptar la entrada sin relleno:

PθM⌈E⪪θ¶Lι→η

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

      θ         First input
       ¶        Literal newline
     ⪪          Split
    E           Map over each string
         ι      Current string
        L       Length
   ⌈            Maximum
  M       →     Move that many squares right



1

Swift 4 , 119 bytes

func f(s:[String])->String{return s[0].split{$0=="\n"}.enumerated().map{$0.1+s[1].split{$0=="\n"}[$0.0]+"\n"}.joined()}

Explicación

func f(s: [String]) -> String {
    return s[0].split{ $0=="\n" }       //splitting the first string after every \n
    .enumerated()                       //create a tuple of offsets and elements
    .map {
        $0.1 +                          //current element
        s[1].split{$0 == "\n"}[$0.0] +  //splitting the second string + indexing
        "\n"                            //new line after every line
     }
     .joined()
}

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.