การสลับความสูงแผนที่ไปเป็นแผนที่ลึก


30

ลักษณะ

งานของคุณคือการส่งออก 'ความลึก' - นั่นคือความสูงของวัตถุ แต่ไม่เห็นจากด้านบน แต่จากด้านหน้าของมัน

ตัวอย่างเช่นพิจารณาวัตถุต่อไปนี้ตามที่แสดงในภาพ แผนที่ความสูงจะปรากฏขึ้นทางด้านซ้าย แผนที่ความลึกที่สอดคล้องกันจะเป็น (เท่าที่เห็นจากการยืนที่ลูกศร):

010
211   <- Depthmap
322

หากคุณยืนที่ลูกศรจะมี 3 ลูกบาศก์อยู่ด้านหลังกันที่จุดซ้ายมือด้านล่าง 2 หลังซึ่งกันและกันที่ตรงกลางซ้ายมือ 0 ที่จุดซ้ายมือด้านบนเป็นต้น

ตัวอย่าง

อินพุต

อินพุตเป็นอาร์เรย์สองมิติของขนาดใด ๆ (ไม่จำเป็นต้องเป็นสี่เหลี่ยมจัตุรัส)

เอาท์พุต

เอาท์พุทเป็นอีกอาร์เรย์สองมิติซึ่งแสดงถึงความลึก (height x width)ในขณะที่คุณสามารถอนุมานขนาดของมัน (3 x 3)ในภาพก็จะเป็น โปรดทราบว่าถ้าหอสูงที่สุดของก้อนเป็น 5 depthmap (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
@pvdvdb: ปริศนาที่ดี เราสนับสนุนให้ผู้คนค้นหาคำแนะนำเกี่ยวกับปริศนา Lab LabหรือMeta SandBoxก่อนโพสต์ ด้วยวิธีนี้ปัญหาประเภทนี้สามารถถูกรีดออกก่อนที่ปริศนาของคุณจะปรากฏ เราทุกคนมีปัญหาในการผลิตสเปคที่สมบูรณ์แบบโดยเฉพาะอย่างยิ่งถ้างานนั้นไม่สำคัญ
dmckee

2
@pvdvdb: อย่ากังวล มันไม่ใช่ความต้องการบางอย่าง เพียงแค่บริการที่เราจัดเตรียมไว้ให้ซึ่งกันและกันโดยหวังว่าจะทำให้เว็บไซต์ดีขึ้นเล็กน้อย
dmckee

2
ความสับสนเกี่ยวกับบรรทัดสุดท้ายอาจเป็นไปได้ว่านิยามของแผนที่ความลึกของคุณนั้นเป็นเรื่องแปลก โดยทั่วไปแผนที่ความลึกจะเหมือนกับแผนที่ความสูงที่เห็นจากกล้องเฉพาะ - กล่าวคือเป็นการขยายส่วนต่อไปยังจุดชมวิวของฉากที่กำหนด สิ่งที่คุณมีก็คือจำนวนบล็อกที่อยู่ติดกันในที่ที่กำหนด ไม่แน่ใจว่าจะเรียกมันอย่างไร อาจทำให้เกิดการอุดตันของแก้วได้บางส่วนและยิ่งคุณมีสิ่งเหล่านี้มากเท่าไหร่ก็ยิ่งส่งผลให้เกิดความมืดมากขึ้นโดยไม่คำนึงถึงช่องว่างระหว่างกัน
Joey

1
ไม่ต้องกังวล มันเป็นงานที่ดีเหมือนตอนนี้
Joey

คำตอบ:


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

@pvdvdb ขอบคุณ แต่ฉันคิดว่าคุณควรเปิดโดยไม่ยอมรับคำตอบใด ๆ ในบางครั้ง (อาจเป็นหนึ่งสัปดาห์)
คุณ

เนื่องจากคำตอบที่ยอมรับสามารถเปลี่ยนแปลงได้ตลอดเวลาอีกครั้งอันตรายอยู่ที่ไหน
Joey

+100: 42 ตัวอักษร :-)
mellamokb

ฉันไม่ดูวิธีแก้ปัญหาของคุณจนกว่าฉันจะเขียนเอง []*เปรียบเทียบพวกเขาตอนนี้พวกเขากำลังค่อนข้างคล้ายกันยกเว้นว่าคุณบันทึกตันของตัวละครด้วย เคล็ดลับดี
Peter Taylor

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

ผ่านการทดสอบทั้งหมด


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

คำตอบยาวไปที่ [รหัสกอล์ฟ] คำถามเป็นที่ยอมรับเมื่อระยะเวลาที่เกิดขึ้นจากการใช้ภาษาที่ไม่เหมาะสม (พูด Fortran 77) แต่คุณคาดว่าจะยังคงที่จะทำให้ความพยายามต่อไปยังกอล์ฟพวกเขา การไม่แม้แต่จะลดตัวระบุของคุณให้เหลือเพียงตัวอักษรเดียวก็ไม่สามารถเข้าถึงจิตวิญญาณของเกมได้ซึ่งฉันสงสัยว่าเป็นสาเหตุของการลงคะแนน
dmckee

ยินดีต้อนรับสู่โค้ดกอล์ฟ! คุณสามารถแยกรหัส golfed ออกจากรหัส ungolfed ของคุณและใส่จำนวนตัวอักษรในโพสต์ของคุณสำหรับรหัส golfed ของคุณได้ไหม ขอบคุณ! มันจะทำให้การโพสต์ของคุณอ่านง่ายขึ้นเล็กน้อยและเป็นรูปแบบทั่วไปที่เราใช้
mellamokb

เป้าหมายของการเขียนโค้ดคือการสร้างรหัสที่สั้นที่สุด ของคุณค่อนข้างละเอียดโปรดลองให้มากขึ้น!
FUZxxl

1

Python 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 ของ Ventero


0

APL (ขยาย Dyalog)ขนาด 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

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.