จัดระเบียบฮาโลวีน Candy - Hole # 4


12

ดูHole # 1ถ้าคุณสับสน

เด็กทุกคนจะทำอย่างไรหลังจากที่เขา / เธอเก็บถังขนมในวันฮาโลวีน?

จัดเรียงตามประเภทและขนาดแน่นอน1 !

ความท้าทาย

เมื่อได้รับถุงขนมที่มีรูปร่างและขนาดแตกต่างกันให้จัดเรียงขนมจากซ้ายไปขวาตาม:

  • ครั้งแรก: ปริมาณขนม (ดังนั้น 5 จากหนึ่งจะเหลืออีก 4 จาก)
  • ที่สอง (หากมีความสัมพันธ์ใด ๆ หลังจากครั้งแรก): หากจำนวนเท่ากันขนมที่มีพื้นที่ภายในมากขึ้น(ขึ้นอยู่กับจำนวนตัวอักษร) จะมีอันดับที่สูงขึ้น

หากหลังจากการเรียงลำดับที่สองยังมีการเสมอกันคุณอาจเลือกที่จะเป็นอันดับแรก

อินพุต

คุณจะได้รับขนมผ่าน stdin; เกลื่อนกลาด ดูตัวอย่างด้านล่าง

เอาท์พุต

ส่งออกขนมที่สั่งซื้อในลำดับที่ถูกต้อง หมายเหตุ, ลูกอมควรเสมอจะอยู่ในมากคอลัมน์เรียบร้อยเพื่อเอาใจปลา OCD ของคุณ2 ขนมประเภทเดียวกันควรวางโดยตรงภายใต้กัน ดูตัวอย่างด้านล่าง

"พื้นที่ภายใน" หมายความว่าอย่างไร

  • พื้นที่ภายในของขนมชิ้นหนึ่งนั้นวัดด้วยตัวอักษรทั้งหมดที่ประกอบขึ้นเป็นขนมโดยรวม

  • ช่องว่างใด ๆ ภายใน "เส้นขอบ" ถือเป็นส่วนหนึ่งของพื้นที่ขนม

  • เส้นขอบคือห่วงของอักขระที่เชื่อมต่อกันอักขระแต่ละตัวในแนวทแยงหรือถัดจากเพื่อนบ้าน

ตัวอย่างเช่น,

+--------+
|        |
|        |
|        |
|        |
+--------+

มีพื้นที่มากกว่า

XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX

แม้ว่าจะมีตัวละครน้อยกว่าโดยรวม

ตัวอย่าง

การป้อนข้อมูล:

                       _           \|            |/                                     _    
    _               lllllll        -*------------*-            -\       /-           lllllll 
 lllllll           lllllllll        |  /\  /\  / |             +|\ooooo/|+          lllllllll
lllllllll          llll+llll        | /  \/  \/  |             ||o     o||          llll+llll
llll+llll          lllllllll       -*------------*-            ||o     o||          lllllllll
lllllllll           lllllll        /|            |\            +|/ooooo\|+           lllllll 
 lllllll               |                                       -/       \-              |    
    |                  |                _                                               |    
    |   -\       /-    |             lllllll                                            |    
    |   +|\ooooo/|+    |            lllllllll                                           |    
    |   ||o     o||    |            llll+llll                                           |    
    |   ||o     o||    +            lllllllll                              rrr--rrr     +    
    +   +|/ooooo\|+                  lllllll                                rr||rr           
        -/       \-                     |                                   | || |           
                                        |                                   | || |           
                                        |                                   | || |           
                                        |                                   | || |           
                                        |            \|            |/       | || |           
                                        +            -*------------*-       | || |           
                                                      |  /\  /\  / |        | || |           
                        -\       /-                   | /  \/  \/  |        | || |           
                        +|\ooooo/|+                  -*------------*-       rr||rr           
                        ||o     o||                  /|            |\      rrr--rrr          
                        ||o     o||                                                          
                        +|/ooooo\|+                                                          
                        -/       \-                                                          

จะกลายเป็น

    _     \|            |/ -\       /- rrr--rrr
 lllllll  -*------------*- +|\ooooo/|+  rr||rr 
lllllllll  |  /\  /\  / |  ||o     o||  | || | 
llll+llll  | /  \/  \/  |  ||o     o||  | || | 
lllllllll -*------------*- +|/ooooo\|+  | || | 
 lllllll  /|            |\ -/       \-  | || | 
    |                                   | || | 
    |     \|            |/ -\       /-  | || | 
    |     -*------------*- +|\ooooo/|+  | || | 
    |      |  /\  /\  / |  ||o     o||  | || | 
    |      | /  \/  \/  |  ||o     o||  rr||rr 
    +     -*------------*- +|/ooooo\|+ rrr--rrr
          /|            |\ -/       \-         
    _                                          
 lllllll  \|            |/ -\       /-         
lllllllll -*------------*- +|\ooooo/|+         
llll+llll  |  /\  /\  / |  ||o     o||         
lllllllll  | /  \/  \/  |  ||o     o||         
 lllllll  -*------------*- +|/ooooo\|+         
    |     /|            |\ -/       \-         
    |                                          
    |                                          
    |                                          
    |                                          
    +                                          

    _                                          
 lllllll                                       
lllllllll                                      
llll+llll                                      
lllllllll                                      
 lllllll                                       
    |                                          
    |                                          
    |                                          
    |                                          
    |                                          
    +                                          

    _                                          
 lllllll                                       
lllllllll                                      
llll+llll                                      
lllllllll                                      
 lllllll                                       
    |                                          
    |                                          
    |                                          
    |                                          
    |                                          
    +                                          

ตัวอย่างที่สอง:

                   qq                                                                 \/     
                   qq                 qq      qq                                    +-----+  
                                      qq      qq         qq                       +       |  
 jjjjjjjj                                                qq         qq            |       |  
  jjjjjj             \/                                             qq      qq    |       |  
   jjjj            +-----+ <---notice that the left side is not connected   qq    +-------+  
  jj  jj         +       |       <-->       <-->                                             
 j      j        |       |                                                                   
jj  <>  jj       |       |       <-->                                 qq            jjjjjjjj 
 jj    jj        +-------+                                            qq             jjjjjj  
   jjjj                                 qq           qq                               jjjj   
                                        qq           qq                              jj  jj  
                                                                                    j      j 
                      +---------------------------------------------------------+  jj  <>  jj
      ooooo           +---------------------------------------------------------+   jj    jj 
     o     yyyyyy                                                                     jjjj   
     o           ww - notice diagonal border, allowed                                        
     o           ww                                                 jjjjjjjj                 
     o     yyyyyy          ooooo                ooooo                jjjjjj                  
      ooooo               o     yyyyyy         o     yyyyyy           jjjj                   
                          o           ww       o           ww        jj  jj                  
                          o           ww       o           ww       j      j                 
                          o     yyyyyy         o     yyyyyy        jj  <>  jj                
                           ooooo                ooooo               jj    jj                 
                                                                      jjjj                   

วิธีการแก้:

qq  ooooo          jjjjjjjj  <-->     \/    +---------------------------------------------------------+
qq o     yyyyyy     jjjjjj          +-----+ +---------------------------------------------------------+
   o           ww    jjjj    <--> +       |                                                            
qq o           ww   jj  jj        |       |                                                            
qq o     yyyyyy    j      j  <--> |       |                                                            
    ooooo         jj  <>  jj      +-------+                                                            
qq                 jj    jj                                                                            
qq  ooooo            jjjj             \/                                                               
   o     yyyyyy                     +-----+                                                            
qq o           ww  jjjjjjjj       +       |                                                            
qq o           ww   jjjjjj        |       |                                                            
   o     yyyyyy      jjjj         |       |                                                            
qq  ooooo           jj  jj        +-------+                                                            
qq                 j      j                                                                            
    ooooo         jj  <>  jj                                                                           
qq o     yyyyyy    jj    jj                                                                            
qq o           ww    jjjj                                                                              
   o           ww                                                                                      
qq o     yyyyyy    jjjjjjjj                                                                            
qq  ooooo           jjjjjj                                                                             
                     jjjj                                                                              
qq                  jj  jj                                                                             
qq                 j      j                                                                            
                  jj  <>  jj                                                                           
qq                 jj    jj                                                                            
qq                   jjjj                                                                              

โปรดทราบว่าคอลัมน์มีระยะห่างระหว่างกัน 1 อักขระและจัดเรียงตามแนวนอนที่ด้านบน นอกจากนี้โปรดทราบว่าขนมแต่ละอันอยู่ในคอลัมน์ที่ถูกต้องแต่ละขนมที่มีระยะห่างระหว่างกัน 1 ตัว

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟโปรแกรมที่สั้นที่สุด (เป็นไบต์) จึงชนะ

1คุณจะทำอะไรอีก เห็นได้ชัดว่าคุณต้องการแสดงพลังและพลังอันยอดเยี่ยมในปริมาณขนมที่คุณเก็บใช่ไหม?

2ฉันรู้ว่าคุณกำลังคิดอะไร! ปลาต้องมองผ่านชามโค้งที่ขนมของคุณดังนั้นมันจะผิดเพี้ยนต่อไป! ปลาของฉันมีชีวิตอยู่ (ก่อนที่มันจะตาย) ในพิพิธภัณฑ์สัตว์น้ำรูปสี่เหลี่ยมผืนผ้า


เนื่องจากด้านซ้ายไม่ได้เชื่อมต่อพื้นที่จึงมีเฉพาะความหนาของเส้นรอบวงเขต X
เครื่องมือเพิ่มประสิทธิภาพ

@ ออพติไมเซอร์ใช่ แต่อาจมีความหนาของเส้นขอบระหว่างขนม ตัวอย่างข้างต้นมีพื้นที่ 24
ยืด Maniac

คำตอบ:


7

Ruby, 928 ตัวอักษร

เอาล่ะอันนี้สนุกมาก!

w=[];b=' ';u=$<.read.split'
';k=->l,z,t,p{loop{y=!!1;z.each{|c|t.each{|o|v=[c[0]+o[0],c[1]+o[1]]
y=!(z+=[v])if v[0]>=0&&v[1]>=0&&v[0]<l.size&&v[1]<l[0].size&&p[l[v[0]][v[1]]]&&!z.index(v)}}
break if y};z};(y=y;z=k[u,[[u.index{|p|y=p.index /\S/},y]],([-1,0,1].product([-1,0,1])-[0,0]),->x{x!=b}]
n=z.min_by{|c|c[0]}[0];m=z.min_by{|c|c[1]}[1];q=Array.new(z.max_by{|c|c[0]}[0]-n+1){b*(z.max_by{|c|c[1]}[1]-m+1)}
z.each{|c|q[c[0]-n][c[1]-m]=u[c[0]][c[1]];u[c[0]][c[1]]=b};w+=[q])while u*''=~/\S/;o=Hash.new 0;w.each{|c|o[c]+=1}
p=->q{e=k[q,((0...q.size).flat_map{|x|[[x,0],[x,q[0].size-1]]}+(1...q[0].size-1).flat_map{|y|[[0,y],[q.size-1,y]]}).select{|c|q[c[0]][c[1]]==b},[[0,1],[0,-1],[1,0],[-1,0]],->x{x==b}]
(q.size*q[0].size)-e.size};r=o.sort_by{|k,v|v+(p[k]/1e3)}.reverse.map{|k,v|(k+[b*k[0].size])*v}
r.map!{|k|k+([b*k[0].size]*(r.max_by(&:size).size-k.size))};puts ([b]*r.max_by(&:size).size).zip(*r).map{|r|r.join(b)[2..-1]}

คุณสามารถให้อินพุตกับ STDIN หรือคุณสามารถส่งไฟล์อินพุตเป็นอาร์กิวเมนต์ (เช่นruby organize.rb candy.txt) และมันจะถือว่าไฟล์เป็น STDIN โดยอัตโนมัติ

อัฒภาคทั้งหมดสามารถถูกแทนที่ด้วยบรรทัดใหม่ ฉันติดกาวบางเส้นเข้าด้วยกันเพื่อลดพื้นที่แนวตั้ง

Ungolfed (2367 ตัวอักษร):

#!/usr/bin/ruby
input = $<.read.split("\n")
candies = []

# utility method
flood = -> arr, coords, offsets, cond {
    loop {
        changed = false
        coords.each{|c|
            offsets.each{|o|
                nc = [c[0]+o[0], c[1]+o[1]]
                if nc[0] >= 0 && nc[1] >= 0 && nc[0] < arr.length && nc[1] < arr[0].length &&
                    cond[arr[nc[0]][nc[1]]] && !coords.index(nc)
                    coords.push nc
                    changed = true
                end
            }
        }
        break if !changed
    }
    coords
}

# while there are non-whitespace characters in the pile
while input.join =~ /\S/
    # get coordinates of the first character to flood-fill on
    y = nil
    x = input.index{|row| y = row.index /\S/ }

    # flood-fill on that character
    coords = flood[input, [[x, y]], ([-1,0,1].product([-1,0,1]) - [0, 0]), ->x{x != ' '}]

    # x = max, n = min
    xx = coords.max_by{|c| c[0] }[0]
    nx = coords.min_by{|c| c[0] }[0]
    xy = coords.max_by{|c| c[1] }[1]
    ny = coords.min_by{|c| c[1] }[1]

    # create a properly sized thingy for this one candy
    candy = Array.new(xx - nx + 1) {
        ' ' * (xy - ny + 1)
    }

    # fill the thingy, while also removing it from the pile
    coords.each{|c|
        candy[c[0] - nx][c[1] - ny] = input[c[0]][c[1]]
        input[c[0]][c[1]] = ' '
    }

    candies.push candy
end

# group by same candies
candytypes = Hash.new 0
candies.each{|c| candytypes[c] += 1 }

area = -> candy {
    # we want to eliminate surrounding spaces
    # so flood-fill all spaces that touch the edges
    surround = (0...candy.length).flat_map{|x| [[x, 0], [x, candy[0].length-1]] } +
        (1...candy[0].length-1).flat_map{|y| [[0, y], [candy.length-1, y]] }
    surround.select! {|c| candy[c[0]][c[1]] == ' ' }
    surround = flood[candy, surround, [[0,1],[0,-1],[1,0],[-1,0]], ->x{x == ' '}]

    # now just subtract amount of surrounding spaces from total amount of chars
    (candy.length * candy[0].length) - surround.length
}
columns = candytypes.sort_by {|k, v|
    # this is a pretty ugly hack
    v + (area[k] / 1000.0)
}.reverse.map{|k, v| (k + [' ' * k[0].length]) * v }
columns.map!{|k| k + ([' ' * k[0].length] * (columns.max_by(&:length).length - k.length)) }

puts ([' '] * columns.max_by(&:length).length).zip(*columns).map{|r| r.join(' ')[2..-1] }

3
ในที่สุดคำตอบนี้! เป็นงานที่ดี;)
Martin Ender
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.