打印一个10 x 10的星号网格


83

背景

这是一个标准的教科书示例,用于演示循环。

这是大约10年前我开始学习编程时所学的第一批程序之一。

任务

您将打印此确切文本:

**********
**********
**********
**********
**********
**********
**********
**********
**********
**********

眼镜

  • 您可能会有多余的尾随换行符。
  • 每行末尾可能会有多余的尾随空格(U + 0020),包括多余的尾随换行符。

计分

这是。以字节为单位的最短答案将获胜。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。


2
@DylanMeeus“您要打印此确切的文本:”
Leaky Nun

13
@DylanMeeus因为这与隐藏重复控制台输出的开发工具有关,并且不是整个JavaScript控制台的本机,也不在JavaScript规范中-以及可以关闭该功能的事实-我认为应该可以接受。并非所有浏览器都会像这样折叠它。
Trotski94年

6
请@LeakyNun排行榜摘要!
dkudriavtsev

2
关于此挑战的最有趣的事情之一是,取决于您的语言,********可能比循环更短。让我想知道给定语言在1或2个循环之间切换的最佳时机。
dwana '16

1
你说尾随新行是可以接受的。换行符也可以接受吗?
艾伯特·伦肖

Answers:




65

Bash + coreutils,19个字节

我更喜欢在Bash中重复使用“是”。

yes **********|head

我按@Neil的建议保存了2个字节。但是,当您运行此命令的目录不仅包含以'。'开头的文件时,揍你需要附上星星*"

Bash + coreutils,21个字节

yes "**********"|head

2
好主意yes。我们通常将此类解决方案标记为“ Bash + coreutils”。
manatwork '16

8
不错,碰巧有10行恰好是的默认行head
Digital Trauma'8

3
您是否可以通过要求当前目录中的任何文件都必须以“ .?” 开头来节省两个字节?
尼尔

@Neil,您对我的回答有何评论?如果是这样,我不明白:)
CousinCocaine

1
您也可以yes \**********|head不受文件限制地进行写入。
弗洛里安·F

50

Vim,13 8字节

@Lynn节省了5个字节

qqi*␛9.o␛q9@q 

10i*␛Y9p

10i*␛插入10次*,然后Y9p复制该行并将其粘贴9次。


8
10i*♥Y9p作品。
林恩

1
那太疯狂了。
nbubis '16

我认为您可以为文本编辑器计算击键次数而不是字节数,这意味着<ESC>会更短。
addison

1
为什么是♥而不是␛?
CL。

1
我本来会用yy9p自己的,但是用大写字母保存角色的工作真不错!
Joe Z.

49

Pyth,6个字节

VT*T\*

T在Pyth中为10,Vab执行语句b a时间,\*为星号字符常量,然后将(*)字符串与整数相乘n重复该字符串。Pyth的隐式打印V方式是打印10行。


40

六角形 37 35 34 31

10"+}(=${";<$<1}42/.0@_=<>\;>(_

展开:

   1 0 " +
  } ( = $ {
 " ; < $ < 1
} 4 2 / . 0 @
 _ = < > \ ;
  > ( _ . .
   . . . .

在线尝试

基本上只有两个for循环从十开始递减到零,在内循环上打印一个星号,在外循环上打印一个换行符。

说明:

该程序包括三个主要部分:内存的初始化,打印十个星号的循环和打印换行符的循环。打印换行符的循环还包含打印星号的循环。

首先,代码运行完全线性的内存初始化。该代码经计算为:10"+}42。这会将附近边缘的记忆设置为:

10 \ / 10
    |
   42

42是星号字符的ASCII代码,并且两个十将用作我们的循环计数器。值得注意的是,内存指针当前指向远离两个十的位置,因此向后移动将使我们处于十个之一。

接下来,我们开始星号打印循环。线性,代码如下:;".._(。这会打印出一个星号,将内存指针向后和向左移动,最后使该值递减。一次迭代后,内存将如下所示:

10 \ / 9
    |
   42

然后我们进入循环条件:最左下角>。如果我们刚刚减小的边缘仍为正,则反弹并执行a {将我们移回42。然后我们按下a $;通过跳过来返回到打印循环的开始,the <。如果该值为零,则进入另一个循环。

外循环通过将最近清零的存储边沿重置为十开始(这是10代码中的“向西南”)。然后,我们将这十个字符输出为ASCII字符,这是换行符。接下来,我们移至另一个内存边缘并对其递减{(,然后执行等于一堆noop的操作:=${_=。现在,在此循环的一次迭代之后,内存将如下所示:

 9 \ / 10
    |
   42

这次,存储器从上图中的九个存储单元的边缘向外面向。接下来,我们执行<作为外部循环的循环条件的。如果该值不为零,我们会在一些反射镜附近反弹,然后在进入"移动的西南方的六边形顶部后再次开始执行有意义的指令。这使我们向后移动并向左移动,再次移至42,但朝内。然后=翻转方向,正确重置状态以再次开始内部循环。如果将边沿设置为零,则指令指针会进行一些冒险,直到退出程序之前,它什么都不做。

冒险始于指示指针向东北冒险,危险地无视主要方向的安全。它勇敢地忽略了与其方向(/)对齐的镜子,并英勇地跳下了蹦床($)完全避开了另一个完全相同的蹦床的致命陷阱。盯着未初始化的六角形边的空度,指针不动摇一会儿,将其面对的两个空白边相加在一起,将当前边设置为它们的总和:0(该边实际上实际上为零,但指针喜欢相信这很重要)。由于边缘为零,因此指针会在道路的叉处向左转,进入神秘的(六边形)森林。在这里,它发现自己迷失了方向,向前和向后移动,直到它在开始时出现在内存中的同一位置。认为问题一定是上一次将当前边沿设置为零,所以指针勇敢地植入了1进入当前边缘。然后,高贵的指针调查了另一条路径,一条路径是……一个陷阱!当前边沿递减并设置回零!指针因令人震惊的事件转瞬而晕眩,跌跌撞撞地回到陷阱中,将当前边沿设置为负数。生气的是,指针试图返回到相对宜人的森林,只是注意到由于当前边缘不为正,所以路径再次偏移,指针发现自己正走入山洞。在山洞里,我的意思是一个巨大的六角形蠕虫的嘴。无助,指针以垂死的呼吸诅咒性别。另外,程序结束。


宝贝,我希望蠕虫吞下一个指针就可以了。那些事会伤害人
乔芬'16

3
+1代表我读过的最有趣的-唯一的-六角形解释。减少边缘时,我感到如此紧张!

37

Emacs,10 8击键

F3 C-1 0 * ENTER F4 C-9 F4

说明

F3             Starts a macro recording
C-1 0 *        Apply 10 times command '*': prints 10 asterix'
ENTER          Insert new line
F4             Stops the macro record
C-9 F4         Apply 9 times the macro

感谢肖恩挽救了两个按键,提示更换C-udigitC-digit


9
+1,我总是赞扬文本编辑器的答案(即使我自己更
像个

1
如果C-u仅算一次击键,则可以通过键入C-1 C-0(或M-1 M-0)代替C-u 1 0C-9代替来消除两个击键C-u 9
肖恩

15
+1,因为您不得不使用emacs编写代码。
addison

1
另外(不保存任何内容),可以在宏内进行行重复:F3 C-1 0 * ENTER C-1 0 F4
Jonathan Carroll,

@JonathanCarroll是的,如果我们要打印10行以上,它将节省字节;)
YSC

29

果冻,7个字节

”*x⁵Ṅ9¡

这是怎么回事?

”*x⁵Ṅ9¡  - No arguments
”*       - character literal, *
  x      - multiply (dyadic operation)
   ⁵     - integer literal, 10 (we have now constructed the string '**********')
    Ṅ    - Print & linefeed (monadic operation)
     9   - integer literal, 9
      ¡  - Repeat n times (n is 9 as the first Ṅ is not a repeat)

Tryitonline测试


9
我真的很喜欢Ṅ9¡
丹尼斯

清单版本:”*ẋ⁵Wẋ⁵
暴民埃里克(Erik the Outgolfer)

@EriktheGolfer,您Y最后需要一个“来打印此确切文本”
Jonathan Allan

@JonathanAllan它本身是一个列表。这并不是要“打印此确切文本”,但是,如果您要对其进行处理,则将使用它。
暴民埃里克(Erik the Outgolfer)

26

PowerShell,14个12字节

,('*'*10)*10

10使用字符串乘法构造长度的星号字符串。将其封装在括号中,并将其馈入逗号运算符以构造一个数组。我们使用数组乘法来构造一个由该元素组成的10元素数组(即,一个10元素的星号字符串数组)。这留在管道上,并且输出是隐式的(由于Write-Output数组的默认值是换行符分隔的,因此我们免费获得它-感谢@Joey的澄清)。

较旧,14个字节

0..9|%{'*'*10}

完整程序。从循环09通过一个ForEach-Object循环|%{...}。每次迭代时,我们都使用字符串乘法来创建长度为的10字符串*。这些结果字符串留在管道上,并且最后的输出是隐式的(由于Write-Output数组的默认值是换行符分隔的,因此我们免费获得它-感谢@Joey的澄清)。


5
我喜欢它,因为powershell会变得很冗长。但这是优雅而简短的。
dwana '16

好吧,从技术上讲,数组永远不会通过传递ToString,而是逐个展开并传递到Write-Output。在将数组转换为字符串的上下文中,可以将其元素用空格分隔。
乔伊,

@Joey Ah,公平,这是更好的表达方式。我将编辑措辞(以及答案模板;-)。
AdmBorkBork,2016年

1
我在这里可能有偏见,因为我参与了PowerShell实施,所以我必须学习很多实际的解释器内部内容;)
Joey

25

V,7个字节

10é*10Ä

在线尝试!

答案尽可能简单。

说明:

10      "10 times:
  é*    "insert an asterisk
    10Ä "make 10 copies of the current line

非竞争版本(5个字节):

10O±*

说明:

10O     " Insert the following on the next ten lines:
   ±    "   10 copies of
    *   "   an asterisk

由于错误而发布挑战时,此方法不起作用。


程序点:é和Ä是多字节字符(至少在utf-8中,如此处所示),因此该程序长9个字节。

6
@rob它们在这里用utf-8编码,因为那只是浏览器的工作方式。V使用“ Latin1”编码,分别在E9和处C4
DJMcMayhem

21

水母12 10字节

感谢Zgarb节省2个字节。

P$'*
 &;10

在线尝试!

说明

使用更常规的表示法,该程序表示以下表达式:

P( $( &;(10), '* ) )

&;接受一个值,并创建一个两倍于该值的对,因此&;(10)给我们[10 10]。然后$进行整形,形成一个10x10的星号网格。最后,P以“矩阵格式”打印数组,该数组将每个字符串打印在自己的行上。


20

HTML&CSS,104 60字节

p::after{content:"**********"
<p><p><p><p><p><p><p><p><p><p>

我不确定字节数是否正确(因为我没有计算<style>CSS 的标记。如果使用HTML预处理器,也可以缩短HTML,但不确定是否违反规则

感谢manatwork和Business Cat。

看到我的36字节的Jade条目


您可以省略自闭包/s并将所有标签写在同一行中。但是最好将标签更改为,<p>因为它更短,即使您需要添加p{margin:0}
manatwork '16

2
这是无效的CSS。您需要右括号!
理查德·汉密尔顿

25
@RichardHamilton有效的CSS和工作的CSS是不一样的事情
undergroundmonorail

1
@ClementNerma为什么有人在此之后放代码?
暴民埃里克(Erik the Outgolfer)

2
您可以放弃最后一个,>我相信
21Me21

16

Python 2 22 21字节

print('*'*10+'\n')*10

print(("*"*10+'\n')*10)为我工作。
piepi'8

6
@piepi这就是为什么您通常最好在Python 2中打高尔夫球-调用时不需要括号print
shooqie'8

@shooqie您无法使用Python2击败Python3解决方案。Python2和Python3是不同的语言。您也不会将Python2解决方案与像Pyth这样的专业高尔夫语言进行比较。
阿尔夫

16

MATLAB,14个字节

repmat('*',10)

我没有MATLAB对此进行测试,因此我不确定*s 之间是否有空格。
Erik the Outgolfer '16

@EriktheGolfer显然不是:)
PieCot

mat建议一个矩阵,这就是为什么我问。
暴民埃里克(Erik the Outgolfer)'16年

2
@EriktheGolfer对不起,我很没礼貌。Mat实际上是指一个矩阵,但是在这种情况下是char矩阵,它是一个字符串数组(每行都像一个字符串)。因此,输出矩阵一行一行地打印,同一行的元素之间没有空格。
PieCot

16

APL,9 字节

适用于所有已制作的APL。

10 10'*'

10 10 十行十列

 周期性[R epeating

'*' 一个明星

在线尝试APL!


值得注意的是,该解决方案不是特定于Dyalog的。它也可以与GNU APL一起使用。
Arc676

3
@ Arc676是的。实际上,它适用于所有已制作的APL。
亚当

恩,我只需要一个字节...我差点用“格式”把戏击败了你:∘.⊢⍨⍕⍨,⍨5
ngn

@ngn太可怕了!
亚当

14

Java 7,63字节

void f(){for(int i=0;i++<10;)System.out.println("**********");}

只是为了踢。我似乎找不到任何使它更短的技巧。尝试为100循环添加逻辑或返回String而不是进行打印只会变得更糟。


1
如果声明i为类变量(默认为0int i;void f(){for(;i++<10;)System.out.println("**********");}
删除

1
除非我在函数中进行任何操作,否则会节省可重用性i=0
Geobits,

3
+1看来你的确权,这是最短的..递归是65个字节:int i=10;void f(){System.out.println("**********");if(i-->0)g();}; 逐个递归是67个字节:int i=99;void f(){System.out.print(i%10<1?"*\n":"*");if(i-->0)g();}; 使用String的构造函数与炭阵列为82个字节:void g(){System.out.print(new String(new char[10]).replace("\0","**********\n"));}; String.format为81个字节:void g(){System.out.print(String.format("%010d",0).replace("0","**********\n"));}。嗯,我们尝试过。;)
Kevin Cruijssen

2
但是,是否不必添加类声明本身也算在内?能做到这一点的最短的java7完整程序是什么?
jsbueno '16

1
您必须计算导入语句,因此在这里无法节省费用。
Geobits,2016年

14

Ruby,15个字符

puts [?**10]*10

样品运行:

bash-4.3$ ruby -e 'puts [?**10]*10'
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********

你能解释一下?**10吗?它确实确实产生了一个由十个星号组成的字符串,但我不清楚如何...
erich2k8

3
?是字符文字符号,所以?* == '*'。第二*String.*方法,所以?**10 == '*'.*(10)
manatwork '16

害怕我仍然不明白为什么?是任何东西的字面意义,但是也许最好不要回答一些问题。;)
erich2k8

抱歉,我找不到任何参考。简单来说就是Ruby语法,它允许使用各种字符串文字符号,并在字符串长度为1个字符的情况下加一个:?标记后跟该字符,而无需一对?标记。
manatwork

1
我在以下参考资料中找到了它:ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html There is also a character literal notation to represent single character strings, which syntax is a question mark (?) followed by a single character or escape sequence that corresponds to a single codepoint in the script encoding:
erich2k8

13

记事本,34 31击键

**********
^A^C↓^V^A^C↓^V^V^V^V

^表示Ctrl- <跟随字符>键,↑↓分别是向上键和向下键。

加密的道具,保存3次击键。


2
您应该使用击键计数。
Leaky Nun

1
那就是Shift + Up。Ctrl + Up是另一回事。
尼尔

1
31次击键**********↵^A^C↓^V^A^C↓^V^V^V^V
Crypto

1
26次击键*****^A^C^V^V↵^A^C^V^A^C^V^V^V^V^V
安迪

5
23次击键**^A^C^V^V^V^V^V↵^A^C^V^V^A^C^V^V^V^V^V
安迪

13

Emojicode,54个字节

🏁🍇🔂i⏩0 10🍇😀🔤**********🔤🍉🍉

说明:

🏁🍇                        👴 The beginning of program.
    🔂 i ⏩ 0 10 🍇          👵 This is called a "range".
                          It basically starts with i=0 and increments until i=10, then exits. 👵
        😀 🔤**********🔤    👵 😀 is printing class.
                          The 🔤s make the characters they surround string literals. 👵
    🍉                     👴 End of range
🍉                         👴 End of program

2
我数了54个utf-8字节。
科纳·奥布莱恩

这种语言讨厌Windows 7 ...
John Dvorak


10

R,27 29字节

cat(rep('\r**********\n',10))

另一个答案(34个字节)是: cat(rep('**********',10),sep='\n')


除了第一行(请参阅此处),这会在所有行的开头添加一个额外的空间。
plannapus

谢谢,它可以添加\r
Mamie

1
另一种选择是太多(37)字节:cat(matrix('*',10,10),fill=10,sep='') r小提琴
乔纳森·卡洛尔

另一种替代方法,也是29个字节:write(rep("*",100),"",10,,"")
Giuseppe

1
并且write(rep("**",50),1,5,,"")为27个字节,避免了第一次回车。
J.Doe

9

PHP,32字节

for(;$i++<10;)echo"**********
";

(可变的32个字节-用写入echo

<?=str_repeat("**********
",10);

(可变33个字节)

<?=str_pad("",110,"**********
");

(可变33个字节)

for(;$i++<110;)echo$i%11?"*":"
";

(可变35个字节)

for(;$i++<10;)printf("%'*10s
",'');

(可变38个字节)

<?=($a=str_repeat)($a("*",10)."
",10);

3
第二个也可以打成32字节<?=str_repeat("**********↵",10);
插入用户名

1
正如你已经有了替代品的一个很好的收集,这里是另一种乐趣:echo chunk_split(str_repeat("*",100),10);最长到目前为止,只是在我的视野,这是 PHP办法做到这一点。
manatwork's

可以使用WIN-1252编码缩短一个字节:for(;++$i<111;)echo$i%11?~Õ:~õ;for(;++$i<11;)echo~ÕÕÕÕÕÕÕÕÕÕõ;
aross

另一个33字节的模数变体:for(;$i++<110;)echo"*↵"[$i%11<1];。并为该集合添加一个37字节的解决方案:for(;$i++<110;)echo chr($i%11?42:10);
泰特斯(Titus),


8

Brainfuck,46 43字节

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

在线尝试!需要翻译器,其磁带在左侧打开并且具有8位单元。

该程序的第一部分按如下方式+[[---<]+[-->]<]设置磁带:

[255, 250, 245, ... 15, 10, 5, 0, 250, 240, 230, ..., 40, 30, 20, 10, 0]
                                                                      ^

这给出了40个用于输出星号(*ASCII 42),20用作循环计数器,以及10用作输出换行符。


7

JavaScript(ES6),37个字节

console.log(`**********
`.repeat(10))

一个简单的答案。


5
无法使用节省6 alert
凯文L

1
可以说,通过删除console.log()REPL在标题中指定,可以节省13个字节。
帕特里克·罗伯茨

6

Cheddar,21个 20字节

print('*'*10+'
')*10

另一个简单的答案。


4
使用文字换行,以节省1个字节
漏尼姑

2
使它使用->而不是打印功能?
Downgoat

6

Haskell,29个字节

putStr$[0..9]>>"**********\n"

<list1> >> <list2>(length <list1>)副本<list2>


6

R,35 33 32字节

ÔR,有时候你很冗长。

for(i in 1:10)cat(rep("*",10),"\n")

有趣的是,该cat函数没有任何价值(它提供NULL给STDOUT),所以您不能做类似的事情rep(cat(rep))),这会更有趣!

编辑:
@LeakyNun提出的新解决方案,-2个字节。

for(i in 1:10)cat("**********\n")

编辑:通过@ user5957401 将其缩短-1个字节

for(i in 0:9)cat("**********\n")

3
for(i in 1:10)"**********\n"
Leaky Nun

1
@LeakyNun:简单是关键!cat尽管如此,我还是没有。
弗雷德里克

cat(rep("**********\n",10))
Leaky Nun

@LeakyNun无法产生所需的输出:请参见此处。中的默认分隔符cat为空格,因此此输出。
plannapus

5

视网膜,12字节

字节数假定为ISO 8859-1编码。前导换行很重要。


10$**
.
$_¶

第一阶段写入一个由十个星号组成的字符串,第二阶段将每个星号替换为整个字符串和一个换行符。这将打印两个尾随换行符。


5

J10 9字节

1个字节,感谢@Adám。

10 10$'*'

在线口译员

说明

10 10向操作员指定维度,该操作员$将使用指定的维度构建数组。


1
同样是9个字节:'*'$~,~10
Conor O'Brien
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.