Cerco disperatamente Babbo Natale


13

Trova Babbo Natale e le sue renne in una scena affollata.

Ingresso

L'input sarà su STDIN e sarà un numero variabile di righe di caratteri di uguale, ma variabile, lunghezza. Se Babbo Natale (rappresentato dal personaggio S) è nella scena, il suo sacco di regali (rappresentato dal personaggio P) sarà in una delle posizioni adiacenti a lui (orizzontalmente, verticalmente o diagonalmente). Le sue renne (ognuna rappresentata dal personaggio R) saranno tutte all'interno del quadrato 5x5 che lo circonda. Se Snella scena appare un personaggio che non ha un sacco di regali o che non è accompagnato da almeno 4 renne, allora non è Babbo Natale.

Produzione

La scena è stata ripulita da ogni offuscamento (tutti i personaggi non-Babbo Natale, non-regali, non-renne sostituiti con uno spazio), mostrando Babbo Natale, il suo sacco di regali e le sue renne - tutti gli altri personaggi dovrebbero essere sostituiti con spazi. Se Babbo Natale e le sue renne non sono nella scena, riproducili invariati. È garantito che ci sarà una sola soluzione, quindi non ci sarà mai più di un Babbo Natale valido e non porterà mai più di un sacco di regali.

Esempi

In questi esempi sto solo usando il *carattere per rendere più facile per vedere i S, Pe Rpersonaggi, ma il programma dovrebbe essere in grado di gestire qualsiasi carattere ASCII da !a `(33 a 96). Ho lasciato fuori i caratteri minuscoli e sopra per evitare confusione.

Ingresso:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Output: (ignora i punti, sono per forzare la pagina a mostrare le righe vuote)

.           
.          
.           
     R     
      P    
     S     
     R     
    R  R   
.           
.           
.           
.           

Input: (non abbastanza renne)

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Produzione:

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Input: (nessun sacco di regali)

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Produzione:

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Input: (presenta non abbastanza vicino)

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

Produzione:

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

Input: (una delle renne non all'interno del quadrato 5x5 attorno a Babbo Natale)

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

Produzione:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

Script di test

Come in alcune delle mie precedenti domande, ho nuovamente macellato alcuni script di test originariamente creati da Joey e Ventero per fornire alcuni casi di test per questa domanda:

Uso: ./test [your program and its arguments]

Versione in testo normale dei test di riferimento: testo normale

Rewards

Ogni voce che posso verificare che soddisfa le specifiche, supera i test e ha ovviamente avuto qualche tentativo di giocare a golf riceverà un mio voto (quindi per favore fornisci le istruzioni per l'uso con la tua risposta). La soluzione più breve entro la fine del 31/12/2013 sarà accettata come vincitrice.


Mi rendo conto che è simile alla mia domanda precedente Riconoscimento facciale , ma sono passati un paio d'anni da allora. Inoltre, mi scuso per aver saltato la Sandbox delle domande, ma essendo relativo a Natale, doveva essere pubblicato rapidamente o non sarebbe pertinente.
Gareth,

L'output del primo esempio non viene visualizzato correttamente (sembra avere dimensioni inferiori).
Dennis Jaheruddin,

@DennisJaheruddin Sembra che Markdown stia rimuovendo tutte le righe vuote. Ho aggiunto punti all'inizio di quelle linee per mostrare che sono lì. Mi dispiace per la confusione.
Gareth,

Risposte:


2

MATLAB: 110 , 95 caratteri

f=@(x,y) filter2(ones(x),y);a=M==83;b=M==82;c=M==80;d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);if ~d,M,else,M(~d)=32,end

Non sono sicuro del modo in cui l'input dovrebbe essere elaborato, ma il resto è piuttosto semplice.

Versione normalmente formattata:

f=@(x,y) filter2(ones(x),y);
a=M==83;
b=M==82;
c=M==80;
d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);
if ~d
  M
else
  M(~d)=32
end

Esempio di input:

M=['***********'
'***********'
'***********'
'*****R*****'
'******P****'
'*****SQL_2*'
'*****R*****'
'****R**R***'
'***********'
'***********'
'***********'
'***********'];

Hmmm, eseguire gli script di test su questo sarà imbarazzante. Una rapida occhiata al codice suggerisce che stai usando solo gli esempi sopra riportati che usano i *caratteri come folla per rendere più semplice la visualizzazione dei caratteri e S, mentre i test nello script di test usano tutti i caratteri ASCII da 33 ( ) in su a (e incluso) 96 (`` `). Lo chiarirò nella domanda. Ho fatto una versione in testo semplice dei test che devi superare, che aggiungerò anche alla domanda. PR!
Gareth,

@Gareth Aggiornato, sembra passare i test ora. Peccato che Babbo Natale non indossi Qun'ulilt, mi avrebbe salvato almeno 2 personaggi.
Dennis Jaheruddin,

Va bene. Non ho Matlab, quindi sto solo scaricando Octave (che gli internet mi dicono è il miglior modo gratuito per eseguire il codice Matlab) e eseguirò i test al mattino per verificarlo.
Gareth,

Va bene, ho controllato questo e sembra soddisfare le specifiche. L'unico posto in cui ha un vantaggio sleale è sui requisiti di input. Ho votato, ma non sarò in grado di accettarlo come vincitore a meno che non legga l'input (da un file poiché sembra che Matlab non legga da STDIN).
Gareth,

Sei entrato SQL_2nell'input del campione ... bello :)
Timtech,

1

Python 2 ( 353 381)

import re,sys
a=sys.stdin.readlines()
h=len(a)
w=len(a[0])
a=''.join(a)+' '*99
print a
b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]
for c in b:
 if c[12]=='S' and 'P' in ''.join([c[1+5*z:4+5*z] for z in range(1,4)]) and c.count('R')>3:
  a=re.sub('[^RPS]','.',c)
  w=h=5
for y in range(0,h):
 print a[y*w:(y+1)*w]

Primo tentativo di scrivere il codice nel modo più compatto possibile. Python non è proprio il linguaggio per questo, poiché rientro e newline sono semplicemente richiesti dal design. Ho scelto principalmente di usare questa lingua, per il modo in cui puoi giocare con le liste e le stringhe come liste. Un linguaggio con una facile manipolazione della matrice sarebbe l'ideale per questo compito, ma purtroppo non ne conosco nessuno.

Per testare qualcosa, è necessario assegnare qualcosa a, ad es

a=['1**********','*2*********','**3********','***4*******','****5*P****','*****S*****','*****,*****','****R**R***','***********','***********','****R******','**RPSRRR***']

La cosa più interessante in questo codice è probabilmente:

b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]

che è un modo elegante di scrivere: "b diventa un elenco di una rappresentazione (stringa di 25 caratteri) di ogni quadrato 5x5 nella rappresentazione originale".


Mentre Matlab potrebbe avere difficoltà a leggere da STDIN, Python non temo. Leggere l'input da STDIN è uno dei requisiti (per rendere possibile l'esecuzione dello script di test tanto da impedire alle persone di elaborare il proprio formato di input).
Gareth,

oops, l'ho perso del tutto.
Sumurai8,

Modificato il codice, ma non è possibile verificare se funziona effettivamente qui. Dovrebbe leggerlo nello stesso formato in cui si
trovava

Ok, ho avuto la possibilità di eseguire i test ora e ci sono un paio di problemi. 1) Nei casi in cui si trova Babbo Natale, l'input viene emesso come prima della soluzione. 2) La tua soluzione ha dimensioni diverse rispetto all'input. Ho cercato di chiarire la questione su questo punto: tutti i personaggi non (santa, regali, renne) dovrebbero essere sostituiti con spazi. È stato così nel primo esempio, ma non è stato dichiarato esplicitamente nella domanda. 3) Quando Babbo Natale non viene trovato, l'uscita ha una doppia spaziatura.
Gareth,

0

Dovrebbe esserci solo un Babbo Natale nel file (se più di 2 "S", ho bisogno di aggiornare il codice).

Usando awk

cat santa.awk

BEGIN{FS=""}
{ for (i=1;i<=NF;i++)
         { a[NR FS i]=$i
           if ($i=="S") {l=NR;c=i}
         }
     }
END{ if (l=="") {print "No Santa";exit}
     for (i=l-1;i<=l+1;i++)
        for (j=c-1;j<=c+1;j++)
          if (a[i FS j]=="P") p++
     if (p<1) {print "Santa has no presents";exit}
     for (i=l-2;i<=l+2;i++)
        for (j=c-2;j<=c+2;j++)
          if (a[i FS j]=="R") r++
     if (r<4) {print "Santa has no enough reindeers";exit}
     else {  print "found Santa "
             for (i=1;i<=NR;i++)
               { for (j=1;j<=NF;j++)
                   if (a[i FS j]~/[R|S|P]/) {printf a[i FS j]} else {printf " "}
                 printf RS
                }
           }
    }

Esegui il comando awk come di seguito

awk -f santa.awk file

Risultato

found Santa



     R
    R R
    PS
    RR
    R  R

Mi scuso per non averlo recensito prima (sono in vacanza e non ho un facile accesso al wifi). Sfortunatamente, 2 Ssono ammessi purché solo uno sia un Babbo Natale "valido". I test (forniti nella domanda) presentano un paio di casi che fallirebbero per questo motivo.
Gareth,
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.