• Source
    1. while gets
    2. group=[]
    3. $_.gsub(/[\d,]+/){|tok|group<<tok}
    4. gcount=group.shift.to_i
    5.  
    6. hline={0=>[[0,0]]}
    7. vline={}
    8. while group.size>0
    9. up=hline.keys.min
    10. endp=-1
    11. hline.delete(up).sort_by{|e|e[0]}.each do |t|
    12. left,width=t
    13. if left==endp
    14. endp=left+width
    15. else
    16. endp=left+width
    17. group.shift.split(?,).each do |s|
    18. s=s.to_i
    19. (hline[up+s]||=[])<<[left,s]
    20. (vline[left]||=[])<<[up+s,s]
    21. left+=s
    22. end
    23. end
    24. end
    25. end
    26. ans=[]
    27. vline.keys.sort.each do |left|
    28. endp=-1
    29. vline[left].sort_by{|e|-e[0]}.each do |t|
    30. down,s=t
    31. if down!=endp
    32. break if gcount==0
    33. gcount-=1
    34. end
    35. ans<<s if gcount==0
    36. endp=down-s
    37. end
    38. break if gcount==0
    39. end
    40. puts "(#{ans*?,})"
    41. end