Поміняння мап висоти на мапу глибини


30

Опис

Ваше завдання - вивести "карту глибини" - мапу висоти об'єкта, але видно не зверху, а спереду.

Наприклад, розгляньте наступний об’єкт, як показано на зображенні. Карта висоти показана зліва. Відповідна карта глибини була б (як видно з стояння біля стрілки):

010
211   <- Depthmap
322

Якщо ви стоїте біля стрілки, то в нижній лівій точці є 3 кубика один за одним, 2 позаду один одного в середній лівій точці, 0 у верхній лівій точці тощо.

приклад

Вхідні дані

Вхід - це двовимірний масив будь-яких розмірів (не обов'язково квадратний).

Вихідні дані

Вихід - ще один двовимірний масив, який представляє мапу глибини. Як можна зробити висновок, його розміри є (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 напівкоксу або Meta SandBox до публікації. Таким чином, подібні питання можна випрасувати, перш ніж ваша головоломка буде реалізована. У всіх нас виникають проблеми із створенням досконалих специфікацій, особливо якщо завдання нетривіальне.
dmckee

2
@pimvdb: Не хвилюйся; це не якась вимога. Просто послуга, яку ми надаємо один одному, сподіваючись зробити сайт трохи кращим.
dmckee

2
Що ж, плутанина щодо останнього рядка може полягати в тому, що ваше визначення "карти глибини", мабуть, є рідкісним. Зазвичай карта глибини така ж, як і карта висоти, щойно видно з конкретної камери, тобто вона говорить про розширення до точки огляду певної сцени (принаймні, так поводиться з цим 3D-рендері). У вас є, по суті, кількість блоків одна за одною в даному місці. Не знаю, як це назвати. Анологія може частково перекривати скляні блоки, і чим більше їх будете один за одним, тим темнішим буде результат - незалежно від місця між ними.
Joey

1
Не хвилюйся. Це прекрасне завдання, як зараз.
Joey

Відповіді:


12

Гольфскрипт, 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, дякую, але я думаю, ви повинні відкрити його, не приймаючи жодної відповіді на деякий час (може бути один тиждень).
ВИ

Оскільки прийняту відповідь можна будь-коли змінити, де шкода?
Joey

+100: 42 символів :-)
mellamokb

Я утримався від перегляду вашого рішення, поки не написав своє. Порівнюючи їх зараз, вони досить схожі, за винятком того, що ви зберігаєте тону символів із []*. Гарний трюк.
Пітер Тейлор

8

Рубін 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

Скала 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), але ви все ще очікуєте зробити спробу пограти в них. Навіть не намагаючись звести свої ідентифікатори до однієї літери, не вдасться вникнути в дух гри, що, як я підозрюю, є причиною скоромовки.
dmckee

Ласкаво просимо до коду гольфу! Чи можете ви відокремити код для гольфу від коду, який не використовується для гольфу, і, будь-ласка, покласти у своєму дописі кількість символів для коду для гольфу? Спасибі! Це зробить вашу публікацію трохи простішою для читання і є загальною схемою, яку ми використовуємо.
mellamokb

Мета коду гольфу - створити найкоротший можливий код. Ваш швидше багатослівний, тому постарайтеся більше!
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

Схожий на рішення Ruby 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.