ASCII 복셀 인쇄


28

작은 큐브 로 구성된 n × n × n 큐브 를 나타내는 이진수 값 의 ×× 배열 을 읽는 프로그램을 작성하십시오 . 각 값은 주어진 위치에 복셀 (작은 입방체)이 있는지 여부를 나타냅니다. 프로그램은 주어진 배열을 ASCII 그래픽으로 출력해야합니다 (콘솔을 통한 출력 또는 파일 쓰기).××

다음 배열을 고려하십시오 .2×2×2

[
 [[0,0],
  [1,0]]
 [[1,1],
  [1,0]],
]

[
 [[0,0],
  [0,0]]
 [[1,1],
  [1,1]],
]

이 경우 출력은 다음과 같아야합니다 (수직 공간이 적은 코드 편집기 / 콘솔에서와 같이보기에는 좋지 않습니다).

  +----+
 /    /|-+----+
+----+ |     /|
|    | +----+ |
|    | |    | +
+    + |    |/
|    | +----+
|    |/
+----+

    +----+----+
   /         /|
  +         + |
 /         /  +
+----+----+  /
|         | +
|         |/
+----+----+

A의 예 입력 스트링을 찾을 수 여기 (페이스트 빈). 입력 문자열에 대한 새로운 예제는 여기 에서 찾을 수 있습니다.12×12×127×7×7

ASCII 사양

복셀의 각 모서리는 +가장자리로 이어지는 가장자리가 있는 한로 표시됩니다 . 은 +하나 개 이상의 단위 길이의 직선 에지가있는 경우에도 그려. 가장자리에는 세 가지 유형이 있습니다. 가로 왼쪽에서 오른쪽 ----, 앞뒤로 가로 /및 세로

|
|

각각은 +(오래 보이는 것처럼) 끝나야 합니다. 하나의 평면 평면을 두 개 이상의 조각으로 세분 할 때 모서리가 그려지지 않습니다 ( +위에서 언급 한 모서리와 관련하여). 다른 곳에 숨겨져있는 구조는 그려서는 안됩니다.

'도면'은 기본적으로 평행 투영이므로 항상 같은 각도에서 위쪽, 오른쪽 및 앞면 만 볼 수 있습니다.

세부

코드는 크기의 입력에 대해 작동해야합니다 . (당신은 너무 후 허용하기 전에 / 공간과 불필요한 줄 바꿈을 후행 할 수 항상 기본적으로 출력하는 코드를 작성 도면의 실제 크기가 아니라도 그리드 정도) .=1,2,,1212×12×12××

입력 형식과 방법은 사용자에게 달려 있습니다. csv, JSON 또는 기타 항목을 사용할 수 있지만 각 복셀의 상태에 대해 과 으로 구성되어야 합니다. 순서는 예제와 동일해야합니다.10

  • 1 차원 : 맨 위부터 맨 아래까지 레이어 별
  • 2 차원 : 한 행씩 뒤로 (가장 먼) 앞 (가장 가까운)
  • 3 차원 : 왼쪽에서 오른쪽으로 각 행의 복셀

콘솔을 사용하든 파일을 입력 및 출력으로 읽는지에 달려 있습니다. 제발 당신이 그것을 접근 방법 코드 / 대한 정보를 알려줍니다.

심사

이것은 codegolf이므로 가장 적은 수의 바이트가 이깁니다. 여기에는 실제로 작업을 수행하는 부분 만 포함됩니다. 바이트를 계산할 때 입력을 이미 구문 분석하여 변수에 저장 한 것으로 간주 할 수 있으며 출력 문자열을 변수에 저장하여 인쇄 할 수 있도록 준비해야합니다. 파싱 ​​및 출력 자체는 계산되지 않습니다.

(그리고 창의적인 예제로 제출을 찬성합니다 =)

이것은 Rob의 퍼즐 페이지 에서 영감을 얻었습니다 .

답변:


12

파이썬 ( 4443661354 바이트)

편집 : 매우 특별한 경우 모퉁이 십자가를 생략하는 또 다른 버그를 발견했습니다. 똑바로 수정하면 코드에 50 바이트가 추가되어 조금 더 골프를 치려고했습니다. 이제 버그가 수정되었으며 83 바이트 더 짧습니다. 매우 해킹되고 있습니다. 또한 5 중 for 루프를 제거하고 싶었지만 아직 해결책을 찾지 못했습니다. 어떤 아이디어?

편집 2 : 가져 오기가 매우 길면 다른 7자를 저장할 수 있습니다.

매우 짧거나 우아하지는 않지만 복잡한 문제입니다.

#input:
u=[[[1,1,1],[1,0,1],[1,1,1]],
   [[1,0,1],[0,0,0],[1,0,1]],
   [[1,1,1],[1,0,1],[1,1,1]]]

#actual code that counts:
r=range
n=len(u)
g=r(n)
a=([' ']*9*n+['\n'])*6*n
t='/|-+\n '
d=dict(zip(t+'%!=*',2*t))
for y,z,x,i,j in __import__('itertools').product(g,g,g[::-1],r(6),r(8)):
 if abs(i+j-6)<5*u[x][y][z]:a[(9*n+1)*(i+3*x+2*y)+j+5*z-2*y+2*n]+='./    %|+====* ||    ! *|    !/.*----+'[8*i+j-8]
o=''.join((d[x[-1]],' ')[x[-2:]in('%/','!|','=-')or x[-4:]=='*++*']for x in a)

#output:
print o

먼저 모든 개별 복셀을 모든 선으로 서로 그립니다. 그런 다음 맨 위 문자 만 출력하고 해당 선을 제거하고 사양에 따라 그려서는 안되는 평면에서 교차합니다.

나는 이것을 훨씬 더 많이 골프화 할 수 있다고 생각하지만 444는 그렇게 좋은 숫자입니다. :)

예제 3x3x3 및 7x7x7 출력 (일부 줄 바꿈 제거) :

        +----+----+----+   
       /              /|   
      +    +----+    + |   
     /    /|   /    /  +   
    +    +----+    +   |   
   /              /  + |   
  +----+----+----+  /| +   
  |              | + | |   
  |              | |-+ |   
  +    +----+    + |/  +   
  |    | +--|    | +  /    
  |    |/   |    |   +     
  +    +----+    +  /      
  |              | +       
  |              |/        
  +----+----+----+         

                +----+----+----+    +----+----+----+           
               /              /|   /              /|           
              +    +----+    + |  +    +----+    + |           
             /    /|   /    /  + /    /|   /    /  +           
            +    + |  +    +  / +    + |  +    +  /            
           /    /  +-/    /  + /    /  +-/    /  +             
          +----+  /-+----+  /-+----+  /-+----+  /--+           
          |    | +  |    | +  |    | +  |    | +  /|           
        +----+ | |+----+ | |+----+ | |+----+ | | + |           
       /    /| + /    /| + /    /| + /    /| + |/  +           
      +    + | |+    + | |+    + | |+    + | | +   |           
     /    /  + /    /  + /    /  + /    /  + |   + |           
    +    +----+    +   |+    +----+    +   | +  /| +           
   /              /  + /              /  + | | + | |           
  +----+----+----+  /|+----+----+----+  /| + |/--+ |           
  |              | + ||              | + | |-+  /  +           
  |              |/--+|              |/--+ |   +  /            
  +----+----+----+  / +----+----+----+  /  +  /  +             
    +    +  / +    +--- +    +  /-+    +  /--+  /--+           
   /    /  + /              /  + /    /  +   | +  /|           
  +----+  / +----+----+----+  /-+----+  /--+ |/  + |           
  |    | +  |              | +  |    | +  /|-+  /  +           
  |    | |-+|              |/  +|    | | + |   +  /            
  +    + |  +----+----+----+  /|+    + |/  +  /  +             
  |    | +----+----+ | |+    + ||    | +  /--+  /              
  |    |/         /| + /    /  +|    |   +   | +               
  +    +----+----+ | |+----+  /-+    +  /--+ |/                
  |              | + ||    | +  |    | +  /|-+                 
  |              | | +|    | | +|    |/  + |                   
  +----+----+    + | |+    + |/|+----+  /  +                   
    +    +--|    | + ||    | + |  +    +  /                    
   /        |    | |-+|    |   +-/    /  +                     
  +----+----+    + |  +    +  / +----+  /                      
  |              | +  |    | +  |    | +                       
  |              |/   |    |/   |    |/                        
  +----+----+----+    +----+    +----+                         

1
좋은 작업! 내 혼란에 비해 매우 컴팩트합니다. 그래도 오목한 가장자리를 확인하십시오! (더하기 기호 누락) -repl.it/XA9/2
PiGuy

@PiGuy : 잘 잡아라! 나는 그것을 고쳤다 고 생각한다. 코드가 조금 더 길어졌지만 골프가 더 많이 나왔으므로 여전히 같은 바이트 수를 유지합니다.
Emil

더 가까운 '4'에 하나의 '+'가 너무 많은 것 같습니다. (내가 게시 한 7x7x7도 사용해 볼 수 있습니까?)
flawr

@flawr : 그 더하기 부호는 맨 오른쪽 (오른쪽 아래 모서리)에 속하므로 맞습니다. :) 7x7x7 케이스를 추가하겠습니다. 모든 사람이 게시하면이 페이지가 어수선 해 졌다고 생각했기 때문에 먼저 그 페이지를 남겼지 만 괜찮습니다.
Emil

아 이제 나는 본다-나는 큰 수직 공간에 속았다 고 생각한다.
flawr

20

루아 (1442 바이트)

보너스 애니메이션! :)
당신이 예제와 같은 형식의 멋진 복셀 아트를 가지고 있다면, 의견에 링크하고
7x7x7
보너스 애니메이션
12x12x12 에서 애니메이션을 만들 것입니다.
보너스 2
이것은 첫 번째 코드 골프이므로 매우 지저분하고 개선 할 계획입니다. 다른 언어로 포팅합니다.
여기에 2.5kB 이하의 겨우 골프 스가 있습니다 (이 시점에서 들여 쓰기 공백을 제거하면 나중에 더 계속하겠습니다)

현재 ~ 1.4kB 골프 및 축소 버전입니다 (첫 번째 줄의 "a"테이블은 복셀 매트릭스의 자리 표시 자입니다).

local a={}
local b,c=table,string;local d,e,f,g,h,i=b.concat,#a,c.gsub,c.gmatch,ipairs,b.insert;local function j(k,l,m)return a[k]and a[k][l]and a[k][l][m]==1 end;local n={}for o=1,e*5+1 do n[o]={}for p=1,e*7+1 do n[o][p]=" "end end;local q=[[
__6hhhh7
_g    ij
1aaaa2 j
b    d 5
b    de_
3cccc4__
]]local function r(k,l,m)local s=q;if j(k,l,m)then local t,u,v,w,x,y,z,A=j(k-1,l,m),j(k+1,l,m),j(k,l,m-1),j(k,l,m+1),j(k,l-1,m),j(k+1,l+1,m),j(k+1,l,m+1)," "if t then s=f(s,"[ai]"," ")end;if u and not y then A=A.."c"end;if u and not z then A=A.."e"end;if v then A=A.."bg"end;if w then A=A.."di"end;if x then if not j(k,l-1,m+1)then A=A.."j"end;A=A.."h"end;if t then if w and j(k-1,l,m+1)then A=A.."2"end;if v and j(k-1,l,m-1)then A=A.."1"end end;if u then if w and j(k+1,l,m+1)then A=A.."4"end;if v and j(k+1,l,m-1)then A=A.."3"end end;if x then if w and j(k,l-1,m+1)then A=A.."7"end;if v and j(k,l-1,m-1)then A=A.."6"end;if u and j(k+1,l-1,m)then A=A.."5"end end;s=f(f(f(f(f(s,"["..A.."]"," "),"[ach]","-"),"[bdj]","|"),"[gie]","/"),"[1234567]","+")else s=nil end;return s end;local B,C;local D=e*2-1;local E=1;for k=e,1,-1 do for l=1,e do for m=1,e do B=(l-1)*-2+(m-1)*5+D;C=(l-1)*2+(k-1)*3+E;local s=r(k,l,m)if s then local F={}for G in s:gmatch("[^\n]+")do local H={}for I in G:gmatch(".")do i(H,I)end;i(F,H)end;for J,K in h(F)do for L,I in h(K)do if I~="_"then n[C+J-1][B+L-1]=I end end end end end end end;for o,a in h(n)do print(d(a))end

편집 : 여기에 애니메이션을 만들기위한 편집 내용을 포함하여 원본 (3kB 이상) 언 골프 버전이 있습니다 (자신이 실행 중이고 애니메이션을 원하는 false경우 코드 하단 부근을로 변경) true.

local v = {}
local depth = #v;

function voxel(y,z,x)
  return (v[y] and v[y][z] and v[y][z][x]==1)
end

local canvas = {}
print("Constructing canvas of depth",depth)
for i=1,depth*5+1 do
  canvas[i] = {}
  for j=1,depth*7+1 do
    canvas[i][j] = " "
  end
end

local voxelProto = [[
__6hhhh7
_g    ij
1aaaa2 j
b    d 5
b    de_
3cccc4__
]]

function renderVoxel(y,z,x)
  local vox = voxelProto
  if (voxel(y,z,x)) then
    local up = voxel(y-1,z,x)
    local down = voxel(y+1,z,x)
    local left = voxel(y,z,x-1)
    local right = voxel(y,z,x+1)
    local back = voxel(y,z-1,x)
    local downFront = voxel(y+1,z+1,x)
    local downRight = voxel(y+1,z,x+1)

    if (up) then
      vox = vox:gsub("[ai]"," ")
    end
    if (down and not downFront) then
      vox = vox:gsub("[c]"," ")
    end
    if (down and not downRight) then
      vox = vox:gsub("[e]"," ")
    end
    if (left) then
      vox = vox:gsub("[bg]"," ")
    end
    if (right) then
      vox = vox:gsub("[di]"," ")
    end
    if (back and not voxel(y,z-1,x+1)) then
      vox = vox:gsub("[j]"," ")
    end
    if (back or up) then
      vox = vox:gsub("[h]"," ")
    end
    if (up and right and voxel(y-1,z,x+1)) then
      vox = vox:gsub("[2]"," ")
    end
    if (up and left and voxel(y-1,z,x-1)) then
      vox = vox:gsub("[1]"," ")
    end
    if (down and right and voxel(y+1,z,x+1)) then
      vox = vox:gsub("[4]"," ")
    end
    if (down and left and voxel(y+1,z,x-1)) then
      vox = vox:gsub("[3]"," ")
    end
    if (back and right and voxel(y,z-1,x+1)) then
      vox = vox:gsub("[7]"," ")
    end
    if (back and left and voxel(y,z-1,x-1)) then
      vox = vox:gsub("[6]"," ")
    end
    if (back and down and voxel(y+1,z-1,x)) then
      vox = vox:gsub("[5]"," ")
    end

    vox = vox:gsub("[ach]","-")
    vox = vox:gsub("[bdj]","|")
    vox = vox:gsub("[gie]","/")
    vox = vox:gsub("[1234567]","+")
  else
    vox = nil
  end
  return vox
end
local xpos,ypos
local minx = depth*2-1
local miny = 1;

local pic = {}
function drawCanvas()
  for k,v in pairs(canvas) do
    pic[k] = table.concat(v)
  end
  return table.concat(pic,"\n")
end

local timeline = {}
print("Compositing voxels")
for y=depth,1,-1 do
  for z=1,depth do
    for x = 1,depth do
      xpos = (z-1)*-2 + (x-1)*5 + minx
      ypos = (z-1)*2 + (y-1)*3 + miny
      local vox = renderVoxel(y,z,x)
      if (vox) then
        local vt = {}
        for line in vox:gmatch("[^\n]+") do
          local vtl = {}
          for c in line:gmatch(".") do
            table.insert(vtl,c)
          end
         table.insert(vt,vtl)
        end
        for ly,chars in ipairs(vt) do
          for lx,c in ipairs(chars) do
            if (c ~= "_") then
              canvas[ypos+ly-1][xpos+lx-1] = c
            end
          end
        end
        table.insert(timeline,drawCanvas())
      end
    end
  end
end

if (false) then -- change to true if you want to see the animation!
  for i=1,#timeline do
    local t = os.clock() + 0.05
    io.write(timeline[i],'\n\n')
    io.flush()
    while (t > os.clock()) do end
  end
end         
print(timeline[#timeline])

다음은 3x3x3 복셀 행렬의 문자열에서 복셀 행렬을 채울 코드 샘플입니다. (유사한 형식의 문자열이 있지만 큐브인지 확인하십시오. 그렇지 않으면 깨질 것입니다.)
이를 사용하려면 첫 번째 줄 바로 뒤에이 청크를 삽입하십시오.local v = {}

local vs = [[
100
000
000

110
100
000

111
110
101
]]
for layer in vs:gmatch("[^a]+") do
 local a = {}
 for row in layer:gmatch("[^\n]+") do
 local b = {}
 for _vox in row:gmatch("[01]") do
 table.insert(b,(_vox=="1") and 1 or 0)
 end
 table.insert(a,b)
 end
 table.insert(v,a)
end

주어진 12x12x12 복셀 패턴 의 출력은 다음과 같습니다 . (예 : 일반 콘솔 / 텍스트보기 장치에서는 더 잘 보입니다. 여기에 세로 간격이 너무 많습니다.)

                                                                          +----+----+
                                                                         /         /|
                                                                        +----+----+ |
                                                                        |         | +
                                                            +----+      |         |/
                                                           /    /|      +    +----+
                                                          +----+ |      |    | +----+
                                                          |    | +      |    |/    /|
                                                          |    | |      +    +----+ |
                                                          +    + |      |         | +
              +----+----+                         +----+--|    | +      |         |/
             /         /|                        /        |    | |      +    +----+
            +----+----+ |                       +----+----+    + |      |    | +----+
            |         | +                       |              | +      |    |/    /|
            |         |/       +----+----+----+ |              | |      +    +----+ |
            +    +----+       /              /| +    +----+    + |      |         | +
            |    | +         +----+----+----+ | |    | +--|    | +      |         |/
            |    | |         |              | + |    |/   |    | |      +----+----+
            +    + |         |              | | +    +----+    + |            
            |    | +         +    +----+    + | |              | +            
            |    | |         |    | +--|    | + |              |/             
            +    + |         |    |/   |    | | +----+----+----+              
            |    | +----+    +    +----+    + |                               
            |    |/    /|    |              | +                               
            +    +----+ |    |              |/                                
            |         | +    +----+----+----+                                 
            |         |/                                                      
            +----+----+                                       +----+----+     
                                                             /         /|     
                                                  +----+    +----+----+ |     
                                                 /    /|    |         | +     
                                                +----+ |    |         |/      
                                                |    | +    +    +----+       
      +----+----+----+  +----+----+----+----+---|    | |---+|    | +----+-+----+----+
     /              /| /                        +    + |    |    |/    /|          /|
    +----+----+----+ |+                         |    | +    +    +----+ |         + |
    |              | +                          |    | |    |         | +        /  +
    |              | |      +----+----+----+    +    + |    |         |/        +  /
    +    +----+    + |     /              /|    |    | +    +    +----+        /  +
    |    | +--|    | +    +----+----+----+ |    |    | |    |    | +          +  /
    |    |/   |    | |    |              | +    +    + |    |    | |         /  +
    +    +----+    + |    |              | |    |    | +    +    + |        +  /
    |              | +    +    +----+    + |    |    | |    |    | +       /  +
    |              | |    |    | +--|    | +    +    + |    |    |/       +  /
    +----+----+    + |    |    |/   |    | |    |    | +    +----+       /  + 
      +----+--|    | +    +    +----+    + |    |    |/                 +  /  
     /        |    | |    |              | +    +----+                 /  +   
    +----+----+    + |    |              |/                           +  /    
    |              | +    +----+----+----+                           /  +     
    |              |/                                               +  /      
    +----+----+----+                                               /  +       
      +                                                           +  /        
     /                                                           /  +         
    +                                                           +  /          
   /                                                           /  +           
  +                                                           +  /            
 /                                                           /  +             
+----+----+----+----+----+----+----+----+----+----+----+----+  /              
|                                                           | +               
|                                                           |/                
+----+----+----+----+----+----+----+----+----+----+----+----+   

여기 7x7x7 예제 의 출력이 있습니다.

              +----+----+----+    +----+----+----+
             /              /|   /              /|
            +    +----+    + |  +    +----+    + |
           /    /|   /    /  + /    /|   /    /  +
          +    + |  +    +  / +    + |  +    +  / 
         /    /  +-/    /  + /    /  +-/    /  +  
        +----+  /-+----+  /-+----+  /-+----+  /--+
        |    | +  |    | +  |    | +  |    | +  /|
      +----+ | |+----+ | |+----+ | |+----+ | | + |
     /    /| + /    /| + /    /| + /    /| + |/  +
    +    + | |+    + | |+    + | |+    + | | +   |
   /    /  + /    /  + /    /  + /    /  + |   + |
  +    +----+    +   |+    +----+    +   | +  /| +
 /              /  + /              /  + | | + | |
+----+----+----+  /|+----+----+----+  /| + |/--+ |
|              | + ||              | + | |-+  /  +
|              |/--+|              |/--+ |   +  / 
+----+----+----+  / +----+----+----+  /  +  /  +  
  +    +  / +    +----+    +  /-+    +  /--+  /--+
 /    /  + /              /  + /    /  +   | +  /|
+----+  / +----+----+----+  /-+----+  /--+ |/  + |
|    | +  |              | +  |    | +  /|-+  /  +
|    | |-+|              |/  +|    | | + |   +  / 
+    + |  +----+----+----+  /|+    + |/  +  /  +  
|    | +----+----+ | |+    + ||    | +  /--+  /   
|    |/         /| + /    /  +|    |   +   | +    
+    +----+----+ | |+----+  /-+    +  /--+ |/     
|              | + ||    | +  |    | +  /|-+      
|              | | +|    | | +|    |/  + |        
+----+----+    + | |+    + |/|+----+  /  +        
  +    +--|    | + ||    | + |  +    +  /         
 /        |    | |-+|    |   +-/    /  +          
+----+----+    + |  +    +  / +----+  /           
|              | +  |    | +  |    | +            
|              |/   |    |/   |    |/             
+----+----+----+    +----+    +----+              

와우, 멋져 보인다 =) 구문 분석 / 출력 코드도 포함되지 않더라도 포함 할 수 있습니까? – 비 -luaners가 결과를 재현 할 수 있도록 =)
flawr

나는 새로운 예를 포함 시켰습니다. 여러분도 포함시킬 수 있다면 좋을 것입니다 =)
flawr

새로운 7x7x7 샘플로 업데이트되었으며, pastebin 문자열에서 테이블을 생성하기위한 스 니펫도 추가되었습니다.
PiGuy

@ 7x7x7 : 프로그램이 오목한 수직 모서리를 그리지 않는 것 같습니다. 상단 레이어의 뒤쪽 (뒤쪽)에있는 커브의 상단과 같습니다. 또는 가장 낮은 레이어의 앞 (가까운) 오른쪽에서 비슷하게. 나는 애니메이션을 완전히 좋아한다!
flawr

@flawr 고마워요, 바이트 카운트 다운에 시간이 걸리고 이제는 1.5kB 미만이며 애니메이션을 만드는 데 사용되는 전체 코드를 추가했습니다.
PiGuy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.