Mengganti peta ketinggian ke peta kedalaman


30

Deskripsi

Tugas Anda adalah menampilkan 'peta kedalaman' - yaitu peta ketinggian suatu objek tetapi tidak terlihat dari atas tetapi dari depannya.

Misalnya, perhatikan objek berikut seperti yang ditunjukkan pada gambar. Peta ketinggian ditampilkan di sebelah kiri. Peta kedalaman yang sesuai akan (seperti yang terlihat dari berdiri di panah):

010
211   <- Depthmap
322

Jika Anda berdiri di panah, ada 3 kubus di belakang satu sama lain di titik kiri bawah, 2 di belakang satu sama lain di titik kiri tengah, 0 di titik kiri atas dll.

example

Memasukkan

Input adalah array dua dimensi dari berbagai ukuran (tidak harus persegi).

Keluaran

Output adalah array dua dimensi yang mewakili peta kedalaman. Seperti yang dapat Anda simpulkan, ukurannya adalah (height x width). Dalam gambar, itu akan menjadi (3 x 3). Perhatikan bahwa jika menara kubus tertinggi adalah 5, maka depthmap akan menjadi array (5 x 3).

Kondisi menang

Kode terpendek menang.

Tidak diizinkan

Semua bahasa diizinkan, tidak ada batasan eksplisit. (Aku tidak tahu apa yang bisa kamu lakukan, tapi tolong bersikap adil.)

Contohnya

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

Bisakah Anda memberikan contoh input / output untuk contoh gambar yang Anda posting?
mellamokb

4
@ pimvdb: Teka-teki yang bagus. Kami mendorong orang-orang untuk mencari saran tentang Puzzle Lab char atau Meta SandBox sebelum memposting. Dengan begitu, masalah-masalah seperti ini dapat diselesaikan sebelum puzzle Anda tayang. Kita semua kesulitan menghasilkan spesifikasi yang sempurna, terutama jika tugasnya tidak sepele.
dmckee

2
@ pimvdb: Jangan khawatir; itu bukan semacam persyaratan. Hanya layanan yang kami sediakan untuk satu sama lain dengan harapan membuat situs ini sedikit lebih baik.
dmckee

2
Nah, kebingungan mengenai baris terakhir mungkin karena definisi Anda tentang »peta mendalam« tidak umum, saya kira. Biasanya peta kedalaman sama dengan peta ketinggian, hanya dilihat dari kamera tertentu - yaitu memberitahu ekstensi menuju sudut pandang adegan tertentu (setidaknya itulah cara penyaji 3D memperlakukannya). Apa yang Anda miliki pada dasarnya adalah berapa banyak balok di belakang satu sama lain di tempat tertentu. Namun, tidak yakin bagaimana menyebutnya. Anlogy mungkin sebagian dari balok kaca transparan dan semakin banyak Anda miliki di belakang satu sama lain, semakin gelap hasilnya - terlepas dari ruang di antara mereka.
Joey

1
Jangan khawatir. Ini tugas yang bagus seperti sekarang.
Joey

Jawaban:


12

Golfscript, 42 karakter

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

hasil

$ 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

Selamat.
pimvdb

@ pimvdb, terima kasih, tapi saya pikir Anda harus membukanya tanpa menerima jawaban untuk beberapa waktu (mungkin satu minggu).
ANDA

Karena jawaban yang diterima dapat diubah kapan saja lagi, di mana salahnya?
Joey

+100: 42 karakter :-)
mellamokb

Saya menahan diri untuk tidak melihat solusi Anda sampai saya menulis sendiri. Membandingkannya sekarang, mereka agak mirip kecuali Anda menyimpan banyak karakter dengan []*. Trik yang bagus.
Peter Taylor

8

Ruby 1.9, 102 karakter

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

Lewati semua testcases.


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})}

Passes all test cases.


7

Haskell, 118 characters

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

  • Edit (122 → 118): avoid filtering by only iterating to maximal height

4

Scala 236 characters

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}}

With some formatting:

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
    }
}

I'm sure a better facility with for comprehensions would mean I could cut some characters from this.


4

JavaScript, 235 208 195 bytes

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")}

Just for the record, this is the code I made up before posting the question. (Smallened now)


3

Haskell Version (Now optimized)

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))

Ungolfed version

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

Long answers to [code-golf] questions are acceptable when the length arises from using unsuitable languages (say fortran 77), but you are still expected to make an attempt to golf them. Not even bothering to reduce your identifiers to single letter is failing to get into the spirit of the game, which I suspect is the cause of the downvotes.
dmckee

Welcome to code golf! Can you separate your golfed code from your ungolfed code, and put a character count in your post for your golfed code please? Thanks! It will make your post a little easier to read and is the general pattern we use.
mellamokb

The goal of code golf is to create the shortest code possible. Yours is rather verbose, so try harder!
FUZxxl

1

Python, 117 chars

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

Similar to Ventero's Ruby solution.


0

APL (Dyalog Extended), 14 bytes

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

Try it online!

{⊖⍉+⌿⍵≥⍀⍳⌈/,⍵}    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 bytes

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

0

Japt, 12 bytes

c rÔÆÕËè>X
w

Try all test cases

Outputting the rows in reversed order would save 2 bytes, taking input in column-major order would save 1 byte, doing both would (naturally) save 3 bytes

Explanation:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.