Ingrandisci ASCII art


64

In questa sfida, devi prendere l'arte ASCII multilinea come input, come:

 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO 
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO      
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO   
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO      
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO      

E prenderai anche un numero intero come input. È necessario produrre l'arte ASCII ingrandita della quantità specificata con il numero intero. Ad esempio, se si usasse un secondo argomento di 3, l'output sarebbe

   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOO                  OOOOOOOOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO                     OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO                     OOOOOO         OOOOOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO                              OOOOOO            OOOOOO   OOOOOO            OOOOOO   OOOOOO                  OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO                  OOOOOOOOOOOOOOOOOO         OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO   OOOOOO

Specificamente, ogni carattere deve trasformarsi in nda nscatola di quel carattere, dove nè l'argomento intero. Ad esempio, un input di

ab
cd

e 3 si tradurrà in

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Questo è , quindi vince il codice più breve in byte.


L'arte ascii sembra interessante nell'elenco delle domande
Giustino,

6
Penso che dovresti fare un round secondario / bonus per un metodo che introduce il corretto aliasing nell'arte ingrandita. La tua gigantesca arte del golf in codice sembra piuttosto bloccata.
AmeliaBR,

5
@AmeliaBR Vedi qui .
Howard,

Risposte:


37

APL, 7 caratteri / byte *

{⍺/⍺⌿⍵}

Funzione che accetta il numero e la stringa di input come parametri e restituisce il risultato:

      a
abcde
fghij
      2 {⍺/⍺⌿⍵} a
aabbccddee
aabbccddee
ffgghhiijj
ffgghhiijj
      3 {⍺/⍺⌿⍵} a
aaabbbcccdddeee
aaabbbcccdddeee
aaabbbcccdddeee
fffggghhhiiijjj
fffggghhhiiijjj
fffggghhhiiijjj

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL può essere scritto nel proprio set di caratteri a byte singolo (legacy) che associa i simboli APL ai valori superiori di 128 byte. Pertanto, ai fini del calcolo del punteggio, un programma di N caratteri che utilizza solo caratteri ASCII e simboli APL può essere considerato lungo N byte.


1
...: O Come funziona?
Maniglia della porta

4
@DoorknobofSnow La rappresentazione standard per una stringa multilinea è APL è una matrice di caratteri rettangolare (con spazi vuoti finali se le linee hanno una larghezza irregolare ... sì, APL è così vecchio.) La /funzione (da non confondere con l' /operatore ... sì, stesso simbolo ) duplica e / o rimuove le colonne da una matrice secondo l'argomento di sinistra. Se si tratta di uno scalare (numero semplice), viene replicato per tutte le colonne di input. Pertanto 2/mè una matrice con tutte le colonne raddoppiate. La variante fa lo stesso, ma per le file (o gli aerei del primo asse nel caso generale.)
Tobia,

6
Bel linguaggio, vero? In realtà è abbastanza leggibile, una volta imparate alcune decine di simboli. Molto più delle lingue ASCII di rumore di linea che vedi qui intorno ...
Tobia,

Freddo. ⌿ era sempre nella lingua? Non era nel libro Gilman and Rose e in un libro Iverson su APL \ 360 menzioni / [1] ma non ⌿.
Mark Plotnick,

2
Wow. Quello. È. Appena. Eccezionale. Sono. Gravemente. Awestruck. Di. Questo. Codice. Vorrei offrire più di un semplice +1, ma il mio rappresentante è ancora abbastanza basso per una taglia.
Erik the Outgolfer,

35

GolfScript, 20 caratteri

n%(~{.{*}+@1/%n+*}+/

Prende tutto l'input da STDIN, la prima riga è il fattore di ridimensionamento, il resto l'input multilinea. Puoi provare l'esempio online .

Ingresso

3
ab
cd

Produzione

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Codice

n%            # Split the input into separate lines
(~            # Take the first line and evaluate (factor)
{             # {...}+/ adds the factor to the code block and loops over
              # the remaining lines (i.e. the factor will be the top of stack
              # for each line of input
   .{         # Same thing, duplicate factor and add it to code block and
              # loop over each character (1/ splits the string into chars)
     *        # multiply single-char string with factor
   }+@1/%
   n+         # Join string by adding a newline
   *          # Multiply the line by the factor (left from the . operation)
}+/

Hey! Hai un formato di input, un punteggio e un tempo migliori di me: - / +1
John Dvorak,

Inoltre, mi sono quasi perso a leggerlo.
John Dvorak,

2
@JanDvorak Aggiunte alcune spiegazioni.
Howard,

Wow. Oggi ho imparato 1/. Ho anche bisogno di usare di value function +più.
John Dvorak,

2
@CoryKlein: Sarebbe di grande aiuto se ci dicessi quale errore, ma ... * guarda nella sfera di cristallo * ... potrebbe non essere golfscript.rbcontrassegnato come eseguibile o che la prima riga abbia la strada sbagliata per l'interprete Ruby per il tuo sistema. Oh, e echopresumibilmente dovrebbe essere cat. Prova cat inputFile | ruby golfscript.rb scriptFile(o semplicemente ruby golfscript.rb scriptFile < inputFile) e vedi se funziona.
Ilmari Karonen,

19

J, 20 17 caratteri

f=.([#&.|:#)];._2

Definisce un verbo fche fa ciò che è richiesto. Uso:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

dov'è ala stringa di input.
Su Windows è necessario un carattere aggiuntivo per rimuovere \r:

f=.([#&.|:#)}:;._2

Spiegazione :

];._2taglia la stringa di input in blocchi in base all'ultimo carattere della stringa, che in questo caso sarà a \n. Windows ha \r\nquindi abbiamo bisogno di usare }:per tagliare un carattere aggiuntivo off: }:;._2. Taglia la documentazione del verbo

Il resto del codice (ad eccezione dell'assegnazione f=.) è un fork .
Si scompone così:[ #&.|: #

Se aè la nostra stringa di input, il calcolo sarà 3 # a(chiameremo questo risultato x), quindi 3 [ a(chiameremo questo risultato y) quindi y #&.|: x.

3 # afa solo tre copie di ogni membro di a. Copia la documentazione del verbo
Questo gira

ab
cd

dentro, come moto a luogo, andare da dentro a fuori: I put my hand inTO my pocket = metto la mano in tasca

aaabbb
cccddd

3 [ arestituisce solo 3. Documentazione del verbo sinistro

Finalmente y #&.|: xè ycopia in trasposizione x. I #lavori come prima, ma la &.|:dice J per trasporre l'ingresso prima e poi trasporre indietro quando è finito. Nella documentazione congiunta , trasporre la documentazione verbale .

La trasposizione gira

aaabbb
cccddd

dentro, come moto a luogo, andare da dentro a fuori: I put my hand inTO my pocket = metto la mano in tasca

ac
ac
ac
bd
bd
bd

quindi la copia lo cambia in

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

e trasponendolo indietro ti dà

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
Windows fa schifo, eh? : P
cjfaure,

@Trimsty Effettivamente lo fa.
Gareth,

Questo è più breve: [##"1Inoltre, non sono sicuro delle regole non scritte del golf in J, ma direi che la divisione delle corde e l'assegnazione potrebbero essere omesse, dati i requisiti non chiari della domanda. Certamente l'ho fatto nella mia risposta APL. Esempio:2 ([##"1) 'abcde',:'fghij'
Tobia,

17

Haskell, 49 byte

x=(=<<).replicate
e n=unlines.x n.map(x n).lines

La funzione di ingrandimento è e, che accetta un conteggio e una stringa e restituisce una stringa:

λ: putStrLn $ e 3 "ab\ncd\n"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

15

APL, 11 caratteri

@Gareth ha fatto essenzialmente la stessa cosa prima, in J, quindi questa voce APL è solo per esibizione, non per competizione - è il vincitore.

      E←{⍉⍺/⍉⍺/⍵}

Uso: ingrandimento nell'arg sinistro (⍺), arte nella forma di una matrice di caratteri 2d nell'arg destro (⍵).
⍺ / ⍵ replicherà gli elementi attraverso ogni riga di un vettore o di una matrice (2 / 'OO' diventa 'OO OO').
⍉⍺ / ⍉ lo trasporterà, replicherà gli elementi, lo trasporterà.

(Se avessimo scelto la chiarezza anziché la durata del programma, il codice avrebbe potuto essere E ← {⍺ / [1] ⍺ / ⍵})

      I←5 32⍴' OOOOOO  OOOOOO  OOOOOO  OOOOOOOOO      OO    OO OO   OO OO     OO      OO    OO OO   OO OOOOO  OO      OO    OO OO   OO OO      OOOOOO  OOOOOO  OOOOOO  OOOOOOO'
      I
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO
OO      OO    OO OO   OO OO     
OO      OO    OO OO   OO OOOOO  
OO      OO    OO OO   OO OO     
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO

      3 E I
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOOOOOOOOOOO      
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
OOOOOO                  OOOOOO            OOOOOO   OOOOOO         OOOOOO   OOOOOO               
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO
   OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOO      OOOOOOOOOOOOOOOOOOOOO

Dovrei sottolineare, tuttavia, che uso 5 caratteri che trasformano l'input di stringa in una matrice di caratteri, quindi mi hai battuto solo di 1 carattere. :-)
Gareth,

2
J è ostacolato da quel fastidioso obiettivo di progettazione in cui gli operatori sono limitati al set di caratteri ASCII. :)
Mark Plotnick,

2
Tuttavia, se misuriamo in byte come ha detto l'OP, questo è 44 byte (implicando unicode ovviamente, non utf-8) e @ Gareth è ancora 17. Questo è il rovescio della medaglia delle lingue che non sono limitate all'ASCII.
cjfaure,

5
@Trimsty Ma APL ha il suo set di caratteri che mappa ogni carattere su un singolo byte, quindi probabilmente questo è ancora 11 byte.
Volatilità,

1
@Volatility Hm. È davvero strano, scusa, non lo sapevo: P
cjfaure,

13

Script Bash / sed, 48 caratteri

printf -vr %$1s
sed -n s/./${r// /&}/g${r// /;p}

Salva come script chmod +xed esegui:

$ ./asciiexpand 3 <<< $'ab\ncd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
$ 

Come funziona?

La carne è al sedcomando. Ad esempio, se n = 3, il comando sed viene espanso in qualcosa del tipo:

sed -n 's/./&&&/g;p;p;p'

Questo sedcomando composto può essere suddiviso in:

  • s/./&&&/g - questo comando sostitutivo corrisponde a ciascun personaggio e lo sostituisce con il personaggio ripetuto 3 volte
  • pComandi 3x : stampa solo l'intero spazio del modello (cioè la linea corrente) 3 volte

Passiamo -na sed per dirgli di non stampare nulla se non esplicitamente detto, quindi abbiamo il pieno controllo di ciò che viene stampato e quante volte.

Non sono riuscito a trovare un modo rapido per generare direttamente stringhe ripetute di lunghezza arbitraria sed, quindi ho usato alcuni bashtrucchi:

printf -vr "%3s"

Questo stampa una stringa (non specificata, cioè vuota), con 3 spazi iniziali e assegna il risultato alla bashvariabile r.

Quindi utilizziamo l' bashespansione dei parametri per trasformare questa stringa di spazi in ciò che dobbiamo sostituire sednell'espressione:

$ echo ${r// /&}
&&&
$ echo ${r// /;p}
;p;p;p
$ 

Sono stato in grado di cavarmela rimuovendo le virgolette attorno allo printfspecificatore di formato e sedall'espressione, poiché nessuno dei personaggi all'interno di esso ha bisogno di fuggire nella bashshell.

Conteggio dei caratteri:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 

Non ho idea di come funzioni ma funziona!
Tomas,

1
La variabile n viola la regola 1: "NON può essere hardcoded".
arte

1
Basta usare $1e rimuovere n=3;, si salveranno anche 4 caratteri e forse anche {}nella stampa.
Tomas,

E come possiamo assumere $ 1 sarà essere numerico, le virgolette attorno printfargomento s' non sono necessari, riducendolo a 52 caratteri: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
arte

1
@Tomas - Probabilmente hai capito come funziona ormai, ma ho aggiunto una descrizione nel caso ti interessi.
Trauma digitale

9

PERL,  41 39 25   22 caratteri

PERL, semplice ed efficace - creato proprio per l'attività. Se richiamato -pi3, dov'è 3il parametro n:

s/./$&x$^I/ge;$_ x=$^I

Soluzione classica (39 caratteri):

$n=<>;print map{s/./$&x$n/ge;"$_"x$n}<>

La soluzione classica richiede che nsia specificata nella prima riga di input, ad es

3
ab
cd

Grazie @manatwork per il $&trucco.


1
Freddo. Ma non è necessario per catturare i caratteri corrispondenti: s/./$&x$n/ge.
arte

8

Rubino:  64  49 caratteri

Tutti i dati ricevuti su STDIN: prima riga il fattore di ridimensionamento, quindi l'arte ASCII.

BEGIN{n=gets.to_i}
$_=[$_.gsub(/./){$&*n}]*n*$/

Esecuzione di esempio:

bash-4.2$ ruby -lpe 'BEGIN{n=gets.to_i};$_=[$_.gsub(/./){$&*n}]*n*$/' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Rubino:  44  41 caratteri

Supponendo che ogni riga di input sia terminata con un separatore di riga. Grazie a @Ventero.

$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n

Esecuzione di esempio:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

1
Un modo più breve per impostare n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(purtroppo, lo spazio dopo i due punti è necessario, altrimenti il ​​parser viene confuso). Corri con ruby -n.
Ventero,

Doh. Ho provato decine di approcci per abbreviare il compito di n, ma mi mancava l'operatore ternario. Grazie @Ventero.
arte

6

Python 3 - 84

Non la risposta più breve ma diversa. Un one-liner interessante.

n=int(input())
for i in eval(input()):print(((''.join(j*n for j in i)+'\n')*n)[:-1])

Inserisci prima un numero, quindi l'arte ASCII come elenco Python, ad esempio:

C:\Users\User4\Desktop>c:/python33/python.exe golf.py
3
["aabb","bbcc","ccdd"]
aaaaaabbbbbb
aaaaaabbbbbb
aaaaaabbbbbb
bbbbbbcccccc
bbbbbbcccccc
bbbbbbcccccc
ccccccdddddd
ccccccdddddd
ccccccdddddd

5

GolfScript, 29 caratteri

{:i;n/{1/:c;{c{i*}/n}i*}/}:f;

Questo definisce un blocco f, che quando chiamato produrrà l'output desiderato. Presuppone che gli argomenti siano nello stack (perché in pratica è così che gli argomenti vengono passati in GolfScript).

Ungolfed (ha anche senso?: P):

{:i;n/{ # for each line...
  1/:c; # save characters of string in c
  {     # i times...
    c{  # for each character...
      i*
    }/
    n
  }i*
}/}:f;


# Test run
"ab
cd" 3 f

5

Golfscript, 23 caratteri

~(:i;n/{{{.}i*}:c%c}%n*

Ho deciso di scrivere un intero programma perché ha un sovraccarico minore rispetto a una funzione anonima:

  • ~(:i;- valuta l'input, quindi decrementa il moltiplicatore, memorizzalo come ied elimina.
  • n/{...}%n* - diviso per newline, mappa ogni riga, unisci per newline
    • {...}:c%c, - prendi un blocco, applicalo sulla mappa di ogni elemento, quindi applicalo a tutta la linea.
      • {.}i*- duplicare questo elemento ivolte

Demo live: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Esempio di utilizzo:

;'"abc
def"3'
~(:i;n/{{{.}i*}:c%c}%n*

5

Python 3 - 109 107 93

i=input;n,s,a=int(i()),i(),[]
while s:a+=[''.join(c*n for c in s)]*n;s=i()
print('\n'.join(a))

Innanzitutto, inserisci il numero, quindi la stringa. Dovrebbe essere autoesplicativo ...

Grazie a Waleed Khan per aver suggerito di rimuovere il file []

Grazie a Volatility per aver suggerito di aessere un elenco.


7
Appena notato; l'NSA sta osservando ogni tuo input
Justin il

Codice più breve in byte. Ciò non includerebbe quindi le nuove righe? Il tuo conteggio non dovrebbe essere 112?
cjfaure,

Scusa, volevo dire 111.
cjfaure,

@Trimsty hai ragione; Pensavo che wordcounter.net contasse le nuove righe.
Justin,

2
Crea ain un elenco, esegui a+=[''.join(c*n for c in s)]*n, quindi esegui print('\n'.join(a))alla fine. Dovrebbe funzionare.
Volatilità del

5

Java - 217

Prima prova a giocare a golf. Sembra che Java non sia la lingua in cui farlo.

enum M{;public static void main(String[]a){int f=new Integer(a[0]),i=0,j,k;a=a[1].split("\n");for(;++i<a.length*f;System.out.println())for(j=0;++j<a[i/f].length();)for(k=0;k++<f;)System.out.print(a[i/f].charAt(j));}}

Su Windows è necessario sostituire "\ n" con "\ r \ n".

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

2
I caratteri di input devono espandersi sia verso il basso che attraverso (quindi dovrebbero esserci 3 righe di aaabbbe 3 righe cccdddnell'esempio di output sopra).
Gareth,

2
Puoi risparmiare: 1 carattere inizializzando i nella dichiarazione anziché il for; 8 caratteri usando a invece di x ( a=a[1].split("\n")e cambia tutti x con a).
arte

3
Sì, con qualsiasi lingua in cui solo la dichiarazione di mainrichiede più byte rispetto a interi programmi in altre lingue, i concorrenti riceveranno dei bogeys.
Mark Plotnick,

2
Ok Ecco 3 caratteri salvati riorganizzando leggermente l' enum M{;public static void main(String[]a){int f=Integer.valueOf(a[0]),i=-1,j,k;a=a[1].split("\n");for(;++i<a.length*f;System.out.println())for(j=0;j<a[i/f].length();j++)for(k=0;k++<f;)System.out.print(a[i/f].charAt(j));}}
esterno

3
Altri 4 byte: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov,

5

(Modifica: questa soluzione non è più valida perché la semantica dell'istruzione è cambiata. Non mi ero reso conto che avevo già usato l'istruzione quando l'ho cambiata. Puoi, tuttavia, correggere questo programma semplicemente cambiandolo in l'istruzione più recente .)

Sclipting , 19 caratteri

Si aspetta che l'input sia separato da \n(no \r) e che la prima riga contenga il fattore moltiplicatore.

겠坼銻標⑴가殲各標⓶各①復終겠併①復終

Spiegazione

겠坼 | split everything at \n
銻 | get first element (the factor)
標 | mark
⑴가殲 | bring list to front; remove first element (the factor)
各 | for each line...
    標⓶ | mark
    各①復終 | for each character, multiply it
    겠併 | add a newline and concatenate everything above the mark
    ①復 | multiply that
終 | end of loop

Alla fine, lo stack apparirà così:

[ factor, mark, line1, line2, line3, ... ]

Tutto al di sopra del segno viene automaticamente concatenato e prodotto, il resto scartato.


The 太 有意思 了! 你 是 原创 者 对 吧?
theGreenCabbage

@theGreenCabbage 对 了. Just 木 外 是 这个 电脑 语言 的 创始人
Justin

1
@Timwi mi dispiace di averti chiamato 踢 木 外 (calciare legna fuori, pronunciato tea-moo-why) ...
Justin

@Quincunx: Hehe, l'ho trovato divertente :) Ma il finale iè pronunciato [iː], non [ɑi]; come lo scriveresti in cinese adesso?
Timwi,

@Timwi Ho pensato che fosse così (ma non riuscivo a pensare a un personaggio corrispondente). Ho scritto cercando e copiando (su mdbg.net/chindict/chindict.php )
Justin

3

J, 7 caratteri

([#"1#)

Esattamente come nella risposta APL di @ Tobia, ma nei caratteri ASCII.

a =. ' 0 ',.'0 0',.' 0 '
a
 0 
0 0
 0 

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  

3

Powershell (96)

function m($n,$s){$s.split("`n")|%{$l="";$_.ToCharArray()|%{$c=$_;1..$n|%{$l+=$c}};1..$n|%{$l}}}

Pensavo di provarlo in PS. Usando il piping in foreach (%) per mantenerlo breve qui, ma il functione lo ToCharArraystanno facendo prendere un colpo brevità.

Per usarlo, lo chiami dalla riga di comando in questo modo:

PS C:\> m 3 "ab
>> cd"
>>
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Ecco la versione non minimizzata:

function f($n, $s)
{
    $s.split("`n") | % {            # split input into separate lines
        $l=""                       # initialize an output line
        $_.ToCharArray() | % {      # split line into chars
            $c=$_ ; 1..$n | % {     # add n chars to the line
                $l+=$c 
            } 
        }
        1..$n | % {$l}              # output the line n times
    }
}

2
Mazzy suggerì function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}63 byte
ovs

2

Julia, 74 caratteri / byte

julia> f(i,n)=print(prod([(prod(["$c"^n for c in l])*"\n")^3 for l in split(i)]))
f (generic function with 1 method)

julia> f("ab\ncd",3)
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

7 in meno se restituisco semplicemente la stringa. julia>è il prompt interattivo.


1
Questo è il primo golf Julia che ho visto.
cjfaure,

@Trimsty codegolf.stackexchange.com/search?q=julia è ancora molto raro, ma sono stati pochi (anche da uno dei designer del linguaggio in realtà).
plannapus,

@plannapus Interessante! C'è un nuovo, raro esolang chiamato ~ - ~! che ho usato anch'io, anche se è terribile per il golf.
cjfaure,


2

Powershell, 54 byte

param($s,$n)$s-replace'.',('$0'*$n)-split'
'|%{,$_*$n}

Script di prova:

$f = {

param($s,$n)$s-replace'.',('$0'*$n)-split'
'|%{,$_*$n}

}

@(
@"
ab
cd
"@
,
@"
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO
"@
) | % {
    &$f $_ 3
}

Spiegazione:

  • $s-replace'.',('$0'*$n) ripete ogni simbolo eccetto una nuova riga.
  • -split'``n' divide la stringa larga per una nuova riga
  • |%{,$_*$n} ripete ogni riga come elemento array e restituisce array

Il risultato è una matrice di stringhe larghe e ripetute.


2

R , 83/72 byte

Approccio alternativo usando regexps

Se è consentita una nuova riga finale, 72 byte:

function(s,n)cat(gsub("([^
]*
)",r,gsub("([^
])",r<-strrep("\\1",n),s)))

Provalo online!

Altrimenti, 83 byte:

function(s,n)write(rep(el(strsplit(gsub("([^\n])",strrep("\\1",n),s),"\n")),e=n),1)

Provalo online!



1

BrainFuck esteso : 158

{a<]<[->+}3>,>3+[->4+[-<<4->>]&a>+<<]<+[-<,[>10+[-<->>+<]<[[->>+<<]3>[->[->+&a&a#3<+>>]>>]<[-]<<]>>[>[-4<[<]>[.>]>>.>]4<[-]<[-]4>[-]]>>[->+<]>[-<+<+>>]4<+<]>]

Si trasforma in:

Brainfuck: 185

>>>,>+++[->++++[-<<---->>]<]<[->+>+<<]<+[-<,[>++++++++++[-<->>+<]<[[->>+<<]>>>[->[->+<]<[->+<]<[->+<<<+>>]>>]<[-]<<]>>[>[-<<<<[<]>[.>]>>.>]<<<<[-]<[-]>>>>[-]]>>[->+<]>[-<+<+>>]<<<<+<]>]

Richiede un interprete che ha 0 o nessuna modifica come marker EOF. beef, disponibile dai repository Ubuntu, funziona bene:

$ ( echo -n 2
> cat <<eof
> BBBB  RRRR   AAA  IIII NN  NN FFFFF * * * KK  KK
> BB BB RR RR AA AA  II  NNN NN FF      *   KK  KK
> BBBB  RRRR  AAAAA  II  NNNNNN FFFF  ***** KKKKK
> BB BB RR RR AA AA  II  NN NNN FF      *   KK  KK
> BBBB  RR RR AA AA IIII NN  NN FF    * * * KK  KK
> eof
> ) | beef double.bf
BBBBBBBB    RRRRRRRR      AAAAAA    IIIIIIII  NNNN    NNNN  FFFFFFFFFF  **  **  **  KKKK    KKKK
BBBBBBBB    RRRRRRRR      AAAAAA    IIIIIIII  NNNN    NNNN  FFFFFFFFFF  **  **  **  KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNNNN  NNNN  FFFF            **      KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNNNN  NNNN  FFFF            **      KKKK    KKKK
BBBBBBBB    RRRRRRRR    AAAAAAAAAA    IIII    NNNNNNNNNNNN  FFFFFFFF    **********  KKKKKKKKKK
BBBBBBBB    RRRRRRRR    AAAAAAAAAA    IIII    NNNNNNNNNNNN  FFFFFFFF    **********  KKKKKKKKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNN  NNNNNN  FFFF            **      KKKK    KKKK
BBBB  BBBB  RRRR  RRRR  AAAA  AAAA    IIII    NNNN  NNNNNN  FFFF            **      KKKK    KKKK
BBBBBBBB    RRRR  RRRR  AAAA  AAAA  IIIIIIII  NNNN    NNNN  FFFF        **  **  **  KKKK    KKKK
BBBBBBBB    RRRR  RRRR  AAAA  AAAA  IIIIIIII  NNNN    NNNN  FFFF        **  **  **  KKKK    KKKK

Codice EBF non registrato:

;;;; Multiply 
;;;; Takes a digit x and ASCII art on STDIN
;;;; Prints ASCI art scaled x times
;;;; Usage:
;;;; bf ebf.bf < multiply.ebf >multiply.bf
;;;; bf multiply.bf

;;; Memory map for this program
:zero
:str
:flag
:tmp
:dup    
:num

;;; Macros

;; EOL support. Comment out the body of the two 
;; macros below to only support 0 and no change
;; Some interpreters use -1
{eol_start
  +(- 
}

{eol_end 
   )
}

;; macro that reads a digit.
;; the actual number is one more than input
;; ^12 uses 3 cells from origin
{read_number
  ,                    ; read char
  ^1 3+(-^2 4+(-^ 4-)) ; reduce by 3*4*4=48
}

;; duplicate current element
;; to the left using the right as tmp
{copy_left 
  (-^1+)^1(-^0+<+)
}

;; Duplicate char n times while
;; shifting to the right
{handle_char
  $str(-$tmp+)               ; copy the char to tmp
  $dup(-$num(->+)            ; for each dup move num
        $dup(-$num+)         ; and dup one step to the right
        $tmp(-$dup+$str+)    ; and copy the char back to str and to dup
        @flag)               ; which is the new tmp (it gets shifted to the right)
  $tmp(-)                    ; clear char when done
}

{handle_linefeed
  $dup(-                     ; for each dup
    $zero[<]>                ; go to beginnning of string
    [.>]@str                 ; print string 
    $tmp.                    ; print newline
  )
  $zero[-]<[-]>@zero         ; clean last two chars
  $tmp(-)                    ; remove line feed
}


;;; Main program 

;; read number
$tmp &read_number
$tmp (-$dup+$num+)
;$tmp,[-] ; uncomment to require a newline before asci art
$flag+(-
  $str = ,
  ( ;; NB! The line containing EOF will not be printed!
    &eol_start
    $flag 10+(-$str-$tmp+)
    if $str is not linefeed (   
       &handle_char
    ) $tmp ( linefeed
       &handle_linefeed
    ) 
    $num &copy_left      ; we need two copies of the duplicate dupber
    $flag+               ; flag to 
    &eol_end
  )  
)

1

Rebol - 87 79

r: do input while[d: input][forskip d r[insert/dup d d/1 r - 1]loop r[print d]]

Versione ben formattata:

r: do input

while [d: input] [
    forskip d r [insert/dup d d/1 r - 1]
    loop r [print d]
]

Esempio di utilizzo:

rebol -qw --do 'Rebol[]r: do input while[d: input][forskip d r[insert/dup d d/1 r - 1]loop r[print d]]' <<< "3
ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

NB. Questo codice funziona solo in Rebol 2 in questo momento (la funzione INPUT utilizzata non è ancora completamente implementata in Rebol 3).


1

R , 125 byte

function(s,n,x=utf8ToInt(s),m=matrix(x[u<-x!=10],,sum(!u)+1))for(i in 1:ncol(m))cat(rep(intToUtf8(rep(m[,i],e=n)),n),sep="
")

Provalo online!

Converte la stringa in UTF8, inserisce una matrice le cui colonne sono righe di testo (rimuovendo le nuove righe), quindi ripete ogni carattere e le righe generate prima di stampare separate da nuove righe.


congratulazioni per 1K a proposito! :-)
Giuseppe,

ty :-)! È bello vedere le risposte R alla maggior parte delle domande e persino risposte multiple ad alcune domande.
JayCe

0

R - 89

M=function(I,N) cat(paste(lapply(lapply(strsplit(I,""),rep,e=N),paste,collapse=""),"\n"))

I <- c("aa  aa  aa", "bbb bbb bbb", "c c c c c c")
N <- 3

I
# aa  aa  aa
# bbb bbb bbb
# c c c c c c"

M(I,N)

# aaaaaa      aaaaaa      aaaaaa 
# bbbbbbbbb   bbbbbbbbb   bbbbbbbbb 
# ccc   ccc   ccc   ccc   ccc   ccc

Sembra interessante. Ma ricevo un errore: "Errore: impossibile trovare la funzione" str_split "”. Devo installare esplicitamente il pacchetto stringr per poter eseguire il tuo codice? (Mi dispiace, non ho familiarità con R.)
Manatwork

non manca una chiamata cata stamparlo come stdout? Inoltre, ogni elemento della stringa non deve essere ripetuto solo n volte di lunghezza, ma deve essere ripetuto anche in larghezza.
plannapus,

Puoi anche giocare a golf un po 'di più: <-può essere =, paste0qui può essere sostituito dal pastemomento che stai usando l'argomento collapse e l'argomento eachpuò essere abbreviato e. Vedi qui per alcune idee di base sul golf con R.
plannapus,

Altrimenti, è un bel tentativo (il mio tentativo più breve è ancora nei circa 200 caratteri :))
plannapus,

@manatwork ok, nessun errore più durante il caricamentostringr
petermeissner

0

MATLAB: 20 ​​caratteri

['' imresize(ans,n)]

Questa soluzione presuppone che l'immagine sia archiviata in un file chiamato startup.me che sia consentito fornire la quantità di repliche a matlab quando viene chiamata, ciò può essere fatto mediante:!matlab -r "n=3"&

MATLAB, chiama senza argomento: 23 caratteri

load;['' imresize(s,n)]

A differenza della prima soluzione, le ultime due presumono che la quantità di repliche potrebbe non essere prevista nella chiamata. Per queste soluzioni sono previsti la stringa e il numero originali in un file chiamato matlab.matnella directory corrente.

MATLAB, alternativa matematica: 27 caratteri

load;['' kron(s,ones(1,n))]

0

C # (177)

public string e(string i,int x){return string.Join("",i.Split('\n').Select(a=>string.Join("",Enumerable.Repeat(string.Join("",a.ToCharArray().Select(c=>new string(c,x))),x))));}

Si aspetta che la stringa di input "i" contenga nuove righe "\ n" come delimitatore.

formattato

public string e(string i, int x)
{
    return string.Join("", i.Split('\n').Select(a => string.Join("", Enumerable.Repeat( string.Join("", a.ToCharArray().Select(c => new string(c, x))), x))));
 }

0

CJam, 14 byte

CJam è più recente di questa sfida (e la caratteristica principale che sto usando è in realtà molto recente), quindi questa risposta non sarebbe ammissibile per essere accettata - ma non batte comunque APL, quindi ...

l~qN/1$e*fe*N*

Provalo qui.

Spiegazione

Con il nuovo e*che ripete ogni carattere di una stringa, questo è davvero semplice:

l~             e# Read and eval the scale factor.
  qN/          e# Read the rest of the input as the ASCII art and split into lines
     1$e*      e# Copy the scale factor and repeat each line by it.
         fe*   e# Repeat the characters in each line by the scale factor.
            N* e# Join with newlines.

Mi rendo conto che questa è una vecchia risposta, ma puoi salvare un byte utilizzando invece una funzione:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100 byte (Windows) non competitivi

'l' asoc
'i' asoc
i '[^
]' '%0' l rep replace '[^
]*' '%0
' l rep 'z' asoc z 1 z len 1 - sub replace

RProgN non ha caratteri di escape al momento della scrittura, il che rende qualsiasi gestione di nuove righe richiede una nuova riga fisica. Pertanto, questa risposta (e qualsiasi input) deve utilizzare CRLF, anziché solo LF. :(

Inoltre, la funzione 'rep' è stata aggiunta solo dopo l'emissione di questa sfida, in quanto tale non è competitiva.


0

Vim, 39 sequenze di tasti (escluso input, non in competizione)

il gotcha e il motivo per cui questo non è in competizione è perché l'ingresso deve essere inserito due volte. Sostituisci entrambi 2con il tuo input.

qayl2phxl@aquu:%norm @a<cr>gg0qbyy2P2jkddj@bq@b

Spiegazione

  • qayl2phxl@aquuregistra una macro che strappa un personaggio, lo incolla e passa a quello successivo, quindi si ripete. Quindi annulla le modifiche. Poiché vogliamo che il loop non sia infinito, non eliminiamo il carattere, il che significa che dobbiamo eliminare quello estraneo ma terminare comunque con un movimento che non riesce sull'ultimo carattere.
  • :%norm @a<cr> esegue la macro su ogni riga
  • gg0 ritorna all'inizio
  • qbyy2P2jkddj@bq@busa la stessa tecnica @aper copiare ogni riga, ma con una macro ricorsiva.

So che questo può essere giocato di più, ad esempio attraversando all'indietro per la duplicazione della linea, ma a causa del requisito di ingresso multiplo, mi fermerò qui e segnerò questa risposta come non competitiva.

Risposta precedente (32 battute, solo doppie)

qaylpl@aqu:%norm @a<cr>:%s/.*/&\r&<cr>

Spiegazione

  • qaylpl@aquregistra una macro che strappa un personaggio, lo incolla e passa a quello successivo, quindi si ripete. Annulla la modifica.
  • :%norm @a<cr> esegue la macro su ogni riga
  • :%s/.*/&\r&<cr> raddoppia ogni riga

Volevo fare una macro nidificata, ma quella interna (caratteri) ferma quella esterna (linee) ... Quindi devo eseguire due comandi, aggiungendo alcuni tasti a una soluzione altrimenti semplice.

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.