Amerikan Bayrağını Yazdır!


29

Özel Bağımsızlık Günü (ABD) bugün sizin için zorlu bir temaydı. Amerikan Bayrağının bu inanılmaz sanat gösterimini basan bir program yazmalısınız.

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

Her satırdaki son boşluklara ve sondaki bir satır sonrasına izin verilir.

Bayrağın bakması gerektiği gibi olmadığını, ancak ASCII ile alabileceğim en yakın yol olduğunu unutmayın.

Her zaman olduğu gibi, bu standart boşluklar geçerli ve baytlarda en kısa cevap geçerli!


İzleyen beyaz boşluğa izin veriliyor mu?
Dennis,

@Dennis aşırı olmadığı sürece neden olmadığını anlamıyorum. Yani sondaki bir satırsonu tamam.
DJMcMayhem

9
Bunu bir pop-yarışma haline getirir ve en gerçekçi bayrağı kimin yazdığını görürüm.
Hosch250,

7
@ Hosch250 Bu "sanat yarışması" olarak kapanacaktı
Sp3000

1
@steveverrill Evet, ama esintiyle dalgalanan bir bayrak çizebiliriz belki.
Hosch250,

Yanıtlar:


21

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

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

CJam tercümanında çevrimiçi olarak deneyin .

Fikir

Bayrağın en ilginç kısmı yıldızlar ve çizgilerdir.

İki boşluğu ve bir sayıyı 56 kez tekrarlar ve her birine dikey bir çubuk eklersek,

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

Bu deseni 7 kez tekrarlayarak ve ilk iki çizgiyi atarak, şeritleri elde ederiz:

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

Şimdi, ipi " * "50 kez tekrarlayıp sonucu uzunluğu 22'lik parçalara bölersek, yıldızları elde ederiz:

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

Boşluk biraz kapalı, ancak son parçayı yok edip kalanlara boşluk bırakarak bunu düzeltebiliriz.

Şimdi, çizgileri ve yıldızları üst üste getirirsek,

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

Tek yapılması gereken iki çizgi 57 çizgi eklemek, 37 dikey çubuktan oluşan bir sütun eklemek ve vişneyi üstüne koymak.

kod

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
Çok kısa bir süre için, sihirli bir an seni dövüyordum
edc65

2
Her gün birisinin 120 baytlık bir CJam programı yazdığını görmüyorsunuz.
lirtosiast

1
En çok sevdiğim şey, her çizgide 6 yıldız olması için bir yol bulmanız ve ardından doğal olarak istemediklerinizden kurtulmanız.
Level River St

@ steveverrill: Ben de beğendim, ama daha kısa bir şey buldum ...
Dennis,

Güzel! (Petekle benzer bir şey yaptınız, değil mi?) Ama şimdi açıklamanızdaki üst üste binen görüntüyü revize etmeniz gerekiyor.
Level River St

27

Python 2, 113 bayt

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)

Dize dilimleme ve modulo çekleri bolca.


+1 Çok etkileyici, yakut cevabımdan 7 bayt önce. Hem siz hem de EDC65 bir zamanlar Dennis'in önünde miydiniz? Vaov!
Seviye River St

11
Bir cjam cevabıyla rekabet eden bir python cevabı. Yaşamak için ne zaman!
DJMcMayhem

3
Değerin i=0kendisinin nasıl basıldığını seviyorum .
xnor

8

Brainf ** k 3355 3113 1598 1178 782 bayt

Bu dil nedir

İşte 28 döngüye sahip el optimize versiyonudur. Sanırım bunu gidebildiği kadarıyla aldım.

İşte ideone.com adresindeki çalışma :

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

Bu nasıl çalışıyor?

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

Bu program 10 hafıza yeri kullanır:

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

Satır 1

  • Bu satır ASCII karakterlerini 2'den 7'ye kadar olan kayıtlarda (çoğunlukla) ayarlar. Bazı ince ayarlamalar daha sonra yapılır.
  • Bu kod, ilk önce 0 register'ına 3 koyar ve ardından her döngüde dört defa 4 defa artan register 1'i döndürür: +++[>++++<-] . Son sonuç, kayıt 0'ın 0 ve kayıt 1'in 12 olmasıdır.
  • 12 bir sonraki döngü için döngü sayacı olarak kullanılır. Döngü boyunca 12 kez, kayıt 2, 3 ve 4, 3 kez arttırılır, kayıt 5, 10 kez arttırılır, kayıt 6, 1 kez artırılır ve kayıt 7, 4 kez artırılır. Bu döngünün sonunda, şunları içerir: R2 (36), R3 (36), R4 (36), R5 (120), R6 (12), R7 (48). Döngü yazmacı 2, 6 kez artırıldıktan sonra, kayıt 3, 4 kez azaltılır ve kayıt 4, bir kez azalır. Bu noktada, değerler: R2 (42), R3 (32), R4 (35), R5 (120), R6 (12), R7 (48). 5 ve 6 numaralı kayıtların tümü başlangıç ​​ASCII değerlerini içerir.
  • Bir sonraki kayıt 7, "0"bayrağın tepesindeki çıktıdır !
  • Sonraki register 6 iki kez 10'a (ASCII newline) düşürülür ve çıkar. Bayrağın ilk satırı ile bitti!

Hat 2

  • İlk önce 5 ile 4 arasındaki artışlar kayıtlıdır "|"(ASCII 124) ve çıkış yapar.
  • Sonra, 7 sayısını üçe göre değiştirerek "0"(ASCII 48) 'den "-"(ASCII 45) değiştirir ve çıkarır.
  • Daha sonra 7'yi döngü sayacı 3'e (kayıt 8) yerleştirir ve 7 kez döngüye sokar ve toplam 7 * 8 = 56 çizgi için her seferinde 8 çizgi yazar.
  • Sonunda yeni bir satır çıkartarak biter.

Satır 3

  • Bu çizgi iki döngü içeriyor.
  • İlk döngü " * "5 kez yazar .
  • Sonra " * "yazılır
  • İkinci döngü "#"toplamda 32'ye 8 kez yazma (8) yazar .
  • Sonra "#", "|"ve "\n"yazılır.

Satır 4 - 11

  • Bu çizgiler, bayrağın yıldızlarını ve çizgilerini yazmak için 3. satırla aynı tekniği kullanır.

Satır 12

  • Bu çizgi 3 kez çalışan bir döngü başlatır.
  • Döngü 17 satırında sona ermektedir.

Satır 13

  • Bayrak boyunca geçen bir şerit yazar.
  • Döngüde "#"her seferinde 8 kez yazan 7 kez çalışan bir döngü kullanır .

Satır 14

  • 2 kez çalışan bir döngünün başlangıcı.

Satır 15

  • Bayrak boyunca geçen bir şerit yazar.
  • Döngüde " "her seferinde 8 kez yazan 7 kez çalışan bir döngü kullanır .

Satır 16

  • 14. satırda başlayan iç döngünün sonu.

Satır 17

  • 13. satırda başlayan dış döngünün sonu.

Satır 18

  • Bayrağın alt şeridini çizer.

Satır 19

  • Bayrağın alt kenarlığını çizer.

Satır 20

  • Bayrak direğini çizer.
  • 8 kez "|"döngüye girer , her seferinde iki kez yazar ve satır yazar .

2
Bayrağı sıkıştırmayı gerçekten başardın! Umarım golf bittiğinde bir açıklama yaparsın. Bunun nasıl çalıştığını bilmek isterim.
Dennis,

Bir açıklama göndereceğim. Hala golf oynuyorum!
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

7

JavaScript ( ES6 ), 153 156

Şablon dizesini kullanarak, anlamlı ve sayılan 1 yeni satır var.

Aşağıdaki pasajı çalıştırma testi (yalnızca EcmaScript 6, Firefox olmak)

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

Daha vatansever olmak için, işte EcmaScript 5 versiyonu

// 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
+5 daha vatanseverlik
Pete TNT

6

Ruby, 104 102 bayt

ManAtWork Ruby'den gelen fikirleri izinle kullanmak.

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 bayt

Olarak değiştirilen teklifler ?Şerit rengi için koşullu yerine kullanılan diziye . şerit uzunluğu için formül yerine koşullu kullanılır.

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

Buradaki püf nokta çizgileri (hem kırmızı / #beyaz / hem de space) doğru uzunluğa çekmek ve ardından yıldızları doldurmak için doğru şekilde yaslamak. Ruby rjust, " * "ve arasında değişen dolgu dizesini belirtmemize izin verir." *" .

Orijinal sürüm, 127 bayt

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

Hata! Ruby cevabının zaten var olup olmadığını kontrol etmeden önce sayfayı yeniden unuttum. Gibi cevabım önemli ölçüde farklı değil, sildim. İçinde bulabileceğiniz herhangi bir güzel parçayı kullanmaktan çekinmeyin.
manatwork

@manatwork Bunu silmeniz gerektiğini görmüyorum, benimkinden daha kısaydı ve ben zaten reddetti. İçinde bilmediğim bazı Ruby püf noktaları vardı, yakut için yeniyim. Geleneksel bir dilde en kısa cevap olan her iki yanıtın en iyisini kullanarak 104'e düştüm. Ben kullanabilir neden anlamıyorum maportasında puts ama tek başına kullanamazsınız i parantez ile surround bile: puts((0.18).map{}). Başka bir gelişme görürseniz, ya bana bildirin ya da kendi cevabınızı geri alın ve oraya gönderin.
Level River St

Ruby'nin rjustsadece bir karakter değil, bir ip alabileceği konusunda etkilendim . Çok kötü Python bunu yapamaz ...
Sp3000

3

SWI-Prolog, 275 bayt

Fransız kökenli bir dilde, hangi tür bir uydurma

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

Sonucu burada görün


Var olan bir cevabı kırmaktan nefret ediyorum, ancak ilk versiyonun 13 yerine 11 şeriti vardı. Neyi değiştirdiğimi görmek için düzenleme geçmişini kontrol edebilirsiniz. Bunun için üzgünüm.
DJMcMayhem

@DJMcMayhem Sabit, sadece iki sayıyı değiştirmek gerekiyordu ve cevabın uzunluğunu değiştirmedi, bu yüzden hepsi iyi
Fatalize

1

C, 235 211 208 205 203 198 197 186 bayt

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

edit: Cool Guy'ın bazı önerilerini ekledi ve?: bazı if ifadelerini değiştirmek için kullandı.

düzenleme: kaldırıldı taşma \ 0 önleme ve yerine stringf kullanılan stringf sınırlayıcı.

düzenleme: Her iki memset koşullu elden geçirdi.

edit: noktalı virgül kaldırmak için forder içine taşınır ("0").

düzenleme: hafifçe yeniden düzenleme 11 bayt daha almak için.


İyi ilk girişim. Ancak bu, her çizginin |başlangıcında basılmış gibi görünmüyor ...
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);}}
bayttaki kodunuz

@ Cool Guy: Yakaladığın için teşekkürler. '|' Öğesini taşımayı unuttum. başlatıcıdan ikinci printf'e dön. Kodunuzu Cygwin altında GCC kullanarak çalıştırmayı denedim, ancak biçimlendirme kapalı. Derlemek için gerekli bayrakları çalıştırmak için yapmam gereken özel bir şey var mı?
openaddr

Özel bayrak gerekmez. Burada test edin Golf daha kullanarak 45yerine '-'ve 35yerine '#'ve 32yerine' '
Spikatrix

@ Cool Guy: Karakter kodlama değerleri için iyi öneri. Ve i == 0 ı göz ardı ediyorum iyi yakalamak. Sanırım ilk kodunuz ikinci (puts) () yüzünden işe yaramadı, ama bu kısmen benim hatamdı çünkü "|" 'nin pozisyonunu değiştirmeyi unutmak, dizginin tamamını içeren tampon gibi görünmesini sağladı. Sonunda printf kullanarak sağladığınız linkteki kod şimdi çalışıyor.
openaddr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.