Agrandir l'art ASCII

64

Dans ce défi, vous devez prendre comme source l'art ASCII multiligne, tel que:

 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      

Et vous allez aussi prendre un entier en entrée. Vous devez générer l’art ASCII agrandi du montant spécifié avec l’entier. Par exemple, si vous utilisiez un deuxième argument de 3, le résultat serait:

   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

Plus précisément, chaque caractère doit se transformer en une boîte nby nde ce caractère, où nest l'argument entier. Par exemple, une entrée de

ab
cd

et 3 entraîneront

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

C'est le , donc le code le plus court en octets gagne.

Poignée de porte
la source
L'art ascii semble intéressant sur la liste des questions
Justin
6
Je pense que vous devriez faire un tour secondaire / bonus pour une méthode qui introduit un aliasing approprié dans l’art élargi. Votre art de code de golf géant est plutôt bluffant.
AmeliaBR
5
@AmeliaBR Voir ici .
Howard

Réponses:

37

APL, 7 caractères / octets *

{⍺/⍺⌿⍵}

Fonction qui prend le nombre et la chaîne d'entrée en tant que paramètres et renvoie le résultat:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL peut être écrit dans son propre jeu de caractères codé sur un octet (existant) qui mappe les symboles APL sur les valeurs supérieures à 128 octets. Par conséquent, aux fins de la notation, un programme de N caractères qui utilise uniquement des caractères ASCII et des symboles APL peut être considéré comme ayant une longueur de N octets.

Tobia
la source
1
...: O Comment ça marche?
Poignée de porte
4
@DoorknobofSnow La représentation standard d'une chaîne multiligne est APL est une matrice de caractères rectangulaire (avec des espaces en fin de chaîne si les lignes ont une largeur inégale… oui, APL est si ancienne.) La /fonction (à ne pas confondre avec l' /opérateur… oui, même symbole ) duplique et / ou supprime les colonnes d’une matrice selon l’argument de gauche. S'il s'agit d'un scalaire (nombre simple), il est répliqué pour toutes les colonnes en entrée. Par conséquent, 2/mest une matrice avec toutes les colonnes doublées. La variante fait la même chose, mais pour les lignes (ou les plans du premier axe dans le cas général).
Tobia
6
Belle langue, n'est-ce pas? C'est en fait assez lisible, une fois que vous avez appris quelques dizaines de symboles. Beaucoup plus que les langages de bruit de ligne ASCII que vous voyez ici…
Tobia
Cool. Est-ce que était toujours dans la langue? Ce n'était pas dans le livre de Gilman et Rose, et un livre d'Iverson sur APL \ 360 mentionne / [1] mais pas.
Mark Plotnick le
2
Sensationnel. Cette. Est. Juste. Impressionnant. Je suis. Gravement. Awestruck. Par. Cette. Code. Je voudrais offrir plus qu'un simple +1, mais mon représentant est assez faible pour une prime pour le moment.
Erik the Outgolfer
35

GolfScript, 20 caractères

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

Prend toutes les entrées de STDIN, la première ligne est le facteur de mise à l'échelle, le reste, l'entrée multiligne. Vous pouvez essayer l'exemple en ligne .

Contribution

3
ab
cd

Sortie

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

Code

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
la source
Hey! Vous avez un meilleur format d'entrée, score et temps que moi: - / +1
John Dvorak
De plus, je suis un peu perdu à le lire.
John Dvorak
2
@JanDvorak Ajout de quelques explications.
Howard
Sensationnel. Aujourd'hui j'ai appris 1/. J'ai aussi besoin d'utiliser value function +plus.
John Dvorak
2
@CoryKlein: Cela aiderait si vous nous disiez quelle erreur, mais ... * regarde dans une boule de cristal * ... il se peut que ce golfscript.rbne soit pas marqué comme exécutable, ou que la première ligne ait le mauvais chemin vers l'interprète Ruby pour votre système. Oh, et cela echodevrait être probablement cat. Essayez cat inputFile | ruby golfscript.rb scriptFile(ou juste ruby golfscript.rb scriptFile < inputFile) et voyez si cela fonctionne.
Ilmari Karonen
19

J, 20 17 caractères

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

Définit un verbe fqui fait ce qui est requis. Usage:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

aest la chaîne d'entrée.
Sous Windows, un caractère supplémentaire est requis pour supprimer \r:

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

Explication :

];._2coupe la chaîne d'entrée en morceaux en fonction du dernier caractère de la chaîne, qui dans ce cas sera un \n. Windows a \r\ndonc nous devons utiliser }:pour couper un caractère supplémentaire de: }:;._2. Couper la documentation du verbe

Le reste du code (à l'exception de l'affectation f=.) est un fork .
Il se décompose comme ceci:[ #&.|: #

Si aest notre chaîne d'entrée le calcul sera 3 # a(nous appellerons ce résultat x), alors 3 [ a(nous appellerons ce résultat y) alors y #&.|: x.

3 # afait juste trois copies de chaque membre de a. Copier la documentation du verbe
Ce tourne

ab
cd

dans

aaabbb
cccddd

3 [ aretourne juste 3. Documentation du verbe gauche

Enfin y #&.|: xest ycopie sous Transpose x. Le #fonctionne comme avant, mais le &.|:dit à J de transposer l’entrée d’abord puis de la transposer une fois terminée. Sous documentation de transposition , transposez la documentation du verbe .

La transposition tourne

aaabbb
cccddd

dans

ac
ac
ac
bd
bd
bd

alors la copie le change en

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

et en le transposant vous donne

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Gareth
la source
4
Windows est nul, hein? : P
cjfaure
@ Trimsty En effet, c'est le cas.
Gareth
C'est plus court: [##"1je ne suis pas sûr non plus des règles non écrites du golf en J, mais je dirais que le dédoublement des chaînes et l'assignation pourraient être omis, étant donné les exigences peu claires de la question. Je l'ai certainement fait dans ma réponse APL. Exemple:2 ([##"1) 'abcde',:'fghij'
Tobia
17

Haskell, 49 octets

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

La fonction agrandir est e, qui prend un compte et une chaîne, et retourne une chaîne:

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

APL, 11 caractères

@Gareth a essentiellement fait la même chose en premier, en J, donc cette inscription APL est juste pour une exposition, pas pour une compétition - il est le vainqueur.

      E←{⍉⍺/⍉⍺/⍵}

Utilisation: grossissement dans l'argument de gauche (), art sous la forme d'une matrice de caractères 2d dans l'arg de droite ().
⍺ / ⍵ répliquera les éléments sur chaque ligne d'un vecteur ou d'une matrice (2 / 'OO' devient 'OO OO').
⍉⍺ / ⍉ transposera cela, répliquera les éléments, transposera cela.

(Si nous visions la clarté au lieu de la longueur du programme, le code aurait pu être 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
la source
Je dois cependant souligner que j'utilise 5 caractères pour transformer l'entrée de chaîne en tableau de caractères, de sorte que vous ne me battez que d'un caractère. :-)
Gareth
2
J est entravé par cet objectif de conception fastidieux dans lequel les opérateurs sont limités au jeu de caractères ASCII. :)
Mark Plotnick
2
Bien que, si nous mesurons en octets comme indiqué par le PO, il s’agit de 44 octets (ce qui implique unicode bien sûr, pas utf-8) et celui de @ Gareth est toujours 17. C’est l’inconvénient des langages qui ne sont pas limités à ASCII.
cjfaure
5
@Trimsty Mais APL a son propre jeu de caractères qui mappe chaque caractère à un seul octet. Il est donc possible que ce soit toujours 11 octets.
Volatilité
1
@Volatility Hm. C'est vraiment bizarre, désolé, je ne savais pas: P
cjfaure Le
13

Script Bash / sed, 48 caractères

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

Enregistrez en tant que script chmod +xet exécutez:

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

Comment ça marche?

La viande en est dans la sedcommande. Par exemple, si n = 3, la commande sed est étendue à quelque chose comme:

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

Cette sedcommande composée peut être divisée en:

  • s/./&&&/g - cette commande de substitution correspond à chaque caractère et le remplace par le caractère répété 3 fois
  • pCommandes 3x - ceci imprime simplement 3 fois tout l'espace du motif (c'est-à-dire la ligne courante)

Nous passons -nà sed pour lui dire de ne rien imprimer sauf indication explicite, nous avons donc le contrôle total sur ce qui est imprimé et combien de fois.

Je ne pouvais pas trouver un moyen rapide de générer des chaînes de répétition de longueur arbitraire directement dans sed, donc j'ai utilisé quelques bashastuces à la place:

printf -vr "%3s"

Ceci imprime une chaîne (non spécifiée, c'est-à-dire vide), avec 3 espaces de début, et affecte le résultat à la bashvariable r.

Nous utilisons ensuite le bashparamètre expansion pour transformer cette chaîne d'espaces en éléments à substituer dans l' sedexpression:

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

J'ai réussi à supprimer les guillemets autour du printfspécificateur de format et de l' sedexpression, car aucun des caractères qu'il contient ne doit s'échapper dans le bashshell.

Nombre de caractères:

$ submission='r=`printf %$1s`
> sed -n s/./${r// /&}/g${r// /;p}'
$ echo ${#submission}
48
$ 
Trauma numérique
la source
Je ne sais pas comment ça marche mais ça marche!
Tomas
1
La variable n enfreint la règle 1: «Ne peut PAS être codé en dur».
manatwork
1
Il suffit d’utiliser $1et de supprimer n=3;, vous enregistrez même 4 caractères et peut-être aussi {}le printf.
Tomas
Et comme on peut supposer 1 $ sera numérique, les guillemets autour printfdes arguments de ne sont pas nécessaires, ce qui réduit à 52 caractères: r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}".
Manatwork
1
@Tomas - Vous avez probablement déjà compris comment cela fonctionne, mais j'ai ajouté une description au cas où cela vous intéresserait.
Digital Trauma
9

PERL,  41 39 25   22 caractères

PERL, simple et efficace - créé pour la tâche. Lorsqu'il est appelé avec -pi3, où 3est le paramètre n:

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

Solution classique (39 caractères):

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

La solution classique a besoin de nest spécifiée dans la première ligne, par exemple

3
ab
cd

Merci @ Manatwork pour le $&truc.

Tomas
la source
1
Cool. Mais vous ne devez saisir les caractères correspondants: s/./$&x$n/ge.
manatwork
8

Ruby:  64  49 caractères

Toutes les données reçues sur STDIN: première ligne le facteur de mise à l'échelle, puis l'art ASCII.

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

Échantillon échantillon:

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 caractères

En supposant que chaque ligne d’entrée se termine par un séparateur de ligne. Merci à @Ventero.

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

Échantillon échantillon:

bash-4.2$ ruby -ne '$.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n' <<< '3
> ab
> cd'
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
homme au travail
la source
1
Un moyen plus court pour définir n: $.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n(malheureusement, l'espace après le côlon est nécessaire, sinon l'analyseur devient confus). Courez avec ruby -n.
Ventero
Doh. J'ai essayé des dizaines d'approches pour raccourcir la tâche à n, mais j'ai raté l'opérateur ternaire. Merci, @Ventero.
Manatwork
6

Python 3 - 84

Pas la plus courte mais une réponse différente néanmoins. Un one-liner intéressant.

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

Ajoutez d'abord un nombre, puis l'art ASCII sous forme de liste Python, par exemple:

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

GolfScript, 29 caractères

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

Ceci définit un bloc fqui, lorsqu'il est appelé, produira la sortie souhaitée. Cela suppose que les arguments sont sur la pile (car c'est essentiellement ainsi que les arguments sont passés dans GolfScript).

Ungolfed (cela a-t-il même un sens?: 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
Poignée de porte
la source
5

Golfscript, 23 caractères

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

J'ai décidé d'écrire un programme entier parce qu'il comporte moins de temps système que même une fonction anonyme:

  • ~(:i;- évaluez l'entrée, décrémentez le multiplicateur, enregistrez-le sous iet supprimez-le.
  • n/{...}%n* - scinder par nouvelles lignes, mapper chaque ligne, joindre par nouvelles lignes
    • {...}:c%c, - prenez un bloc, appliquez-le sur chaque élément de la carte, puis appliquez-le à toute la ligne.
      • {.}i*- dupliquer cet élément ifois

Démo en direct: http://golfscript.apphb.com/?c=OyciYWjjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06yyVjfSVuKg%3D%3D

Exemple d'utilisation:

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

D'abord, entrez le numéro, puis la chaîne. Devrait être explicite ...

Merci à Waleed Khan d’avoir suggéré de supprimer le []

Merci à Volatility pour avoir suggéré d’ aêtre une liste.

Justin
la source
7
Juste remarqué; la nsa surveille toutes vos entrées
Justin
Le code le plus court en octets. Cela n'inclurait-il pas les nouvelles lignes? Votre nombre ne devrait-il pas être de 112?
cjfaure
Désolé, je voulais dire 111.
cjfaure
@ Trimsty vous avez raison; Je pensais que wordcounter.net comptait les nouvelles lignes.
Justin
2
Faites aune liste, faites a+=[''.join(c*n for c in s)]*n, puis faites print('\n'.join(a))à la fin. Cela devrait fonctionner.
Volatilité
5

Java - 217

Essayez d'abord de jouer au golf. On dirait que Java n'est pas le langage pour le faire.

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

Sous Windows, vous devez remplacer "\ n" par "\ r \ n".

java M 3 "ab
cd"
aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd
Danny
la source
2
Les caractères saisis doivent être étendus aussi bien que vers le bas (il doit donc y avoir 3 lignes aaabbbet 3 lignes cccddddans votre exemple de sortie ci-dessus).
Gareth
2
Vous pouvez épargner: 1 caractère en initialisant i dans la déclaration au lieu du for; 8 caractères en utilisant a au lieu de x ( a=a[1].split("\n"), et changez tous les x avec a).
Manatwork
3
Oui, quelle que soit la langue dans laquelle la déclaration de mainprend plus d'octets que de programmes entiers dans d'autres langues, les candidats vont se faire bogeys.
Mark Plotnick
2
HM OK. Voici 3 caractères sauvés en réorganisant un peu la boucle 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));}}
extérieure
3
Encore 4 octets: Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov
5

(Edit: cette solution est maintenant invalide car la sémantique de l' instruction a changé. Je ne savais pas que je l'avais déjà utilisée lorsque je l'avais modifiée. Vous pouvez toutefois corriger ce programme en le changeant simplement en la nouvelle instruction .)

Sclipting , 19 caractères

Attend que l'entrée soit séparée par \n(non \r) et que la première ligne contienne le facteur de multiplication.

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

Explication

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

A la fin, la pile ressemblera à ceci:

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

Tout ce qui se trouve au-dessus de la marque est automatiquement concaténé et sorti, le reste est jeté.

Timwi
la source
这太有意思了你是原创者对吧!
theGreenCabbage
@theGreenCabbage. 踢木外是这个电脑语言的
Justin
1
@ Timwi désolé de t'avoir appelé 木 外 (coup de pied en bois dehors, prononcé tea-moo-pourquoi) ...
Justin
@Quincunx: Hehe, j'ai trouvé ça drôle :) Mais la finale iest prononcée [iː], pas [ɑi]; comment l'écririez-vous en chinois maintenant?
Timwi
@ Timwi Je me suis dit que c'était comme ça (mais je ne pouvais pas penser à un personnage correspondant). J'ai écrit en cherchant et en copiant -collant (sur mdbg.net/chindict/chindict.php )
Justin
3

J, 7 caractères

([#"1#)

Exactement la même chose que dans la réponse APL de @ Tobia, mais en caractères ascii.

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

2 ([#"1#) a
  00  
  00  
00  00
00  00
  00  
  00  
Barbermot
la source
3

Powershell (96)

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

Je pensais que je donnerais un coup de feu dans PS. En utilisant la tuyauterie dans de foreach (le%) pour le garder court ici, mais functionet ToCharArraysont en fait prendre un coup , il brièveté.

Pour l'utiliser, appelez-le depuis la ligne de commande comme suit:

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

Voici la version non minimisée:

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
la source
2
Mazzy a suggéré function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}pour 63 octets
ovs
2

Julia, 74 caractères / octets

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 moins si je retourne juste la chaîne. julia>est l'invite interactive.

gggg
la source
1
C'est le premier golf Julia que j'ai vu.
cjfaure
@Trimsty codegolf.stackexchange.com/search?q=julia est encore très rare, mais il y en a eu quelques-uns (y compris par l'un des concepteurs de la langue).
Plannapus
@plannapus Intéressant! Il y a un nouveau, rare esolang appelé ~ - ~! que j’ai aussi utilisé, même si c’est terrible pour le golf.
cjfaure
2

Powershell, 54 octets

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

Script de test:

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

Explication:

  • $s-replace'.',('$0'*$n) répète chaque symbole sauf la nouvelle ligne.
  • -split'``n' divise la chaîne large par une nouvelle ligne
  • |%{,$_*$n} répète chaque ligne en tant qu'élément de tableau et retourne un tableau

Le résultat est un tableau de chaînes larges et répétées.

mazzy
la source
2

R , 83/72 octets

Approche alternative utilisant les expressions rationnelles

Si nous sommes autorisés à utiliser une nouvelle ligne de fin, 72 octets:

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

Essayez-le en ligne!

Sinon, 83 octets:

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

Essayez-le en ligne!

J.Doe
la source
1

K, 20

.....

{,/y#',:',/'y#'/:x} 
tmartin
la source
1

BrainFuck étendu : 158

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

Cela devient:

Brainfuck: 185

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

Il nécessite un interprète qui a 0 ou pas de changement en tant que marqueur EOF. beef, disponible chez Ubuntu Repo, fonctionne de plus en plus:

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

Code EBF non-golé:

;;;; 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
la source
1

Rebol - 87 79

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

Version joliment formatée:

r: do input

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

Exemple d'utilisation:

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 Ce code ne fonctionne que dans Rebol 2 pour le moment (la fonction INPUT utilisée n’est pas encore totalement implémentée dans Rebol 3).

draegtun
la source
1

R , 125 octets

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

Essayez-le en ligne!

Convertit la chaîne en UTF8, la place dans une matrice dont les colonnes sont des lignes de texte (suppression des nouvelles lignes), puis répète chaque caractère et les lignes générées avant impression séparées par des nouvelles lignes.

JayCe
la source
bravo au 1K au fait! :-)
Giuseppe
ty :-)! C'est formidable de voir R répondre à la plupart des questions et même plusieurs réponses à certaines questions.
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
la source
Semble intéressant. Mais je reçois une erreur: "Erreur: impossible de trouver la fonction" str_split "". Dois-je installer explicitement le package stringr pour pouvoir exécuter votre code? (Désolé,
je
ne manque-t-il pas un appel catà l'imprimer en tant que stdout? De plus, chaque élément de la chaîne ne doit pas simplement être répété n fois, il doit être répété également en largeur.
Plannapus
Vous pouvez également <-jouer un peu plus à votre fonction: vous pouvez =, vous paste0pouvez remplacer ici par pastepuisque vous utilisez de toute façon l'argument collapse et que l'argument eachpeut être raccourci e. Voir ici pour quelques idées de base sur le golf avec R.
plannapus
Sinon, c'est une belle tentative (ma plus courte tentative est toujours dans les 200 caractères ou plus :))
planifié le
@manatwork ok, pas d'erreur sans chargementstringr
petermeissner le
0

MATLAB: 20 ​​caractères

['' imresize(ans,n)]

Cette solution suppose que l’image est stockée dans un fichier appelé startup.met qu’il est autorisé à indiquer le nombre de réplications à matlab lorsqu’on l’appelle. Cette opération peut être effectuée au moyen de:!matlab -r "n=3"&

MATLAB, appel sans argument: 23 caractères

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

Contrairement à la première solution, les deux dernières supposent que le nombre de réplications ne peut pas être attendu dans l'appel. Pour ces solutions, la chaîne et le nombre d'origine sont attendus dans un fichier appelé matlab.matdans votre répertoire actuel.

MATLAB, alternative mathématique: 27 caractères

load;['' kron(s,ones(1,n))]
Dennis Jaheruddin
la source
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))));}

Attend la chaîne d'entrée "i" contenant les nouvelles lignes "\ n" en tant que délimiteur.

Formaté

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))));
 }
microbien
la source
0

CJam, 14 octets

CJam est plus récent que ce défi (et la principale fonctionnalité que j'utilise est en fait très récente), donc cette réponse ne pourrait pas être acceptée - mais elle ne bat pas l'APL de toute façon, alors ...

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

Testez-le ici.

Explication

Avec le nouveau e*qui répète chaque caractère dans une chaîne, ceci est vraiment simple:

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
la source
Je réalise que c'est une vieille réponse, mais vous pouvez sauvegarder un octet en utilisant une fonction à la place:{N/1$fe*e*N*}
Esolanging Fruit
0

RProgN 100 octets (Windows) non concurrents

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

RProgN n'a pas d'échappements de caractères au moment de l'écriture, ce qui oblige toute manipulation de nouvelles lignes à nécessiter une nouvelle ligne physique. En tant que telle, cette réponse (et toute entrée) doit utiliser des CRLF, au lieu de simplement des LF. :(

De plus, la fonction 'rep' n'a été ajoutée qu'après la publication de ce défi. Elle n'est donc pas en concurrence.

ATaco
la source
0

Vim, 39 frappes au clavier (entrée non comprise, pas en compétition)

le gotcha et la raison pour laquelle cela n’est pas concurrent, c’est que l’entrée doit être entrée deux fois. Remplacez les deux 2par votre propre entrée.

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

Explication

  • qayl2phxl@aquuenregistre une macro qui tire un caractère, le colle et passe au suivant, puis se rediffuse. Ensuite, il annule les modifications. Parce que nous voulons que la boucle ne soit pas infinie, nous ne supprimons pas le caractère, ce qui signifie que nous devons supprimer la boucle superflue tout en terminant par un mouvement qui échoue sur le dernier caractère.
  • :%norm @a<cr> exécute la macro sur chaque ligne
  • gg0 revient au tout début
  • qbyy2P2jkddj@bq@butilise la même technique que @apour copier chaque ligne, mais avec une macro récursive.

Je sais que cela peut être joué davantage, par exemple en effectuant un retour en arrière pour la duplication de ligne, mais en raison de l'exigence d'entrée multiple, je vais m'arrêter là et marquer cette réponse comme non compétitive.

Réponse précédente (32 frappes, seulement les doubles)

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

Explication

  • qaylpl@aquenregistre une macro qui extrait un caractère, le colle et passe au suivant, puis se rejoue. Annuler le changement.
  • :%norm @a<cr> exécute la macro sur chaque ligne
  • :%s/.*/&\r&<cr> double chaque ligne

Je voulais créer une macro imbriquée, mais la première (caractères) arrête la première (lignes) ... Je dois donc exécuter deux commandes, ce qui ajoute quelques touches à une solution par ailleurs simple.

Christian Rondeau
la source