ハイトマップをデプスマップに交換する


30

説明

あなたの仕事は、「深度マップ」、つまりオブジェクトの高さマップですが、上からではなく正面から見たものを出力することです。

たとえば、画像に示されている次のオブジェクトを考えます。高さマップは左側に表示されます。対応する深度マップは次のとおりです(矢印の位置から見た場合)。

010
211   <- Depthmap
322

矢印の前に立つと、左下のポイントに3つの立方体、左の中央のポイントに2つ、左上の点に0などがあります。

例

入力

入力は、任意のサイズの2次元配列です(必ずしも正方形ではありません)。

出力

出力は、深度マップを表す別の2次元配列です。推測できるように、そのサイズは(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

2
@pimvdb:心配しないでください。なんらかの要件ではありません。サイトを少しでも良くすることを期待して、お互いに提供するサービスです。
dmckee

2
さて、最後の行に関する混乱は、「深さマップ」の定義が珍しいことかもしれません。通常、深度マップは特定のカメラから見た高さマップと同じです。つまり、特定のシーンの視点に向かって拡張を伝えます(少なくとも3Dレンダラーがそれを処理する方法です)。あなたが持っているのは、基本的に、与えられた場所でどれだけ多くのブロックが背後にあるかです。しかし、それをどのように呼ぶのかわかりません。アナロジーは、部分的に透明なガラスブロックである可能性があり、それらが互いの背後にあるほど、その間のスペースに関係なく、結果が暗くなります。
ジョーイ

1
心配しないで。それは今のままで素晴らしい仕事です。
ジョーイ

回答:


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

@pimvdb、ありがとう。しかし、しばらくの間(1週間になるかもしれませんが)何の回答も受け入れずに開くべきだと思います。
あなた

受け入れられた答えはいつでも変更できるので、害はどこにありますか?
ジョーイ

+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

[code-golf]の質問に対する長い答えは、不適切な言語(fortran 77など)を使用することで長さが生じる場合は受け入れられますが、それらをゴルフする試みを行うことが期待されます。識別子を1文字に減らすことさえ気にせずにゲームの精神に浸ることはできません。それがダウン投票の原因だと思います。
dmckee

コードゴルフへようこそ!あなたのゴルフコードをあなたのゴルフコードから分離し、あなたのゴルフコードの投稿に文字数を入れてください。ありがとう!これにより、投稿が少し読みやすくなり、一般的なパターンになります。
mellamokb

コードゴルフの目標は、可能な限り短いコードを作成することです。あなたのものはかなり冗長なので、もっと頑張ってください!
FUZxxl

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 Extended)、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.