ASCII Voksellerini Yazdır


28

Bir okuyan bir program yazın bir temsil ikili değerler dizisi oluşur küp, küçük küpler. Her değer, verilen konumda mevcut olan bir voksel (küçük küp) olup olmadığını söyler. Program verilen diziyi bir ASCII grafiği olarak çıkarmalıdır (bu, konsoldan çıktı almak veya bir dosyaya yazmak anlamına gelir).nxnxnnxnxnn3

Örnekler

Aşağıdaki diziyi ele alalım :2x2x2

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

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

Bu durumda çıktı şöyle görünmelidir (burada daha az dikey alana sahip kod editörleri / konsolları kadar iyi görünmez):

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

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

giriş dizesi için bir örnek burada bulunabilir (pastebin). giriş dizgisine yeni bir örnek burada bulunabilir .12x12x127x7x7

ASCII'nin Özellikleri

Bir vokselin her bir köşesi, +ona giden herhangi bir kenarı olduğu sürece temsil edilir . Aynı +zamanda birden fazla birim uzunluğunda düz bir kenar olduğunda da çizilir. Üç tür kenar vardır: Yatay soldan sağa ----, yatay arkadan öne /ve dikey

|
|

Bunların her birinin +(göründüğü kadarıyla) bitmesi gerekiyor . Kenarlar, bir düzlemsel düzlemi iki veya daha fazla parçaya böldüklerinde çizilmeyecektir ( +yukarıda belirtildiği gibi kenarların aksine ). Başkalarının arkasına gizlenmiş yapılar çizilmemelidir.

'Çizim' temelde paralel bir çıkıntıdır, bu nedenle yalnızca üst, sağ ve ön taraflar her zaman aynı açıdan görünür.

ayrıntılar

Kod boyutundaki girişler için çalışıyor olmalıdır . (Kadar sonra izin verilmeden önce / boşluk ve gereksiz yeni satır Firar olabilir , her zaman temel olarak çıktılar bir kod bilgileri çekme gerçek boyutu sadece da ızgara veya çok) .n=1,2,...,1212x12x123x3x3

Giriş biçimlendirme ve yöntem size kalmış, csv, JSON veya başka herhangi bir şey kullanabilirsiniz, ancak her vokselin durumu için ve oluşmalıdır . Sipariş, örneklerde olduğu gibi olmalıdır:10

  • 1. boyut: en üstten en alt kata kadar olan katman katman
  • 2. boyut: satır arka arkaya (en uzak) önden (en yakın)
  • 3. boyut: her satırda soldan sağa vokseller

Konsolu kullanmanız veya dosyaları giriş ve çıkış olarak okumanız size bağlıdır. Lütfen bize kodunuzdan / ona nasıl yaklaştığınızdan bahsedin.

yargılamak

Bu kod kodludur, bu yüzden en az sayıda bayt kazanır. Bu SADECE işi ​​gerçekten yapan kısmı içerir - baytları sayırken girişi zaten bir değişkende ayrıştırılmış ve kaydedilmiş olarak düşünebilirsiniz ve çıktı dizesinin bir değişkene kaydedilmiş, yazdırılmaya hazır olması gerekir. Ayrıştırma ve çıktının kendisi sayılmaz.

(Ve sunumları yaratıcı örneklerle artıracağım =)

Bu Rob's Puzzle sayfasından esinlenmiştir .

Yanıtlar:


12

Python ( 444 361 354 bayt)

Düzenleme: Çok özel durumlarda bir köşe çarpı atlayacak başka bir hata buldum. Dümdüz bir düzeltme, koda 50 bayt ekledi, bu yüzden biraz daha aşağıya düşürmeye çalıştım. Şimdi hata sabittir ve 83 bayt daha kısadır. Çok kırılganlaşıyor. Ayrıca döngü için beş kattan kurtulmak istedim ancak henüz bir çözüm bulamadım. Herhangi bir fikir?

Düzen 2: Çok uzun bir içe aktarma ile 7 karakter daha kaydedebilirim.

Ne çok kısa ne de çok şık, ama sonra yine karmaşık bir problem:

#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

İlk önce tüm bireysel vokselleri üst üste tüm çizgilerle çizer. Sonra sadece en üstteki karakterleri çıkarır ve bu çizgilerden kurtulur ve özelliklere göre çizilmemesi gereken düzlemsel düzlemler üzerinde geçer.

Sanırım biraz daha golf oynamak mümkün ama 444 çok iyi bir rakam. :)

Örnek 3x3x3 ve 7x7x7 çıktı (bazı yeni satırlar kaldırılmış olarak):

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

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

1
İyi iş! Benim karmaşa göre çok kompakt. İçbükey kenarlarınızı olsa kontrol edin! (eksik artı işaretleri) - repl.it/XA9/2
PiGuy

@PiGuy: İyi yakalayın! Sanırım tamir ettim. Bu benim kodumu biraz daha uzun yaptı ama ben de daha fazla golf buldum, bu yüzden sihirli bir şekilde hala aynı byte sayısındayım.
Emil,

Yakında '4' üzerinde çok fazla bir '+' var gibi görünüyor. (Gönderdiğim 7x7x7 dijital fotoğraf makinesini de deneyebilir misiniz?)
flawr

@flawr: Bu artı işareti en uzak 4'e (çok sağ alt köşeye) ait, bu yüzden doğru olmalı. :) 7x7x7 vakasını ekleyeceğim. İlk önce onu dışarıda bıraktım, çünkü eğer herkes yayınlarsa sayfanın karmakarışık olacağını düşünmüştüm, ama sanırım sorun değil.
Emil,

Ah şimdi görüyorum - sanırım büyük dikey alanlar tarafından kandırıldım.
kusur,

20

Lua (1442 bayt)

Bonus animasyonları! :)
Eğer örnekler aynı biçimde herhangi serin voksel sanat var yorumlarda bağlamak ve bunu bir animasyon dışarı edecekse
7x7x7
Bonus animasyonu
12x12x12
Bonus 2
Bu benim ilk kod golf onun oldukça Dağınık böylece, ve ben iyileştirmeye planı ya da farklı bir dile taşımak.
İşte sahip olduğum şey şu anda 2.5kB'nin hemen altında zar zor golf oynadı (bu noktada girinti boşluklarını kaldırdım, daha sonra devam edeceğim)

İşte şimdi ~ 1.4kB golf ve küçültülmüş versiyon (ilk satırdaki "a" tablosunun voksel matrisi için yer tutucusu olduğuna dikkat edin):

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

Düzenleme : İşte orjinal (3kB üstü) eski sürümdür, animasyonu yapmak için yaptığım düzenlemeler de dahil (eğer kendin çalıştırıyorsan ve animasyonu istiyorsan false, kodun altını değiştir) 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])

Voxel matrisini 3x3x3 bir voksel matrisi için bir dizeden dolduracak bir kod örneği. (Benzer bir biçimde herhangi bir dize alır, ancak bir küp olduğundan emin olun, aksi halde işler muhtemelen kırılır.)
Bunu kullanmak için ilk satırdan hemen sonra bu öbeği yerleştirin.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

Burada verilen 12x12x12 voksel düzeninden çıktı: (ve evet normal bir konsol / metin görüntüleme cihazında daha iyi görünüyor, burada biraz fazla dikey boşluk var)

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

İşte 7x7x7 örneğindeki çıktı

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

Vay, harika görünüyor =) Sayılmasa da ayrıştırma / çıkış kodunu da ekleyebilir misiniz - sadece luanan olmayanların sonuçlarınızı yeniden üretebilmesi için =)
kusur

Yeni bir örnek
ekledim

Yeni 7x7x7 örnek ile güncellendi, ayrıca pastebin dizelerinden tablo oluşturmak için pasajı eklendi.
PiGuy

@ 7x7x7: Görünüşe göre programınız içbükey dikey kenarlar çizmiyor. Üst tabakanın arka (daha ileri) tarafındaki eğrinin üstünde olduğu gibi. veya benzer şekilde en alt katmandaki ön (yakın) sağ tarafta. Animasyonları tamamen seviyorum!
kusur

@flawr Teşekkürler, ben de bayt saymak ve şimdi 1.5kB'nin altına inmek için biraz zaman harcadım ve animasyonları oluşturmak için kullandığım kodun tamamını ekledim.
PiGuy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.