放大ASCII艺术


64

在此挑战中,您必须将多行ASCII文字作为输入,例如:

 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      

并且您还将采用整数作为输入。您必须输出以整数指定的数量放大的ASCII字体。例如,如果您使用的第二个参数3,则输出为

   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

具体来说,每个字符都必须变成该字符的一个nn框,其中n是整数参数。例如,输入

ab
cd

和3将导致

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

这是,因此以字节为单位的最短代码获胜。


问题清单上的ascii艺术看起来很有趣
贾斯汀

6
我认为您应该为将适当的混叠引入放大的艺术中的方法进行第二轮/奖金回合。您的巨型代码高尔夫艺术看起来很块状。
AmeliaBR 2014年

5
@AmeliaBR看到这里
霍华德

Answers:


37

APL,7个字符/字节*

{⍺/⍺⌿⍵}

以数字和输入字符串为参数并返回结果的函数:

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

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*:APL可以写在它自己的(传统)单字节即APL符号映射到上部128个字节值的字符集。因此,出于评分的目的,仅使用ASCII字符和APL符号的N个字符的程序可以视为N个字节长。


1
...:O它是如何工作的?
门把手

4
@DoorknobofSnow用于多行字符串的标准表示是APL为矩形字符矩阵(与尾随空白如果线具有不均匀的宽度...是,APL是那个旧。)的/功能(不与混淆/操作者...是,相同的符号)根据左侧参数从矩阵中复制和/或删除列。如果这是一个标量(简单数字),则将其复制到所有输入列。因此2/m,矩阵的所有列均加倍。所述变体做相同的,但对于行(或第一轴线的平面中的一般情况。)
托比亚

6
漂亮的语言,不是吗?一旦学习了几十个符号,它实际上就很容易读懂。除了您在这里看到的ASCII线噪声语言外,还有更多……
Tobia 2014年

凉。⌿总是用语言吗?它不在Gilman和Rose书中,一本关于APL \ 360的Iverson书中提到/ [1]却没有提到⌿。
Mark Plotnick 2014年

2
哇。那。是的。只是。太棒了 我是。严重。敬畏。通过。这个。码。我想提供的不仅仅是+1,但我的代表对于赏金的要求还是很低的。
暴民埃里克(Erik the Outgolfer)

35

GolfScript,20个字符

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

接受来自STDIN的所有输入,第一行是比例因子,其余为多行输入。您可以在线尝试该示例。

输入项

3
ab
cd

输出量

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

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

嘿! 您的输入格式,得分时间比我更好:-/ +1
John Dvorak

另外,我有点迷茫。
约翰·德沃夏克

2
@JanDvorak添加了一些解释。
2014年

哇。今天我学到了1/。我还需要使用value function +更多。
John Dvorak 2014年

2
@CoryKlein:如果您告诉我们什么错误,那会有所帮助,但是... *凝视水晶球* ...可能golfscript.rb不是标记为可执行文件,或者第一行的Ruby解释器路径错误为您的系统。哦,echo大概应该是cat。尝试cat inputFile | ruby golfscript.rb scriptFile(或仅试一下ruby golfscript.rb scriptFile < inputFile),看看是否可行。
Ilmari Karonen 2014年

19

J,20个 17个字符

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

定义一个f需要做的动词。用法:

   3 f a
aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

a输入字符串在哪里。
在Windows上,需要附加字符才能删除\r

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

说明

];._2根据字符串的最后一个字符将输入字符串切成小块,在这种情况下为a \n。Windows有,\r\n所以我们需要使用}:砍掉一个额外的字符:}:;._2剪切动词文档

代码的其余部分(赋值除外f=.)是fork
它像这样分解:[ #&.|: #

如果a是我们的输入字符串,则计算将为3 # a(我们将其称为结果x),然后为3 [ a(我们将其称为结果yy #&.|: x

3 # a只需为的每个成员制作三份副本a复制动词文档
这将打开

ab
cd

进入

aaabbb
cccddd

3 [ a刚刚返回3. 左动词文档

最后y #&.|: xy转置下的复制x。该#作品不如以前,但&.|:告诉J可先调换输入,然后转回来时,它的完成。在衔接文档下转置动词文档

转置转

aaabbb
cccddd

进入

ac
ac
ac
bd
bd
bd

然后副本将其更改为

aaaccc
aaaccc
aaaccc
bbbddd
bbbddd
bbbddd

然后将其移回给您

aaabbb
aaabbb
aaabbb
cccddd
cccddd
cccddd

4
窗户很烂,是吗?:P
cjfaure 2014年

@Trimsty确实如此。
Gareth 2014年

这更短:[##"1而且,我不确定J中打高尔夫球的不成文规则,但是我想说,鉴于问题的宽松要求,字符串拆分和赋值可以省略。我在APL回答中确实做到了。示例:2 ([##"1) 'abcde',:'fghij'
Tobia

17

Haskell,49个字节

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

扩大函数是e,它接受一个计数和一个字符串,然后返回一个字符串:

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

15

APL,11个字符

@Gareth首先在J中做了基本上相同的事情,因此此APL参赛作品仅用于展示,而非竞争-他是获胜者。

      E←{⍉⍺/⍉⍺/⍵}

用法:左arg(⍺)中的放大倍率,右arg(⍵)中2d字符矩阵形式的艺术作品。
⍺/⍵将在向量或矩阵的每一行中复制元素(2 /'OO'变为'OO OO')。
⍉⍺/⍉将转置该位,复制元素,然后转置该位。

(如果为了清楚起见,而不是程序长度,代码可能是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

但我应该指出,我使用5个字符将字符串输入转换为字符数组,因此您实际上只击败了1个字符。:-)
Gareth 2014年

2
J被讨厌的设计目标所困扰,在该目标中,运算符只能使用ASCII字符集。:)
Mark Plotnick 2014年

2
但是,如果像OP所说的那样以字节为单位进行测量,则这是44个字节(当然是unicode,不是utf-8),而@Gareth仍然是17。这是不限于ASCII的语言的缺点。
cjfaure

5
@Trimsty但是APL有它自己的字符集,该字符集将每个字符映射到一个字节,因此可以说这仍然是11个字节。
波动性

1
@波动率 真的很奇怪,抱歉,不知道:P
cjfaure 2014年

13

Bash / sed脚本,48个字符

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

另存为脚本,chmod +x然后运行:

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

它是如何工作的?

它的实质在sed命令中。例如,如果n = 3,那么sed命令将扩展为:

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

该复合sed命令可以分解为:

  • s/./&&&/g -此替换命令匹配每个字符并将其替换为重复3次的字符
  • 3x p命令-这只会打印整个图案空间(即当前行)3次

我们传递-n给sed告诉它除非明确告知,否则不要打印任何内容,因此我们可以完全控制打印内容和打印次数。

我无法找出直接在中直接生成任意长度重复字符串的快速方法sed,所以我改用了一些bash技巧:

printf -vr "%3s"

这会打印一个字符串(未指定,即为空),带有3个前导空格,并将结果分配给bash变量r

然后,我们使用bash参数扩展将该空格字符串转换为需要替换为sed表达式的内容:

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

我能够删除printf格式说明符和sed表达式周围的引号,因为其中的任何字符都不需要在bashshell中转义。

字符数:

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

我不知道这是如何工作的,但是它有效!
托马斯2014年

1
变量n违反规则1:“不得硬编码”。
manatwork 2014年

1
只需使用$1并删除n=3;,您甚至可以保存4个字符,也许也可以保存{}在printf中。
托马斯2014年

并且我们可以假定$ 1将是数字,因此printf不需要在参数周围加上引号,将其减少到52个字符:r=`printf %$1s`;sed -n "s/./${r// /&}/g${r// /;//p}"
manatwork 2014年

1
@Tomas-到目前为止,您可能已经了解了它的工作原理,但是如果您感兴趣,我添加了说明。
Digital Trauma 2014年

9

PERL, 41 39 25   22个字符

PERL,简单有效-为任务而创建。用调用时-pi3,其中3的参数为n

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

经典解决方案(39个字符):

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

经典解决方案需要在n输入的第一行中指定,例如

3
ab
cd

感谢@manatwork的$&把戏。


1
凉。但您无需捕获匹配的字符:s/./$&x$n/ge
manatwork 2014年

8

Ruby: 64个  49个字符

在STDIN上收到的所有数据:首先是比例因子,然后是ASCII码。

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

样品运行:

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个字符

假设每条输入线都用行分隔符终止。感谢@Ventero。

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

样品运行:

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

1
设置的更短方法n:($.<2?n=$_.to_i: $><<$_.gsub(/./){$&*n}*n遗憾的是,冒号后的空格是必需的,否则解析器会感到困惑)。用运行ruby -n
Ventero 2014年

h 我尝试了数十种方法来将赋值缩短到n,但是我错过了三元运算符。谢谢@Ventero。
manatwork 2014年

6

Python 3-84

尽管如此,这不是最短的答案,而是不同的答案。一个有趣的单线。

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

首先输入数字,然后输入ASCII样式作为Python列表,例如:

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个字符

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

这定义了一个block f,当被调用时将产生期望的输出。它假定参数在堆栈上(因为这基本上是在GolfScript中传递参数的方式)。

脱手(甚至有意义吗::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个字符

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

我决定编写整个程序,因为它的开销甚至比匿名函数还小:

  • ~(:i;-评估输入,然后递减乘数,将其存储为i并丢弃。
  • n/{...}%n* -按换行分隔,映射每行,按换行联接
    • {...}:c%c,-取一个块,将其应用于map-each元素,然后将其应用于整行。
      • {.}i*-重复此元素i时间

现场演示:http : //golfscript.apphb.com/? c= OyciYWJjCmRlZiIzJwp%2BKDppO24ve3t7Ln1pKn06YyVjfSVuKg%3D%3D

用法示例:

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

首先,输入数字,然后输入字符串。应该不言自明...

感谢Waleed Khan建议删除 []

感谢Volatility建议a列出清单。


7
刚刚注意到;国家安全局(nsa)正在监视您的每一次输入
贾斯汀(Justin)

最短代码(以字节为单位)。那不包括换行符吗?你不应该是112吗?
cjfaure 2014年

对不起,我的意思是111
cjfaure

@Trimsty你是对的;我以为wordcounter.net算了换行符。
贾斯汀2014年

2
制作a一个列表,执行a+=[''.join(c*n for c in s)]*n,然后print('\n'.join(a))最后执行。那应该工作。
波动性2014年

5

Java-217

首先尝试打高尔夫球。似乎Java并不是实现它的语言。

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

在Windows上,您需要将“ \ n”替换为“ \ r \ n”。

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

2
输入字符需要向下和向两侧扩展(因此aaabbbcccddd在上面的输出示例中,应该有3行和3行)。
Gareth 2014年

2
您可以通过在声明中初始化i而不是for; 来保留1个字符。使用a而不是x(a=a[1].split("\n"),最多8个字符,并用a更改所有x)。
manatwork 2014年

3
是的,在任何一种语言中,仅声明的main字节要比其他语言中的整个程序占用更多的字节,所以参赛者将会受到柏忌。
Mark Plotnick 2014年

2
嗯好 这是3个字符,它们通过稍微重新设置循环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));}}
外圈来节省

3
另外4个字节:Integer.valueOf(a[0])->new Integer(a[0])
Yurii Shylov

5

(编辑:此解决方案现在无效,因为指令的语义已更改。我没有意识到更改指令时已经使用了该指令。但是,您可以通过简单地将其更改为较新的说明。)

滑行,19个字符

期望输入用\n(no \r)分隔,并且第一行包含乘数。

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

说明

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

最后,堆栈将如下所示:

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

标记上方的所有内容都会自动连接并输出,其余的将被丢弃。


这是原始者对吧?
theGreenCabbage 2014年

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

1
@Timwi很抱歉叫您踢木外(外面踢木,发音为tea-moo-why)...
Justin

@Quincunx:呵呵,我觉得很有趣:)但是最后i的发音是[iː],而不是[ɑi];您现在怎么用中文写?
Timwi'1

@Timwi以为是这样发音的(但是我想不出对应的字符)。我是通过搜索和复制粘贴(在mdbg.net/chindict/chindict.php上)写的
Justin

3

J,7个字符

([#"1#)

与@Tobia的APL答案完全相同,但以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}}}

以为我会在PS中试一试。使用管道到foreach的(%)中使它简短,但functionand ToCharArray使其简洁。

要使用它,您可以从命令行像下面这样调用它:

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

这是非最小版本:

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建议function m($n,$s){-split$s|%{,(-join($_-split''|%{$_*$n}))*$n}}使用63个字节
ovs,2018年

2

朱莉娅,74个字符/字节

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个。julia>是交互式提示。


1
这是我见过的第一场朱莉娅高尔夫。
cjfaure 2014年

@Trimsty codegolf.stackexchange.com/search?q=julia仍然非常少见,但数量很少(实际上包括该语言的一位设计师)。
plannapus 2014年

@plannapus有趣!有一个新的稀有的伊苏朗叫〜-〜!我也曾经用过,尽管打高尔夫球很糟糕。
cjfaure


2

Powershell,54个字节

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

测试脚本:

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

说明:

  • $s-replace'.',('$0'*$n) 重复每个符号除了换行。
  • -split'``n' 用新行分割宽字符串
  • |%{,$_*$n} 将每行重复为一个数组元素并返回数组

结果是一系列宽且重复的字符串。


2

R,83/72字节

使用正则表达式的Alt方法

如果允许尾随换行符,则为72个字节:

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

在线尝试!

否则,为83个字节:

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

在线尝试!



1

扩展的BrainFuck:158

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

它变成:

操蛋:185

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

它需要一个EOF标记为0或没有变化的解释器。beef可以从Ubuntu repos下载,可以正常工作:

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

非高尔夫EBF代码:

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

格式良好的版本:

r: do input

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

用法示例:

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

注意 此代码目前仅在Rebol 2中可用(使用的INPUT功能尚未在Rebol 3中完全实现)。


1

R,125个字节

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

在线尝试!

将字符串转换为UTF8,放入一个矩阵,该矩阵的列为文本行(删除换行符),然后重复每个字符和生成的行,然后用换行符分隔打印。


顺便恭喜1K!:-)
朱塞佩

ty :-)!看到大多数问题的R答案,甚至对某些问题的多个答案,真是太好了。
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

看起来很有趣。但是我收到一个错误:“错误:找不到函数“ str_split””。我是否需要显式安装stringr软件包才能运行您的代码?(对不起,不熟悉R。)
manatwork 2014年

它是否缺少将cat其打印为stdout 的调用?另外,字符串的每个元素不仅应重复n次,而且应在宽度上重复。
plannapus 2014年

您还<-可以使用更多函数:可以=paste0可以替换为,paste因为无论如何您都使用collapse参数,并且该参数each可以缩短为e。见这里的一些基本思路与R.高尔夫
plannapus

否则,这是一个不错的尝试(我自己最短的尝试仍然在200个字符左右:))
plannapus 2014年

@manatwork好的,如果没有加载,就不会再出错了stringr
petermeissner 2014年

0

MATLAB:20个字符

['' imresize(ans,n)]

该解决方案假定映像存储在一个名为的文件中startup.m,并且允许在调用它时向matlab提供复制数量,这可以通过以下方式完成:!matlab -r "n=3"&

MATLAB,不带参数的调用:23个字符

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

与第一种解决方案不同,后两种假定在调用中可能不会预期复制数量。对于这些解决方案,原始字符串和数字应该在matlab.mat当前目录中的文件中。

MATLAB,数学替代:27个字符

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

期望包含新行“ \ n”的输入字符串“ i”作为定界符。

格式化的

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个字节

CJam比这个挑战要新(并且我正在使用的主要功能实际上是最近的),因此此答案不符合被接受的条件,但是无论如何它都没有击败APL,所以...

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

在这里测试。

说明

使用新e*的字符串重复每个字符,这确实很简单:

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.

我意识到这是一个旧答案,但是您可以使用函数来节省一个字节:{N/1$fe*e*N*}
Esolanging Fruit

0

RProgN 100字节(Windows)不竞争

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

RProgN在编写时没有字符转义符,这使得对新行的任何处理都需要物理上的新行。因此,此答案(和任何输入)必须使用CRLF,而不仅仅是LF。:(

同样,仅在发出此挑战后才添加“ rep”功能,因此这是非竞争性的。


0

Vim,39次击键(不包括输入,不参与比赛)

陷阱和不竞争的原因是输入必须输入两次。2用您自己的输入替换两者。

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

说明

  • qayl2phxl@aquu记录一个提取字符的宏,将其粘贴并移至下一个,然后重播自身。然后撤消更改。因为我们希望循环不是无限的,所以我们不要删除字符,这意味着我们必须删除无关的字符,但仍然要以最后一个字符失败的动作结束。
  • :%norm @a<cr> 在每一行上运行宏
  • gg0 回到最开始
  • qbyy2P2jkddj@bq@b使用与@a复制每一行相同的技术,但具有递归宏。

我知道这可以做得更好,例如,通过向后遍历进行行复制,但是由于有多个输入项的要求,我将在此处停下来并将此答案标记为不竞争。

先前的答案(32次击键,仅翻倍)

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

说明

  • qaylpl@aqu记录一个提取字符的宏,将其粘贴并移至下一个,然后重播自身。撤消更改。
  • :%norm @a<cr> 在每一行上运行宏
  • :%s/.*/&\r&<cr> 每行加倍

我想做一个嵌套的宏,但是内部的一个(字符)停止了外部的一个(行)...所以我必须运行两个命令,向否则为简单的解决方案添加了很多击键。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.