ASCII allineato orizzontalmente Art


20

Il tuo compito è quello di accettare come input due "ASCII Art" e di allineare ogni opera una accanto all'altra in senso orizzontale.

Ad esempio, supponiamo di avere due stringhe "abc\ndef"e "123\n456". È necessario allinearli orizzontalmente per produrre la stringa "abc123\ndef456". Lo chiamo" allineando orizzontalmente "perché mentre gli input, una volta stampati, assomigliano a questo:

abc
def

e:

123
456

L'output, una volta stampato, sarà simile al seguente:

abc123
def456

Nota come un input è posizionato accanto all'altro.


Ingresso

  • L'input sarà stringhe e può essere come due argomenti separati o come una sequenza di stringhe.
  • I personaggi nelle arti avranno codici decimali nell'intervallo 32-126 (incluso).
  • Va bene supportare un numero arbitrario di arti da allineare anziché solo due (ma ovviamente devi supportarne almeno due).
  • Puoi presumere che ogni disegno avrà le stesse dimensioni e che conterrà almeno una linea.
  • Devi essere in grado di supportare almeno 100x100 personaggi artistici.

  • Per allinearsi con le convenzioni sul sito, l'ordine degli argomenti non ha importanza. Non importa quale arte sia a sinistra o a destra.


Produzione

  • L'output saranno le arti allineate come menzionato sopra, o restituite o output allo stdout.

  • Qualsiasi spazio bianco finale in facoltativo.

  • Non ci deve essere un separatore visivo tra le arti allineate.


Le arti di input e output devono essere stringhe \no \rdelimitate. Sarebbe eccessivamente banale consentire array 2D.

Gli invii possono essere funzioni o programmi completi.

Casi test:

"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
Possiamo usare un delimitatore personalizzato anziché newline? cioè "|"o " "?
R

10
Dirò di no, dato che rovinerebbe qualsiasi arte.
Carcigenicato

Possiamo usare \rinvece di \n?
Adám,

@ Adám Sure. Aggiornerò la formulazione.
Carcigenicato

Lo spazio bianco iniziale è ok?
Adám,

Risposte:


20

6
Perché chi non ha solo un incorporato per questo? : P
caird coinheringaahing

5
Non è nemmeno giusto. ; -;
totalmente umano

3
@KevinCruijssen Su PPCG di solito è consentito prendere input nell'ordine desiderato e per un linguaggio basato su stack l'ordine corrente ha più senso del contrario.
dzaima,

5
@KevinCruijssen anche se ho appena ricordato che ho un built-in per l'aggiunta inversa, quindi sto aggiornando il post: p
dzaima

2
Quindi Canvas ha due builtin per questo? Ok perché no?
caird coinheringaahing


6

Python 2 , 59 byte

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

Provalo online!


Può anche essere ridotto rimuovendo lo spazio. : P
totalmente umano

Se vuoi inserire e produrre elenchi di linee, come avevi prima, puoi arrivare a 30: provalo online!

Rimasi seduto lì per circa 5 minuti cercando di decidere se avrei dovuto farlo. Come mostra la risposta di Haskell, ridurrebbe la sfida a qualcosa di molto più banale. Suppongo però che le soluzioni troppo banali non sarebbero così popolari.
Carcigenicato

4

05AB1E , 6 byte

|¶¡øJ»

Provalo online!

Spiegazione

|        # push all input into a list
 ¶¡      # split on newlines
   ø     # zip
    J    # join the rows to single strings
     »   # merge on newlines

Peccato che non fosse permesso uno spazio tra i due ingressi :(.
Magic Octopus Urn


3

Perl 5 -0F , 28 byte

Include +2per l' \nargomento -F(è "codice", quindi dovrebbe contare)

Dare input direttamente uno dopo l'altro su STDIN.

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

Provalo online!


3

Bash + coreutils, 14

  • 4 byte salvati grazie a @DavidFoerster.
paste -d "" $@

L'input viene dato come due nomi di file come parametri della riga di comando.

Provalo online .


È possibile salvare 4 byte:paste -d "" $@
David Foerster il

@DavidFoerster Grazie! Strano - l'ho provato prima e non ha funzionato. Modifica - Vedo ora - invece di -d "", ho provato -d"", che ovviamente non è diverso da-d
Digital Trauma


2

APL (Dyalog Unicode) , SBCS da 9 byte

Programma completo. Richiede (STDIN) un elenco di lunghezze di \rstringhe -delimate. Le stringhe possono essere sfilacciate e di larghezza diversa purché abbiano lo stesso numero di linee. Stampe (STDOUT) risultanti ASCII art.

⊃,/⎕FMT¨⎕

Provalo online!

 richiesta di input valutato

⎕FMT¨ formato (valuta tutti i caratteri di controllo e restituisce la matrice di caratteri) ciascuno

,/ combinarli orizzontalmente (riduzione della catenazione)

 divulgare (perché la riduzione ha ridotto il grado da 1 a 0)


2

Java 8, 100 84 78 byte

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

Esce da an ArrayIndexOutOfBoundsExceptiona STDERR dopo aver stampato il risultato su STDOUT, che è consentito .

-6 byte grazie a @ OlivierGrégoire .

Spiegazione:

Provalo online.

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 byte. Nulla si dice sul non avere alcun effetto collaterale aggiuntivo. Quindi potremmo semplicemente contare fino a quando si verifica un'eccezione.
Olivier Grégoire,

@ OlivierGrégoire Grazie! E uscire con un errore su STDERR è infatti consentito dopo aver stampato tutto su STDOUT.
Kevin Cruijssen,

2

Rubino , 48 byte

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

Provalo online!

Una lambda che prende due stringhe e restituisce una stringa. L'impostazione del splitdelimitatore predefinito su newline con $;=$/;non salva alcun byte, ma rende il resto un po 'più bello.

Ruby , 49 byte (arbitrariamente molte stringhe)

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

Provalo online!

Solo per divertimento. Si scopre che possiamo accettare una matrice di stringhe ad un costo aggiuntivo di solo 1 byte.


2

JavaScript (ES6), 51 byte

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


2

Meraviglia , 21 byte

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

Esempio di utilizzo:

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

#nviene utilizzato invece di \nindicare nuove righe.

Spiegazione

Versione dettagliata:

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

Dividi ogni stringa nell'array di input lungo le nuove righe, comprimi con concatenazione di stringhe e genera ogni elemento.





1

JavaScript (ES6), 52 byte

Accetta input nella sintassi del curry (a)(b).

a=>b=>a.split`
`.map((s,i)=>s+b.split`
`[i]).join`
`

Provalo online!



1

PowerShell , 51 49 byte

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

Provalo online!

Accetta input come stringhe letterali con newline. In alternativa `n, puoi anche utilizzare (il delimitatore newline in PowerShell \n).

Prima di tutto -splitla stringa di input a sinistra su newline, che crea un array, e lo attraversiamo |%{...}. Ogni iterazione, concateniamo la stringa con la stringa di input corretta nuovamente suddivisa su newline, indicizzata e incrementata.

Questi vengono lasciati sulla pipeline e l'implicito Write-Outputal completamento ci dà l'output come una matrice di stringhe, che sono stampate con una nuova riga tra.




1

Japt -R , 8 7 byte

·íV· m¬

Provalo


Spiegazione

             :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

Provalo

             :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 byte

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

Provalo online!

Ungolfed:

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

Esempi:

$ 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

Ne ho anche uno più corto ma non riesce se la seconda readistruzione restituisce un valore diverso da zero.

Bash , 55 byte

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

Nota: <&3non sembra funzionare su tio.run

Questo utilizza descrittori di file ( 1e 3) invece di argomenti:

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

1

Carbone , 8 byte

PθM⌕θ¶→η

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Aggiungi 2 byte per accettare più input:

FA«PιM⌕ι¶→

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Aggiungi 4 byte per accettare input non riempiti:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

      θ         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 byte

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

Spiegazione

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()
}

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.