打印美国国旗!


29

今天,您将以特别独立日(美国)为主题的挑战。您必须编写一个程序来打印此美国国旗的ascii艺术表示形式。

0
|---------------------------------------------------------
| *   *   *   *   *   * #################################|
|   *   *   *   *   *                                    |
| *   *   *   *   *   *                                  |
|   *   *   *   *   *   #################################|
| *   *   *   *   *   *                                  |
|   *   *   *   *   *                                    |
| *   *   *   *   *   * #################################|
|   *   *   *   *   *                                    |
| *   *   *   *   *   *                                  |
|########################################################|
|                                                        |
|                                                        |
|########################################################|
|                                                        |
|                                                        |
|########################################################|
|                                                        |
|                                                        |
|########################################################|
|---------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

允许在每行尾随空格以及一个尾随换行符。

请注意,这并不是标志的外观,但这是我可以使用ASCII获得的最接近的标志。

像往常一样,这是因此存在标准漏洞,并且最短答案以字节为单位!


是否允许尾随空格?
丹尼斯

@Dennis,只要不过度,我不明白为什么不这样做。因此,尾随一个换行符就可以了。
DJMcMayhem

9
我将其设为流行竞赛,看看谁打印出最真实的标志。
Hosch250

7
@ Hosch250最终将以“美术大赛”结束
Sp3000

1
@steveverrill是的,但是也许我们可以在微风中画出一个荡漾的旗帜。
Hosch250

Answers:


21

果酱 184 120 109 101 76 74 69 67 64 62 58字节

0'-57*"  #"56f*'|f+7*2>" *  "50*22/W<Sf+..e&~J$]N'|+a37*.+

CJam解释器中在线尝试

理念

旗帜最有趣的部分是星条旗图案。

如果我们重复两个空格和一个数字符号56次,并在每个空格后面加上一个竖线,我们得到

                                                         |
                                                         |
#########################################################|

重复此模式7次并丢弃前两行,我们获得了条纹:

#########################################################|
                                                         |
                                                         |
#########################################################|
                                                         |
                                                         |
#########################################################|
                                                         |
                                                         |
#########################################################|
                                                         |
                                                         |
#########################################################|
                                                         |
                                                         |
#########################################################|
                                                         |
                                                         |
#########################################################|

现在,如果我们重复字符串" * "50次并将结果分成长度为22的块,我们将获得星号:

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

空格有些差,但是我们可以通过消除最后一个块并在其余块后面添加一个空格来解决此问题。

现在,如果我们叠加条纹和星星,我们得到

 *   *   *   *   *   * #################################|
   *   *   *   *   *                                    |
 *   *   *   *   *   *                                  |
   *   *   *   *   *   #################################|
 *   *   *   *   *   *                                  |
   *   *   *   *   *                                    |
 *   *   *   *   *   * #################################|
   *   *   *   *   *                                    |
 *   *   *   *   *   *                                  |
########################################################|
                                                        |
                                                        |
########################################################|
                                                        |
                                                        |
########################################################|
                                                        |
                                                        |
########################################################|

剩下要做的就是添加两行,每行57个破折号,添加一列37条竖线,并将樱桃放在顶部。

0         e# Push a zero.
'-57*     e# Push a string of 57 dashes.
"  #"56f* e# Repeat each character in the string 56 times.
'|f+      e# Append a vertical bar to each resulting string.
7*        e# Repeat the resulting array of strings 7 times.
2>        e# Discard the first two strings.
" *  "50* e# Repeat the string 50 times.
22/       e# Split the result into chunks of length 22.
W<        e# Discard the last, partial chunk.
Sf*       e# Append a space to each chunk.
..e&      e# Twofold vectorized logical AND.
          e# Since all characters in the strings are truthy, this always selects
          e# the second character, painting the stars over the stripes.
~         e# Dump all resulting strings on the stack.
J$        e# Copy the string of dashes.

]         e# Wrap the entire stack in an array.
N'|+a37*  e# Repeat ["\n|"] 37 times.
.+        e# Perform vectorized concatenation.

13
在短短的神奇时刻,我击败了您
edc65

2
并非每天都看到有人写120字节长的CJam程序。
lirtosiast 2015年

1
我最喜欢的是,您如何找到一种在每条直线上拥有6个星星,然后自然地摆脱您不想要的星星的方法。
级圣河

@steveverrill:我也很喜欢,但是我发现了一些更短的东西……
Dennis

凉!(您对蜂窝做了类似的事情,不是吗?)但是现在您需要修改说明中的叠加图像。
水平河圣

27

Python 2,113字节

for i in range(38):print i and"|"+["-"*57,(" *  "*7)[i%2*2:][:(i<11)*23].ljust(56,"  #"[i%3])+"|"][1<i<21]*(i<22)

字符串切片和取模运算丰富。


+1非常令人印象深刻,比我的红宝石答案要早7个字节。您和EDC65一次都领先于Dennis吗?哇!
级圣河

11
与cjam答案竞争的python答案。多么活着的时间!
DJMcMayhem

3
我喜欢如何i=0自动打印值。
xnor

8

Brainf ** k,3355 3113 1598 1178 782字节

这是什么语言?

这是具有28个循环的手动优化版本。我想我已经尽力了。

这是在ideone.com上的运行:

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

这是如何运作的?

 1: +++[>++++<-]>[>+++>+++>+++>++++++++++>+>++++<<<<<<-]>++++++>---->->>>.<--.
 2: <++++.>>---.>+++++++[<........>-]<<.
 3: <.<<<<+++++[>>.<.>..<<-]>>.<.>.<<++++[>>>........<<<-]>>>.>.>.
 4: <.<<<<+++++[>>...<.<-]+++++[>>.......<<-]>>.>>.>.
 5: <.<<<<++++++[>>.<.>..<<-]++++[>>........<<-]>>>>.>.
 6: <.<<...<<+++++[>.>...<<-]++++[>>>........<<<-]>>>.>.>.
 7: <.<<<<++++++[>>.<.>..<<-]++++[>>........<<-]>>>>.>.
 8: <.<<<<+++++[>>...<.<-]+++++[>>.......<<-]>>.>>.>.
 9: <.<<<<+++++[>>.<.>..<<-]>>.<.>.<<++++[>>>........<<<-]>>>.>.>.
10: <.<<<<+++++[>>...<.<-]+++++[>>.......<<-]>>.>>.>.
11: <.<<<<++++++[>>.<.>..<<-]++++[>>........<<-]>>>>.>.
12: >>>+++[<<<
13: <.>>>+++++++[<<<<........>>>>-]<<<.>.
14: >>++[<<
15: <.<<<<+++++++[>>........<<-]>>>>.>.
16: >>-]<<
17: >>>-]<<<
18: <.>>>+++++++[<<<<........>>>>-]<<<.>.
19: <.>>.>+++++++[<........>-]<<.
20: >>++++++++[<<<.>.<.>.>>-]

该程序使用10个内存位置:

0: loop counter #1
1: loop counter #2
2: "*"  ASCII 42
3: spc  ASCII 32
4: "#"  ASCII 35
5: "|"  ASCII 124
6: "\n" ASCII 10
7: "0"  ASCII 48, "-"  ASCII 45
8: loop counter #3
9: loop counter #4

1号线

  • 该行在寄存器2至7中(大多数情况下)设置ASCII字符。稍后进行一些调整。
  • 此代码首先将3放入寄存器0,然后循环3次,使寄存器1递增4次,每个循环:+++[>++++<-]。然后最终结果是寄存器0为0,寄存器1为12。
  • 12用作下一个循环的循环计数器。对于循环中的12次,寄存器2、3和4递增3次,寄存器5递增10次,寄存器6递增1次,寄存器7递增4次。在此循环结束时,它们包含:R2(36),R3(36),R4(36),R5(120),R6(12),R7(48)。循环寄存器2递增6次后,寄存器3递减4次,寄存器4递减一次。此时,值是:R2(42),R3(32),R4(35),R5(120),R6(12),R7(48)。除寄存器5和6外,所有寄存器均包含其初始ASCII值。
  • 下一个寄存器7输出,"0"在标志的顶部!
  • 下一个寄存器6递减两次至10(ASCII换行符)并输出。完成标志的第一行!

2号线

  • 首先,它将寄存器5加4,使其变为"|"(ASCII 124)并输出。
  • 然后将寄存器7从"0"(ASCII 48)更改为"-"(ASCII 45)减三。
  • 接下来,将7放入循环计数器3(寄存器8)并循环7次,每次写出8个破折号,总共7 * 8 = 56个破折号。
  • 最后,通过输出换行符结束。

3号线

  • 这行包含两个循环。
  • 第一个循环写入" * "5次。
  • 然后 " * "
  • 第二个循环循环写入4次8 "#",总共32次。
  • 然后"#",,"|""\n"被写入。

第4-11行

  • 这些行使用与第3行相同的技术来写出标记的星条旗。

12号线

  • 该行启动一个循环,运行3次。
  • 循环在第17行结束。

13号线

  • 编写一条穿过标志的带。
  • 使用一个运行7次的循环,"#"每次循环写入8次。

14号线

  • 循环运行2次的开始。

15号线

  • 编写一条穿过标志的带。
  • 使用一个运行7次的循环," "每次循环写入8次。

16号线

  • 从第14行开始的内部循环的结尾。

17号线

  • 从第13行开始的外循环结束。

18号线

  • 绘制标志的底部条纹。

19号线

  • 绘制标志的底部边框。

20号线

  • 画旗杆。
  • 循环8次,"|"每次循环两次写和换行。

2
您实际上设法压缩了标志!希望您打完高尔夫球后能发个解释。我非常想知道这是如何工作的。
丹尼斯

我会发表一个解释。我还在打高尔夫球!
vacawama

7

///:225个字符

/D/ddd//d/--------//H/hhh//h/########//S/sss//s/        //A/aaaaa//a/ *  //b/|HHh|
|SSs|
|SSs|
//p/|
|
|
|
/0
|DDd-
|A * Hh#|
|  A Ss |
|A * Ss |
|  A Hh#|
|A * Ss |
|  A Ss |
|A * Hh#|
|  A Ss |
|A * Ss |
bbb|HHh|
|DDd-
pppp

7

的JavaScript(ES6),153 156

使用模板字符串,有1条重要的换行符已计算在内

测试以下代码段的运行情况(仅EcmaScript 6,仅Firefox)

// TEST - Just for testing purpose,redefine console.log

console.log = (...x) => O.innerHTML += x+'\n'

// SOLUTION

o=[0];for(o[r=1]=o[21]='-'[R='repeat'](57);++r<21;o[r]=" *  "[R](7).substr(r%2*2,r<11&&23)+'  #'[r%3][R](r<11?33:56)+'|')o[37]='';console.log(o.join`
|`)
<pre id=O></pre>

更爱国的是EcmaScript 5版本

// TEST - Just for testing purpose,redfine console.log

console.log = function(x){ O.innerHTML += x+'\n' }

// SOLUTION - 175 bytes

for(o=(A=Array)(38),o[0]=0,r=2;r<21;r++)o[r]=A(8)[J='join'](" *  ").substr((r&1)*2,r<11?23:0)+A(r<11?34:57)[J]('  #'[r%3])+'|';
o[1]=o[r]=A(58)[J]('-'),console.log(o[J]('\n|'))
<pre id=O></pre>


4
+1调用ES5 更爱国
皮特TNT

6

Ruby,104102字节

允许使用ManAtWork的Ruby回答中的想法。

puts 0,s=?|+?-*57,(0..18).map{|i|?|+("#  "[i%3]*(i>8?56:33)).rjust(56," *   *"[i%2*2,4])+?|},s,'|
'*16

Ruby,127121112字节

将引号更改为?使用的数组,而不是条带颜色的条件。使用条件而不是条带长度的公式。

puts 0,s=?|+?-*57
19.times{|i|puts ?|+("#  "[i%3]*(i>8?56:33)).rjust(56,i%2>0?"   *":" *  ")+?|}
puts s,"|\n"*16

这里的技巧是将条纹(红色/ #和白色/ space)绘制到正确的长度,然后右对齐它们,并用星星填充。Ruby rjust允许我们指定填充字符串,该填充字符串在" * "和之间交替" *"

原始版本,127字节

puts 0,s="|"+"-"*57
19.times{|i|puts("|"+((i%3>0?" ":"#")*((i+1)/10*23+33)).rjust(56,i%2>0?"   *":" *  ")+"|")}
puts s,"|\n"*16

糟糕,在检查Ruby答案是否已存在之前,我忘记了重新加载页面。由于我的答案没有明显不同,因此删除了它。随意使用您可能在其中找到的任何好零件。
manatwork

@manatwork我看不到您需要删除它,它比我的短,我已经对其进行了投票。我不知道其中有一些Ruby技巧,我是红宝石新手。我使用这两个答案中的最好的,现在只有104个,这是传统语言中最短的答案。我不明白为什么可以map在中间使用,puts 但即使将方括号括起来也无法单独使用puts((0.18).map{})。如果您看到任何进一步的改进,请告诉我,或者取消删除您自己的答案,然后将其发布在此处。
级圣河

我对Ruby rjust可以接受一个字符串而不只是一个char 印象深刻。太糟糕了,Python无法做到这一点...
Sp3000

3

SWI-Prolog,275字节

在法国血统的语言,这是一种配件

a:-put(48),nl,b,c(0).
b:-z,w(-,57).
c(I):-nl,I=36;J is I+1,(I=19,b,c(J);I>19,z,c(J);I>8,z,(I mod 3=:=0,w(#,56);tab(56)),z,c(J);z,(I mod 2=:=0,tab(1),w('*   ',5),put(42),tab(1);w('   *',5),tab(3)),(0=:=I mod 3,w(#,33);tab(33)),z,c(J)).
z:-put(124).
w(A,B):-writef('%r',[A,B]).

这里查看结果


我讨厌打破现有的答案,但是第一个版本有11条而不是13条。我没有做任何更改。您可以查看编辑历史记录,以查看我所做的更改。对于那个很抱歉。
DJMcMayhem

@DJMcMayhem固定,只需要更改两个数字,而无需更改答案的长度,所以一切都很好
Fatalize 2015年

1

C,235 211 208 205 203 198 197 186字节

i;x(){for(puts("0");i<37;i++){char b[58]="";i<21?memset(b,i%20?i%3&1?35:32:45,56),i&&i<10?memcpy(b," *   *   *   *   *   *   "+(i%2?0:2),23):0,b[56]=i%20?124:45:0;printf("|%.57s\n",b);}}

编辑:添加了一些Cool Guy的建议,并使用?:替换了一些if语句。

编辑:消除了\ 0预防溢出,并在printf中使用了字符串长度限制器。

编辑:重做两个memset条件。

编辑:将puts(“ 0”)移至for标头中以删除其分号。

编辑:略微重构,以获得更多的11个字节。


好的第一次尝试。但这似乎并没有|每一行的开头打印出来……
Spikatrix

您的代码以198个字节为单位:i;c(){puts("0");for(;i<37;i++){char b[58]="|";if(i<21){memset(b,!((i-1)%3)?35:32,56);if(i<10)memcpy(b," * * * * * * "+((i%2)?0:2),23);b[56]='|';}if(!i||i==20){memset(b,45,57);}puts(b);}}
Spikatrix

@酷家伙:谢谢你的收获。我忘了移动'|' 从初始化程序返回到第二个printf。我尝试在Cygwin下使用GCC运行您的代码,但是格式已关闭。我需要执行任何特殊操作来运行它还是在编译时需要任何标志?
openaddr

无需特殊标志。在此处进行测试,使用45代替'-'35代替'#'32代替' '
Spikatrix

@Cool Guy:关于字符编码值的好建议。而且我忽略了i == 0的优势。我认为您的初始代码由于第二个puts()而无法正常工作,但这部分是我的错,因为忘记忘记改回“ |”的位置,这似乎使缓冲区包含了整个字符串。您最后使用printf提供的链接中的代码现在可以正常工作。
openaddr
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.