In các đoạn mã ASCII


28

Viết chương trình đọc một mảng n×n×n của các giá trị nhị phân đại diện cho một khối , bao gồm khối nhỏ hơn. Mỗi giá trị cho biết có một voxel (khối lập phương nhỏ) có ở vị trí nhất định hay không. Chương trình phải xuất ra mảng đã cho dưới dạng đồ họa ASCII (có nghĩa là đầu ra thông qua bàn điều khiển hoặc ghi vào tệp).n×n×nn3

Ví dụ

Chúng ta hãy xem xét mảng sau:2×2×2

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

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

Trong trường hợp này, đầu ra sẽ trông như thế này (ở đây trông không tốt như ở trình soạn thảo mã / bảng điều khiển có không gian dọc ít hơn):

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

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

Có thể tìm thấy một ví dụ cho chuỗi đầu vào ở đây (pastebin). Một ví dụ mới cho chuỗi đầu vào có thể được tìm thấy ở đây.12×12×127×7×7

Thông số kỹ thuật của ASCII

Mỗi góc của một voxel được đại diện bởi một +miễn là có bất kỳ cạnh dẫn đến nó. Chúng +cũng được vẽ khi có một cạnh thẳng dài hơn một đơn vị. Có ba loại cạnh: Ngang từ trái sang phải ----, ngang trở lại trước /và dọc

|
|

Mỗi trong số đó phải kết thúc bằng một +(như có thể nhìn thấy). Các cạnh sẽ không được vẽ khi chúng chia một mặt phẳng thành hai hoặc nhiều mảnh (không giống như +các cạnh so với các cạnh như đã nêu ở trên). Các cấu trúc được ẩn đằng sau những người khác không được rút ra.

'Bản vẽ' về ​​cơ bản là một hình chiếu song song nên chỉ có thể nhìn thấy các mặt trên, phải và mặt trước - luôn từ cùng một góc.

Chi tiết

Mã phải hoạt động cho các đầu vào có kích thướcn=1,2,,1212×12×123×3×3

10

  • Chiều thứ 1: từng lớp từ lớp trên xuống dưới
  • Chiều thứ 2: hàng theo hàng trở lại (xa nhất) về phía trước (gần nhất)
  • Chiều thứ 3: voxels ở mỗi hàng từ trái sang phải

Cho dù bạn sử dụng bàn điều khiển hay đọc các tập tin như đầu vào và đầu ra là tùy thuộc vào bạn. Vui lòng cho chúng tôi biết mã của bạn / cách bạn tiếp cận nó.

Đánh giá

Đây là codegolf nên số byte ít nhất sẽ thắng. Điều này bao gồm CHỈ phần thực sự làm việc - khi đếm byte, bạn có thể xem đầu vào đã được phân tích cú pháp và lưu trong một biến và bạn phải lưu chuỗi đầu ra vào một biến, sẵn sàng để in. Phân tích cú pháp và đầu ra chính nó không được tính.

(Và tôi sẽ nâng cấp bài nộp với các ví dụ sáng tạo =)

Điều này được lấy cảm hứng từ trang Puzzle của Rob .

Câu trả lời:


12

Python ( 444 361 354 byte)

Chỉnh sửa: Tôi tìm thấy một lỗi khác sẽ bỏ qua một góc chéo trong các trường hợp rất đặc biệt. Một bản sửa lỗi thẳng đã thêm 50 byte vào mã vì vậy tôi đã cố gắng đánh nó xuống thêm một chút. Bây giờ lỗi đã được sửa và nó thậm chí còn ngắn hơn 83 byte. Nó đang trở nên rất hack. Tôi cũng muốn thoát khỏi vòng lặp năm lần nhưng không thể tìm ra giải pháp. Có ý kiến ​​gì không?

Chỉnh sửa 2: Với quá trình nhập rất dài, tôi có thể lưu thêm 7 ký tự.

Không quá ngắn cũng không rất thanh lịch, nhưng một lần nữa, đây lại là một vấn đề phức tạp:

#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

Đầu tiên, nó vẽ tất cả các voxels riêng lẻ với tất cả các dòng trên đầu của nhau. Sau đó, nó chỉ xuất ra các ký tự trên cùng và loại bỏ các đường và chéo đó trên các mặt phẳng không nên được vẽ theo thông số kỹ thuật.

Tôi đoán có thể đánh golf này xuống khá nhiều, nhưng 444 là một con số đẹp. :)

Ví dụ đầu ra 3x3x3 và 7x7x7 (đã xóa một số dòng mới):

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

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

1
Công việc tốt! Rất nhỏ gọn so với mớ hỗn độn của tôi. Kiểm tra các cạnh lõm của bạn mặc dù! (thiếu dấu cộng) - repl.it/XA9/2
PiGuy

@PiGuy: Bắt tốt! Tôi nghĩ rằng tôi đã sửa nó. Nó làm cho mã của tôi dài hơn một chút nhưng tôi cũng tìm thấy một số thứ chơi gôn hơn nữa, vì vậy tôi vẫn kỳ diệu ở cùng một số byte.
Emil

Có vẻ như có một '+' quá nhiều khi gần hơn '4'. (Bạn cũng có thể dùng thử 7x7x7 mà tôi đã đăng không?)
flawr

@flawr: Dấu cộng đó thuộc về góc xa 4 (góc dưới bên phải thấp hơn) nên nó phải đúng. :) Tôi sẽ thêm trường hợp 7x7x7. Lần đầu tiên tôi bỏ nó đi vì tôi nghĩ nó sẽ làm lộn xộn trang này nếu mọi người đăng nó, nhưng tôi đoán điều đó tốt.
Emil

Bây giờ tôi hiểu rồi - tôi nghĩ rằng tôi đã bị lừa bởi những khoảng trống lớn dọc.
flawr

20

Lua (1442 byte)

Thưởng hoạt hình! :)
Nếu bạn có bất kỳ nghệ thuật voxel thú vị nào có cùng định dạng với các ví dụ, hãy liên kết nó trong các bình luận và tôi sẽ tạo ra một hình ảnh động từ nó
7x7x7
Phần thưởng hoạt hình
12x12x12
Phần thưởng 2
Đây là môn đánh gôn đầu tiên của tôi, vì vậy nó khá lộn xộn nó hoặc chuyển nó sang một ngôn ngữ khác.
Đây là những gì tôi có, ngay bây giờ chỉ dưới 2,5kB chưa được đánh gôn (chỉ cần loại bỏ khoảng trắng thụt vào thời điểm này, tôi sẽ tiếp tục sau)

Dưới đây là phiên bản rút gọn và chơi gôn ~ 1,4kB (lưu ý bảng "a" trên dòng đầu tiên là trình giữ chỗ cho ma trận voxel):

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

Chỉnh sửa : Đây là phiên bản không có bản gốc (trên 3kB), bao gồm các chỉnh sửa của tôi để tạo hoạt hình (nếu bạn đang tự chạy và muốn hoạt hình, hãy thay đổi falsegần cuối mã thành 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])

Dưới đây là một mẫu mã sẽ đưa vào ma trận voxel từ một chuỗi cho ma trận voxel 3x3x3. (Nó sẽ lấy bất kỳ chuỗi nào trong một định dạng tương tự, nhưng hãy chắc chắn rằng đó là một khối hoặc mọi thứ có thể sẽ bị hỏng.)
Để sử dụng chuỗi này, hãy chèn đoạn này ngay sau dòng đầu tiênlocal 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

Đây là đầu ra từ mẫu voxel 12x12x12 đã cho : (và vâng, nó trông đẹp hơn trên một thiết bị xem / bảng điều khiển văn bản bình thường, có một khoảng cách dọc quá nhiều ở đây)

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

Đây là đầu ra từ ví dụ 7x7x7 ở đây

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

Wow, trông thật tuyệt =) Bạn cũng có thể bao gồm mã phân tích / mã đầu ra mặc dù nó không được tính - chỉ để những người không phải là người có thể tái tạo kết quả của bạn =)
flawr

Tôi đã bao gồm một ví dụ mới, sẽ rất tuyệt nếu bạn cũng có thể bao gồm điều đó =)
flawr

Được cập nhật với mẫu 7x7x7 mới, cũng đã thêm đoạn mã để tạo bảng từ các chuỗi pastebin.
PiGuy

@ 7x7x7: Có vẻ như chương trình của bạn không vẽ các cạnh dọc lõm. Giống như trên đỉnh của đường cong đó ở mặt sau (xa hơn) của lớp trên cùng. hoặc tương tự ở phía trước (gần) bên phải trên lớp thấp nhất. Tôi hoàn toàn thích các hình ảnh động!
flawr

@flawr Cảm ơn, tôi đã sửa nó cũng như dành thời gian để đếm ngược byte và bây giờ dưới 1,5kB, và tôi đã thêm mã đầy đủ tôi đã sử dụng để tạo hoạt hình.
PiGuy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.