Organizar Halloween Candy - Hoyo # 4

12

Vea el hoyo # 1 si está confundido.

¿Qué hace cada niño después de recolectar cubos de dulces durante Halloween?

¡Ordénelo por tipo y tamaño, por supuesto 1 !

El reto

Dada una bolsa de dulces desechada de diferentes formas y tamaños, clasifique los dulces de izquierda a derecha en función de:

  • Primero: la cantidad de dulces (entonces quedan 5 de uno más que 4 de otro)
  • Segundo (si hay algún empate después del primero): si la cantidad es la misma, el dulce con más área interna (según el número de caracteres) tendrá una clasificación más alta.

Si después del segundo orden todavía hay un empate, entonces puedes elegir ser primero.

Entrada

Se le dará el dulce a través de stdin; esparcidos por Ver ejemplos a continuación.

Salida

Salida de los dulces ordenados en el orden correcto. Tenga en cuenta que los dulces siempre deben colocarse en columnas muy ordenadas para apaciguar a su pez OCD 2 . Los dulces del mismo tipo deben colocarse directamente uno debajo del otro. Ver ejemplos a continuación.

¿Qué quieres decir con "área interior"?

  • El área interior de un dulce se mide por el total de caracteres que componen el dulce en su conjunto.

  • Cualquier espacio en blanco dentro de un "borde" se considera parte del área del dulce.

  • Un borde es cualquier bucle de caracteres conectado, cada carácter diagonal o al lado de su vecino.

Por ejemplo,

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

tiene más área que

XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX

aunque tiene menos caracteres en general.

Ejemplos

entrada:

                       _           \|            |/                                     _    
    _               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\|+                                                          
                        -/       \-                                                          

Se convertiría

    _     \|            |/ -\       /- 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                                       
    |                                          
    |                                          
    |                                          
    |                                          
    |                                          
    +                                          

Un segundo ejemplo:

                   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                   

Solución:

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                                                                              

Tenga en cuenta que las columnas tienen 1 carácter de espacio entre ellas y están alineadas horizontalmente en la parte superior. También tenga en cuenta que cada dulce está en una columna exacta, cada dulce con 1 carácter de espacio entre ellos.

Puntuación

Este es el código de golf, por lo que gana el programa más corto (en bytes).

1 ¿Qué más harías? Obviamente, quieres mostrar tu increíble poder y poder en la cantidad de dulces que recolectaste, ¿verdad?

2 ¡Sé lo que estás pensando! Un pez tiene que mirar a través de un tazón curvo hacia su dulce, por lo que, de todos modos, ¡se distorsionará! Bueno, mi pez vivía (antes de morir) en un acuario rectangular .

Estiramiento Maniaco
fuente
Dado que el lado izquierdo no está conectado, ¿el área es solo el grosor límite X circunferencia?
Optimizador
@Optimizer sí, aunque puede haber variación en el grosor del borde a través de un caramelo. El ejemplo anterior tiene área 24.
Stretch Maniac

Respuestas:

7

Rubí, 928 caracteres.

¡Vaya, este fue divertido!

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]}

Puede dar la entrada en STDIN, o puede pasar un archivo de entrada como argumento (como ruby organize.rb candy.txt) y tratará el archivo como STDIN automáticamente.

Todos los puntos y comas se pueden reemplazar con líneas nuevas; Acabo de pegar algunas líneas para reducir el espacio vertical.

Sin golf (2367 caracteres):

#!/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] }
Pomo de la puerta
fuente
3
Finalmente una respuesta a esto! Buen trabajo;)
Martin Ender