ASCII 연결 육각형


21

개요

육각형이 여러 개인 경우, 50 x 50 ASCII 아트 이미지 범위 내에서 연결된 모양으로 배열하십시오. 당신이 선택한 모양은 연결되어있는 한 골프에 가장 적합한 것으로 임의의 것이 될 수 있습니다. 하나의 육각형보다 크면 구멍이있을 수 있습니다 (그렇지 않으면 육각형 수가 모호합니다).


나열한 것

모든 육각형은 다음과 같은 형식이어야합니다 (이 크기와 방향 만 유효).

 __
/  \
\__/    Note there are 2 underscores per horizontal edge.

두 개의 육각형이 모서리를 공유하면 직접 연결 됩니다.

 __               __
/  \__           /  \
\__/  \          \__/
   \__/    or    /  \
                 \__/

정점 만 공유하는 두 개의 육각형은 연결되지 않습니다.

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

에지 반을 공유해도 연결된 것으로 간주되지 않습니다.

 __
/  \
\__/
 /  \
 \__/

직접 연결된 육각형 만 사용하여 육각형에서 다른 육각형으로의 경로가있는 경우 육각형 모음이 연결 됩니다 .

구멍

연결된 육각형 모음에있는 육각 크기의 구멍은 육각형으로 간주되므로 지정된 ASCII 아트가 육각형 수에 제한이 없습니다.

예상 구멍이 단일 육각형이므로 구멍으로 간주 되지 않습니다 .

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      7 hexagons (not 6 with a hole)

수행 은 하나의 육각형에 해당하지 않기 때문에 구멍으로 수를 :

    __
 __/  \__
/  \__/  \__
\__/  \__/  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/      8 hexagons with a hole

입력과 출력

입력

1에서 255 사이의 정수입니다.

산출

위에서 설명한대로 연결된 육각형의 입력 수를 나타내는 ASCII 아트 문자열입니다.

  • 행 수 (개행으로 구분 된 하위 문자열)는 최대 50 개이며 추가 선택적인 후행 개행입니다.
  • 행의 길이는 같을 필요는 없지만 각 길이는 최대 50 자 여야합니다.
  • 총 행 수가 50을 초과하지 않으면 길이가 0 인 행은 연결된 셰이프 위 또는 아래에 존재할 수 있습니다.
  • 총 행 수가 50을 초과하지 않으면 공간 전용 행이 연결된 모양의 위 또는 아래에 존재할 수 있습니다.
  • 행 길이가 50을 초과하지 않으면 모양의 왼쪽에 공백이 나타날 수 있습니다 (모양은 왼쪽에 정렬 할 필요가 없습니다).
  • 행 길이가 50을 초과하지 않으면 모양의 오른쪽에 공백이 나타날 수 있습니다.
  • 연결된 모양의 일부를 구성하지 않는 문자는 공백이나 개행 문자 여야합니다.

출력이 올 바르면 한 실행에서 다음 실행까지 일관 될 필요는 없습니다.

입력: 6

유효한 출력 :

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

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

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

유효하지 않은 출력 :

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      Invalid for 6 as the centre hole counts as a 7th hexagon.

 __    __    __      __
/  \__/  \__/  \    /  \
\__/  \__/  \__/    \__/
   \__/  \__/                Invalid as the 6 hexagons are not connected.

 __    __    __  __
/  \__/  \__/  \/  \
\__/  \__/  \__/\__/
   \__/  \__/           Invalid as vertex touching does not count as connected.

 __    __       __
/  \__/  \     /  \
\__/  \__/     \__/
/  \__/  \
\__/  \__/
   \__/       Invalid as the 6 connected hexagons are not the only visible characters.

승리

바이트 단위의 가장 짧은 유효한 답변이 이깁니다.


리더 보드

( Martin의 리더 보드 스 니펫 사용 )


모든 사람이 구현하기 가장 쉬운 첫 번째 예제 출력 패턴을 사용하게 될 것입니다.
Fatalize

1
@Fatalize 내 예제는의 입력에 대해서만 작동합니다 6. 255수평 행의 육각형 입력은 50 x 50 ASCII 아트에 맞지 않습니다.
trichoplax

50 자 한도에 도달 할 때마다 간단히 루프백하고 아래 줄을 채울 수 있습니다
Fatalize

1
@Fatalize 문제는 코드의 바이트 수를 최소화하는 것입니다. 패턴이 단순하더라도 상관 없습니다. 사람들이 시도하는 것과 다른 언어에 적합한 것을 보는 것이 흥미로울 것입니다.
trichoplax

@ Fatalize : 짧거나 그렇지 않다면 나는 몰라, 그러나 더 "흥미로운"답변은 육각형을 배치 할 수있는 위치를 찾기 위해 실제 검색을 수행하여 더 흥미로운 결과를 얻을 수 있습니다.
Alex Van Liew

답변:


13

CJam, 64 57 55 바이트

" __
/  \
\__/"N/{_SS/\+_47>S3*f{\+}_2>\@?}q~(*]:..e>N*

여기에서 테스트하십시오.

이렇게하면 열 단위로 다음 패턴이 생성됩니다 .

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

설명

이것은 Dennis의 우수한 팁을 기반으로 .e>여러 조각에서 ASCII 아트 출력을 어셈블하는 데 사용 됩니다. 그가 말했듯 .e>이 요소별로 최대 두 개의 배열 (또는 문자열)을 취하며 공백은 문자 코드가 가장 낮으므로 이것을 사용하여 문자열 격자에 다른 문자를 부과 할 수 있습니다. 또한 두 배열의 길이가 같지 않으면 더 긴 배열의 관련 요소는 변경되지 않고 그대로 복사됩니다. 이것은 다른 패턴이 같은 크기 일 필요도 없음을 의미합니다. 이것을 2 차원 배열에 적용하기 위해 (끝까지 .e>줄 바꿈을 삽입하고 싶지 않기 때문에) 줄에 쌍을 적용 하여을 제공합니다 ..e>.

코드의 기본 아이디어 N는 올바른 위치로 이동 한 단일 육각형의 복사본 을 생성 하는 것입니다. 빈 줄을 추가하고 공백을 추가하여 수평으로 육각형을 수직으로 "이동"합니다. 작업이 끝나면 아름다운 사본 :..e>(CJam 프로그램에서 사용한 가장 긴 연산자)을 사용하여 모든 사본을 함께 접습니다 .

코드는 다음과 같습니다.

" __
/  \
\__/"N/    e# Get a 2D character grid of the hexagon.
{          e# Read input N, repeat this block N-1 times.
  _        e#   Make a copy, so we leave the last hexagon on the stack.
  SS/\+    e#   Prepend two empty lines.
  _47>     e#   Make a copy and discard the first 47 lines.
  S3*f{\+} e#   Prepend 3 spaces to each line. This copy has been moved back to
           e#   the top and one column to the right.
  _2>      e#   Make a copy and discard another two lines.
  \@?      e#   If any lines were left after that, pick the copy in the next column,
           e#   otherwise, stay in the same column.
}q~(*      
]:..e>     e# Wrap all the hexagons in an array and fold them into a single grid.
N*         e# Join them with newline characters.

남자, 나는이 골프 언어 중 하나를 정말로 배워야한다.
Alex Van Liew 23

@AlexVanLiew 당신은해야합니다! :) 그러나 코드 골프 우승 가능성을 높이기 위해서가 아니라 CJam은 프로그래밍하기에 재미있는 아름다운 언어이기 때문에 위의 솔루션 (아주 우아하다고 생각하는)이 다른 언어를 알지 못하기 때문에 말이 될 것입니다. ;)
Martin Ender

아마 Pyth 또는 둘 다 배울 것입니다. 둘 다 거의 같은 것입니까 아니면 나머지 것보다 낫습니까?
Alex Van Liew

@AlexVanLiew 나는 많은 Pyth를 모른다. 그러나 나는 그들이 같은 것에서 멀다는 것을 안다. CJam은 스택 기반 언어이며, Pyth는 Python의 속기 (현재는 자체 내장 세트가 있음)로 시작되었습니다. Pyth는 골프와 관련하여 약간 우위를 차지할 수도 있지만 개인적으로 다른 패러다임에서 프로그래밍을 즐기는 것이 좋으므로 CJam을 고수하겠습니다.
마틴 엔더

아하 나는 파이썬을 꽤 잘 알고 있으므로 Pyth를 배우고 싶지만 시간이 걸리면 CJam도 시도해 볼 것입니다!
Alex Van Liew

7

Python 2, 219207

b=bytearray(' ');h=['__ ','/  \\','\\__/'];k=range;x=input();g=[b*50for _ in k(50)]
for i in k(x):
 c=i*3%48+1;r=(i*3+1)/48*2+i%2
 for m in k(i>15,3):n=m==0;g[r+m][c+n:c+4-n]=h[m]
print"\n".join(map(str,g))

stdin에 입력을받습니다.

거의 50x50 크기의 공간 격자를 만들고 육각형을 적절한 곳에 밀어 넣습니다. 16 육각 후, I는 첫 번째 행하지 않아도 hI 사용되도록 (2 차원 배열로 육각형) i>151 0 대신에 범위를 시작하는 c=i*3%48+1;r=(i*3+1)/48*2+i%2계산 의 C olumn 및 R I을 개시해야 아우. n부울이지만 범위를 수정하는 정수로 사용됩니다 ( h[0]물건을 덮어 쓰지 않기 위해 3 자 이므로 ).

나는 이것에 매우 만족 a[x:y]=b합니다. 특히 구문을 기억할 때 초기 버전 이후 약 50 바이트를 줄였습니다 .

출력 (n = 30) :

  __    __    __    __    __    __    __    __
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/  \__/
(plus 44 lines of spaces each 50 wide)

공백의 후행이 허용되기 때문에 12 바이트를 줄이는 정확한 행 수 인 대신 g50을 만들 도록 작성을 변경했습니다 .bytearray3+(x>1)+x/16*2


6

스위프트 2.0, 601 591 바이트

import Cocoa
var a=Int(Process.arguments[1])!,b="/  \\__".join([String](count:9,repeatedValue:""))+"/",c="\\__/  ".join([String](count:9,repeatedValue:""))+"\\",d=c.startIndex,e=c.endIndex,j=[c.stringByReplacingOccurencesOfString("\\",withString:" ").stringByReplacingOccurencesOfString("/",withString:" ").substringToIndex(advance(d,3*a,e)),b.substringToIndex(advance(d,3*a+a%2,advance(e,-1)))]
while a>0{j+=[c.substringToIndex(advance(d,3*a+1,e)),b.substringToIndex(advance(d,3*a+(a+1)%2,e)]
a<=16 ?j+=[" "+j.removeLast().substringFromIndex(advance(d,1))]:()
a-=16}
for l in j{print(l)}

실행하려면 swift hexagons.swift 21

산출:

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

스위프트 substringToIndexstringByReplacingOccurencesOfString너무 많은 캐릭터를 ...


나는 Swift를 전혀 모르지만 적은 코드로 반복적 인 문자열을 구성하는 방법이 없습니까?
Reto Koradi

문자열을 반복하는 유일한 방법은입니다 stringByPaddingToLength.이 경우 전체 문자열을 입력하는 것보다 11 자 더 깁니다.
David Skrundz

6
나는 애플이 지나치게 장황한 문자열 연결을 좋아한다는 것을 알았다. stringByAppendingStringObjective-C 만큼 나쁘지는 않지만 여전히 ...
Fatalize

코드 골프 외부에서는 메소드 검색이 훨씬 쉬워지기 때문에 정말 좋습니다.
JustSid

4

C, 238 바이트

#define h(A) c[m+A/4][n+A%4]
i,m,n;
f(a)
{
    char c[50][51];
    for(i=0;i<50;i++)for(m=0;m<51;m++)c[i][m]=m-50?32:0;
    for(;a;)
        m=a/12*2,n=a%12*3,a--%2?m=a/12*2+1,n=a%12*3+3:0,
        h(1)=h(2)=h(9)=h(10)=95,h(4)=h(11)=47,h(7)=h(8)=92;
    for(;i;)puts(c-i--+50);
}

문자 수에 필요한 공백과 줄 바꾸기 만 고려하십시오.

단순히 문자 행렬을 만들어 역순으로 채우고 모든 것을 인쇄합니다.


2

자바 스크립트 (ES6), 265 바이트

A=Array;f='forEach';U=x=1;y=0;a=A.from(A(51),_=>A.from(A(51),_=>' '));d=h=>(` __
/  \\
\\__/`.split`
`[f]((l,i)=>[...l][f]((c,j)=>{if('_/\\'.indexOf(a[x+i][y+j])<0)a[x+i][y+j]=c})),(x+=U*-2+1),(U=!U),(C-y<=3?((U=x+=2),y=0):y+=3),--h?d(h):a.map(d=>d.join``).join`
`)

육각형을 왼쪽에서 오른쪽으로 연속으로 테셀 레이트합니다. 열 끝에 도달 할 때까지 벌집처럼 위아래로 번갈아 가며 나타납니다.

설명이 포함되어 있지 않음 (firefox에서 작동) :

'use strict';
const CAP = 51;
var a = Array.from(Array(51), () => Array.from(Array(51),() => ' '))

function draw (hexagons, x, y, a, up) {
  // x, y (row, col) represents the current position of the cursor
  /*
  
    Here's a map of the first three iterations:
    
            01234567
     0        __
     1     __/  \__
     2    /  \__/  \
     3    \__/  \__/

    For the first 17 iterations, the cursor will be at:
    
      # | x | y
      ----------
      1 | 1 | 0
      2 | 0 | 3
      3 | 1 | 6
      4 | 0 | 9
      5 | 1 | 12
      6 | 0 | 15
      7 | 1 | 18
      8 | 0 | 21
      9 | 1 | 24
     10 | 0 | 27
     11 | 1 | 30
     12 | 0 | 33
     13 | 1 | 36
     14 | 0 | 39
     15 | 1 | 42
     16 | 0 | 45
     17 | 3 | 0      <- moves back to the first row

  */
` __
/  \\
\\__/`
  // split the hexagon into three lines
  .split('\n').forEach((line, index) => {
    // and for each line
    ;[...line].forEach((char, j) => {
      // if the cursor position (x, y) translated
      // by (index, j) is not already part of a hexagon
      // then replace it with the current (index, j) piece
      // of the hexagon
      /*
         0123
       0  __
       1 /  \
       2 \__/
       
      */
      if ('_/\\'.indexOf(a[x + index][y + j]) < 0)
        a[x + index][y + j] = char
    })
  })
  
  // `up` represents the next hexagon
  // if true, the next hexagon will be drawn attached to
  // the top right edge of the current hexagon
  if (up) {
    x -= 1
  // otherwise, it'll be drawn attached to the bottom right edge
  } else {
    x += 1
  }

  // move three columns to the right
  y += 3
  // change directions
  up = !up

  // if within the right boundary of the 51x51 matrix,
  // move back to the left edge and down 2 rows
  // and draw the next hexagon as an `up` hexagon
  if (51 - y <= 3) {
    y = 0
    x += 2
    up = true
  }

  // if hexagons > 0, then recurse and draw the next hexagon
  // otherwise, return the array (join the columns in each row, then join each row
  // by a new line)
  return --hexagons ?
    draw(hexagons, x, y, a, up)
    : a.map(d => d.join('')).join('\n')
}

var n = parseInt(prompt('Number to draw:'))
var r = draw(n, 1, 0, a, true)
document.write('<pre>' + r.replace(/\n/g, '<br>') + '</pre>')


2

루비, 120

->n{a=(1..50).map{' '*50}
n.times{|i|x=i%16*3
3.times{|j|a[47-i/16*2-x/3+j][x..x+3]=[' __ ','/  \\','\__/'][j]}}
puts a}

50 개의 공백으로 구성된 50 개의 문자열 배열을 만든 다음 3 줄로 4자를 대체하여 육각형을 추가합니다.

" __ "
"/  \"
"\__/"

첫 번째 선에는 공백이 있으므로 육각형을 플로팅 한 후에는 다른 육각형을 그 아래에 플롯 할 수 없습니다. 공백은 이전 육각형을 덮어 쓰기 때문입니다.

따라서 육각형은 16x16 마름모 (왜곡 된 사각형)의 형태로 아래쪽에서 위쪽으로 추가되고 왼쪽에서 오른쪽으로 기울어집니다.

" __ "그런 다음 추가 \/필요한 곳으로 문자열 을 덮어 씁니다 .

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

g=->n{
  a=(1..50).map{' '*50}              #make an array of 50 strings of 50 spaces
  n.times{|i|                        #loop through all hexagons
    x=i%16*3                         #x coordinate of top left corner of hexagon, 16 per row
    3.times{|j|                      #loop through 3 lines to print hexagon.
      a[47-i/16*2-x/3+j][x..x+3]=    #47-i/16*2 : start at the bottom and work up. each row is 2 lines high and contains 16 hexagons. x/3 : slant upwards as the row moves right. 
       [' __ ','/  \\','\__/'][j]    #These are the symbols for each of the 3 lines required for a hexagon. [x..x+3] defines which characters have to be replaced in each string.
    }      
  }
  puts a                             #print to stdout
}

N=gets.to_i
g.call(N) 

일반적인 출력 (n = 250)

여기에 총 50 줄을 만들기 위해 몇 줄의 공백이 더 있어야하지만 Stackexchange를 포함하도록 형식을 지정할 수있는 방법이 있는지 모르겠습니다.

                                              __  
                                           __/  \ 
                                        __/  \__/ 
                                     __/  \__/  \ 
                            __    __/  \__/  \__/ 
                         __/  \__/  \__/  \__/  \ 
                      __/  \__/  \__/  \__/  \__/ 
                   __/  \__/  \__/  \__/  \__/  \ 
                __/  \__/  \__/  \__/  \__/  \__/ 
             __/  \__/  \__/  \__/  \__/  \__/  \ 
          __/  \__/  \__/  \__/  \__/  \__/  \__/ 
       __/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
    __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
 __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/       
\__/  \__/  \__/  \__/  \__/  \__/  \__/          
/  \__/  \__/  \__/  \__/  \__/  \__/             
\__/  \__/  \__/  \__/  \__/  \__/                
/  \__/  \__/  \__/  \__/  \__/                   
\__/  \__/  \__/  \__/  \__/                      
/  \__/  \__/  \__/  \__/                         
\__/  \__/  \__/  \__/                            
/  \__/  \__/  \__/                               
\__/  \__/  \__/                                  
/  \__/  \__/                                     
\__/  \__/                                        
/  \__/                                           
\__/                                              
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.