Le muffe di melma possono contare!


10

sfondo

Gli stampi di melma sono fantastici. Se li metti su una superficie con fonti di cibo, essi diffonderanno i loro viticci per trovare il cibo, dopo di che formeranno una rete di connessioni tra le fonti. In questa sfida, dovrai simulare uno stampo di melma in cerca di cibo. Inoltre, questo particolare stampo si fermerà una volta trovato abbastanza.

Ingresso

I tuoi input devono essere un elenco Ldi coordinate intere 2D nel formato nativo della tua lingua e un numero intero non negativo N. L'elenco Lè garantito per essere privo di duplicati, ma potrebbe non essere ordinato. L'input Nè compreso tra 0 e la lunghezza di L, incluso.

L'elenco Lrappresenta un insieme di coordinate per le fonti alimentari. Ad esempio, l'elenco

[(0,0),(2,-1),(3,1),(0,4),(5,5)]

potrebbe essere interpretato visivamente come

     o
o


   o
o
  o

Produzione

L'output è un altro elenco Kdi coordinate intere 2D senza duplicati nello stesso formato dell'input. Rappresenta la rete formata dallo stampo di melma e deve soddisfare le seguenti condizioni:

  • L'intersezione di Le Kha dimensioni esatte N.
  • L'insieme Kè collegato come sottoinsieme della griglia intera (tramite adiacenze ortogonali o diagonali).
  • Se Kviene rimossa qualsiasi coordinata di , non soddisfa più le prime due condizioni.

Si noti che se N = 0, l'output deve essere un elenco vuoto.

Un esempio di output accettabile per l'elenco sopra Le N = 4sarebbe

[(0,0),(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(3,3),(3,2),(3,1),(3,5),(4,5),(5,5)]

che può essere visualizzato come

   xxO
Oxx
x  x
x  x
x  O
O
  o

dove ognuno Orappresenta una coordinata in entrambi Le K, e ciascuno xrappresenta una coordinata in Kma non in L. Sono accettabili anche altri output e i "viticci" non devono essere i più brevi possibili. Ad esempio, questa è anche una soluzione accettabile:

   xxOxx
Oxx     x
  x    x
 x    x
x  o x
O   x
  Ox 

Regole

Sia l'input che l'output devono essere elenchi, non set o altri tipi di dati. Le coordinate stesse possono essere liste o tuple. È possibile modificare l'ordine dei due ingressi se necessario.

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi test

Il tuo programma dovrebbe funzionare su questi elenchi per tutti i valori applicabili di N.

[]
[(2,3)]
[(0,0),(1,0),(0,1),(1,1)]
[(0,0),(2,-1),(3,1),(0,4),(5,5)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3)]
[(0,0),(1,0),(2,0),(3,0),(0,3),(1,3),(2,3),(3,3),(0,1),(0,2),(3,1),(3,2),(8,1),(8,2),(-5,1),(-5,2)]
[(0,0),(20,0),(15,15),(-10,4),(-10,3),(0,-5),(7,6),(7,7),(8,8),(9,8),(10,-2),(-1,12),(-3,10)]
[(0,0),(1,0),(2,0),(3,0),(5,0),(6,0),(7,0),(0,9),(1,9),(2,9),(3,8),(4,9),(5,10),(6,10),(7,9),(3,3),(4,4),(5,5)]

visualizzati:

===
o
===
oo
oo
===
     o
o     


   o  
o     
  o   
===
oooo


oooo
===
     oooo     
o    o  o    o
o    o  o    o
     oooo     
===
                         o     


         o                     

       o                       

                  oo           
                 o             
                 o             

o                              
o                              


          o                   o

                    o          


          o                    
===
     oo 
ooo o  o
   o    


     o  
    o   
   o    


oooo ooo

Risposte:


3

CJam, 77 95 byte

Penso che questo possa essere giocato un po 'di più, ma ecco qui:

q~$<_{{:X;]{[X\]z::-~mhW*}$~:Y{_)Y1{_@=X@=}:B~-g-{+__X=!\}:C~1B=!&}g{_(Y0B-g-\C0B=!&}g}*]_&}L?p

L'input va come N <Array of coordinate array>. Per esempio:

4 [[0 0] [1 5] [2 1] [0 3] [5 0] [5 5]]

Produzione:

[[0 5] [1 5] [0 4] [0 3] [0 0] [0 2] [0 1] [1 1] [2 1]]

Algoritmo :

L'algoritmo è piuttosto semplice e va come:

  • Ordina l'array di coordinate di input. Questo rende le coordinate ordinate prima per riga e poi per colonna.
  • Ora selezioniamo i primi Npunti
  • Ora riduciamo su questi Npunti. La destinazione è l'ultimo punto e la fonte è il punto di chiusura a quell'ultimo punto.
  • Quindi iniziamo con il punto più in alto a sinistra, camminiamo a destra (o a sinistra) fino alla sua accensione o direttamente sopra il punto successivo.
  • Quindi scendiamo per raggiungere il punto successivo.
  • È garantito che non rimarrà alcun punto scoperto al punto precedente nella stessa riga. Questo assicura che non tocchiamo nessun altro punto che il prescelto N. La scelta del punto di chiusura garantisce anche che la seconda regola sia mantenuta vera.

Provalo online qui

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.