Zamiana map wysokości na mapy głębokości


30

Opis

Twoim zadaniem jest wygenerowanie „mapy głębokości” - to znaczy mapy wysokości obiektu, ale niewidocznego z góry, ale z przodu.

Na przykład rozważmy następujący obiekt pokazany na obrazku. Mapa wysokości pokazana jest po lewej stronie. Odpowiednia mapa głębokości wyglądałaby (patrząc od pozycji przy strzale):

010
211   <- Depthmap
322

Jeśli stoisz przy strzale, są 3 kostki za sobą w dolnym lewym punkcie, 2 za sobą w środkowym lewym punkcie, 0 w lewym górnym rogu itp.

przykład

Wkład

Dane wejściowe to dwuwymiarowa tablica o dowolnych rozmiarach (niekoniecznie kwadratowa).

Wydajność

Dane wyjściowe to kolejna dwuwymiarowa tablica reprezentująca mapę głębokości. Jak można wywnioskować, jego rozmiary to (height x width). Na zdjęciu byłoby (3 x 3). Zauważ, że jeśli najwyższa wieża sześcianów wynosiła 5, mapa głębokości byłaby tablicą (5 x 3).

Warunki wygranej

Najkrótszy kod wygrywa.

Niedozwolone

Wszystkie języki dozwolone, bez wyraźnych ograniczeń. (Nie wiem, co możesz wymyślić, ale graj proszę, proszę.)

Przykłady

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

Czy możesz podać przykładowe dane wejściowe / wyjściowe dla przykładowego obrazu, który opublikowałeś?
mellamokb

4
@pimvdb: Nice puzzle. Zachęcamy ludzi do zasięgnięcia porady na temat Puzzle Lab lub Meta SandBox przed wysłaniem. W ten sposób można rozwiązać te problemy, zanim Twoja łamigłówka zostanie uruchomiona. Wszyscy mamy problemy z przygotowaniem idealnej specyfikacji, szczególnie jeśli zadanie nie jest trywialne.
dmckee

2
@pimvdb: Nie martw się; to nie jest jakiś wymóg. Po prostu świadczymy sobie usługi w nadziei, że strona będzie nieco lepsza.
dmckee

2
Cóż, zamieszanie związane z ostatnią linią może być takie, że twoja definicja »mapy głębokości« jest dość rzadka. Zwykle mapa głębokości jest taka sama jak mapa wysokości, widziana z konkretnej kamery - tzn. Wskazuje rozszerzenie w kierunku punktu widzenia danej sceny (przynajmniej tak traktują ją rendery renderujące 3D). To, co masz, to w zasadzie liczba bloków znajdujących się za sobą w danym miejscu. Nie jestem jednak pewien, jak to nazwać. Anlogia może być częściowo przezroczystymi szklanymi blokami, a im więcej masz ich za sobą, tym ciemniejszy jest wynik - niezależnie od odstępu między nimi.
Joey

1
Nie martw się To jest dobre zadanie, tak jak jest teraz.
Joey

Odpowiedzi:


12

Golfscript, 42 znaki

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

wyniki

$ 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

Gratulacje.
pimvdb

@pimvdb, dziękuję, ale myślę, że powinieneś go otworzyć bez przyjmowania odpowiedzi przez pewien czas (może to być tydzień).
TY

Ponieważ zaakceptowana odpowiedź może zostać zmieniona w dowolnym momencie, gdzie jest szkoda?
Joey,

+100: 42 znaków :-)
mellamokb

Powstrzymałem się od spojrzenia na twoje rozwiązanie, dopóki nie napisałem własnego. Porównując je teraz, są raczej podobne, z tą różnicą, że oszczędzasz mnóstwo postaci []*. Niezła sztuczka.
Peter Taylor

8

Ruby 1.9, 102 znaki

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

Przechodzi wszystkie przypadki testowe.


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

Przechodzi wszystkie przypadki testowe.


7

Haskell, 118 znaków

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

  • Edytuj (122 → 118): unikaj filtrowania, wykonując tylko iterację do maksymalnej wysokości

4

Scala 236 znaków

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

Z pewnym formatowaniem:

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

Jestem pewien, że lepsze narzędzie do rozumienia oznaczałoby, że mogłem wyciąć z tego kilka postaci.


4

JavaScript, 235 208 195 bajtów

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

Dla przypomnienia, to jest kod, który wymyśliłem przed opublikowaniem pytania. (Teraz mniejsze)


3

Wersja Haskell (teraz zoptymalizowana)

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

Wersja bez golfa

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

Długie odpowiedzi na pytania [kod-golfa] są dopuszczalne, gdy długość wynika z używania nieodpowiednich języków (powiedzmy fortran 77), ale nadal oczekuje się, że spróbujesz je zagrać w golfa . Nawet zadawanie sobie trudu, aby zredukować twoje identyfikatory do jednej litery, nie wchodzi w ducha gry, co, jak podejrzewam, jest przyczyną negatywnych opinii.
dmckee

Witamy w Code Golf! Czy potrafisz oddzielić kod do gry w golfa od kodu do gry w golfa i podać liczbę znaków w poście dla kodu do gry w golfa? Dzięki! Sprawi, że twój post będzie trochę łatwiejszy do odczytania i jest to ogólny wzór, którego używamy.
mellamokb

Celem gry w golfa jest stworzenie możliwie najkrótszego kodu. Twój jest dość gadatliwy, więc spróbuj bardziej!
FUZxxl

1

Python, 117 znaków

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

Podobne do rozwiązania Ruby firmy Ventero.


0

APL (Dyalog Extended) , 14 bajtów

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

Wypróbuj 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 bajty

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

0

Japt , 12 bajtów

c rÔÆÕËè>X
w

Wypróbuj wszystkie przypadki testowe

Wyprowadzenie wierszy w odwrotnej kolejności pozwoliłoby zaoszczędzić 2 bajty , przyjęcie danych w kolejności głównej kolumny pozwoliłoby zaoszczędzić 1 bajt , a wykonanie obu pozwoliłoby (naturalnie) zaoszczędzić 3 bajty

Wyjaśnienie:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.