미국 국기를 인쇄하십시오!


29

오늘 미국을 위한 특별 독립 기념일 테마 도전. 이 미국 국기의 아스키 아트 표현을 인쇄하는 프로그램을 작성해야합니다.

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

각 줄의 후행 공백과 하나의 후행 줄 바꿈이 허용됩니다.

이것은 플래그가 보이는 방식이 아니지만 ASCII로 얻을 수있는 가장 가까운 것입니다.

평소와 같이 이것은 이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 승리합니다!


후행 공백이 허용됩니까?
Dennis

@Dennis 그것이 과도하지 않은 한 왜 그런지 모르겠습니다. 따라서 하나의 후행 줄 바꿈이 좋습니다.
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 통역사 에서 온라인으로 사용해보십시오 .

생각

국기에서 가장 흥미로운 부분은 성조기 패턴입니다.

두 개의 공백과 숫자 기호를 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

1
내가 가장 좋아하는 것은 각 줄에 6 개의 별을 가진 방법을 찾은 다음 원하지 않는 별을 자연스럽게 제거하는 방법입니다.
Level River St

@steveverrill : 저도 그 점을 좋아했지만 더 짧은 것을 발견했습니다 ...
Dennis

시원한! (벌집과 비슷한 일을 했습니까?) 그러나 이제 설명에서 중첩 된 이미지를 수정해야합니다.
Level River St

27

파이썬 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보다 앞서 있었습니까? 와우!
Level River St

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에 넣은 다음 각 루프를 4 번씩 증가시켜 레지스터 1을 3 번 반복 +++[>++++<-]합니다. 결과적으로 레지스터 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을 감소 시키고 출력합니다.
  • 그런 다음 7을 루프 카운터 3 (레지스터 8)에 넣고 7 번 반복하여 매번 8 개의 대시를 작성하여 총 7 * 8 = 56 개의 대시를 만듭니다.
  • 마지막으로 줄 바꿈을 출력하여 끝납니다.

3 호선

  • 이 줄에는 두 개의 루프가 있습니다.
  • 첫 번째 루프는 " * "5 번 씁니다 .
  • 그런 다음 " * "기록됩니다
  • 두 번째 루프 "#"는 총 32 번씩 8 을 4 번 반복 합니다.
  • 그런 다음 "#", "|""\n"기록됩니다.

4 ~ 11 행

  • 이 선들은 3 번 줄과 같은 기술을 사용하여 깃발의 별과 줄무늬를 씁니다.

12 호선

  • 이 줄은 3 번 실행되는 루프를 시작합니다.
  • 루프는 17 행에서 끝납니다.

13 호선

  • 깃발을 가로 지르는 스트립을 씁니다.
  • 루프를 "#"통해 매번 8 번씩 7 번씩 실행되는 루프를 사용합니다 .

14 호선

  • 2 회 실행되는 루프의 시작

15 호선

  • 깃발을 가로 지르는 스트립을 씁니다.
  • 루프를 " "통해 매번 8 번씩 7 번씩 실행되는 루프를 사용합니다 .

16 호선

  • 14 행에서 시작한 내부 루프의 끝.

17 호선

  • 13 번 라인에서 시작된 외부 루프의 끝.

18 호선

  • 깃발의 밑줄을 그립니다.

19 호선

  • 플래그의 아래쪽 테두리를 그립니다.

20 호선

  • 깃대를 그립니다.
  • 루프를 "|"통해 매번 두 번 쓰기 와 개행을 두 번 반복합니다.

2
실제로 깃발을 압축했습니다! 골프를 마치면 설명을 게시하길 바랍니다. 어떻게 작동하는지 알고 싶습니다.
Dennis

설명을 게시하겠습니다. 나는 아직도 골프를 해요!
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

자바 스크립트 ( 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를 애국심
Pete TNT

6

루비, 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

루비, 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)를 올바른 길이로 그린 다음별로 채 웁니다. 루비는 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

루비 답변이 이미 있는지 확인하기 전에 페이지를 다시로드하는 것을 잊었습니다. 으로 내 대답은 크게 다르지 않다, 나는 그것을 삭제. 당신이 찾을 수있는 좋은 부분을 자유롭게 사용하십시오.
manatwork

@manatwork 나는 당신이 그것을 삭제해야한다고 보지 못했습니다. 내 것보다 짧았으며 이미 그것을 공표했습니다. 내가 알지 못한 루비 트릭이 있었는데, 루비를 처음 사용했습니다. 나는 두 가지 답변 중 가장 좋은 것을 사용하여 104로 줄어 들었습니다. 이는 전통적인 언어에서 가장 짧은 답변입니다. map중간에 왜 사용할 수 있는지 이해하지 puts 못하지만 괄호로 묶어도 독자적으로 사용할 수 없습니다 puts((0.18).map{}). 추가 개선 사항이 있으면 알려주거나 답장을 삭제 한 후 게시하십시오.
Level River St

Ruby rjust가 문자가 아닌 문자열을 사용할 수 있다는 것에 깊은 인상을 받았습니다 . 너무 나쁜 파이썬은 그렇게 할 수 없습니다 ...
Sp3000

3

SWI- 프롤로그, 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 고정, 두 숫자 만 변경하고 답의 길이를 변경하지
않아도되었으므로

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 : 캐치 주셔서 감사합니다. 나는 '|'을 움직이는 것을 잊었다 이니셜 라이저에서 두 번째 printf로 돌아갑니다. Cygwin에서 GCC를 사용하여 코드를 실행하려고 시도했지만 형식이 해제되었습니다. 컴파일 타임에 컴파일해야 할 특별한 작업이나 컴파일 타임에 필요한 플래그가 있습니까?
openaddr

특별한 플래그가 필요하지 않습니다. 여기 테스트 골프 그것을 더 사용하여 45대신 '-'하고 35대신 '#'하고 32대신' '
Spikatrix

@ Cool Guy : 문자 인코딩 값에 대한 좋은 제안. 그리고 내가 간과 한 i == 0을 잘 잡았습니다. 두 번째 puts () 때문에 초기 코드가 작동하지 않았다고 생각하지만 "|"의 위치를 ​​다시 변경하는 것을 잊어 버려 버퍼가 전체 문자열을 포함하는 것처럼 보이기 때문에 부분적으로 내 잘못이었습니다. 마지막에 printf를 사용하여 제공 한 링크의 코드가 이제 작동합니다.
openaddr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.