将高度图交换为深度图


30

描述

您的任务是输出一个“深度图”-即对象的高度图,但不是从其顶部而是从其正面看到。

例如,考虑以下对象,如图所示。高度图显示在左侧。相应的深度图应为(如从箭头处看到的那样):

010
211   <- Depthmap
322

如果您站在箭头处,则在左下角点处彼此后面有3个多维数据集,在左中角点处彼此后面有2个立方体,在左上角点处有0个立方体等。

例

输入值

输入是任何大小的二维数组(不一定是正方形)。

输出量

输出是另一个二维数组,它表示深度图。可以推断,其大小为(height x width)。在图像中,它将为(3 x 3)。请注意,如果多维数据集的最高塔为5,则深度图将是的数组(5 x 3)

获奖条件

最短的代码获胜。

不允许的

允许所有语言,没有明确的限制。(我不知道你能想出什么,但是请公平对待。)

例子

Input:     Ouput:

5321       0001
1456       1012
2105       1112
           1212
           2222
           3323


Input:     Output:

22         01
13         12
00         22


Input:     Output:    (of the sample image)

232        010
210        211
101        322

您可以为您发布的示例图片提供示例输入/输出吗?
mellamokb

4
@pimvdb:好难题。我们鼓励人们在发布之前在Puzzle Lab char或Meta SandBox上寻求建议。这样,您就可以解决这些问题,然后再解决难题。我们所有人都很难制定出完美的规范,尤其是在任务艰巨的情况下。
dmckee,2011年

2
@pimvdb:不要烦恼;这不是某种要求。只是我们为彼此提供的一项服务,希望使站点更好一点。
dmckee 2011年

2
好吧,关于最后一行的困惑可能是您对“深度图”的定义并不常见,我想。通常,深度图与高度图是相同的,只是从特定的摄像机看到的-即,它告诉给定场景视点的扩展(至少这是3D渲染器对待它的方式)。本质上,您所拥有的是给定位置中彼此后面有多少个块。不过,不确定如何调用它。古老的作品可能是部分透明的玻璃块,彼此之间的距离越多,结果越暗-无论它们之间的空间如何。
乔伊,

1
不用担心 现在,这是一项很好的任务。
乔伊,

Answers:


12

Golfscript,42个字符

n%{n*~]}%zip:|[]*$),{:);n|{{)>},,}%}%-1%\;

结果

$ golfscript 2657.gs < 2657-1.txt 
0001
1012
1112
1212
2222
3323

$ golfscript 2657.gs < 2657-2.txt 
01
12
22

$ golfscript 2657.gs < 2657-3.txt 
010
211
322

恭喜你
pimvdb 2011年

@pimvdb,谢谢,但是我认为您应该在一段时间(可能是一个星期)内不接受任何答案的情况下打开它。

由于接受的答案可以随时更改,因此危害何在?
乔伊,

+100:42个字符:-)
mellamokb

在编写自己的解决方案之前,我不会考虑您的解决方案。现在比较它们,它们非常相似,只不过您使用节省了很多字符[]*。好招
彼得·泰勒

8

Ruby 1.9,102个字符

f=$<.map{|g|[*g.chop.bytes]}
f.flatten.max.downto(49){|j|puts f.transpose.map{|n|n.count{|r|r>=j}}*""}

通过所有测试用例。


7

Windows PowerShell中,108 111 114

(($i=@($input))-split''|sort)[-1]..1|%{$h=$_
-join(1..$i[0].Length|%{$x=$_-1
@($i|?{"$h"-le$_[$x]}).count})}

通过所有测试用例。


7

Haskell,118个字符

import List
p h=map(\c->transpose(lines h)>>=show.length.filter(>=c))['1'..maximum h]
main=interact$unlines.reverse.p

  • 编辑(122→118):通过仅迭代到最大高度来避免过滤

4

Scala 236个字符

object D extends App{var(l,m,z)=(io.Source.stdin.getLines.toList,0,0);val a=Array.ofDim[Int](l.head.size,10);for(i<-l;(j,q)<-i.zipWithIndex;x<-1 to j-48){a(q)(x-1)+=1;m=List(m,j-48).max};for(i<-1 to m){for(j<-a){print(j(m-i))};println}}

使用某些格式:

object Depthmap extends App
{
    var(l,m,z)=(io.Source.stdin.getLines.toList,0,0)
    val a=Array.ofDim[Int](l.head.size,10)
    for(i<-l;(j,q)<-i.zipWithIndex;x<-1 to j-48)
    {
        a(q)(x-1)+=1
        m=List(m,j-48).max
    }
    for(i<-1 to m)
    {
        for(j<-a)
        {
            print(j(m-i))
        }
        println
    }
}

我确信更好的理解能力将意味着我可以从中削减一些角色。


4

JavaScript中,235个 208 195字节

function _(b){for(e=Math.max.apply(0,b.join().split(",")),f=[],c=i=0;i<e;i++){for(
c=[],a=0;a<b[0].length;a++)for(d=c[a]=0;d<b.length;d++)b[d][a]>i&&c[a]++;f[e-i-1]
=c.join("")}return f.join("\n")}

仅作记录,这是我在发布问题之前编写的代码。(现在略)


3

Haskell版本(现已优化)

import Data.List
import Text.Parsec
import Text.Parsec.String

main= readFile"in.txt">>=(\t->either print(putStrLn.intercalate"\n".map(concatMap show).(\j->map (\n->(map(length.(filter(>=n)))(transpose$reverse j))) (reverse [1..(maximum$map maximum j)])))(parse(many1$many1 digit>>=(\x->newline>>(return$map(read.return)x)))""t))

非高尔夫版本

import Data.List (foldl', transpose, intercalate)
import Text.Parsec
import Text.Parsec.String

-- Source:  http://codegolf.stackexchange.com/questions/2657/swapping-heightmaps-to-depthmaps

digitArray :: Parser [[Int]]
digitArray = many1 $ do xs <- many1 digit
                        optional newline
                        return $ map (read . return) xs

maxHeight :: Ord c => [[c]] -> c
maxHeight = maximum . (map maximum)

heightToDepth :: [[Int]] -> [[Int]]
heightToDepth ins = level (maxHeight ins)
        where level 0 = []
              level n = (map (length . (filter (>=n))) xs) : level (n-1)
              xs      = transpose $ reverse ins

lookNice xs = intercalate ['\n'] $ map (concatMap show) xs

main = do inText <- readFile "in.txt"
          case parse digitArray "" inText of
              Left err -> print err
              Right xs -> putStrLn $ lookNice $ heightToDepth xs

当由于使用不合适的语言(例如fortran 77)而导致长度过长时,[code-golf]问题的长答案是可以接受的,但是仍然希望您尝试打高尔夫球。甚至不费心将标识符简化为单个字母也无法融入游戏的精神,我怀疑这是投票失败的原因。
dmckee 2011年

欢迎参加编码高尔夫!您能否将高尔夫代码与非高尔夫代码分开,并在您的帖子中添加一个字符数作为高尔夫代码?谢谢!这将使您的帖子更容易阅读,这是我们使用的常规模式。
mellamokb

代码高尔夫的目标是创建尽可能短的代码。您的内容很冗长,因此请加倍努力!
FUZxxl 2011年

1

Python,117个字符

import sys
a=zip(*sys.stdin)[:-1]
n=int(max(map(max,a)))
while n:print''.join(`sum(e>=`n`for e in r)`for r in a);n-=1

与Ventero的Ruby解决方案相似。


0

APL(Dyalog扩展),14字节

{⊖⍉+⌿⍵≥⍀⍳⌈/,⍵}

在线尝试!

{⊖⍉+⌿⍵≥⍀⍳⌈/,⍵}    Monadic function:
                  Start with a 2D array ⍵.
          ⌈/,      Find the overall maximum value h.
                  Make the list 1...h
       ≥⍀          Make a  table between that list and ⍵.
                   Now we have a 3D matrix where position [a,b,c]
                   represents whether ⍵[a,b] is at least c.
    +⌿             We sum along the outermost (first) dimension, 
                   since that corresponds to a column of ⍵.
                   Now we have a 2D matrix where position [b,c]
                   represents how many values in column b of  are at least c.
                  Transpose so the heights are rows.
                  Flip vertically.

0

Clojure,102字节

#(for[h(range(apply max(flatten %))0 -1)](map(fn[w _](count(for[r % :when(>=(r w)h)]_)))(range)(% 0)))

0

Japt,12个字节

c rÔÆÕËè>X
w

尝试所有测试用例

以相反的顺序输出行将节省2个字节,以列优先的顺序输入将节省1个字节,同时执行这两个操作(自然)将节省3个字节

说明:

c rÔ          #Find the maximum height
    Æ         #For each number X in the range [0...max_height]:
     Õ        # Get the columns of the input
      Ë       # For each column:
       è>X    #  Count how many items are greater than X

w             #Reverse the output
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.