Cetak Bendera Amerika!

29

Tantangan Khusus Hari Kemerdekaan (AS) untuk Anda hari ini. Anda harus menulis program yang mencetak representasi seni Amerika dari Bendera Amerika ini.

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

Ruang tambahan di setiap baris, serta satu baris tambahan, diizinkan.

Perhatikan bahwa ini bukan tampilan bendera yang seharusnya, tetapi ini adalah yang terdekat yang bisa saya dapatkan dengan ASCII.

Seperti biasa, ini adalah sehingga celah standar berlaku dan jawaban terpendek dalam byte menang!

DJMcMayhem
sumber
Apakah trailing whitespace diizinkan?
Dennis
@ Dennis selama itu tidak berlebihan saya tidak melihat mengapa tidak. Jadi satu trailing newline tidak apa-apa.
DJMcMayhem
9
Saya akan menjadikan ini kontes pop dan melihat siapa yang mencetak bendera paling realistis.
Hosch250
7
@ Hosch250 Itu akhirnya akan ditutup sebagai "kontes seni"
Sp3000
1
@steveverrill Ya, tapi kita bisa menggambar bendera yang berembus tertiup angin, mungkin.
Hosch250

Jawaban:

21

CJam, 184 120 109 101 76 74 69 67 64 62 58 byte

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

Cobalah online di juru bahasa CJam .

Ide

Bagian yang paling menarik dari bendera adalah pola bintang dan garis-garis.

Jika kita mengulangi dua spasi dan tanda nomor 56 kali dan menambahkan bilah vertikal untuk masing-masing, kita dapatkan

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

Mengulangi pola ini 7 kali dan membuang dua baris pertama, kami memperoleh garis-garis:

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

Sekarang, jika kita mengulangi string " * "50 kali dan membagi hasilnya menjadi potongan dengan panjang 22, kita mendapatkan bintang-bintang:

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

Spasi putih sedikit tidak aktif, tetapi kita bisa memperbaikinya dengan menghilangkan potongan terakhir dan menambahkan ruang ke yang tersisa.

Sekarang, jika kita melapiskan garis dan bintang, kita dapatkan

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

Yang tersisa untuk dilakukan adalah menambahkan dua garis 57 garis, menambahkan kolom 37 batang vertikal dan meletakkan ceri di atasnya.

Kode

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.
Dennis
sumber
13
Untuk sesaat yang sangat singkat dan ajaib, aku mengalahkanmu
edc65
2
Tidak setiap hari Anda melihat seseorang menulis program CJam 120 byte terlalu lama.
lirtosiast
1
Yang paling saya sukai adalah bagaimana Anda menemukan cara untuk memiliki 6 bintang di setiap baris, lalu secara alami menyingkirkan yang tidak Anda inginkan.
Level River St
@steveverrill: Saya juga menyukainya, tetapi saya menemukan sesuatu yang lebih pendek ...
Dennis
Keren! (Anda melakukan sesuatu yang mirip dengan sarang lebah, bukan?) Tapi sekarang Anda perlu merevisi gambar yang dilapiskan dalam penjelasan Anda.
Level River St
27

Python 2, 113 byte

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)

Mengiris string dan memeriksa modulo berlimpah.

Sp3000
sumber
+1 Sangat mengesankan, 7 byte di depan jawaban ruby ​​saya. Baik Anda dan EDC65 berada di depan Dennis pada satu waktu? Wow!
Level River St
11
Jawaban python yang bersaing dengan jawaban cjam. Waktu yang tepat untuk hidup!
DJMcMayhem
3
Saya suka bagaimana nilainya i=0dicetak sendiri.
xnor
8

Brainf ** k, 3355 3113 1598 1178 782 byte

Bahasa apakah ini?

Ini adalah versi yang dioptimalkan dengan tangan yang menampilkan 28 loop. Saya pikir saya sudah mengambil ini sejauh yang akan terjadi.

Inilah jalannya di ideone.com :

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

Bagaimana cara kerjanya?

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

Program ini menggunakan 10 lokasi memori:

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

Baris 1

  • Baris ini mengatur karakter ASCII dalam register 2 hingga 7 (kebanyakan). Beberapa penyesuaian dilakukan kemudian.
  • Kode ini pertama menempatkan 3 di register 0, dan kemudian loop 3 kali kenaikan register 1 empat kali setiap loop: +++[>++++<-] . Maka hasil akhirnya adalah register 0 adalah 0, dan register 1 adalah 12.
  • 12 digunakan sebagai penghitung loop untuk loop berikutnya. Untuk 12 kali melalui loop, register 2, 3, dan 4 bertambah 3 kali, register 5 bertambah 10 kali, register 6 bertambah 1 kali, dan register 7 bertambah 4 kali. Pada akhir loop ini, mereka berisi: R2 (36), R3 (36), R4 (36), R5 (120), R6 (12), R7 (48). Setelah register loop 2 bertambah 6 kali, register 3 dikurangi 4 kali, dan register 4 dikurangi sekali. Pada titik ini, nilainya adalah: R2 (42), R3 (32), R4 (35), R5 (120), R6 (12), R7 (48). Semua kecuali register 5 dan 6 berisi nilai ASCII awal mereka.
  • Register 7 berikutnya adalah output, the "0" di bagian atas bendera!
  • Register 6 berikutnya dikurangi dua kali menjadi 10 (baris ASCII) dan hasilnya. Selesai dengan baris pertama bendera!

Baris 2

  • Pertama-tama ia menambah register dengan 5 yang membuatnya "|" (ASCII 124) dan mengeluarkannya.
  • Kemudian decrements register 7 dengan tiga mengubahnya dari "0"(ASCII 48) menjadi "-"(ASCII 45) dan mengeluarkannya.
  • Selanjutnya ia menempatkan 7 ke loop counter 3 (register 8) dan loop 7 kali, menuliskan 8 strip setiap kali dengan total 7 * 8 = 56 strip.
  • Akhirnya diakhiri dengan mengeluarkan baris baru.

Baris 3

  • Baris ini berisi dua loop.
  • Loop pertama menulis " * " 5 kali.
  • Kemudian " * " ditulis
  • Loop kedua loop 4 kali menulis 8 "#" dengan total 32.
  • Kemudian "#",, "|"dan "\n"ditulis.

Baris 4 - 11

  • Baris-baris ini menggunakan teknik yang sama dengan baris 3 untuk menuliskan bintang-bintang dan garis-garis bendera.

Baris 12

  • Baris ini memulai loop yang berjalan 3 kali.
  • Loop berakhir pada baris 17.

Baris 13

  • Menulis strip yang melintasi bendera.
  • Menggunakan loop yang berjalan 7 kali menulis "#"8 kali setiap kali melalui loop.

Baris 14

  • Awal dari loop yang berjalan 2 kali.

Baris 15

  • Menulis strip yang melintasi bendera.
  • Menggunakan loop yang berjalan 7 kali menulis " "8 kali setiap kali melalui loop.

Baris 16

  • Akhir lingkaran dalam yang dimulai pada baris 14.

Baris 17

  • Akhir lingkaran luar yang dimulai pada baris 13.

Baris 18

  • Menarik garis bawah bendera.

Baris 19

  • Menarik batas bawah bendera.

Baris 20

  • Menarik tiang bendera.
  • Loop 8 kali, menulis "|"dan baris baru dua kali setiap kali melalui loop.
vacawama
sumber
2
Anda benar-benar berhasil mengompres bendera! Saya harap Anda akan memposting penjelasan ketika Anda selesai bermain golf. Saya sangat ingin tahu cara kerjanya.
Dennis
Saya akan memposting penjelasan. Saya masih bermain golf!
vacawama
7

/// : 225 karakter

/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
manatwork
sumber
7

JavaScript ( ES6 ), 153 156

Menggunakan string template, ada 1 baris baru yang signifikan dan dihitung

Tes menjalankan cuplikan di bawah ini (menjadi EcmaScript 6, hanya 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>

Untuk menjadi lebih patriotik, ini adalah versi 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>

edc65
sumber
4
+1 untuk memanggil ES5 lebih patriotik
Pete TNT
6

Ruby, 104 102 byte

Menggunakan gagasan dari ManAtWork's Ruby menjawab dengan izin.

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

Ruby, 127 121 112 byte

Mengubah kutipan menjadi ?array yang digunakan alih-alih bersyarat untuk warna garis. digunakan conditional bukan formula untuk stripe length.

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

Kuncinya di sini adalah menggambar garis-garis (baik merah / #putih / space) dengan panjang yang benar, kemudian membenarkannya, padding dengan bintang-bintang. Ruby rjustmemungkinkan kita menentukan string padding, yang berganti-ganti antara " * "dan " *".

Versi asli, 127 byte

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
Level River St
sumber
Ups, saya lupa memuat ulang halaman sebelum memeriksa apakah jawaban Ruby sudah ada. Karena jawaban saya tidak jauh berbeda, saya menghapusnya. Jangan ragu untuk menggunakan bagian bagus apa pun yang mungkin Anda temukan di dalamnya.
manatwork
@manatwork Saya tidak melihat bahwa Anda perlu menghapusnya, itu lebih pendek dari milik saya dan saya sudah memutarnya. Ada beberapa trik Ruby di sana saya tidak tahu, saya baru rubi. Saya turun ke 104 menggunakan yang terbaik dari kedua jawaban, yang merupakan jawaban terpendek dalam bahasa konvensional. Saya tidak mengerti mengapa saya dapat menggunakan mapdi tengah-tengah puts tapi aku tidak bisa menggunakannya sendiri, bahkan jika saya mengelilingi dengan kurung: puts((0.18).map{}). Jika Anda melihat peningkatan lebih lanjut, beri tahu saya, atau batalkan hapus jawaban Anda sendiri dan poskan di sana.
Level River St
Saya terkesan bahwa Ruby rjustdapat mengambil string dan bukan hanya char. Sayang sekali Python tidak bisa melakukan itu ...
Sp3000
3

SWI-Prolog, 275 byte

Dalam bahasa asal Prancis, yang agak pas

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]).

Lihat hasilnya di sini

Fatalisasi
sumber
Saya benci untuk memecahkan jawaban yang ada, tetapi versi pertama memiliki 11 garis bukan 13. Saya tidak mengubah apa pun. Anda dapat memeriksa riwayat edit untuk melihat apa yang saya ubah. Maaf soal itu.
DJMcMayhem
@DJMcMayhem Tetap, hanya perlu mengubah dua angka dan tidak mengubah panjang jawaban, jadi semuanya baik
Fatalize
1

C, 235 211 208 205 203 198 197 186 byte

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

sunting: menambahkan beberapa saran Cool Guy dan memanfaatkan?: untuk mengganti beberapa pernyataan if.

sunting: dihapus overflow \ 0 pencegahan dan digunakan pembatas panjang string di printf sebagai gantinya.

sunting: ulang kedua persyaratan memset.

sunting: pindah menempatkan ("0") di dalam header untuk menghapus titik koma.

sunting: sedikit refactoring untuk mendapatkan 11 byte lebih banyak.

openaddr
sumber
Usaha pertama yang bagus. Tapi ini sepertinya tidak mencetak |pada awal setiap baris ...
Spikatrix
Kode Anda dalam 198 byte: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: Terima kasih atas tangkapannya. Saya lupa memindahkan '|' kembali ke printf kedua dari initializer. Saya mencoba menjalankan kode Anda menggunakan GCC di bawah Cygwin, tetapi pemformatannya tidak aktif. Apakah ada hal khusus yang perlu saya lakukan untuk menjalankannya atau bendera apa pun yang diperlukan pada waktu kompilasi?
openaddr
Tidak diperlukan bendera khusus. Uji di sini45'-'35'#'32' '
Golfkan
@ Cool Guy: Saran bagus untuk nilai pengkodean karakter. Dan tangkapan yang bagus pada i == 0 saya diabaikan. Saya pikir kode awal Anda tidak berfungsi karena put kedua (), tetapi itu sebagian kesalahan saya karena dengan lupa mengubah posisi "|" kembali, itu membuatnya tampak seperti buffer berisi seluruh string. Kode di tautan yang Anda berikan menggunakan printf pada akhirnya tidak berfungsi sekarang.
openaddr