ahhhh! Le bestie sono QUI!


19

Come abbiamo appreso da IBM PC AT, YouTube (vedi video) , Wikipedia (vedi articolo) e Sesame Street:

La lettera Hè la lettera più spietata dell'alfabeto !

(Anche se in realtà composto da due elementi nel Codice Pagina 437. In realtà, è anche PIÙ spietato in quel modo.)

Come gli Alieni, uhm ... ehm ... Alieni , gli Animali inseguono incessantemente tutti coloro che oserebbero avvicinarsi alle loro uova. Non c'è ragionamento con loro. Devi schiacciarli se non per perire.

Un incontro spaventoso con il 4H Club

Per questo scenario supponiamo che tu sia arrivato alla tua ultima vita e che tu abbia incontrato Bestie semplici in un terreno senza uova (come nello screenshot di Wikipedia). Non hai un tastierino numerico e puoi muoverti solo direttamente su / giù / sinistra / destra ... ma le bestie apparentemente ne hanno uno e possono muoversi in diagonale durante il loro turno.

La scelta della mossa di una Bestia tra le sue opzioni sarà quella che minimizza la distanza dal giocatore. Se le distanze sono uguali, allora il pareggio viene fatto favorendo sinistra + su sopra destra + giù, ma ecco la matrice di chiarimento per essere espliciti al riguardo ... il numero più basso da legare:

1 3 4
2 H 5
6 8 7

Una bestia non dorme mai, ma fortunatamente sono un po 'più lenti del giocatore. Si muovono ogni altro turno (dando al giocatore un vantaggio iniziale iniziando le loro alternanze al secondo turno). Devono muoversi se una mossa è possibile, indipendentemente dal fatto che ciò li porti più lontano dal giocatore.

Schiaccia una bestia se sposti un treno di pareti mobili in cui era seduto in uno spazio chiuso. Queste bestie semplici valgono 2 punti a testa.

Ingresso

  1. Una coppia di numeri interi che indicano le dimensioni di una mappa in colonne e righe.

  2. Numero di righe delle righe di input, ciascuna delle dimensioni della colonna ... contenente un muro solido ( #), un muro mobile ( ~), una bestia ( H), il giocatore ( O) o solo uno spazio.

  3. Input che sarà U, D, L, R che indica una mossa tentata dal giocatore ... o W per aspettare. Si noti che tentare di spingere un muro mobile che è bloccato è un input legale, non comporterà alcuna azione.

Produzione

  1. aHHHH! se le bestie uccidono il giocatore ... o niente se il giocatore vince senza bestie rimaste

  2. Il punteggio

(Nota: per scopi di debug e / o divertimento, probabilmente vorrai essere in grado di generare lo stato ad ogni passaggio; ma è troppo lungo per pubblicare qui.)

chiarimenti

  • Le mappe sono delimitate da solidi muri.

  • L'ordine di chi si muove a turno conta per il risultato. Quindi: il giocatore va sempre per primo, quindi gli animali ricevono un ordine in base alla loro posizione iniziale sulla mappa se stavi attraversando lo schermo dall'alto verso il basso da sinistra a destra. (Una bestia riga 1 si muove prima di una bestia riga 2 e due bestie sulla stessa riga sarebbe quella con il numero di colonna più basso che si muoverebbe prima dell'altra)

  • Gli animali in movimento diagonale possono spostarsi in qualsiasi spazio diagonale adiacente aperto, indipendentemente dal fatto che richieda una compressione tra le pareti.

  • Un giocatore può spingere un numero qualsiasi di pareti mobili in una linea a condizione che ci sia uno spazio o una bestia sull'altra estremità. Ma provare a spingere un treno di mura in una Bestia che non è bloccata tra le mura tratta la Bestia come un muro e non permetterà la mossa.

  • La decisione di mossa di una Bestia durante un turno si basa sulla posizione del giocatore all'inizio del turno. L'ottimizzazione desiderata della "distanza dal giocatore" avviene attraverso un calcolo "in linea d'aria". Qualsiasi approssimazione che darebbe lo stesso risultato misurato dal centro del suo quadrato al centro del quadrato del giocatore va bene.

  • Se una Bestia non può fare quella che sarebbe stata la sua prima mossa preferita in un turno perché una Bestia con priorità più alta ha preso il suo posto, prenderà la sua prossima scelta migliore invece di rimanere sul posto (se una mossa è ancora possibile).

Casi di esempio

Crush semplice

Ingresso

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

Produzione

2

Matrice delle preferenze -> Morte

Ingresso

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

Produzione

aHHHH!
0

Matrice delle preferenze -> Win

Ingresso

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

Produzione

2

Aspettando il mietitore

Ingresso

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

Produzione

aHHHH!
0

Sconfitta riuscita nello scenario di Wikipedia

Ingresso

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

Produzione

8

Mappa fornita da me, mossa e uscita da @bobbel, corroborata da me e da @Allbeert.

Criteri vincenti

Penso che questo sia giocabile a golf, quindi seguirò le regole del code golf a meno che le persone non si lamentino.

Credito extra

Implementazione Unicode giocabile con i caratteri a doppia larghezza per assomigliare all'immagine!


I movimenti diagonali saltano su linee antidiagonali di pareti? Dato che una bestia fa una mossa ad ogni giro, come interrompe i legami di distanza tra due mosse orizzontali o due mosse verticali? Si sposta verso il punto in cui si trovava il giocatore all'inizio del turno o dopo il movimento del giocatore? Quando dici "treno di pareti mobili", significa che il giocatore può spingere un numero qualsiasi di pareti mobili in una linea a condizione che ci sia uno spazio o una bestia dall'altra parte?
Peter Taylor,

2
Se ho capito bene, il secondo esempio è sbagliato, perché pastebin.com/raw.php?i=CqPJPjTR .
Maniglia della porta

1
@ Dr.Rebmu: in genere mi piace molto il tuo compito, ma ci sono molte domande da porre. Grazie per il chiarimento! Quindi, il prossimo: che dire di questa situazione delle due bestie: pastebin.com/raw.php?i=FENVAkCH La mia ipotesi è corretta?
Bob

1
Un'altra domanda: cosa succede se si sposta un treno di mura in una bestia che non è "bloccata"? pastebin.com/raw.php?i=isN4L6pJ
Claudiu

3
@bobbel Man, scrivere domande è più difficile che risolverle! :-) Dico, vista la propensione delle Bestie a non rimanere fermi, faranno la loro prossima mossa migliore se disponibile invece di rinunciare alla loro mossa in quel turno, se una Bestia con priorità più alta ha preso il suo posto ideale. Chiarito.
Dr. Rebmu,

Risposte:


3

Perl 6: 741 caratteri, 758 byte

La versione da golf è in fondo, dal momento che è sostanzialmente linenoise. Sopra è la mia versione pre-golf. Entrambi sono interattivi (leggeranno quanti più comandi possibile dal file di input e poi passeranno all'utilizzo di STDIN per ottenere i comandi). Tentano di usare i caratteri e i colori originali.

L'uso è come 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 versione golfizzata:

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;

Buona Pasqua!


Sono le regole del codice golf, quindi, la tua soluzione vince ... anche se il Perl non mi piace molto. ;-) Ottimo lavoro con console e colori!
Dr. Rebmu,

14

Java, 1.843

Il mio primo tentativo di risolvere questo puzzle con Java. So che ci sono molti miglioramenti per renderlo più breve. Ma alla fine funziona per ora.

Per provarlo, devi creare una classe Ce incollare il codice. args[0](a rigor di termini a[0]) è per input. Il metodo di stampa della mappa non è incluso poiché non è necessario per l'output del 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  ) ;  } }

Per eseguirlo, prova ad esempio:

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

Uscita dell'ultimo grande scenario un turno prima che una bestia mangi il giocatore:

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

Senza spazi lineari stupidi: http://pastebin.com/raw.php?i=QhpxKcCT

Quindi il modo in cui il giocatore sta finendo dopo le mosse RRDDDRRRWW, perché all'ultimo Wtentativo, la bestia a sinistra andrà a destra per mangiare il giocatore.


Un altro esempio della grande mappa originale ma mosse diverse:

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

Vedi questa animazione: http://youtu.be/0DIhEhjWd6s


E l'ultimo esempio con mappa originale e mosse diverse (secondo le nuove regole di movimento delle bestie):

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

Vedi su YouTube: http://youtu.be/jXPzL88TU2A


1
HHHa! :-) Molto bello. Finché lo hai ottenuto, ti interessa giocare alcuni giochi e fornire più dati sui casi di test su quella mappa?
Dr. Rebmu,

Ho aggiunto un nuovo scenario con mappa originale e mosse diverse. Ma non puoi davvero seguire i passaggi, perché non volevo incollare tutti i 75 passaggi in pastebin :)
bobbel

Quindi, ho aggiunto un video per vedere il risultato come un'animazione!
Bob

Buon video ... anche se sembra mostrare che le bestie si muovono troppo velocemente per essere divertenti! Dovremmo cambiare la regola in modo che si muovano ogni altro turno anziché ogni turno?
Dr. Rebmu,

Non mi dispiace Circa dieci byte in più per me! Ma sono totalmente d'accordo. È difficile vincere come è adesso :)
bobbel

5

C - 1004 984 917

Ah, la bellezza di C. Seguendo lo spirito dell'altra risposta, ho provato a formattare anche la mia :)

Immagino che ci siano ancora alcuni miglioramenti qua e là, ma è stato davvero divertente scrivere e giocare a golf. Il conteggio dei personaggi include tutti gli spazi necessari e le nuove linee.

#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);}//////////

Ho provato questo con tutti i casi di esempio e alcuni altri miei, e sembra funzionare correttamente. Se qualcuno trova una situazione in cui non risponde correttamente, per favore fatemelo sapere.

L'input proviene da stdin e l'output a stdout. Non ci sono controlli per input errato. E, restituisce il punteggio se il giocatore viene mangiato o se il giocatore è vivo dopo che tutti i movimenti sono stati eseguiti (anche se ci sono ancora in Hgiro.

Versione non golfata:

#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);
}

Bello!! Anche se sull'ingresso di @ bobbel RRRUWWWRRRURWWWWRDRRWWRDWWWWD sulla grande mappa, ottieni 6 mentre ne ottiene 8. Ha realizzato un video , potresti forse stampare ogni passaggio e cercare eventuali anomalie ...
Dr. Rebmu,

(notando ovviamente che ho cambiato la regola per far muovere le bestie ogni altro turno quando ho visto quanto era ingiocabile il movimento delle bestie ogni turno ...!)
Dr. Rebmu,

Ad essere sincero: non sono sicuro che anche la mia soluzione funzioni correttamente al 100%. Ma mi sembra :)
Bob

@ Dr.Rebmu Mi sono reso conto che hai modificato la domanda nello stesso momento in cui ho pubblicato il mio. Quindi ho appena fatto un trucco rapido che apparentemente ha funzionato. Lo ricontrollerò questo fine settimana e lo aggiornerò. Pubblicherò anche una versione "carina" in modo che eventuali errori possano essere più facili da individuare anche da altre persone :)
Allbeert

FWIW L'ho risolto oggi in Rebol e sto ottenendo anche la risposta di @ bobbel dell'8.
Dr. Rebmu,
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.