Замена карт высот на карты глубин

30

Описание

Ваша задача - вывести «карту глубины», то есть карту высот объекта, который виден не сверху, а спереди.

Например, рассмотрим следующий объект, как показано на рисунке. Карта высот показана слева. Соответствующая карта глубины будет (как видно из стоящей у стрелки):

010
211   <- Depthmap
322

Если вы стоите у стрелки, в нижней левой точке есть 3 кубика друг за другом, 2 в средней левой точке, 2 друг за другом, 0 в левой верхней точке и т. Д.

пример

вход

Ввод - это двумерный массив любых размеров (не обязательно квадратный).

Выход

Выход - еще один двумерный массив, который представляет карту глубины. Как вы можете сделать вывод, его размеры (height x width). На картинке это было бы (3 x 3). Обратите внимание, что если бы самая высокая башня кубов была 5, карта глубины была бы массивом (5 x 3).

Выигрышное условие

Самый короткий код выигрывает.

Disallowed

Все языки допускаются, без явных ограничений. (Я не знаю, что вы можете придумать, но играйте честно, пожалуйста.)

Примеры

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
источник
Можете ли вы предоставить пример ввода / вывода для примера изображения, которое вы разместили?
mellamokb
4
@pimvdb: хорошая головоломка. Мы рекомендуем людям проконсультироваться по поводу загадки Puzzle Lab или 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, спасибо, но я думаю, что вы должны открыть его, не принимая никакого ответа в течение некоторого времени (может быть, одна неделя).
ВЫ
Так как принятый ответ может быть изменен в любое время, где вред?
Джои
+100: 42
персонажа
Я воздерживался от рассмотрения вашего решения, пока не напишу свое собственное. Сравнивая их сейчас, они довольно похожи, за исключением того, что вы сохраняете массу символов с помощью []*. Хороший трюк.
Питер Тейлор
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}}*""}

Проходит все тестовые случаи.

Ventero
источник
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

Хаскель, 118 персонажей

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

  • Редактировать (122 → 118): избегать фильтрации, выполняя только итерации до максимальной высоты
MtnViewMark
источник
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
    }
}

Я уверен, что лучшее средство для понимания означало бы, что я мог бы вырезать некоторые символы из этого.

Gareth
источник
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")}

Просто для протокола, это код, который я составил до публикации вопроса. (Смалленда сейчас)

pimvdb
источник
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] приемлемы, когда длина исходит от использования неподходящих языков (скажем, фортран 77), но вы все равно должны попытаться поиграть в них. Даже не пытаясь свести ваши идентификаторы к одной букве, не удается проникнуть в дух игры, который, как я подозреваю, является причиной отрицательных голосов.
dmckee
Добро пожаловать в код гольф! Можете ли вы отделить свой код для игры в гольф от своего кода для игры в гольф и указать количество символов в своем сообщении для своего кода для игры в гольф, пожалуйста? Благодарность! Это сделает ваш пост немного легче для чтения и является общим шаблоном, который мы используем.
mellamokb
Цель Code Golf - создать максимально короткий код. У тебя довольно многословно, так что старайся!
FUZxxl
1

Питон, 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.

hallvabo
источник
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.
lirtosiast
источник
0

Clojure, 102 байта

#(for[h(range(apply max(flatten %))0 -1)](map(fn[w _](count(for[r % :when(>=(r w)h)]_)))(range)(% 0)))
NikoNyrh
источник
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
Камил Дракари
источник