Ampliar arte ASCII


64

Neste desafio, você deve usar a arte ASCII com várias linhas como entrada, como:

 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 você também terá um número inteiro como entrada. Você deve produzir a arte ASCII ampliada pela quantidade especificada com o número inteiro. Por exemplo, se você usasse um segundo argumento de 3, a saída seria

   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

Especificamente, cada personagem deve se transformar em um npor ncaixa desse personagem, onde né o argumento inteiro. Por exemplo, uma entrada de

ab
cd

e 3 resultará em

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Isso é , então o código mais curto em bytes vence.


arte ascii parece interessante na lista de perguntas
Justin

6
Eu acho que você deve fazer uma rodada secundária / bônus para um método que introduz um apelido adequado na arte ampliada. Sua arte gigante de código de golfe parece bastante irregular.
AmeliaBR 28/01

5
@AmeliaBR Veja aqui .
Howard

Respostas:


37

APL, 7 caracteres / bytes *

{⍺/⍺⌿⍵}

Função que usa o número e a string de entrada como parâmetros e retorna o resultado:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL pode ser escrito na sua própria (legado) de conjunto de caracteres de byte único que mapeia símbolos APL para os 128 valores de bytes superiores. Portanto, para fins de pontuação, um programa de N caracteres que usa apenas caracteres ASCII e símbolos APL pode ser considerado como N bytes.


11
...: O Como isso funciona?
Maçaneta

4
@DoorknobofSnow A representação padrão para uma string de múltiplas linhas é APL é uma matriz de caracteres retangular (com espaços em branco se as linhas têm largura desigual ... sim, APL é que velho.) A /função (para não ser confundido com o /operador ... sim, mesmo símbolo ) duplica e / ou remove colunas de uma matriz de acordo com o argumento do lado esquerdo. Se esse é um escalar (número simples), é replicado para todas as colunas de entrada. Portanto, 2/mé uma matriz com todas as colunas dobradas. A variante faz o mesmo, mas para linhas (ou planos de primeiro eixo no caso geral).
Tobia

6
Linguagem bonita, não é? Na verdade, é bastante legível, depois de aprender algumas dezenas de símbolos. Muito mais do que os ASCII línguas linha de ruído que você vê por aqui ...
Tobia

Legal. Sempre esteve no idioma? Não estava no livro de Gilman e Rose, e um livro de Iverson sobre APL \ 360 menciona / [1], mas não ⌿.
Mark Plotnick

2
Uau. Naquela. É. Somente. Impressionante. Eu sou. Severamente. Surpreendido. Por. Este. Código. Gostaria de oferecer mais do que um mero +1, mas meu representante ainda é bastante baixo para uma recompensa.
Erik the Outgolfer

35

GolfScript, 20 caracteres

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

Pega toda a entrada do STDIN, a primeira linha é o fator de escala e o restante a entrada de múltiplas linhas. Você pode tentar o exemplo online .

Entrada

3
ab
cd

Resultado

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Código

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)
}+/

Ei! Você tem um formato de entrada, pontuação e tempo melhores do que eu: - / +1
John Dvorak

Além disso, estou meio perdido lendo.
John Dvorak

2
@JanDvorak Adicionou alguma explicação.
Howard

Uau. Hoje eu aprendi 1/. Eu também preciso usar value function +mais.
John Dvorak

2
@CoryKlein: Seria útil se você nos dissesse qual erro, mas ... * olha para a bola de cristal * ... pode ser que golfscript.rbnão esteja marcado como executável ou que a primeira linha tenha o caminho errado para o intérprete Ruby para o seu sistema. Ah, e echopresumivelmente deveria ser cat. Tente cat inputFile | ruby golfscript.rb scriptFile(ou apenas ruby golfscript.rb scriptFile < inputFile) e veja se isso funciona.
Ilmari Karonen

19

J, 20 17 caracteres

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

Define um verbo fque faz o que é necessário. Uso:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

onde aé a string de entrada.
No Windows, é necessário um caractere extra para remover \r:

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

Explicação :

];._2divide a string de entrada em partes com base no último caractere da string, que neste caso será a \n. Windows foi \r\npor isso precisamos usar }:para cortar um caractere extra off: }:;._2. Recortar documentação de verbos

O restante do código (com exceção da atribuição f=.) é uma bifurcação .
Ele se divide assim:[ #&.|: #

Se afor nossa string de entrada, o cálculo será 3 # a(chamaremos esse resultado x) e, em seguida 3 [ a(chamaremos esse resultado y) y #&.|: x.

3 # aapenas faz três cópias de cada membro do a. Copiar documentação do verbo
Isso vira

ab
cd

para dentro

aaabbb
cccddd

3 [ ajust return 3. Documentação do verbo esquerdo

Finalmente y #&.|: xé ycopiar em transposição x. As #obras de antes, mas o &.|:diz J para transpor a entrada em primeiro lugar e, em seguida, transpô-la de volta quando terminar. Na documentação conjunta , transponha a documentação do verbo .

A transposição gira

aaabbb
cccddd

para dentro

ac
ac
ac
bd
bd
bd

então a cópia muda para

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

e transpor de volta dá a você

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
O Windows é péssimo, não é? : P
cjfaure 27/01

@ Trimsty De fato, sim.
Gareth

Isso é mais curto: [##"1além disso, não tenho certeza sobre as regras não escritas do golfe em J, mas eu diria que a divisão de cordas e a atribuição podem ser omitidas, dados os requisitos frouxos da pergunta. Certamente o fiz na minha resposta da APL. Exemplo:2 ([##"1) 'abcde',:'fghij'
Tobia 21/01

17

Haskell, 49 bytes

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

A função de aumento é e, que recebe uma contagem e uma sequência e retorna uma sequência:

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

15

APL, 11 caracteres

@Gareth fez essencialmente a mesma coisa primeiro, em J, então essa inscrição no APL é apenas para exibição, não para competição - ele é o vencedor.

      E←{⍉⍺/⍉⍺/⍵}

Uso: ampliação em arg esquerdo (⍺), arte na forma de uma matriz de 2d caracteres em arg direito (⍵).
⍺ / ⍵ replicará elementos em cada linha de um vetor ou matriz (2 / 'OO' se torna 'OO OO').
⍉⍺ / ⍉ irá transpor isso, replicar os elementos, transpor isso.

(Se buscássemos clareza em vez do tamanho do programa, o código poderia ser 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

Devo ressaltar, porém, que eu uso 5 caracteres transformando a entrada de string em uma matriz de caracteres, para que você me derrote apenas 1 caractere. :-)
Gareth

2
J é prejudicado por esse objetivo de design irritante no qual os operadores são restritos ao conjunto de caracteres ASCII. :)
Mark Plotnick

2
No entanto, se medirmos em bytes como o OP disse, isso é 44 bytes (implicando, é claro, unicode, não utf-8) e o @ Gareth ainda é 17. Essa é a desvantagem para idiomas que não são restritos ao ASCII.
Cjfaure

5
@ Trimsty Mas a APL tem seu próprio conjunto de caracteres que mapeia cada caractere para um único byte, então, sem dúvida, isso ainda tem 11 bytes.
Volatilidade

11
@Volatility Hm. Isso é realmente estranho, desculpe, não sabia: P
cjfaure

13

Script Bash / sed, 48 caracteres

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

Salve como um script chmod +xe execute:

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

Como funciona?

A carne disso está no sedcomando. Por exemplo, se n = 3, o comando sed será expandido para algo como:

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

Este sedcomando composto pode ser dividido em:

  • s/./&&&/g - este comando substituto corresponde a cada caractere e o substitui pelo caractere repetido 3 vezes
  • pComandos 3x - apenas imprime todo o espaço do padrão (ou seja, a linha atual) 3 vezes

Passamos -nao sed para dizer a ele para não imprimir nada, a menos que seja explicitamente solicitado, para que tenhamos controle total do que é impresso e quantas vezes.

Não consegui descobrir uma maneira rápida de gerar seqüências repetitivas de comprimento arbitrário diretamente sed, então usei alguns bashtruques:

printf -vr "%3s"

Isso imprime uma string (não especificada, ou seja, vazia), com 3 espaços à esquerda, e atribui o resultado à bashvariável r.

Em seguida, usamos a bashexpansão de parâmetro para transformar essa sequência de espaços no que precisamos substituir na sedexpressão:

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

Consegui me livrar da remoção de aspas em torno do printfespecificador de formato e da sedexpressão, pois nenhum dos caracteres dentro precisa escapar no bashshell.

Contador de caracteres:

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

Eu não tenho uma idéia de como isso funciona, mas funciona!
Tomas

11
A variável n viola a regra 1: "NÃO pode ser codificado".
precisa saber é

11
Basta usar $1e remover n=3;, você ainda salvará 4 caracteres e talvez também {}na impressão.
Tomas

E como podemos assumir US $ 1 será numérico, as cotações em torno printfde argumentos 's não são necessários, reduzindo-a a 52 caracteres: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
manatwork

11
@ Tomas - Você provavelmente já descobriu como funciona até agora, mas adicionei uma descrição para o caso de você estar interessado.
Digital Trauma

9

PERL,  41 39 25   22 caracteres

PERL, simples e eficaz - criado para a tarefa. Quando chamado com -pi3, onde 3está o parâmetro n:

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

Solução clássica (39 caracteres):

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

A solução clássica precisa nser especificada na primeira linha de entrada, por exemplo

3
ab
cd

Obrigado @manatwork pelo $&truque.


11
Legal. Mas você não precisa para capturar os caracteres casada: s/./$&x$n/ge.
precisa saber é

8

Ruby:  64  49 caracteres

Todos os dados recebidos no STDIN: primeira linha do fator de escala, depois a arte ASCII.

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

Exemplo de execução:

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

Ruby:  44  41 caracteres

Supondo que cada linha de entrada seja finalizada com separador de linhas. Graças a @Ventero.

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

Exemplo de execução:

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

11
Uma maneira mais curta de definir n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(infelizmente, o espaço após os dois pontos é necessário, caso contrário, o analisador fica confuso). Corra com ruby -n.
Ventero

Doh. Tentei dezenas de abordagens para reduzir a tarefa para n, mas senti falta do operador ternário. Obrigado, @Ventero.
manatwork

6

Python 3- 84

Não é a resposta mais curta, mas uma resposta diferente, no entanto. Um one-liner interessante.

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

Coloque primeiro um número, depois a arte ASCII como uma lista Python, por exemplo:

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 caracteres

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

Isso define um bloco fque, quando chamado, produzirá a saída desejada. Ele assume que os argumentos estão na pilha (porque é basicamente assim que os argumentos são passados ​​no GolfScript).

Ungolfed (isso faz algum sentido?: 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 caracteres

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

Eu decidi escrever um programa inteiro porque ele tem menos sobrecarga do que uma função anônima:

  • ~(:i;- avalie a entrada e depois diminua o multiplicador, armazene-o como ie descarte-o.
  • n/{...}%n* - divida por novas linhas, mapeie cada linha, junte-se por novas linhas
    • {...}:c%c, - pegue um bloco, aplique-o no mapa - cada elemento e aplique-o a toda a linha.
      • {.}i*- duplicar esse elemento ivezes

Demonstração ao vivo: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Exemplo de uso:

;'"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))

Primeiro, insira o número e a sequência. Deve ser auto-explicativo ...

Agradecemos a Waleed Khan por sugerir a remoção do []

Obrigado ao Volatility por sugerir auma lista.


7
Apenas notei; a NSA está olhando seu cada entrada
Justin

Código mais curto em bytes. Isso não incluiria novas linhas? Sua contagem não deveria ser 112?
precisa saber é o seguinte

Desculpe, eu quis dizer 111.
cjfaure

@Trimsty você está certo; Eu pensei que o wordcounter.net contava novas linhas.
Justin

2
Faça auma lista, faça a+=[''.join(c*n for c in s)]*ne faça print('\n'.join(a))no final. Isso deve funcionar.
Volatilidade

5

Java - 217

Primeira tentativa de golfe. Parece que Java não é a linguagem para fazê-lo.

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

No Windows, você precisa substituir "\ n" por "\ r \ n".

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

2
Os caracteres de entrada precisam se expandir para baixo e para além (portanto, deve haver 3 linhas aaabbbe 3 linhas cccdddno exemplo de saída acima).
Gareth

2
Você pode poupar: 1 caractere inicializando i na declaração em vez de for; 8 caracteres usando a em vez de x ( a=a[1].split("\n")e altere todos os x com a).
manatwork

3
Sim, com qualquer idioma em que apenas a declaração mainuse mais bytes do que programas inteiros em outros idiomas, os concorrentes receberão truques.
precisa saber é o seguinte

2
HM OK. Aqui estão 3 caracteres salvos, reorganizando um pouco o loop 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));}}
externo

3
Outros 4 bytes: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov

5

(Edit: Esta solução agora é inválida porque a semântica da instrução foi alterada. Eu não sabia que já tinha feito uso da instrução quando a mudei. Você pode, no entanto, corrigir o programa simplesmente alterando-o para as instruções mais recentes .)

Sclipting , 19 caracteres

Espera que a entrada seja separada por \n(não \r) e a primeira linha para conter o fator de multiplicação.

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

Explicação

겠坼 | 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

No final, a pilha ficará assim:

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

Tudo acima da marca é automaticamente concatenado e emitido, o restante descartado.


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

@theGreenCabbage 对 了. Por exemplo,
Justin

11
@Timwi pena de chamá-lo踢木外(chute de madeira do lado de fora, pronunciou-chá-moo por isso) ...
Justin

@Quincunx: Hehe, eu achei engraçado :) Mas a final ié pronunciada [iː], não [ɑi]; como você escreveria em chinês agora?
Timwi 30/01

@ Timwi Pensei que era assim que se pronuncia (mas não conseguia pensar em um personagem correspondente). Eu escrevi por pesquisar e copiar-colar (em mdbg.net/chindict/chindict.php )
Justin

3

J, 7 caracteres

([#"1#)

Exatamente a mesma coisa que na resposta APL do @ Tobia, mas em caracteres 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}}}

Pensei que eu daria uma chance no PS. Usando a tubulação no foreach (%) para mantê-lo curto aqui, mas o functione ToCharArrayestá fazendo com que seja preciso um pouco de brevidade.

Para usá-lo, você o chama na linha de comando, assim:

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

Aqui está a versão não minimizada:

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 sugerido function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}para 63 bytes
ovs

2

Julia, 74 caracteres / bytes

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 menos se eu apenas devolver a corda. julia>é o prompt interativo.


11
Este é o primeiro golfe de Julia que eu já vi.
Cjfaure

@Trimsty codegolf.stackexchange.com/search?q=julia ainda é muito raro, mas foram poucos (inclusive por um dos designers da linguagem).
precisa saber é o seguinte

@plannapus Interessante! Há um novo e raro esolang chamado ~ - ~! que eu usei também, embora seja terrível para o golfe.
Cjfaure


2

Powershell, 54 bytes

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

Script de teste:

$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
}

Explicação:

  • $s-replace'.',('$0'*$n) repete cada símbolo, exceto uma nova linha.
  • -split'``n' divide a cadeia larga por nova linha
  • |%{,$_*$n} repete cada linha como um elemento da matriz e retorna a matriz

O resultado é uma matriz de seqüências amplas e repetidas.


2

R , 83/72 bytes

Abordagem Alt usando regexps

Se for permitida uma nova linha à direita, 72 bytes:

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

Experimente online!

Caso contrário, 83 bytes:

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

Experimente online!



1

BrainFuck estendido : 158

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

Acontece em:

Brainfuck: 185

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

Requer um intérprete que tenha 0 ou nenhuma alteração como marcador EOF. beef, disponível nos repositórios Ubuntu, funciona swell:

$ ( 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

Código EBF não destruído:

;;;; 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]]

Versão bem formatada:

r: do input

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

Exemplo de uso:

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 Esse código funciona apenas no Rebol 2 no momento (a função INPUT usada ainda não está totalmente implementada no Rebol 3).


1

R , 125 bytes

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="
")

Experimente online!

Converte a string em UTF8, coloca em uma matriz cujas colunas são linhas de texto (removendo novas linhas) e repete cada caractere e as linhas geradas antes de imprimir separado por novas linhas.


parabéns em 1K por sinal! :-)
Giuseppe

ty :-)! É ótimo ver respostas R para a maioria das perguntas e até várias respostas para algumas perguntas.
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

Parece interessante. Mas recebo um erro: "Erro: não foi possível encontrar a função" str_split "". Preciso instalar explicitamente o pacote stringr para poder executar seu código? (Desculpe, não estão familiarizados com R.)
manatwork

não está faltando uma chamada catpara imprimi-la como stdout? Além disso, cada elemento da cadeia de caracteres não deve apenas ser repetido n vezes, mas também em largura.
plannapus

Você também pode aprimorar sua função um pouco mais: <-pode ser =, paste0pode ser substituído aqui, pastepois você está usando o argumento de recolhimento de qualquer maneira e o argumento eachpode ser reduzido para e. Veja aqui algumas idéias básicas sobre golfe com R.
plannapus

Caso contrário, é uma tentativa agradável (minha própria tentativa mais curto ainda está em 200 caracteres ou menos :))
plannapus

@manatwork ok, não há mais erro no carregamentostringr
petermeissner

0

MATLAB: 20 ​​caracteres

['' imresize(ans,n)]

Esta solução pressupõe que a imagem seja armazenada em um arquivo chamado startup.me que seja permitido atribuir a quantidade de replicações ao matlab ao chamá-lo, isso pode ser feito por meio de:!matlab -r "n=3"&

MATLAB, chamada sem argumento: 23 caracteres

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

Diferentemente da primeira solução, as duas últimas assumem que a quantidade de replicações pode não ser esperada na chamada. Para essas soluções, a seqüência e o número originais são esperados em um arquivo chamado matlab.matem seu diretório atual.

MATLAB, alternativa matemática: 27 caracteres

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

Espera a sequência de entrada "i" contendo novas linhas "\ n" como delimitador.

Formatado

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 bytes

O CJam é mais recente que esse desafio (e o principal recurso que estou usando é realmente muito recente), portanto, essa resposta não seria elegível para ser aceita - mas, de qualquer maneira, não está superando o APL, então ...

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

Teste aqui.

Explicação

Com o novo e*que repete cada caractere em uma string, isso é realmente simples:

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.

Sei que essa é uma resposta antiga, mas você pode salvar um byte usando uma função:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100 bytes (Windows) não concorrentes

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

O RProgN não possui escapes de caracteres desde a gravação, o que faz com que qualquer tratamento de novas linhas exija uma nova linha física. Como tal, esta resposta (e qualquer entrada) deve usar CRLFs, em vez de apenas LFs. :(

Além disso, a função 'rep' foi adicionada apenas depois que esse desafio foi lançado, portanto, isso não é concorrente.


0

Vim, 39 pressionamentos de tecla (excluindo entrada, não competindo)

a pegadinha e a razão pela qual isso não está competindo é porque a entrada deve ser inserida duas vezes. Substitua ambos 2por sua própria entrada.

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

Explicação

  • qayl2phxl@aquugrava uma macro que puxa um caractere, cola-o e passa para o próximo e, em seguida, se reproduz novamente. Em seguida, desfaz as alterações. Como queremos que o loop não seja infinito, não excluímos o caractere, o que significa que precisamos excluir o estranho, mas ainda finalizamos com um movimento que falha no último caractere.
  • :%norm @a<cr> executa a macro em todas as linhas
  • gg0 retorna ao começo
  • qbyy2P2jkddj@bq@busa a mesma técnica @apara copiar todas as linhas, mas com uma macro recursiva.

Sei que isso pode ser mais complicado, por exemplo, retrocedendo para duplicação de linha, mas devido ao requisito de entrada múltipla de entrada, pararei por aí e marcarei esta resposta como não concorrente.

Resposta anterior (32 pressionamentos de tecla, apenas dobra)

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

Explicação

  • qaylpl@aqugrava uma macro que puxa um caractere, cola-o e passa para o próximo e, em seguida, se reproduz novamente. Desfazer a alteração.
  • :%norm @a<cr> executa a macro em todas as linhas
  • :%s/.*/&\r&<cr> dobra cada linha

Eu queria fazer uma macro aninhada, mas a interna (caracteres) para a externa (linhas) ... Então, eu tenho que executar dois comandos, adicionando algumas teclas para uma solução simples.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.