Cherchant désespérément le Père Noël

13

Retrouvez le Père Noël et ses rennes dans une scène bondée.

Contribution

L'entrée se fera sur STDIN et sera un nombre variable de lignes de caractères de longueur égale mais variable. Si le Père Noël (représenté par le personnage S) est dans la scène, son sac de cadeaux (représenté par le personnage P) sera dans l'une des positions adjacentes à lui (horizontalement, verticalement ou en diagonale). Ses rennes (chacun représenté par le personnage R) seront tous dans le carré 5x5 qui l'entoure. Si un Sapparaît dans la scène qui n'a pas de sac de cadeaux ou n'est pas accompagné d'au moins 4 rennes, alors ce n'est pas le Père Noël.

Production

La scène a été débarrassée de tout obscurcissement (tous les personnages non-Père Noël, non-présents, non-rennes remplacés par un espace), montrant le Père Noël, son sac de cadeaux et son renne - tous les autres personnages doivent être remplacés par des espaces. Si le Père Noël et ses rennes ne sont pas dans la scène, sortez-les inchangés. Il est garanti qu'il n'y aura qu'une seule solution, il n'y aura donc jamais plus d'un Père Noël valide et il ne transportera jamais plus d'un sac de cadeaux.

Exemples

Dans ces exemples , je suis juste en utilisant le *caractère pour le rendre facile de voir les S, Pet les Rcaractères, mais votre programme devrait être capable de gérer tous les caractères ascii de !à `(33 à 96). J'ai omis les caractères minuscules et supérieurs pour éviter toute confusion.

Contribution:

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

Sortie: (ignorer les points, ils doivent forcer la page à afficher les lignes vides)

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

Entrée: (pas assez de rennes)

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

Production:

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

Entrée: (pas de sac de cadeaux)

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

Production:

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

Entrée: (présente pas assez proche)

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

Production:

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

Entrée: (l'un des rennes n'est pas dans le carré 5x5 autour du Père Noël)

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

Production:

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

Scripts de test

Comme dans certaines de mes questions précédentes, j'ai une fois de plus massacré des scripts de test créés à l'origine par Joey et Ventero pour fournir des cas de test pour cette question:

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

Version en texte brut des tests pour référence: texte en clair

Récompenses

Chaque entrée dont je peux vérifier qu'elle répond aux spécifications, réussit les tests et a évidemment eu une tentative de golf recevra un vote positif de ma part (veuillez donc fournir des instructions d'utilisation avec votre réponse). La solution la plus courte d'ici la fin du 31/12/2013 sera acceptée comme gagnante.

Gareth
la source
Je me rends compte que cela est similaire à ma question précédente Reconnaissance faciale , mais cela fait quelques années depuis. De plus, je m'excuse d'avoir sauté le Sandbox Question, mais comme il était lié à Noël, il devait être publié rapidement ou ce ne serait pas pertinent.
Gareth
Le premier exemple de sortie ne s'affiche pas correctement (semble être de plus petite taille).
Dennis Jaheruddin
@DennisJaheruddin Il semble que le Markdown supprime toutes les lignes vides. J'ai ajouté des points au début de ces lignes pour montrer qu'ils sont là. Désolé pour la confusion.
Gareth

Réponses:

2

MATLAB: 110 , 95 caractères

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

Je ne suis pas sûr de la façon dont l'entrée est censée être traitée, mais le reste est assez simple.

Version normalement formatée:

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

Exemple d'entrée:

M=['***********'
'***********'
'***********'
'*****R*****'
'******P****'
'*****SQL_2*'
'*****R*****'
'****R**R***'
'***********'
'***********'
'***********'
'***********'];
Dennis Jaheruddin
la source
Hmmm, exécuter les scripts de test sur ce sujet va être gênant. Un rapide coup d'œil sur le code suggère que vous n'utilisez que les exemples ci-dessus qui utilisent des *caractères comme foule pour faciliter la visualisation des caractères S, Pet R- alors que les tests du script de test utilisent tous les caractères ascii à partir de 33 ( !). au (et y compris) 96 (`` ''). Je vais le préciser dans la question. J'ai fait une version en texte brut des tests que vous devez passer, que j'ajouterai également à la question.
Gareth
@Gareth Mis à jour, semble passer les tests maintenant. Dommage que le père QNoël ne porte pas d' uilt, cela m'aurait sauvé au moins 2 caractères.
Dennis Jaheruddin
D'accord. Je n'ai pas Matlab, je ne fais que télécharger Octave (ce que les internautes me disent est le meilleur moyen gratuit d'exécuter le code Matlab) et je passerai les tests le matin pour vérifier.
Gareth
D'accord, j'ai vérifié cela et cela semble répondre aux spécifications. Le seul endroit où il a un avantage injuste est sur les exigences d'entrée. J'ai voté positivement, mais je ne serai pas en mesure de l'accepter comme gagnant à moins qu'il ne lise l'entrée (à partir d'un fichier car il semble que Matlab ne lit pas depuis STDIN).
Gareth
Vous vous êtes glissé SQL_2dans l'entrée échantillon ... sympa :)
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]

Première tentative d'écriture de code aussi compact que possible. Python n'est pas vraiment le langage pour cela, car l'indentation et les nouvelles lignes sont simplement requis par la conception. J'ai principalement choisi d'utiliser cette langue, en raison de la façon dont vous pouvez jouer avec des listes et des chaînes sous forme de listes. Un langage avec une manipulation aisée de la matrice serait idéal pour cette tâche, mais malheureusement je n'en connais aucun.

Pour tester quelque chose, quelque chose doit être assigné à un, par exemple

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

La principale chose intéressante dans ce code est probablement:

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

qui est une façon d'écrire de fantaisie: "b devient une liste d'une représentation (chaîne de 25 caractères) de chaque carré 5x5 dans la représentation originale".

Sumurai8
la source
Alors que Matlab peut avoir des difficultés à lire à partir de STDIN, Python n'a pas peur. La lecture de l'entrée de STDIN est l'une des exigences (pour rendre possible l'exécution du script de test autant que pour empêcher les gens de trouver leur propre format d'entrée).
Gareth
oups, ça m'a totalement manqué.
Sumurai8
Modifié le code, mais ne peut pas tester s'il fonctionne réellement ici. Il devrait le lire dans le même format
qu'auparavant
D'accord, j'ai eu l'occasion d'exécuter les tests à ce sujet maintenant et il y a quelques problèmes. 1) Dans les cas où le Père Noël est trouvé, l'entrée est sortie telle quelle avant votre solution. 2) Votre solution est d'une taille différente de celle de l'entrée. J'ai essayé de clarifier la question sur ce point - tous les caractères non (père Noël, cadeaux, rennes) devraient être remplacés par des espaces. C'était comme ça dans le premier exemple, mais ce n'était pas dit explicitement dans la question. 3) Lorsque le Père Noël n'est pas trouvé, la sortie a un double interligne.
Gareth
0

Il ne devrait y avoir qu'un seul Père Noël dans le fichier (si plus de 2 "S", j'ai besoin de mettre à jour le code).

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

Exécutez la commande awk comme ci-dessous

awk -f santa.awk file

Résultat

found Santa



     R
    R R
    PS
    RR
    R  R
BMW
la source
Toutes mes excuses pour ne pas avoir revu cela plus tôt (je suis en vacances et je n'ai pas facilement accès au wifi). Malheureusement, 2 Ssont autorisés tant qu'un seul est un père Noël «valide». Les tests (fournis dans la question) ont quelques cas qui échoueraient pour cette raison.
Gareth