나는 허니컴을 원해


39

육각형 바둑판 식 배열 또는 벌집 의이 ASCII 아트 섹션을 인쇄하는 가장 짧은 프로그램을 작성하십시오 .

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • 입력이 없어야합니다.
  • 표준 출력 또는 언어의 가장 가까운 대안으로 출력합니다.
  • 프로그램 대신 매개 변수를 사용하지 않고 결과를 정상적으로 인쇄하거나 문자열로 반환 하는 명명 된 함수를 작성할 수 있습니다 .
  • 출력은 임의의 수의 선행 및 / 또는 후행 개행을 가질 수 있으며 출력의 각 라인은 (패턴이 올바르게 정렬되는 한) 임의의 수의 선행 및 / 또는 후행 공백을 가질 수 있습니다.
  • 바이트 단위의 가장 짧은 코드가 이깁니다.

13
당신은 많은 Catan을합니까?
user3490

@ user3490 사실 내가 ^^
캘빈의 취미

2
다음 주 PCG : Catan 보드 생성기 작성?
user3490

7
입력 IMO가 있어야합니다. 귀하의 경우에는 3이어야합니다.
user3819867 12

3
@ user3819867 나는 그것을 고려했지만 이것을 선호했다. 누군가가 관련 도전을하기에는 너무 늦었지만 너무 늦지는 않았습니다.
Calvin 's Hobbies

답변:


33

CJam, 45 43 42 41 40 바이트

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

"\__/  "38*21/

패턴을 \__/ 38 회 반복하여 길이 21의 청크로 분할합니다 . 청크가 줄 바꿈으로 분리 된 경우 결과는 다음과 같습니다.

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

이것은 분명히 원하는 벌집을 포함합니다. 남은 일은 일부 문자를 공백으로 바꾸고 다른 문자를 잘라 내고 실제로 줄 바꿈을 도입하는 것입니다.

741e8 36+Ab

정수 74100 000 036을 생성하고 이를 [7 4 1 0 0 0 0 0 3 6] 배열로 변환합니다 . 각 배열 요소는 공백으로 바꿔야하는 해당 행의 선행 문자 수를 인코딩합니다. 16 에서이 수를 빼면 이 선의 정확한 길이도 얻을 수 있습니다.

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

공백은 L 의 다른 문자보다 코드 포인트가 낮고 벡터화 된 연산자는 더 긴 문자열의 문자를 더 짧은 문자 중 하나에 해당하지 않고 그대로 두 .e<므로 첫 번째 D 문자를 공백으로 바꿉니다 .


2
훌륭합니다. 잘 했어.
Alex A.

28

파이썬 2, 73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

실행을 참조하십시오.

11 개의 출력 행 각각에 대해, 선행 공간 수를 k육각형 왼쪽의 엔벨로프를 형성하는 최대 3 개의 선형 함수로 계산합니다 . 대각선에 기울기 3와가 -3있으므로 행 번호를로 색인하는 것이 좋습니다 i=0,3,...30.

육각형 메쉬를 만들려면 먼저 충분한 단위 타일을 만듭니다 '\__/ '. 그런 다음, 시프트 [i:]는 홀수 행에 대해 3만큼 재정렬합니다. 마지막으로 필요한 부분 [k:16-k]을 가져 와서 k왼쪽과 오른쪽에 여백을 남깁니다 .


22

CJam, 65 56 55 바이트

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

각 줄의 오른쪽 절반은 슬래시와 백 슬래시가 바뀐 왼쪽 절반의 복사본입니다. 따라서 허니컴의 왼쪽 절반을 인코딩하면 충분합니다.

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

이 패턴을 한 줄씩 분석하는 대신 열별로 분석 할 수 있습니다.

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

명백한 패턴이 나타납니다.

  • 문자열은 _ _ _ _다섯 번 발생합니다.
  • 모든 /뒤에는 \.

모든 대체함으로써 /\, _, _ _ _ _0 ~ 3까지 숫자로 공간을, 우리는 더 높은베이스에 기본 4 번호에서 결과 배열을 변환하고 컴팩트 한 방식으로 전체 패턴을 저장할 수 있습니다.

암호

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.

10

C, 148 (144) 140 바이트

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

공백이 있고 컴파일러 경고가없고 일부 코드가 수정되기 전에 몇 바이트를 절약하십시오.

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

이 방법은 문자 / 문자열 테이블을 사용하지 않습니다. 187 개 (11 행, 개행 포함 17 열)를 모두 반복하며 조건 조합에 따라 각 위치에 인쇄 할 문자를 결정합니다.

조건에는 4 개의 선 방정식을 사용하여 4 개의 모퉁이 내외부에있는 테스트가 포함되며 결과는 variable에 저장됩니다 p. 나머지는 대부분 6 자마다 반복되며 홀수 행은 짝수 행에 대해 3 자씩 이동합니다.


2
골프를 타는 사람의 경우 implicit-int를 사용하고을 삭제할 수 있습니다 int .
luser droog가

몇 가지 미세한 개선 사항 :k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
Dennis

7

루비-78 바이트

(-5..5).map{|i|puts' '*(j=[i.abs*3-i/6-9,0].max)+('/  \__'*4)[j+i%2*3,16-j*2]}

xnor 솔루션 의 전사 (69 바이트) :

11.times{|i|puts' '*(j=[7-i*=3,i-24,0].max)+('\__/  '*9)[i+j,16-j*2]}

1
11.times2 바이트 저장
미치 슈워츠

6

자바 스크립트 (ES6) 129 130

그것은 순수한 문자열 교체 / 교체 / 교체입니다 ... 기하학적 속성을 이용하지 않습니다.

템플릿 문자열을 사용하면 모든 줄 바꿈이 중요하고 중요합니다.

Firefox에서 스 니펫을 실행하여 테스트

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>


6

PHP - 139 137 107 101 91 87 바이트

이것이 골프를하는 가장 좋은 방법인지는 모르겠지만 여기에 내 시도가 있습니다.

Ismael Miguel 덕분에 30 36 46 -50 바이트

여기에서 온라인으로 테스트 하십시오

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

오래된 코드 :

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다. PHP 코드를 훨씬 더 줄일 수 있습니다. <?대신 <?php3 바이트를 절약 할 수 있습니다 . 대신 $c=$a.$a."/ \\\n\__".$a.$a."/\n";, $c="$a$a/ \\\n\__.$a$a/\n";PHP에서 변수를 문자열로 확장하므로 작성할 수 있습니다 . 동일한 논리를에 적용하여 echo길이를 더 줄일 수 있습니다. 또한 echo문자열과 문자열 사이에 공백이 필요하지 않습니다 .
Ismael Miguel

1
고마워요. 골프를하려고 할 때마다 새로운 것을 배웁니다.
Timo

천만에요. 다음은 99 바이트 길이의 솔루션입니다 ( ideone.com/WHWEZS) . 혼란스러워 보이지만 훨씬 짧습니다. 을 사용하는 대신 실제 줄 바꿈을 \n넣고 줄당 1 바이트를 저장할 수 있습니다.
Ismael Miguel

한편, 나는 2 바이트를 줄였습니다. 이제 97 바이트가 있습니다.
Ismael Miguel

1
다음은 하나의 라이너 <?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";입니다. 를 \t탭 문자와 \n실제 줄 바꿈 으로 바꾸십시오 .
Ismael Miguel

4

루아 146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(명확성을 위해 줄 바꿈 추가)


1
이 코드 에는 출력과 이스케이프 및 문자열 처리 기능 만 포함되어 있기 때문에 원하는 출력보다 길지 않습니까?
Caleb

6
@ Caleb : 나는 당신이 실제로 그 의견을 세지 않았고 추측했다고 생각합니다. 내 텍스트 편집기에 따르면 격자에 165 문자가 있습니다 (줄 바꿈 포함). S세 번 반복하여 19 자 미만의 문자가 있습니다.
Kyle Kanos

2
그러나 당신은 탈출과 개행 이이 특정 게임에서 경쟁 할 수있는 코드의 능력을 제한한다는 것이 맞습니다. 그러나이기는 것도 내가하는 일이 아니라 재미와 학습을위한 것입니다.
Kyle Kanos

3

다트-113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

순수한 문자열 보간 솔루션. "substring"과 같은 문자열 연산은 실제로 경쟁하기에는 너무 장황합니다.

DartPad에서 실행하십시오 .


3

자바 스크립트 ( ES7 초안 ), 96 94 93 바이트

여기 몇 가지 솔루션에서 영감을 얻은 ...

편집 : edc65에서 -1

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

댓글 :

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)

좋은데 .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65

@ edc65 멋진 캐치!
nderscore

빠른 질문 : 왜 +x그저 왜 그럴까요 x?
Nic Hartley

1
@QPaysTaxes x숫자 로 캐스트 됩니다. 그것없이, 그것은 연결될 것이다z
nderscore

2

파이썬 3, 100 87 바이트

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

아래 코드는 읽을 수있는 버전입니다. 간격 (시작, 길이)을 하드 코딩 한 다음 간격을 중앙에 맞추기 위해 올바른 양의 공간으로 채 웁니다.

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])

2

레티 나 , 66 바이트

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

각 줄은 자체 파일로 이동해야 <LF>하며 파일에서 실제 줄 바꿈을 의미합니다. 바이트 수에 추가 된 추가 파일 당 1 바이트.

당신은 하나의 파일로 코드를 실행할 수 있습니다 -s플래그를<LF> 마커를 유지하고 원하는 경우 가독성을 위해 출력에서 ​​개행으로 변경할 수 있습니다.

이 알고리즘은 빈 입력 문자열에서 시작하여 5 개의 간단한 대체 단계 (홀수 행 내용을 짝수 행 내용으로 변경)입니다. 각 단계 후의 결과는 (로 구분됨 =)입니다.

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/

1

자바 스크립트, 154151 바이트

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.