Organizza Halloween Candy - Hole # 4


12

Vedi Hole # 1 se sei confuso.

Cosa fa ogni bambino dopo aver raccolto secchi di caramelle durante Halloween?

Ordina per tipo e dimensione, ovviamente 1 !

La sfida

Dato un sacchetto di caramelle scaricato di varie forme e dimensioni, ordina le caramelle da sinistra a destra in base a:

  • Primo: la quantità di caramelle (quindi 5 di una sarà lasciata più di 4 di un'altra)
  • Secondo (se ci sono legami dopo il primo): se l'importo è lo stesso, le caramelle con più area interna (in base al numero di personaggi) si posizioneranno più in alto.

Se dopo il secondo ordinamento c'è ancora un pareggio, allora puoi scegliere di essere il primo.

Ingresso

Ti verranno date le caramelle attraverso lo stdin; sparsi. Vedi esempi di seguito.

Produzione

Invia le caramelle ordinate nell'ordine corretto. Nota, le caramelle dovrebbero sempre essere posizionate in colonne molto pulite per placare il tuo pesce OCD 2 . Le caramelle dello stesso tipo dovrebbero essere posizionate direttamente l'una sotto l'altra. Vedi esempi di seguito.

Cosa intendi per "area interna"?

  • L'area interna di un pezzo di caramella è misurata dai personaggi totali che compongono la caramella nel suo insieme.

  • Qualsiasi spazio bianco all'interno di un "bordo" è considerato parte dell'area delle caramelle.

  • Un bordo è un qualsiasi ciclo di caratteri collegato, ogni personaggio in diagonale o vicino al suo vicino.

Per esempio,

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

ha più area di

XXXXXXXX
XXXXXXXX
XXXXXXXX
XXXXXXXX

anche se nel complesso ha meno personaggi.

Esempi

ingresso:

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

Potrebbe diventare

    _     \|            |/ -\       /- 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 secondo esempio:

                   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                   

Soluzione:

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                                                                              

Nota che le colonne hanno 1 carattere di spaziatura tra loro e sono allineate orizzontalmente in alto. Si noti inoltre che ogni caramella è in colonne esatte, ogni caramella con 1 carattere di spaziatura tra.

punteggio

Questo è code-golf, quindi vince il programma più breve (in byte).

1 Cos'altro faresti? Ovviamente vuoi mostrare la tua straordinaria potenza e potenza nella quantità di caramelle che hai raccolto, giusto?

2 So cosa stai pensando! Un pesce deve guardare attraverso una ciotola curva le tue caramelle, quindi sarebbe comunque distorto! Bene, il mio pesce viveva (prima che morisse) in un acquario rettangolare .


Poiché il lato sinistro non è collegato, l'area è solo la circonferenza X dello spessore limite?
Ottimizzatore

@Optimizer sì, anche se potrebbe esserci una variazione nello spessore del bordo attraverso un pezzo di caramella. L'esempio sopra ha l'area 24.
Stretch Maniac

Risposte:


7

Rubino, 928 caratteri

Accidenti, questo è stato divertente!

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

È possibile fornire l'input su STDIN oppure passare un file di input come argomento (come ruby organize.rb candy.txt) e il file verrà trattato automaticamente come STDIN.

Tutti i punti e virgola possono essere sostituiti con nuove righe; Ho appena incollato alcune linee per ridurre lo spazio verticale.

Ungolfed (2367 caratteri):

#!/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
Finalmente una risposta a questa! Bel lavoro;)
Martin Ender il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.