アメリカの国旗を印刷してください!


29

特別な独立記念日(米国)をテーマにした今日のチャレンジ。このアメリカ国旗のアスキーアート表現を印刷するプログラムを作成する必要があります。

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

各行の末尾のスペースと1つの末尾の改行が許可されます。

これはフラグの見た目とは異なりますが、ASCIIで得られる最も近い方法です。

いつものように、これはので、標準的な抜け穴が適用され、バイト単位の最短回答が勝ちます!


末尾の空白は許可されますか?
デニス

@Dennisは、それが過度でない限り、なぜそうなのかわかりません。したがって、1つの末尾の改行で問題ありません。
DJMcMayhem

9
これをポップコンテストにして、誰が最もリアルな旗を印刷するかを確認します。
Hosch250

7
@ Hosch250それは「アートコンテスト」として終了することになります
Sp3000

1
@steveverrillはい、しかし、たぶん風に波打つ旗を描くことができます。
Hosch250

回答:


21

CJam、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インタープリターでオンラインで試してください。

アイディア

フラグの最も興味深い部分は、星条旗のパターンです。

2つのスペースと番号記号を56回繰り返し、それぞれに縦線を追加すると、

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

このパターンを7回繰り返し、最初の2行を破棄すると、ストライプが取得されます。

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

ここで、文字列を" * "50回繰り返し、結果を長さ22のチャンクに分割すると、星が取得されます。

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

空白は少しずれていますが、最後のチャンクを削除し、残りのチャンクにスペースを追加することで修正できます。

さて、ストライプと星を重ね合わせると、

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

あとは57行のダッシュを2行追加し、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
非常に短い、魔法の瞬間に私はあなたを
beっていた-edc65

2
誰かが120バイト長のCJamプログラムを書いているのを毎日見ているわけではありません。
リトシアスト

1
私が一番好きなのは、各行に6つ星を付ける方法を見つけた後、不要な星を自然に取り除く方法です。
レベルリバーセント

@steveverrill:私もそれが好きでしたが、もっと短いものを見つけました...
デニス

クール!(あなたはハニカムで似たようなことをしませんでしたか?)しかし、今、あなたはあなたの説明の中で重ねられたイメージを修正する必要があります。
レベルリバーセント

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の両方が一度にデニスをリードしましたか?うわー!
レベルリバーセント

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文字をセットアップします。いくつかの調整は後で行われます。
  • このコードは、最初にレジスタ0に3を入れてから、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は1回デクリメントされます。この時点で、値はR2(42)、R3(32)、R4(35)、R5(120)、R6(12)、R7(48)です。レジスタ5と6を除くすべてに、初期ASCII値が含まれています。
  • 次のレジスタ7が出力され"0"、フラグの先頭に!
  • 次のレジスター6は2回デクリメントされて10(ASCII改行)になり、出力されます。フラグの最初の行で完了しました!

2行目

  • まず、レジスター5を4増やして"|"(ASCII 124)、出力します。
  • 次に、レジスタ7を"0"(ASCII 48)から"-"(ASCII 45)に3回変更することでデクリメントし、出力します。
  • 次に、ループカウンタ3(レジスタ8)に7を入れて7回ループし、毎回8ダッシュを書き出して合計7 * 8 = 56ダッシュにします。
  • 最後に、改行を出力して終了します。

3行目

  • この行には2つのループが含まれています。
  • 最初のループは" * "5回書き込みます。
  • 次に" * "書かれています
  • 2番目のループは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回書き込みと改行を行います。

2
実際にフラグを圧縮することができました!ゴルフが終わったら説明を投稿してください。これがどのように機能するかを知りたいです。
デニス

説明を掲載します。私はまだゴルフをしています!
ヴァカワマ

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
ES5の愛国心
ピートTNT

6

ルビー、104 102バイト

ManAtWorkのRubyの回答のアイデアを許可を得て使用する。

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

ルビー、127 121 112バイト

引用符を?ストライプの色の条件ではなく、使用される配列に変更しました。ストライプ長の式の代わりに条件を使用しました。

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あなたはそれを削除する必要があるとは思わない、それは私のものよりも短く、私はすでにそれを支持していた。そこにはRubyのトリックがいくつかありましたが、知らなかったので、Rubyは初めてです。私は両方の回答のベストを使用して104になりました。これは、従来の言語では最短の回答です。mapの中央でを使用できる理由がわかりませんputs が、ブラケットで囲んでも、単独では使用できませんputs((0.18).map{})。さらに改善が見られた場合は、お知らせください。または、自分の回答の削除を取り消してそこに投稿してください。
レベルリバーセント

Ruby rjustは文字だけでなく文字列も使用できることに感心しました。あまりにも悪い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]).

ここで結果を見る


私は既存の答えを破ることを嫌いますが、最初のバージョンには13ではなく11のストライプがありました。私は他に何も変更しませんでした。編集履歴を確認して、変更内容を確認できます。ごめんなさい
DJMcMayhem

@DJMcMayhem修正、2つの数字を変更するだけで、回答の長さは変更しなかったので、すべてが良いです
-Fatalize

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条件を作り直しました。

編集:セミコロンを削除するためにforヘッダー内にputs( "0")を移動しました。

編集:さらに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

@Cool Guy:キャッチしてくれてありがとう。「|」を移動するのを忘れました 初期化子から2番目のprintfに戻ります。Cygwinの下でGCCを使用してコードを実行しようとしましたが、フォーマットはオフになっています。それを実行するために何か特別なことをする必要がありますか、コンパイル時に必要なフラグはありますか?
openaddr

特別なフラグは必要ありません。ここでそれをテストしてください。45代わりに'-'35代わりに'#'32代わりに、代わりに' '
-Spikatrix

@Cool Guy:文字エンコード値についての良い提案。そして私が見落としていたi == 0の良いキャッチ。最初のコードは2番目のputs()が原因で機能していなかったと思いますが、「|」の位置を戻すことを忘れることで、バッファに文字列全体が含まれているように見えたため、それは部分的に私のせいでした。最後にprintfを使用して提供したリンクのコードは、現在機能しています。
openaddr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.