폭발적인 ASCII 아트 챌린지


20

전략 게임 "Hexplode" 에서 플레이어는 6 각형 보드에 토큰을 교대로 놓습니다. 토큰의 수가 인접한 타일의 수와 같으면 해당 타일이 폭발 하여 모든 토큰 을 주변의 이웃으로 옮깁니다. 여기서 온라인 게임을 할 수 있습니다 .

이 게임이 마음에 들지만 특정 타일에 몇 개의 토큰이 있는지 정확히 알기가 어렵습니다. 나는 항상 이웃의 수를 세고 있습니다. ASCII 타일을 사용하면 각 타일에 몇 개의 토큰이 있는지 기억하는 데 도움이되는 것이 정말 편리합니다.

양의 정수를 입력으로 사용하고 크기가 N 인 육각형의 ASCII 표현을 생성하는 프로그램이나 함수를 작성해야합니다 . 각 타일은 타일이 가진 이웃의 수입니다. 1은 이웃이없는 이상한 코너 케이스이므로 1보다 큰 입력 만 처리하면됩니다.

이 숫자는 STDIN, 함수 인수, 명령 행 인수와 같은 합리적인 형식으로 파일에서 가져올 수 있습니다. 출력은 STDOUT으로 인쇄, 파일에 쓰기, 리턴과 같은 합리적인 형식 일 수도 있습니다. 문자열 목록, 줄 바꾸기로 구분 된 문자열 등

처음 5 개의 입력에 대한 샘플 출력은 다음과 같습니다.

2)

 3 3
3 6 3
 3 3


3)

  3 4 3
 4 6 6 4
3 6 6 6 3
 4 6 6 4
  3 4 3


4)

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

5)

    3 4 4 4 3
   4 6 6 6 6 4
  4 6 6 6 6 6 4
 4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 4
  4 6 6 6 6 6 4
   4 6 6 6 6 4
    3 4 4 4 3

6)

     3 4 4 4 4 3
    4 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
 4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
    4 6 6 6 6 6 4
     3 4 4 4 4 3

그리고 패턴은 비슷한 방식으로 계속됩니다. 평소와 같이 표준 허점이 적용되며 가장 낮은 바이트 수의 응답이 승자가됩니다!

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
관련 (그러나 이웃의 수가 아닌 프로세스에 대해 묻는 것).
trichoplax

1
저는이 도전을 위해서 Hexagony를 배우고 싶어합니다. ;)
Kevin Cruijssen

답변:


11

MATL , 39 37 바이트

4*3-:!G:+o~YRtP*!tPw4LY)vtI5&lZ+47+*c

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

컨볼 루션을 다시 사용하게됩니다!

입력을 고려하십시오 n = 3. 이 코드는 먼저 브로드 캐스트 를 통해 행 벡터에 열 벡터 를 추가하여 크기 4*n-3× 의 행렬을 만듭니다 . 이것은 모든 페어 단위 추가의 2D 배열 배열을 계산하는 것을 의미합니다.n[1; 2; ...; 9][1, 2, 3]

 2  3  4
 3  4  5
 4  5  6
 5  6  7
 6  7  8
 7  8  9
 8  9 10
 9 10 11
10 11 12

도에 의해 번호 교체 1에 의해 홀수 번호를 0바둑판 패턴을 제공합니다

1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

이것은 육각 격자를 생성하는 데 사용됩니다. 1은 격자의 점을 나타내고 0은 공백을 나타냅니다.

오른쪽 상단 모서리는 행렬의 기본 "대각선"위의 모든 항목을 0으로 만들어 제거합니다.

1 0 0
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

이 행렬에 수직으로 뒤집힌 버전 자체를 요소별로 곱하면 오른쪽 아래 모서리도 제거됩니다. 그런 다음 조옮김

1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

이것은 육각형처럼 보이기 시작합니다. 대칭을 사용하여 그리드가 확장되어 상반부가 생성됩니다.

0 0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

이제 각 항목을 하나의 이웃 수로 대체해야합니다. 이를 위해 우리는 3 × 5 이웃과의 컨볼 루션을 사용합니다 (즉, 커널은 3 × 5 행렬입니다). 결과,

2 3 4 5 5 5 4 3 2
4 5 7 7 8 7 7 5 4
4 6 7 8 7 8 7 6 4
4 5 7 7 8 7 7 5 4
2 3 4 5 5 5 4 3 2

두 가지 문제가 있습니다 (나중에 해결 될 예정 임).

  1. 값은 모든 위치에 대해 계산되었지만 0-1 그리드의 위치에서만 필요합니다.
  2. 이러한 각 위치에 대해 인접 계수에 점 자체가 포함되므로에 의해 해제됩니다 1.

코드는 이제 47각 계산 된 값에 추가 됩니다. 이는 1문제를 해결하기 위해 빼기 (2)와 덧셈 48(ASCII for '0')에 해당하며, 각 숫자를 해당 문자의 코드 포인트로 변환합니다.

그런 다음 결과 행렬에 0-1 그리드의 복사본이 곱해집니다. 그러면 위의 문제 (1)이 해결되어 6 각형 격자의 일부가 아닌 점이 다시 0이됩니다.

 0  0 51  0 52  0 51  0  0
 0 52  0 54  0 54  0 52  0
51  0 54  0 54  0 54  0 51
 0 52  0 54  0 54  0 52  0
 0  0 51  0 52  0 51  0  0

마지막으로이 숫자 배열은 char 배열로 캐스트됩니다. 0 개의 문자가 공백으로 표시되어 최종 결과가 나타납니다.

  3 4 3  
 4 6 6 4 
3 6 6 6 3
 4 6 6 4 
  3 4 3  

15

자바 스크립트 (ES6) 118 117 바이트

n=>[...Array(m=n+--n)].map((_,i,a)=>a.map((_,j)=>(k=j-(i>n?i-n:n-i))<0?``:k&&++j<m?i/2%n?6:4:3+!i%n).join` `).join`\n`

어디 \n리터럴 개행 문자를 나타냅니다. 설명 : 가정하십시오 n=4. 다음과 같이 공백으로 구분 된 숫자 사각형으로 시작합니다.

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

첫 번째 |n-i| 0는 삭제되지만 공백은 남아 있습니다.

   0 0 0 0
  0 0 0 0 0
 0 0 0 0 0 0
0 0 0 0 0 0 0
 0 0 0 0 0 0
  0 0 0 0 0
   0 0 0 0

인스턴트 육각! 그런 다음 0첫 번째 행 또는 마지막 행 및 / 또는 열에 있는지 확인 하여 각각 대신 적절한 값을 계산하면 됩니다. 편집 : @ Arnauld 덕분에 1 바이트가 절약되었습니다.


일부 수식을 사용하여 / console.log ()와 함께 107 바이트 버전을 사용했습니다.n=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
Arnauld

@Arnauld 나는 그것을 좋아한다 3+!i%n!
Neil

7

파이썬 2 125 123 바이트

def h(n):m=n-1;t=[' '*(m-r)+' '.join(('46'[r>0]*(r+m-1)).join('34'[r%m>0]*2))for r in range(n)];print'\n'.join(t+t[-2::-1])

테스트는 이데온에 있습니다

for r in range(n)문자열을 구성 하여 상단에서 중간 행까지 실행합니다
.-두 개의 모서리 또는 두 개의 모서리 만들기 '34'[r%m>0]*2;
- 반복로 가입하여 작성 '6'하거나 '4', '46'[r>0]*(r+m-1);
-모서리와 모서리를 ' ';
-공백 앞에 추가 ' '*(m-r);

그런 다음 이것을 인쇄하고 새 줄로 결합 된 가운데 줄에 반영합니다. print'\n'.join(t+t[-2::-1])


4

파이썬 2, 96 바이트

n=input();m=n-1
while n+m:n-=1;j=abs(n);c='34'[0<j<m];print' '*j+c+' '+'46  '[j<m::2]*(2*m+~j)+c

이것은 꽤 지저분하고 골프 타는 것처럼 보입니다 ...


3

자바 375 363 361 339 329 317 293 바이트

interface J{static void main(String[]r){int i=0,k,h=Integer.decode(r[0]),a=1,l,n=0;for(;i++<h*2-1;n+=a){if(n==h-1)a=-1;String s="";for(k=0;k<n+h;k++,s+=" ")s+=n==0?k==0||k==n+h-1?3:4:k!=0&&k!=n+h-1?6:n==h-1?3:4;l=(h*4-3-s.trim().length())/2;System.out.printf((l==0?"%":"%"+l)+"s%s\n","",s);}}}

언 골프

interface J {
    static void main(String[] r) {
        int i = 0, k, h = Integer.decode(r[0]), a = 1, l, n = 0;
        for (; i++ < h * 2 - 1; n += a) {
            if (n == h - 1) {
                a = -1;
            }
            String s = "";
            for (k = 0; k < n + h; k++, s += " ") {
                s += n == 0 ? k == 0 || k == n + h - 1 ? 3 : 4 : k != 0 && k != n + h - 1 ? 6 : n == h - 1 ? 3 : 4;
            }
            l = (h * 4 - 3 - s.trim().length()) / 2;
            System.out.printf((l == 0 ? "%" : "%" + l) + "s%s\n", "", s);
        }
    }
}

사용법 :

$ java J 5
    3 4 4 4 3     
   4 6 6 6 6 4    
  4 6 6 6 6 6 4   
 4 6 6 6 6 6 6 4  
3 6 6 6 6 6 6 6 3 
 4 6 6 6 6 6 6 4  
  4 6 6 6 6 6 4   
   4 6 6 6 6 4    
    3 4 4 4 3

나는 끔찍한 중첩 if-else 블록을 더 작게 다시 작성할 수 있지만 현재는 알아낼 수 없다고 확신합니다. 모든 제안을 환영합니다 :-)

최신 정보

  • Kevin Cruijssen의 제안을 따르고 parseInt 대신 디코딩을 사용했습니다.
  • 삼항 연산자를 사용하여 if를 다시 작성했습니다.
  • 더 많은 삼항 연산자.
  • 삼항 연산자! 나는 괴물을 만들었다 고 생각한다!
  • 인쇄와 관련하여 if-else 블록을 다시 작성하십시오.

1
나는 당신이 사용하는 방법을 자세히 보지 않았지만 현재 코드에 대한 몇 가지 작은 골프 팁 :으로 골프를 Integer.parseInt칠 수 있습니다 Integer.decode. l=(h*4-3-s.trim().length())/2;if(l==0)에 골프를 칠 수 있습니다 if((l=(h*4-3-s.trim().length())/2)==0). 또한 클래스가없는 메소드를 게시하는 것만으로도 가능합니다 (질문이 달리 명시되어 있지 않는 한). void f(int i){...use i...}대신에 interface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}몇 바이트를 절약 할 수 있습니다. 시간이 더 있으면 더 살펴 볼게요.
Kevin Cruijssen

@KevinCruijssen : 제안 해 주셔서 감사합니다. l=(h*4-3-s.trim().length())/2;if(l==0)실제로와 길이가 같습니다 if((l=(h*4-3-s.trim().length())/2)==0).
Master_ex

2

05AB1E , 44 바이트

FN_i4ë6}ð«¹ÍN+×ðìN_N¹<Q~i3ë4}.ø¹<N-ð×ì})¦«»

설명

육각형의 상단과 하단이 미러링되므로 상단 부분 만 생성하면됩니다.
따라서 X를 입력 하려면 X 행 을 생성해야합니다 . 이것이 메인 루프가하는 일입니다.

F                                        }

그런 다음 행의 중앙 부분을 수행합니다.
이다 4 1 행에 대한 6 (우리는 단지 상부를하고있는 것처럼) 나머지.
패턴에 숫자 사이의 간격이 필요하므로이 숫자를 공백으로 연결합니다.

N_i4ë6}ð«

그런 다음이 문자열을 X-2 + N 번 반복합니다. 여기서 N은 0으로 색인화 된 현재 행이며 왼쪽에 공백 문자를 추가합니다.

¹ÍN+×ðì

이 후 코너킥 시간입니다. 그들은 것 3 첫 번째와 마지막 행과 4 중간 행에 대해.

N_N¹<Q~i3ë4}.ø

이제 각 행 앞에 공백을 추가하여 행이 올바르게 정렬되었는지 확인해야합니다. 추가 된 공백 수는 X-1-N 입니다.

¹<N-ð×ì

이제 그리드의 상단 부분을 완성 했으므로 행을 목록에 추가하고 역 사본을 만들고 해당 사본에서 첫 번째 항목을 제거합니다 (중앙 행만 한 번만 필요).이 두 목록을 함께 병합하고 인쇄.

)¦«»

온라인으로 사용해보십시오!

추가 솔루션, 44 바이트 :

ÍÅ10.øvN_i4ë6}ð«¹ÍN+×ðìyi4ë3}.ø¹<N-ð×ì})¦«»

2

루비, 87 바이트

익명 함수는 n을 인수로 사용하고 문자열 배열을 반환합니다.

->n{(1-n..n-=1).map{|i|j=i.abs
" "*j+(e=j%n>0?"4 ":"3 ")+["6 ","4 "][j/n]*(2*n-1-j)+e}}

테스트 프로그램에서 언 골프

stdin을 통해 입력하십시오. 전체 모양을 표준 출력에 씁니다. 꽤 자명하다.

f=->n{
  (1-n..n-=1).map{|i|            #reduce n by 1 and iterate i from -n to n
    j=i.abs;                     #absolute magnitude of i
    " "*j+                       #j spaces +
    (e=j%n>0?"4 ":"3 ")+         #start the string with 3 or 4 +
    ["6 ","4 "][j/n]*(2*n-1-j)+  #2*n-1-j 6's or 4`s as appropriate +
    e                            #end the string with another 3 or 4
  }
}

puts f[gets.to_i]

1

V , 60 바이트

Àé x@aA4 xr3^.òhYpXa 6^òkyHç^/:m0
Pç 3.*6/^r4$.
òÍ6 4./6

온라인으로 사용해보십시오!

이것은 너무 길다. 다음은 16 진수 덤프입니다. 여기에는 인쇄 할 수없는 문자가 포함되어 있습니다.

0000000: c0e9 2078 4061 4134 201b 7872 335e 2ef2  .. x@aA4 .xr3^..
0000010: 6859 7058 6120 361b 5ef2 6b79 48e7 5e2f  hYpXa 6.^.kyH.^/
0000020: 3a6d 300a 50e7 2033 2e2a 362f 5e72 3424  :m0.P. 3.*6/^r4$
0000030: 2e0a f2cd 3620 9334 852e 2f36            ....6 .4../6

1

라켓, 487 바이트

(λ(n c e o)(let((sp(append(range(- n 1)-1 -1)(reverse(range(- n 1)0 -1))))
(mm(append(range(- n 2)(-(+ n(- n 1))2))(range(-(+ n(- n 1))2)(-(- n 1)2)-1)))
(r""))(for((i sp)(j mm))(define str"")(for((ss i))(set! str(string-append str" ")))
(set! str(string-append str(if(or(= i 0)(= i(- n 1))(= i(* 2(- n 1))))c e)" "))
(for((jj j))(set! str(string-append str(if(= j(- n 2))e o)" ")))(set! r(if(or(= i 0)
(= i(- n 1))(= i(* 2(- n 1))))c e))(set! str(string-append str r))(displayln str))))

테스트 :

(f 4 "3" "4" "6") 

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

(f 5 "o" "*" "-") 

    o * * * o
   * - - - - *
  * - - - - - *
 * - - - - - - *
o - - - - - - - o
 * - - - - - - *
  * - - - - - *
   * - - - - *
    o * * * o

자세한 버전 :

(define(f1 n c e o)
  (let ((sp(append(range(sub1 n) -1 -1)
                  (reverse(range(sub1 n) 0 -1))))
        (mm(append(range(- n 2)(-(+ n(sub1 n)) 2))
                  (range(-(+ n(sub1 n)) 2)(-(sub1 n)2) -1) ))
        (r ""))
    (for((i sp)(j mm))
      (define str "")
      (for((ss i))(set! str(string-append str " ")))
      (set! str(string-append str
                              (if(or(= i 0)(= i(sub1 n))
                                    (= i(* 2(sub1 n)))) c e)
                              " "))
      (for((jj j))
        (set! str(string-append str
                                (if(= j(- n 2)) e o)
                                " ")))
      (set! r(if(or(= i 0)
                   (= i(sub1 n))
                   (= i(* 2(sub1 n)))) c e))
      (set! str(string-append str r))
      (displayln str))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.