aHHHH! Les bêtes sont HHHHere!

19

Comme nous l'avons appris sur IBM PC AT, YouTube (voir la vidéo) , Wikipedia (voir l'article) et Sesame Street:

La lettre Hest la lettre la plus impitoyable de l'alphabet !

(Même lorsqu'il est en fait composé de deux éléments de la page de code 437. En fait, il est encore PLUS impitoyable de cette façon.)

Comme les extraterrestres, euh ... euh ... extraterrestres , les bêtes poursuivent sans relâche tous ceux qui oseraient s'approcher de leurs œufs. Il n'y a aucun raisonnement avec eux. Vous devez les écraser sinon pour périr.

Une rencontre effrayante avec le 4H Club

Pour ce scénario, nous supposerons que vous êtes à votre dernière vie et que vous avez rencontré des bêtes simples sur un terrain sans œufs (comme dans la capture d'écran de Wikipedia). Vous n'avez pas de pavé numérique et ne pouvez que vous déplacer directement vers le haut / bas / gauche / droite ... mais les bêtes en ont apparemment un et peuvent se déplacer en diagonale à leur tour.

Le choix de déplacement d'une bête parmi ses options sera celui qui minimise la distance par rapport au joueur. Si les distances sont égales, alors le bris d'égalité est fait en favorisant gauche + haut sur droite + bas, mais voici la matrice de désambiguïsation pour être explicite à ce sujet ... le plus petit nombre à briser l'égalité:

1 3 4
2 H 5
6 8 7

Une bête ne dort jamais, mais ils sont heureusement un peu plus lents que le joueur. Ils se déplacent tous les deux tours (donnant au joueur une longueur d'avance en commençant leurs alternances au deuxième tour). Ils doivent se déplacer si un mouvement est possible, peu importe si cela l'éloigne du joueur.

Vous écrasez une bête si vous déplacez un train de murs mobiles où elle était assise dans un espace fermé. Ces bêtes simples valent 2 points par tête.

Contribution

  1. Une paire d'entiers indiquant la taille d'une carte en colonnes puis en lignes.

  2. Nombre de lignes de lignes d'entrée, chacune de la taille de la colonne ... contenant soit un mur plein ( #), un mur mobile ( ~), une bête ( H), le joueur ( O) ou juste un espace.

  3. Entrée qui sera soit U, D, L, R indiquant une tentative de déplacement du joueur ... soit W pour attendre. Notez que tenter de pousser un mur mobile qui est bloqué est une entrée légale, cela n'entraînera aucune action.

Production

  1. aHHHH! si les bêtes ont tué le joueur ... ou rien si le joueur a gagné sans bêtes restantes

  2. Le score

(Remarque: à des fins de débogage et / ou d'amusement, vous souhaiterez probablement pouvoir afficher l'état à chaque étape; mais c'est trop long pour publier ici.)

Clarifications

  • Les cartes sont garanties délimitées par des murs solides.

  • L'ordre de qui se déplace à son tour est important pour le résultat. Ainsi: Le joueur va toujours en premier, puis les bêtes reçoivent un ordre basé sur leur position initiale sur la carte si vous balayez l'écran de haut en bas de gauche à droite. (Une bête de la ligne 1 se déplace avant une bête de la ligne 2, et deux bêtes sur la même ligne, ce serait celle avec le numéro de colonne le plus bas qui se déplacerait avant l'autre)

  • Les bêtes en mouvement diagonal peuvent se déplacer dans n'importe quel espace diagonal adjacent ouvert, peu importe si cela nécessite une compression entre les murs.

  • Un joueur peut pousser n'importe quel nombre de murs mobiles dans une ligne à condition qu'il y ait un espace ou une bête à l'autre extrémité. Mais essayer de pousser un train de murs dans une bête qui n'est pas coincée entre les murs traite la bête comme un mur et ne permet pas le mouvement.

  • La décision de déplacement d'une bête pendant un tour est basée sur l'emplacement du joueur au début du tour. Son optimisation souhaitée de la "distance au joueur" passe par un calcul "à vol d'oiseau". Toute approximation qui donnerait le même résultat mesuré du centre de son carré au centre du carré du joueur est correcte.

  • Si une bête ne peut pas effectuer ce qui aurait été son premier mouvement préféré dans un tour parce qu'une bête de priorité supérieure a pris sa place, elle prendra son prochain meilleur choix au lieu de rester en place (si un mouvement est toujours possible).

Exemples de cas

Simple Crush

Contribution

5 3
#####
#O~H#
#####
R

Production

2

Matrice des préférences -> Décès

Contribution

5 5
#####
#O  #
# ~ #
#  H#
#####
WWDW

Production

aHHHH!
0

Matrice des préférences -> Win

Contribution

5 5
#####
#O  #
# ~ #
#  H#
#####
WRD

Production

2

En attendant le Reaper

Contribution

5 5
#####
#O  #
# ~ #
#  H#
#####
WWW

Production

aHHHH!
0

Défaite réussie dans le scénario Wikipédia

Contribution

40 23
########################################
#~      ~ ~~  ~  ~ ~~   ~ ~~    ~ ~ ~~ #
#~~ ~          ~~   ~   ~ ~~         ~ #
#~# ~~   ~~~~      ~  ~~~~  ~    ~~~  ~#
# ~        ~   ~ ~~ #~~       ~        #
#~~  ~~~   ~ ~ ~      ~ ~~ ~  ~  ~  ~  #
#     ~~  ~  ~ ~ ~~~       H    ~  #~  #
#  O~  ~  #  ~~~ ~      ~ ~~  ~  ~ ~~  #
#       ~ ~H~~   ~~ ~ #        ~~   ~  #
# ~~         ~ ~~~  ~~   ~~~~      ~  ~#
#~  ~    ~~~  ~   ~        ~   ~ ~~  ~~#
#     ~      # ~ ~~  ~~~   ~ ~ ~ #    ~#
#~ ~ ~~  ~  ~   H     ~~  ~~ ~ ~ ~~~   #
#       ~   ~   ~   ~  ~     ~~~ ~     #
# ~~  ~  ~ ~~   ~       ~ ~ ~     ~    #
#      ~~   ~   ~  ~         ~      ~~ #
#~ ~     #    ~~~~  ~    ~~~H   # ~    #
#  ~   ~ ~   ~        ~          ~~  ~ #
#  ~   ~     #~  ~   ~~  ~  ~         ~#
# ~~ ~ ~  ~~                ~   ~      #
#    ~~~        ~ ~~  ~  ~  ~   ~      #
# ~ ~     ~            ~~   ~   ~  ~   #
########################################
RRRUWWWRRRURWWWWRDRRWWRDWWWWD

Production

8

Carte fournie par moi, mouvements et sortie par @bobbel, corroborée par moi-même et @Allbeert.

Critères gagnants

Je pense que c'est jouable au golf, donc j'irai avec des règles de golf de code à moins que les gens se plaignent.

Crédit supplémentaire

Implémentation Unicode jouable avec les caractères double largeur pour ressembler à l'image!

Dr. Rebmu
la source
Les mouvements diagonaux sautent-ils par-dessus les lignes antidiagonales des murs? Étant donné qu'une bête fait un mouvement à chaque tour, comment rompt-elle les liens de distance entre deux mouvements horizontaux ou deux mouvements verticaux? Se déplace-t-il vers l'endroit où le joueur était au début du tour, ou après le mouvement du joueur? Quand vous dites "train de murs mobiles", cela signifie-t-il que le joueur peut pousser n'importe quel nombre de murs mobiles dans une ligne à condition qu'il y ait un espace ou une bête à l'autre bout?
Peter Taylor
2
Si je comprends bien, le deuxième exemple est incorrect, car pastebin.com/raw.php?i=CqPJPjTR .
Poignée de porte
1
@ Dr.Rebmu: en général, j'aime beaucoup votre tâche, mais il y a beaucoup de questions à poser. Merci de clarifier! Alors, ensuite: qu'en est-il de cette situation à deux bêtes: pastebin.com/raw.php?i=FENVAkCH Mon hypothèse est-elle correcte?
bobbel
1
Une autre question: que faire si vous déplacez un train de murs dans une bête qui n'est pas «coincée»? pastebin.com/raw.php?i=isN4L6pJ
Claudiu
3
@bobbel Man, écrire des questions est plus difficile que de les résoudre! :-) Je dis étant donné la propension des Beasts à ne pas rester immobile, ils prendront leur prochain meilleur coup si disponible au lieu de renoncer à leur coup ce tour-ci, si une Beast de priorité plus élevée a pris sa place idéale. Clarifié.
Dr.Rebmu

Réponses:

3

Perl 6: 741 caractères, 758 octets

La version golfée est au fond, car elle est essentiellement linoise. Ci-dessus, c'est ma version pré-golfée. Les deux sont interactifs (ils liront autant de commandes du fichier d'entrée que possible et passeront ensuite à utiliser STDIN pour obtenir des commandes). Ils essaient d'utiliser les caractères et les couleurs d'origine.

L'utilisation est comme perl6 beast.p6 beast-input:

use Term::ANSIColor;
class BeastGame {
    enum BeastParts <None Player Beast M-Wall S-Wall>;

    has @.board;
    has Int $.turn = 0;
    has Int $.score = 0;

    method indices (\matcher) {
        @.board.pairs.map: {
            .key*i X+ .value[].pairs.map: {
                .key if .value ~~ matcher
            }
        }
    }
    multi postcircumfix:<[ ]> (BeastGame \SELF, Complex \c) is rw { SELF.board[c.im][c.re] }

    has Complex $!player;
    method player { $!player = $.indices(Player)[0] }
    method Bool { so $.indices(Player) & $.indices(Beast) }

    method new (@lines) {
        my @board = @lines.map:
            {[ %(' ',<O H ~ #> Z=> None, Player, Beast, M-Wall, S-Wall){ .comb } ]}

        self.bless: :@board
    }
    method gist {
        state @symbol-map = map {colored .key, .value~' on_black'},
            ('  ',<◄► ├┤ ▒▒ ██> Z=> <default cyan red green yellow>);

        @.board.map({ @symbol-map[@$_].join }).join("\n")
    }

    method step ($d) {
        my $direction = %(:W(0), :L(-1+0i), :R(1+0i), :U(-1i), :D(1i)){$d};
        $direction // return self;
        self.move($.player,$direction);

        if ++$!turn %% 2 {
            for $.indices(Beast).eager -> $c {
                for (-1-1i,-1+0i,-1i,1-1i,1+0i,-1+1i,1+1i,1i,0i)\
                        .sort({abs $c + $^d - $!player})
                {
                    last if self.move($c, $_).defined;
                }
            }
        }

        self;
    }
    method move ($cur, $by) {
        return $cur if $by == 0;

        my $to = $cur + $by;
        my &cur-is  = { self[$cur] ~~ $^o }
        my &next-is = { self[$to]  ~~ $^o }
        return if cur-is S-Wall;
        (self[$to], self[$cur]) = (self[$cur], None)
            if next-is None
            # Move wall
            or cur-is Player | M-Wall and next-is M-Wall and self.move($to, $by)
            # Kill Player
            or cur-is Beast  and next-is Player
            # Squish Beast
            or cur-is M-Wall and next-is Beast  and self[$to+$by] ~~ M-Wall|S-Wall and $!score += 2
    }
}
my $width = get.words[1];
my $game  = BeastGame.new(lines[^$width]);
my @commands = '',lines.comb,{$*IN.get.comb}...*;

while $game {
    $game.step: @commands.shift;
    print "\e[2J";
    print "\e[H";
    say $game;
}

say "aHHHH!" unless $game.player;
say $game.score;

La version golfée:

my ($u,$s,$m)=0,0;my@b=lines[^get.words[1]].map:{[%(' ',<O H ~ #>Z=>^5){.comb}]}
my@a='',lines.comb,{$*IN.get.comb}...*;sub g(\c)is rw {@b[c.im][c.re]}
my&n=->\o{@b.kv.map:{$^k*i X+$^v[].kv.map:{$^l if $^w==o}}}
my&p={$m=n(1)[0]}
my&M=->$c,$b{my$t=$c+$b;my&c={$^o==g $c}
my&x={$^o==g $t}
c(4)??0!!$b??(($c,$t)».&g=(0,g $c)
if x(0)||c(1|3)&&x(3)&&M($t,$b)||c(2)&&x(1)||c(3)&&x(2)&&2 <g($t+$b)&&($s+=2))!!1}
while n(1)&n(2) {for 1
{M p,%(:W(0),:L(-1),:R(1),:U(-1i),:D(1i)){@a.shift}//last;if $u++%2
{for n(2).eager ->$c{last if M $c,$_
for(-1-1i,-1+0i,-1i,1-1i,1+0i,-1+1i,1+1i,1i,0i).sort({abs $c+$_-$m})}}}
say "\e[2J\e[H",join "\n",map {[~]
(map {"\e[$^v;40m$^k\e[0m"},'  ',<39 ◄► 36 ├┤ 31 ▒▒ 32 ██ 33>)[@$_]},@b}
say "aHHHH!" if !p;say $s;

Joyeuses Pâques!

Mouq
la source
Ce sont les règles du golf de code, donc étant donné que votre solution gagne ... même si je n'aime pas beaucoup Perl. ;-) Bon travail avec la console et la couleur!
Dr Rebmu
14

Java, 1843

Mon premier essai de résolution de ce puzzle avec Java. Je sais qu'il y a beaucoup d'améliorations pour le raccourcir. Mais au final ça marche pour l'instant.

Pour l'essayer, vous devez créer une classe Cet coller le code. args[0](à proprement parler a[0]) est pour la saisie. La méthode d'impression de la carte n'est pas incluse car elle n'est pas nécessaire pour la sortie du puzzle.

class C{static char                    [][]C;static int A=
0,B=0,D=0,E=0,F=0,G                    = 0 ; public static
void main(String[]a                    ){String []b= a[0].
split("\n");int c =                    Byte. decode(b [0].
split(" ")[1]); G=a                    [ 0 ] . replaceAll(
"[^H]","").length()                    ; String d = b [ b.
length - 1 ] ;C=new                    char[c][];for(int e
=1;e<b.length-1;e++                    ) C [ e - 1 ]=b[e].
toCharArray ( ) ; f                    ();boolean X= 0> 1;
for ( char  g : d .                    toCharArray ( ) ) {
switch(g){case 'U':                    h(0,-1);break; case
'D':h(0, 1); break;                    case 'L':h( -1, 0);
break;case'R':h(1,0                    );}if(X)i();X=!X;f(
);}System.out.print                    (D);}static void f(
){for(int a= 0;a<C.                    length;a++)for( int
b=0;b<C[a].length;b                    ++)if(C[a][b]=='O')
{A=b;B= a;}}static void h(int x,int y){E =x;F =y;switch(C[
B +y][A +x]){case 'H':g();break;case ' ':j(A,B);break;case
'~':k();}}static void i(){if(G<1){return;}int[][]l=new int
[G][];int m=0;for(int r=0;r<C.length;r++){for(int c=0;c<C[
r].length; c++){if(C[r][c]=='H'){l[m++]=new int[]{c,r};}}}
for(int[]n:l){o(n[0],n[1]);}} static void o(int a, int b){
int[]c=d (a,b);E=c[0];F =c[1];if(E !=0||F !=0){ j(a,b);} }
static int[]d(int a,int b){int[][]d={{1,3,4},{2,0,5},{6,8,
7},};int[]e=new int[]{0,0};double f=999;for(int r=-1;r<2;r
++){for(int c=-1;c<2;c++){if(C[b+r][a+c]==' '||C[b+r][a+c]
=='O'){int g=a+c-A;                    int h=b+r-B; double
i=Math.sqrt(g*g+h*h                    );if(i<f){e=new int
[]{ c,r};f =i;}else                    if(i==f){if(d[r+1][
c+1]<d[e[1]+1][e[0]                    +1]){e=new int[]{c,
r};}}} }}return e;}                    static void k(){if(
p(E,F,false)){q(E,F                    );} }static void q(
int x,int y){switch                    (C[B+y][A+x]){ case
'~':q(x+E,y+F);case                    'H':case ' ':j(A+x-
E,B+y- F);}} static                    boolean p(int x,int
y,boolean h){switch                    (C[B+y][ A+x]){case
' ':return !h; case                    '~':return h?h:p(x+
E,y +F, false);case                    'H':return h?!h:p(x
+E , y+ F, true) ;}                    return h&&C[B+y][A+
x] == '#' ; }static                    void j(int a,int b)
{char c=C[b][a];if(                    C[b+F][a+E]=='O'){g
();}else if(C[b+F][                    a+E]=='H'){D+=2;G--
;c=C[b][a];C[b][a]=                    ' ';}else{C[b][a]=C
[b+F][a+E];}C[b+F][                    a+E]=c;}static void
g () { System .out.                    print("aHHHH!\n"+D)
;     System      .                    exit  ( 0  ) ;  } }

Pour l'exécuter, essayez par exemple:

root@host:/cygdrive/c/workspace/project/bin> java C "5 5
> #####
> #O  #
> # ~ #
> #  H#
> #####
> WWDW"
aHHHH!
0
root@host:/cygdrive/c/workspace/project/bin>

Sortie du dernier gros scénario un tour avant qu'une bête ne mange le joueur:

████████████████████████████████████████████████████████████████████████████████
██▓▓            ▓▓  ▓▓▓▓    ▓▓    ▓▓  ▓▓▓▓      ▓▓  ▓▓▓▓        ▓▓  ▓▓  ▓▓▓▓  ██
██▓▓▓▓  ▓▓                    ▓▓▓▓      ▓▓      ▓▓  ▓▓▓▓                  ▓▓  ██
██▓▓██  ▓▓▓▓      ▓▓▓▓▓▓▓▓            ▓▓    ▓▓▓▓▓▓▓▓    ▓▓        ▓▓▓▓▓▓    ▓▓██
██  ▓▓                ▓▓      ▓▓  ▓▓▓▓  ██▓▓▓▓              ▓▓                ██
██▓▓▓▓    ▓▓▓▓▓▓      ▓▓  ▓▓  ▓▓            ▓▓  ▓▓▓▓  ▓▓    ▓▓    ▓▓    ▓▓    ██
██          ▓▓▓▓    ▓▓    ▓▓  ▓▓  ▓▓▓▓▓▓                        ▓▓    ██▓▓    ██
██          ▓▓▓▓    ██    ▓▓▓▓▓▓  ▓▓            ▓▓  ▓▓▓▓    ▓▓    ▓▓  ▓▓▓▓    ██
██              ▓▓  ▓▓  ▓▓▓▓      ▓▓▓▓  ▓▓  ██                ▓▓▓▓      ▓▓    ██
██  ▓▓▓▓                  ▓▓  ▓▓▓▓▓▓    ▓▓▓▓  ├┤  ▓▓▓▓▓▓▓▓            ▓▓    ▓▓██
██▓▓    ▓▓    ├┤◄►▓▓▓▓▓▓├┤  ▓▓      ▓▓                ▓▓      ▓▓  ▓▓▓▓    ▓▓▓▓██
██          ▓▓            ██  ▓▓  ▓▓▓▓    ▓▓▓▓▓▓      ▓▓  ▓▓  ▓▓  ██        ▓▓██
██▓▓  ▓▓  ▓▓▓▓    ▓▓    ▓▓                  ▓▓▓▓    ▓▓▓▓  ▓▓  ▓▓  ▓▓▓▓▓▓      ██
██              ▓▓      ▓▓      ▓▓      ▓▓    ▓▓├┤        ▓▓▓▓▓▓  ▓▓          ██
██  ▓▓▓▓    ▓▓    ▓▓  ▓▓▓▓      ▓▓              ▓▓  ▓▓  ▓▓          ▓▓        ██
██            ▓▓▓▓      ▓▓      ▓▓    ▓▓                  ▓▓            ▓▓▓▓  ██
██▓▓  ▓▓          ██        ▓▓▓▓▓▓▓▓    ▓▓        ▓▓▓▓▓▓        ██  ▓▓        ██
██    ▓▓      ▓▓  ▓▓      ▓▓                ▓▓                    ▓▓▓▓    ▓▓  ██
██    ▓▓      ▓▓          ██▓▓    ▓▓      ▓▓▓▓    ▓▓    ▓▓                  ▓▓██
██  ▓▓▓▓  ▓▓  ▓▓    ▓▓▓▓                                ▓▓      ▓▓            ██
██        ▓▓▓▓▓▓                ▓▓  ▓▓▓▓    ▓▓    ▓▓    ▓▓      ▓▓            ██
██  ▓▓  ▓▓          ▓▓                        ▓▓▓▓      ▓▓      ▓▓    ▓▓      ██
████████████████████████████████████████████████████████████████████████████████

Sans espaces de ligne stupides: http://pastebin.com/raw.php?i=QhpxKcCT

Ainsi, la façon dont les joueurs se terminent après les mouvements RRDDDRRRWW, car sur le dernier Wait, la bête à gauche ira à droite pour manger le joueur.


Un autre exemple de la grande carte d'origine mais de mouvements différents:

http://pastebin.com/raw.php?i=nBWjC3PZ

Voir cette animation: http://youtu.be/0DIhEhjWd6s


Et le dernier exemple avec la carte originale et différents mouvements (selon les nouvelles règles de mouvement des bêtes):

http://pastebin.com/raw.php?i=NNmgzx7U

Voir sur youtube: http://youtu.be/jXPzL88TU2A

bobbel
la source
1
HHHa! :-) Très cool. Tant que vous l'avez obtenu, vous voulez jouer à quelques jeux et donner plus de données de cas de test sur cette carte?
Dr Rebmu
J'ai ajouté un nouveau scénario avec la carte originale et différents mouvements. Mais vous ne pouvez pas vraiment suivre les étapes, car je ne voulais pas coller les 75 étapes dans pastebin :)
bobbel
J'ai donc ajouté une vidéo pour voir le résultat sous forme d'animation!
bobbel
Bonne vidéo ... bien qu'elle semble montrer que les bêtes bougent trop vite pour être amusantes! Devrions-nous changer la règle pour qu'ils se déplacent tous les deux tours au lieu de chaque tour?
Dr Rebmu
Ça ne me dérange pas. Environ dix octets de plus pour moi! Mais je suis totalement d'accord. C'est difficile de gagner comme maintenant :)
bobbel
5

C - 1004 984 917

Ahh, la beauté de C. Suivant l'esprit de l'autre réponse, j'ai aussi essayé de formater la mienne :)

J'imagine qu'il y a encore quelques améliorations ici et là, mais c'était vraiment amusant d'écrire et de jouer au golf. Le nombre de caractères comprend tous les espaces nécessaires et les nouvelles lignes.

#define M(y,x,c) {t[y][x]=32;t[p][q]=c;y=p;x=q;}
   #define E {printf("aHHHH!\n%d",Z);exit(0);}
    #define A sqrt(pow(X-Q,2)+pow(Y-P,2))*30
           #define L (char)(m[s]>>8)
            #define G (char)(m[s])
             #define B(b) if(T==b)
              #define J M(Y,X,79)
               #define T t[P][Q]

r,c,X,Y,H,i,j,k,Z,p,q,P,Q,u,v,s,w,m[99],b[8]={
-1,255,65280,65281,1,511,257,256},t[999][999],
x[99],y[99];main(){char N[99];m[85]=b[2];m[68]
=256;m[76]=255; m[82]=1; scanf("%d %d",&c,&r);
for(;P<r;P++)                    for(Q=0;Q<c&&
scanf("%c",&T                    );T-10&&T-13?
Q++:Q){B(79){                    Y=P;X=Q;}B(72
){y[H]=P ;x[H                    ++]=Q;}}scanf
("%s",N);for(                    ;i<strlen(N);
i++){s=N[i];P                    =p=Y+L;Q=q=X+
G;B(32)J B('~')                  {while(P+=L,Q
+=G,T=='~');B                    (72){u=P+L;v=
Q+G;if(t[u][v]                   ==35||t[u][v]
=='~'){Z+=2;T=                   '~';J}}B(32){
T='~';J}}else                    B(72)E if(r=!r)
for(j=0;j<H;j                    ++){P=y[j];Q=
x[j];if(T-72)continue;v=A;s=0;for(k=0;k<8;k++)
{P=y[j]+(char)(b[k]>>8);Q=x[j]+(char)(b[k]);u=
A;B(32)if((c=v-u+99)>s){s=c;q=Q;p=P;}B(79)E}if
(s)M(y[j],x[j],72)}}printf("%d",Z);}//////////

J'ai testé cela avec tous les exemples de cas et quelques autres, et cela semble fonctionner correctement. Si quelqu'un trouve une situation dans laquelle il ne répond pas correctement, faites-le moi savoir.

L'entrée provient de stdin et la sortie vers stdout. Il n'y a pas de vérification pour une entrée incorrecte. Et, il renvoie le score si le joueur est mangé, ou si le joueur est vivant après que tous les mouvements soient exécutés (même s'il y a encoreH autour.

Version non golfée:

#define M(y,x,c) {t[y][x]=32;t[p][q]=c;y=p;x=q;}
#define E {printf("aHHHH!\n%d",Z);exit(0);}
#define A sqrt(pow(X-Q,2)+pow(Y-P,2))*30
#define L (char)(m[s]>>8)
#define G (char)(m[s])
#define B(b) if(T==b)
#define J M(Y,X,79)
#define T t[P][Q]

r, c, X, Y, H, i, j, k, Z, p, q, P, Q, u, v, s, w, m[99], b[8] = { -1, 255,
        65280, 65281, 1, 511, 257, 256 }, t[999][999], x[99], y[99];
main() {
    char N[99];
    m[85] = b[2];
    m[68] = 256;
    m[76] = 255;
    m[82] = 1;
    scanf("%d %d", &c, &r);
    for (; P < r; P++)
        for (Q = 0; Q < c && scanf("%c", &T);T-10&&T-13?Q++:Q) {
            B(79) {
                Y=P;
                X=Q;
            }
            B(72) {
                y[H]=P;
                x[H++]=Q;
            }
        }

    scanf("%s", N);
    for (; i < strlen(N); i++) {
        s = N[i];
        P = p = Y + L;
        Q = q = X + G;
        B(32)
            J
        B('~') {
            while (P += L, Q += G, T=='~');
            B(72) {
                u=P+L;
                v=Q+G;
                if(t[u][v]==35||t[u][v]=='~') {
                    Z+=2;
                    T='~';
                    J
                }
            }
            B(32) {
                T='~';
                J
            }
        } else B(72)E
        if (r = !r)
            for (j = 0; j < H; j++) {
                P = y[j];
                Q = x[j];
                if (T-72)
                continue;

                v = A;
                s = 0;

                for (k = 0; k < 8; k++) {
                    P = y[j] + (char) (b[k] >> 8);
                    Q = x[j] + (char) (b[k]);
                    u = A;
                    B(32)
                        if ((c = v - u + 99) > s) {
                            s = c;
                            q = Q;
                            p = P;
                        }

                    B(79)
                        E
                }
                if (s)
                    M(y[j], x[j], 72)
            }
    }
    printf("%d", Z);
}
Allbeert
la source
Agréable!! Bien que sur l'entrée de @ bobbel RRRUWWWRRRURWWWWRDRRWWRDWWWWD sur la grande carte, vous obtenez 6 pendant qu'il en a 8. Il a fait une vidéo , vous pouvez peut-être imprimer chaque étape et rechercher toute anomalie ...
Dr. Rebmu
(notant bien sûr que j'ai changé la règle pour que les bêtes se déplacent tous les deux tours quand j'ai vu à quel point les bêtes se déplaçaient à chaque tour était ...!)
Dr Rebmu
Pour être honnête: je ne sais pas si ma solution fonctionne à 100% correctement aussi. Mais ça me ressemble :)
bobbel
@ Dr.Rebmu J'ai réalisé que vous avez modifié la question à peu près au même moment où j'ai publié la mienne. Je viens donc de faire un hack rapide qui a apparemment fonctionné. Je vais le revérifier ce week-end et le mettre à jour. Je publierai également une "belle" version pour que les erreurs soient également plus faciles à repérer par d'autres personnes :)
Allbeert
FWIW J'ai résolu ce problème aujourd'hui dans Rebol et j'obtiens également la réponse de @ bobbel de 8.
Dr.Rebmu