Trocar mapas de altura para mapas de profundidade

30

Descrição

Sua tarefa é produzir um 'mapa de profundidade' - ou seja, um mapa de altura de um objeto, mas não visto de cima, mas de frente.

Por exemplo, considere o seguinte objeto, como mostrado na imagem. O mapa de altura é mostrado à esquerda. O mapa de profundidade correspondente seria (como visto em pé na seta):

010
211   <- Depthmap
322

Se você estiver na seta, existem 3 cubos um atrás do outro no ponto inferior esquerdo, 2 atrás um do outro no ponto médio esquerdo, 0 no ponto superior esquerdo etc.

exemplo

Entrada

A entrada é uma matriz bidimensional de qualquer tamanho (não necessariamente quadrado).

Saída

A saída é outra matriz bidimensional que representa o mapa de profundidade. Como você pode deduzir, seus tamanhos são (height x width). Na imagem, seria (3 x 3). Observe que se a torre mais alta de cubos fosse 5, o mapa de profundidade seria uma matriz de (5 x 3).

Condição vencedora

O código mais curto vence.

Não permitido

Todos os idiomas são permitidos, sem restrições explícitas. (Não sei o que você pode criar, mas jogue limpo, por favor.)

Exemplos

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
pimvdb
fonte
Você pode fornecer uma amostra de entrada / saída para a imagem de exemplo que você postou?
Mellamokb
4
@pimvdb: Bom quebra-cabeça. Incentivamos as pessoas a procurar aconselhamento sobre o char Puzzle Lab ou a Meta SandBox antes de postar. Dessa forma, esses tipos de problemas podem ser resolvidos antes que seu quebra-cabeça seja lançado. Todos nós temos problemas para produzir uma especificação perfeita, principalmente se a tarefa não for trivial.
dmckee
2
@pimvdb: Não se preocupe; não é algum tipo de requisito. Apenas um serviço que prestamos um ao outro na esperança de melhorar o site.
dmckee
2
Bem, a confusão sobre a última linha pode ser que sua definição de »mapa de profundidade« é incomum, eu acho. Normalmente, um mapa de profundidade é o mesmo que um mapa de altura, visto apenas de uma câmera específica - ou seja, indica a extensão em direção ao ponto de vista de uma determinada cena (pelo menos é assim que os renderizadores 3D o tratam). O que você tem é essencialmente quantos blocos estão atrás um do outro em um determinado lugar. Não sei como chamá-lo, no entanto. Uma anlogia pode ser blocos de vidro parcialmente transparentes e quanto mais você tiver um atrás do outro, mais escuro o resultado fica - independentemente do espaço entre eles.
Joey
11
Não se preocupe. É uma tarefa bem como é agora.
Joey

Respostas:

12

Golfscript, 42 caracteres

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

resultados

$ 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
VOCÊS
fonte
Parabéns.
Pimvdb
@ pimvdb, obrigado, mas acho que você deve abri-lo sem aceitar nenhuma resposta por algum tempo (pode ser uma semana).
VOCÊ
Como a resposta aceita pode ser alterada a qualquer momento novamente, onde está o mal?
Joey
+100: 42 caracteres :-)
mellamokb
Abstive-me de olhar para a sua solução até escrever a minha. Comparando-os agora, eles são bastante semelhantes, exceto que você salva uma tonelada de caracteres com o []*. Bom truque.
Peter Taylor
8

Ruby 1.9, 102 caracteres

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

Passa em todos os casos de teste.

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

Passa em todos os casos de teste.

Joey
fonte
7

Haskell, 118 caracteres

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

  • Editar (122 → 118): evite filtrar apenas repetindo a altura máxima
MtnViewMark
fonte
4

Scala 236 caracteres

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

Com alguma formatação:

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

Tenho certeza de que uma facilidade melhor com compreensão significaria que eu poderia cortar alguns caracteres disso.

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

Apenas para constar, esse é o código que criei antes de postar a pergunta. (Diminuído agora)

pimvdb
fonte
3

Versão Haskell (agora otimizada)

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

Versão ungolfed

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
Theo Belaire
fonte
Respostas longas para [code-golfe] perguntas são aceitáveis quando o comprimento surge usando linguagens inadequadas (dizem Fortran 77), mas ainda são esperados para fazer uma tentativa de golf -los. Nem mesmo se preocupar em reduzir seus identificadores para uma única letra não está conseguindo entrar no espírito do jogo, que eu suspeito que seja a causa dos votos negativos.
dmckee
Bem-vindo ao código de golfe! Você pode separar seu código de golfe do código não-golfe e colocar uma contagem de caracteres em sua postagem para o seu código de golfe, por favor? Obrigado! Isso tornará sua postagem um pouco mais fácil de ler e é o padrão geral que usamos.
Mellamokb
O objetivo do código golf é criar o menor código possível. O seu é bastante detalhado, então tente mais!
FUZxxl
1

Python, 117 caracteres

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

Semelhante à solução Ruby da Ventero.

hallvabo
fonte
0

APL (Dyalog Extended) , 14 bytes

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

Experimente 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.
lirtosiast
fonte
0

Clojure, 102 bytes

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

Japonês , 12 bytes

c rÔÆÕËè>X
w

Experimente todos os casos de teste

A saída das linhas na ordem inversa economizaria 2 bytes , e a entrada na ordem principal da coluna economizaria 1 byte , enquanto os dois economizariam (naturalmente) 3 bytes

Explicação:

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
Kamil Drakari
fonte