Ampliar arte ASCII

64

En este desafío, debe tomar el arte ASCII multilínea 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      

Y también tomará un entero como entrada. Debe generar el arte ASCII ampliado en la cantidad especificada con el entero. Por ejemplo, si utilizó un segundo argumento de 3, la salida sería

   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

Específicamente, cada carácter debe convertirse en un cuadro npor nde ese carácter, donde nestá el argumento entero. Por ejemplo, una entrada de

ab
cd

y 3 dará como resultado

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Este es el , por lo que gana el código más corto en bytes.

Pomo de la puerta
fuente
ascii art se ve interesante en la lista de preguntas
Justin
66
Creo que deberías hacer una ronda secundaria / de bonificación para un método que introduce un alias adecuado en el arte ampliado. Su arte de golf de código gigante se ve bastante bloqueado.
AmeliaBR
55
@AmeliaBR Ver aquí .
Howard

Respuestas:

37

APL, 7 caracteres / bytes *

{⍺/⍺⌿⍵}

Función que toma el número y la cadena de entrada como parámetros y devuelve el resultado:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL puede escribirse en su propio juego de
caracteres de un solo byte (heredado) que asigna símbolos APL a los valores superiores de 128 bytes. Por lo tanto, para fines de puntuación, un programa de N caracteres que solo usa caracteres ASCII y símbolos APL puede considerarse que tiene una longitud de N bytes.

Tobia
fuente
1
...: O ¿Cómo funciona?
Pomo
44
@DoorknobofSnow La representación estándar para una cadena multilínea es APL es una matriz de caracteres rectangular (con espacios en blanco finales si las líneas tienen un ancho desigual ... sí, APL es tan antigua). La /función (no debe confundirse con el /operador ... sí, el mismo símbolo ) duplica y / o elimina columnas de una matriz de acuerdo con el argumento del lado izquierdo. Si es un escalar (número simple), se replica para todas las columnas de entrada. Por 2/mlo tanto, es una matriz con todas las columnas duplicadas. La variante hace lo mismo, pero para filas (o planos del primer eje en el caso general).
Tobia
66
Hermoso lenguaje, ¿no es así? En realidad, es bastante legible, una vez que aprende unas pocas docenas de símbolos. Mucho más que los lenguajes de ruido de línea ASCII que ves por aquí ...
Tobia
Bueno. ¿Estaba ⌿ siempre en el idioma? No estaba en el libro de Gilman y Rose, y un libro de Iverson sobre APL \ 360 menciona / [1] pero no ⌿.
Mark Plotnick
2
Guau. Ese. Es. Sólo. Increíble. Soy. Severamente. Atemorizado. Por. Esta. Código. Me gustaría ofrecer más que un simple +1, pero mi reputación es bastante baja para una recompensa todavía.
Erik the Outgolfer
35

GolfScript, 20 caracteres

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

Toma todas las entradas de STDIN, la primera línea es el factor de escala, el resto la entrada de líneas múltiples. Puedes probar el ejemplo en línea .

Entrada

3
ab
cd

Salida

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)
}+/
Howard
fuente
¡Oye! Tienes un mejor formato de entrada, puntaje y tiempo que yo: - / +1
John Dvorak
Además, estoy un poco perdido al leerlo.
John Dvorak
2
@ JanDvorak Agregó alguna explicación.
Howard
Guau. Hoy he aprendido 1/. También necesito usar value function +más.
John Dvorak
2
@CoryKlein: Sería de gran ayuda si nos dijeras qué error, pero ... * mira a la bola de cristal * ... puede ser que golfscript.rbno esté marcado como ejecutable o que la primera línea tenga el camino equivocado hacia el intérprete de Ruby para su sistema Ah, y eso echodebería ser cat. Pruebe cat inputFile | ruby golfscript.rb scriptFile(o simplemente ruby golfscript.rb scriptFile < inputFile) y vea si eso funciona.
Ilmari Karonen
19

J, 20 17 caracteres

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

Define un verbo fque hace lo que se requiere. Uso:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

donde aestá la cadena de entrada
En Windows se requiere un carácter adicional para eliminar \r:

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

Explicacion :

];._2corta la cadena de entrada en trozos según el último carácter de la cadena, que en este caso será a \n. Windows ha \r\nasí que tenemos que utilizar }:para cortar un carácter adicional de descanso: }:;._2. Cortar la documentación verbal

El resto del código (con la excepción de la asignación f=.) es una bifurcación .
Se descompone así:[ #&.|: #

Si aes nuestra cadena de entrada, el cálculo será 3 # a(llamaremos a este resultado x), entonces 3 [ a(llamaremos a este resultado y) entonces y #&.|: x.

3 # asolo hace tres copias de cada miembro de a. Copiar la documentación del verbo
Esto gira

ab
cd

dentro

aaabbb
cccddd

3 [ asolo devuelve 3. Documentación del verbo izquierdo

Finalmente y #&.|: xse ycopia bajo transposición x. Los #trabajos que antes, pero el &.|:dice J para la transposición de la entrada primero y luego la transposición de nuevo cuando esté terminado. Bajo documentación de conjunción , transponer documentación verbal .

La transposición gira

aaabbb
cccddd

dentro

ac
ac
ac
bd
bd
bd

entonces la copia lo cambia a

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

y transponerlo de vuelta te da

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Gareth
fuente
44
Windows apesta, ¿eh? : P
cjfaure
@Trimsty De hecho lo hace.
Gareth
Esto es más corto: [##"1además, no estoy seguro acerca de las reglas no escritas del golf en J, pero diría que la división de la cuerda y la asignación podrían omitirse, dados los requisitos sueltos de la pregunta. Ciertamente lo hice en mi respuesta APL. Ejemplo:2 ([##"1) 'abcde',:'fghij'
Tobia
17

Haskell, 49 bytes

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

La función de ampliación es e, que toma un recuento y una cadena, y devuelve una cadena:

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

APL, 11 caracteres

@Gareth hizo esencialmente lo mismo primero, en J, por lo que esta entrada de APL es solo para exhibición, no para competencia: es el ganador.

      E←{⍉⍺/⍉⍺/⍵}

Uso: ampliación en arg izquierda (⍺), arte en forma de matriz de caracteres 2D en arg derecha (⍵).
⍺ / ⍵ replicará elementos en cada fila de un vector o matriz (2 / 'OO' se convierte en 'OO OO').
⍉⍺ / ⍉ lo transpondrá, replicará los elementos, lo transpondrá.

(Si buscáramos claridad en lugar de la duración del programa, el código podría haber sido 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
Mark Plotnick
fuente
Sin embargo, debo señalar que utilizo 5 caracteres para convertir la entrada de cadena en una matriz de caracteres, por lo que realmente solo me superas por 1 carácter. :-)
Gareth
2
J se ve obstaculizado por ese molesto objetivo de diseño en el que los operadores están restringidos al conjunto de caracteres ASCII. :)
Mark Plotnick
2
Sin embargo, si medimos en bytes como dice el OP, esto es 44 bytes (lo que implica unicode, por supuesto, no utf-8) y @ Gareth sigue siendo 17. Esa es la desventaja de los idiomas que no están restringidos a ASCII.
cjfaure
55
@Trimsty Pero APL tiene su propio conjunto de caracteres que asigna cada carácter a un solo byte, por lo que podría decirse que todavía son 11 bytes.
Volatilidad
1
@Volatility Hm. Eso es realmente extraño, lo siento, no sabía: P
cjfaure
13

Bash / sed script, 48 caracteres

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

Guardar como un script chmod +xy ejecutar:

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

¿Como funciona?

La carne de esto está en el sedcomando. Por ejemplo, si n = 3, entonces el comando sed se expande a algo como:

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

Este sedcomando compuesto se puede dividir en:

  • s/./&&&/g - este comando sustituto coincide con cada carácter y lo reemplaza con el carácter repetido 3 veces
  • 3 pcomandos: esto solo imprime todo el espacio del patrón (es decir, la línea actual) 3 veces

Pasamos -na sed para decirle que no imprima nada a menos que se le indique explícitamente, por lo que tenemos control total de lo que se imprime y cuántas veces.

No pude encontrar una forma rápida de generar cadenas repetitivas de longitud arbitraria directamente sed, así que utilicé algunos bashtrucos en su lugar:

printf -vr "%3s"

Esto imprime una cadena (no especificada, es decir, vacía), con 3 espacios iniciales, y asigna el resultado a la bashvariable r.

Luego usamos la bashexpansión de parámetros para transformar esta cadena de espacios a lo que necesitamos sustituir en la sedexpresión:

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

Pude evitar eliminar las comillas alrededor del printfespecificador de formato y la sedexpresión, ya que ninguno de los caracteres necesita escapar en el bashshell.

Número de letras:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 
Trauma digital
fuente
No tengo idea de cómo funciona, ¡pero funciona!
Tomás
1
La variable n viola la regla 1: "NO se puede codificar".
manatwork
1
Simplemente use $1y elimine n=3;, incluso guardará 4 caracteres y quizás también {}en el printf.
Tomás
Y como podemos suponer $ 1 será numérica, las comillas alrededor printfde argumentos 's no son necesarios, reduciéndolo a 52 caracteres: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
manatwork
1
@Tomas - Probablemente ya hayas descubierto cómo funciona, pero agregué una descripción en caso de que estés interesado.
Trauma digital
9

PERL,  41 39 25   22 caracteres

PERL, simple y efectivo: creado correctamente para la tarea. Cuando se invoca con -pi3, ¿dónde 3está el parámetro n:

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

Solución clásica (39 caracteres):

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

La solución clásica necesita que nse especifique en la primera línea de entrada, p. Ej.

3
ab
cd

Gracias @manatwork por el $&truco.

Tomás
fuente
1
Bueno. Pero no se necesita para capturar los caracteres coincidentes: s/./$&x$n/ge.
manatwork
8

Rubí:  64  49 caracteres

Todos los datos recibidos en STDIN: primero la línea del factor de escala, luego el art. ASCII.

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

Ejecución de muestra:

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

Asumiendo que cada línea de entrada termina con un separador de línea. Gracias a @Ventero.

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

Ejecución de muestra:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
hombre trabajando
fuente
1
Una forma más corta de configurar n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(lamentablemente, el espacio después del colon es necesario, de lo contrario el analizador se confunde). Corre con ruby -n.
Ventero
Doh Intenté docenas de enfoques para acortar la asignación a n, pero me perdí el operador ternario. Gracias @Ventero.
manatwork
6

Python 3 - 84

No es la más corta, pero una respuesta diferente. Una frase interesante.

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

Primero ingrese un número, luego el arte ASCII como una lista de Python, por ejemplo:

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

GolfScript, 29 caracteres

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

Esto define un bloque f, que cuando se llama producirá la salida deseada. Se supone que los argumentos están en la pila (porque así es básicamente como se pasan los argumentos en GolfScript).

Sin golf (¿eso tiene 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
Pomo de la puerta
fuente
5

Golfscript, 23 caracteres

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

He decidido escribir un programa completo porque tiene menos sobrecarga que incluso una función anónima:

  • ~(:i;- evalúe la entrada, luego disminuya el multiplicador, almacénelo como iy descarte.
  • n/{...}%n* - dividir por nuevas líneas, mapear cada línea, unirse por nuevas líneas
    • {...}:c%c, - tome un bloque, aplíquelo en el mapa de cada elemento, luego aplíquelo a toda la línea.
      • {.}i*- duplicar este elemento iveces

Demostración en vivo: http://golfscript.apphb.com/?c=OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

Ejemplo de uso:

;'"abc
def"3'
~(:i;n/{{{.}i*}:c%c}%n*
John Dvorak
fuente
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))

Primero, ingrese el número, luego la cadena. Debe explicarse por sí mismo ...

Gracias a Waleed Khan por sugerir eliminar el []

Gracias a Volatility por sugerir tener auna lista.

Justin
fuente
77
Me acabo de dar cuenta; la nsa está observando todas tus aportaciones
Justin
El código más corto en bytes. ¿No incluiría eso, entonces, nuevas líneas? ¿No debería ser tu cuenta 112?
cjfaure
Lo siento, quise decir 111.
cjfaure
@Trimsty tienes razón; Pensé que wordcounter.net contaba nuevas líneas.
Justin
2
Haga auna lista, haga a+=[''.join(c*n for c in s)]*n, luego haga print('\n'.join(a))al final. Eso debería funcionar.
Volatilidad
5

Java - 217

Primero intente jugar al golf. Parece que Java no es el lenguaje para hacerlo.

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

En Windows necesita reemplazar "\ n" con "\ r \ n".

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Danny
fuente
2
Los caracteres de entrada deben expandirse tanto hacia abajo como a través (por lo que debe haber 3 líneas aaabbby 3 líneas cccddden el ejemplo de salida anterior).
Gareth
2
Puede ahorrar: 1 carácter inicializando i en la declaración en lugar de for; 8 caracteres usando a en lugar de x ( a=a[1].split("\n"), y cambie todo x con a).
manatwork
3
Sí, con cualquier idioma donde solo la declaración de maintoma más bytes que programas completos en otros idiomas, los concursantes recibirán fantasmas.
Mark Plotnick
2
HM esta bien. Aquí hay 3 caracteres guardados al reorganizar un poco el outter para 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));}}
daniero
3
Otros 4 bytes: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov
5

(Editar: esta solución ahora no es válida porque la semántica de la instrucción ha cambiado. No me di cuenta de que ya había hecho uso de la instrucción cuando la cambié. Sin embargo, puede arreglar este programa simplemente cambiándolo a la nueva instrucción )

Sclipting , 19 caracteres

Espera que la entrada esté separada por \n(no \r) y que la primera línea contenga el factor multiplicador.

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

Explicación

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

Al final, la pila se verá así:

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

Todo lo que está por encima de la marca se concatena automáticamente y se emite, el resto se descarta.

Timwi
fuente
这 太 有意思 了! 你 是 原创 者 对 吧?
theGreenCabbage
@theGreenCabbage 对 了. 踢 木 外 是 这个 电脑 语言 的 创始人
Justin
1
@Timwi lo siento por llamarte 踢 木 外 (patea madera afuera, pronunciado tea-moo-why) ...
Justin
@Quincunx: Jeje, lo encontré divertido :) Pero el final ise pronuncia [iː], no [ɑi]; ¿Cómo lo escribirías en chino ahora?
Timwi
@Timwi Pensé que así es como se pronuncia (pero no podía pensar en un personaje correspondiente). Escribí buscando y copiando y pegando (en mdbg.net/chindict/chindict.php )
Justin
3

J, 7 caracteres

([#"1#)

Exactamente lo mismo que en la respuesta APL de @ Tobia, pero en caracteres ascii.

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

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  
barbermot
fuente
3

Powershell (96)

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

Pensé darle una oportunidad a esto en PS. Usando tubería en foreach (%) para mantenerlo corto aquí, pero elfunction y ToCharArrayestán haciendo que sea breve.

Para usarlo, lo llama desde la línea de comando de esta manera:

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

Aquí está la versión no 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
    }
}
jurgenb
fuente
2
Mazzy sugirió function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}por 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 si solo devuelvo la cadena. julia>es el mensaje interactivo

gggg
fuente
1
Este es el primer golf de Julia que he visto.
cjfaure
@Trimsty codegolf.stackexchange.com/search?q=julia todavía es muy raro, pero han sido algunos (incluso uno de los diseñadores del lenguaje en realidad).
plannapus
@plannapus ¡Interesante! Hay un nuevo y raro esolang llamado ~ - ~! que también he usado, aunque es terrible para el golf.
cjfaure
2

Powershell, 54 bytes

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

Script de prueba:

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

Explicación:

  • $s-replace'.',('$0'*$n) repite cada símbolo excepto una nueva línea.
  • -split'``n' divide la cadena ancha por una nueva línea
  • |%{,$_*$n} repite cada línea como un elemento de matriz y devuelve la matriz

El resultado es una serie de cadenas anchas y repetidas.

mazzy
fuente
2

R , 83/72 bytes

Enfoque alternativo utilizando expresiones regulares

Si se nos permite una nueva línea final, 72 bytes:

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

Pruébalo en línea!

De lo contrario, 83 bytes:

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

Pruébalo en línea!

J.Doe
fuente
1

K, 20

.....

{,/y#',:',/'y#'/:x} 
tmartin
fuente
1

BrainFuck extendido : 158

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

Se convierte en:

Brainfuck: 185

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

Requiere un intérprete que tenga 0 o ningún cambio como marcador EOF. beef, disponible en repositorios de Ubuntu, funciona bien:

$ ( 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 sin golf:

;;;; 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
  )  
)
Sylwester
fuente
1

Rebol - 87 79

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

Versión bien formateada:

r: do input

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

Ejemplo 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

NÓTESE BIEN. Este código solo funciona en Rebol 2 en este momento (la función INPUT utilizada aún no está completamente implementada en Rebol 3).

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

Pruébalo en línea!

Convierte una cadena a UTF8, la coloca en una matriz cuyas columnas son líneas de texto (eliminando nuevas líneas) y luego repite cada carácter y las líneas generadas antes de imprimir separadamente por nuevas líneas.

JayCe
fuente
felicidades por 1K por cierto! :-)
Giuseppe
ty :-)! Es genial ver respuestas R a la mayoría de las preguntas e incluso respuestas múltiples a algunas preguntas.
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
Petermeissner
fuente
Parece interesante. Pero recibo un error: "Error: no se pudo encontrar la función" str_split "". ¿Necesito instalar explícitamente el paquete stringr para poder ejecutar su código? (Lo siento, no estoy familiarizado con R.)
manatwork
¿no le falta una llamada catpara imprimirlo como stdout? Además, cada elemento de la cadena no solo debe repetirse n veces sino también repetirse en amplitud.
plannapus
También puede jugar un poco más a su función: <-puede ser =, paste0puede reemplazarse aquí pasteya que de todos modos está utilizando el argumento de colapso y el argumento eachpuede acortarse e. Vea aquí algunas ideas básicas sobre golf con R.
plannapus
De lo contrario, es un buen intento (mi intento más corto todavía está en los 200 caracteres más o menos :))
plannapus
@manatwork ok, ya no hay error sin cargarstringr
petermeissner
0

MATLAB: 20 ​​caracteres

['' imresize(ans,n)]

Esta solución supone que la imagen se almacena en un archivo llamado startup.my que se le permite dar la cantidad de réplicas a matlab cuando se llama, esto se puede hacer por medio de:!matlab -r "n=3"&

MATLAB, llamada sin argumento: 23 caracteres

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

A diferencia de la primera solución, las dos últimas suponen que la cantidad de repeticiones puede no esperarse en la llamada. Para estas soluciones, la cadena y el número originales se esperan en un archivo llamadomatlab.mat en su directorio actual.

MATLAB, alternativa matemática: 27 caracteres.

load;['' kron(s,ones(1,n))]
Dennis Jaheruddin
fuente
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 la cadena de entrada "i" que contiene nuevas líneas "\ n" como delimitador.

Formateado

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))));
 }
microbiano
fuente
0

CJam, 14 bytes

CJam es más nuevo que este desafío (y la característica principal que estoy usando es realmente muy reciente), por lo que esta respuesta no sería elegible para ser aceptada, pero de todos modos no está superando a APL, así que ...

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

Pruébalo aquí.

Explicación

Con el nuevo e*que repite cada carácter en una cadena, esto es realmente sencillo:

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.
Martin Ender
fuente
Me doy cuenta de que esta es una respuesta antigua, pero puede guardar un byte usando una función en su lugar:{N/1$fe*e*N*}
Esolanging Fruit
0

RProgN 100 Bytes (Windows) No compite

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

RProgN no tiene escapes de caracteres al momento de la escritura, lo que hace que cualquier manejo de nuevas líneas requiera una nueva línea física. Como tal, esta respuesta (y cualquier entrada) tiene que usar CRLF, en lugar de solo LF. :(

Además, la función 'rep' solo se agregó después de que se emitió este desafío, por lo que no es competitiva.

Un taco
fuente
0

Vim, 39 pulsaciones de teclas (excluyendo entrada, no compitiendo)

El problema y la razón por la que esto no compite es porque la entrada debe ingresarse dos veces. Reemplace ambos 2con su propia entrada.

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

Explicación

  • qayl2phxl@aquugraba una macro que tira de un personaje, lo pega y pasa al siguiente, luego se reproduce a sí mismo. Luego deshace los cambios. Como queremos que el bucle no sea infinito, no eliminamos el carácter, lo que significa que tenemos que eliminar el extraño, pero aún así terminamos con un movimiento que falla en el último carácter.
  • :%norm @a<cr> ejecuta la macro en cada línea
  • gg0 vuelve al principio
  • qbyy2P2jkddj@bq@busa la misma técnica que @apara copiar cada línea, pero con una macro recursiva.

Sé que esto se puede jugar más, por ejemplo, atravesando hacia atrás para la duplicación de líneas, pero debido al requisito de entrada de entrada múltiple, me detendré allí y marcaré esta respuesta como no competitiva.

Respuesta anterior (32 pulsaciones de teclas, solo dobles)

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

Explicación

  • qaylpl@aqugraba una macro que tira de un personaje, lo pega y pasa al siguiente, luego se reproduce a sí mismo. Deshacer el cambio.
  • :%norm @a<cr> ejecuta la macro en cada línea
  • :%s/.*/&\r&<cr> duplica cada línea

Quería hacer una macro anidada, pero la interna (caracteres) detiene la externa (líneas) ... Así que tengo que ejecutar dos comandos, agregando bastantes pulsaciones de teclas a una solución simple.

Christian Rondeau
fuente