aHHHH! The Beasts adalah HHHHere!

19

Seperti yang kami pelajari dari IBM PC AT, YouTube (lihat video) , Wikipedia (lihat artikel) , dan Sesame Street:

Surat itu Hadalah huruf alfabet yang paling tanpa ampun !

(Bahkan ketika sebenarnya terdiri dari dua elemen dalam Kode Page 437. Faktanya, bahkan LEBIH BAIK tanpa ampun.)

Seperti Alien di, uhm ... eh ... Alien , Beasts tanpa henti mengejar semua yang berani mendekati telur mereka. Tidak ada alasan untuk itu. Anda harus menekan mereka jika tidak binasa.

Pertemuan yang menakutkan dengan 4H Club

Untuk skenario ini, kami akan menganggap Anda hidup sampai akhir, dan Anda telah bertemu Beasts polos di medan tanpa telur (seperti pada tangkapan layar Wikipedia). Anda tidak memiliki tombol angka dan hanya dapat bergerak langsung ke atas / bawah / kiri / kanan ... tetapi binatang buas itu memiliki satu, dan dapat bergerak secara diagonal pada gilirannya.

Pilihan bergerak Beast di antara opsinya adalah yang meminimalkan jarak dari pemain. Jika jaraknya sama maka tie breaking dilakukan dengan mengunggulkan + kiri atas + kanan ke bawah, tapi inilah matriks disambiguasi untuk menjadi eksplisit tentang hal itu ... angka terendah untuk tie-break:

1 3 4
2 H 5
6 8 7

Seekor binatang buas tidak pernah tidur, tapi untungnya mereka sedikit lebih lambat dari pemain. Mereka menggerakkan setiap belokan lainnya (memberi pemain start pertama dengan memulai pergantian mereka pada belokan kedua). Mereka harus bergerak jika mungkin, terlepas dari apakah itu membawa mereka lebih jauh dari pemain.

Anda menghancurkan binatang buas jika Anda memindahkan kereta dinding bergerak di mana ia duduk di celah tertutup. Binatang buas polos ini bernilai 2 poin per kepala.

Memasukkan

  1. Sepasang bilangan bulat yang menunjukkan ukuran peta dalam kolom lalu baris.

  2. Hitungan jumlah baris input, masing-masing ukuran kolom ... berisi dinding padat ( #), dinding bergerak ( ~), binatang ( H), pemain ( O), atau hanya spasi.

  3. Input yang akan berupa U, D, L, R menunjukkan upaya yang dicoba oleh pemain ... atau W untuk hanya menunggu. Perhatikan bahwa berusaha mendorong dinding bergerak yang diblokir adalah input legal, itu hanya akan menghasilkan tindakan.

Keluaran

  1. aHHHH! jika binatang buas membunuh pemain ... atau tidak ada jika pemain menang tanpa binatang buas yang tersisa

  2. Nilai

(Catatan: Untuk tujuan debug dan / atau hiburan, Anda mungkin ingin dapat menampilkan status pada setiap langkah; tapi itu terlalu lama untuk dikirim di sini.)

Klarifikasi

  • Peta dijamin akan dibatasi oleh dinding yang kokoh.

  • Urutan siapa yang bergerak pada gilirannya penting bagi hasil. Dengan demikian: Pemain selalu pergi dulu, maka binatang diberi urutan berdasarkan posisi peta awal mereka jika Anda menyapu layar atas ke bawah kiri ke kanan. (Satu baris 1 binatang bergerak di depan satu baris 2 binatang, dan dua binatang pada baris yang sama itu akan menjadi satu dengan nomor kolom terendah yang akan bergerak sebelum yang lain)

  • Binatang-binatang yang bergerak diagonal dapat bergerak ke ruang diagonal terbuka yang berdekatan, terlepas dari apakah itu memerlukan peras di antara dinding.

  • Seorang pemain dapat mendorong sejumlah dinding bergerak dalam satu garis asalkan ada ruang atau binatang di ujung lainnya. Tetapi mencoba untuk mendorong kereta dinding ke Beast yang tidak disematkan di antara dinding memperlakukan Beast sebagai dinding, dan tidak akan membiarkan bergerak.

  • Keputusan kepindahan Beast selama belokan didasarkan pada lokasi pemain di awal belokan. Optimalisasi yang diinginkan dari "jarak ke pemain" adalah melalui perhitungan "saat gagak terbang". Setiap perkiraan yang akan memberikan hasil yang sama seperti yang diukur dari pusat kotak ke pusat kotak pemain baik-baik saja.

  • Jika Beast tidak dapat membuat apa yang akan menjadi langkah pertama yang dipilihnya pada gilirannya karena Beast prioritas yang lebih tinggi mengambil tempatnya, ia akan mengambil pilihan terbaik berikutnya daripada bertahan di tempat (jika langkah masih mungkin).

Contoh Kasus

Hancurkan sederhana

Memasukkan

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

Keluaran

2

Matriks Preferensi -> Kematian

Memasukkan

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

Keluaran

aHHHH!
0

Matriks Preferensi -> Menang

Memasukkan

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

Keluaran

2

Menunggu Penuai

Memasukkan

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

Keluaran

aHHHH!
0

Kekalahan yang Berhasil dalam Skenario Wikipedia

Memasukkan

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

Keluaran

8

Peta disediakan oleh saya, bergerak dan keluaran oleh @bobbel, dikuatkan oleh saya sendiri dan @Allbeert.

Kriteria Menang

Saya pikir ini golf, jadi saya akan pergi dengan aturan kode golf kecuali orang mengeluh.

Kredit tambahan

Implementasi Unicode yang dapat dimainkan dengan karakter double-lebar menyerupai gambar!

Rebmu
sumber
Apakah gerakan diagonal melompati garis dinding antidiagonal? Mengingat bahwa binatang buas membuat gerakan setiap belokan, bagaimana ia memutuskan ikatan jarak antara dua gerakan horizontal atau dua gerakan vertikal? Apakah itu bergerak ke arah pemain pada awal belokan, atau setelah gerakan pemain? Ketika Anda mengatakan "latih dinding yang dapat bergerak", apakah itu berarti bahwa pemain dapat mendorong sejumlah dinding yang bergerak dalam satu garis asalkan ada ruang atau binatang buas di ujung yang lain?
Peter Taylor
2
Jika saya mengerti dengan benar, contoh kedua salah, karena pastebin.com/raw.php?i=CqPJPjTR .
Gagang Pintu
1
@ Dr.Rebmu: umumnya saya sangat menyukai tugas Anda, tetapi ada banyak pertanyaan untuk diajukan. Terima kasih telah mengklarifikasi! Jadi, selanjutnya: bagaimana dengan situasi Two-Beast ini: pastebin.com/raw.php?i=FENVAkCH Apakah asumsi saya benar?
bobbel
1
Pertanyaan lain: Bagaimana jika Anda memindahkan kereta dinding ke binatang buas yang tidak 'ditembaki'? pastebin.com/raw.php?i=isN4L6pJ
Claudiu
3
@ Bob Man, menulis pertanyaan lebih sulit daripada menyelesaikannya! :-) Saya katakan mengingat kecenderungan Beasts untuk tidak tinggal diam, mereka akan mengambil langkah terbaik berikutnya jika tersedia alih-alih mengabaikan langkah mereka yang berubah, jika Beast prioritas yang lebih tinggi mengambil tempat ideal mereka. Diklarifikasi
Dr. Rebmu

Jawaban:

3

Perl 6: 741 karakter, 758 byte

Versi golf berada di bagian bawah, karena pada dasarnya linenoise. Di atasnya adalah versi pra-golf saya. Keduanya interaktif (mereka akan membaca sebanyak mungkin perintah dari file input yang mereka bisa dan kemudian beralih menggunakan STDIN untuk mendapatkan perintah). Mereka mencoba menggunakan karakter dan warna asli.

Penggunaannya seperti 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;

Versi golf:

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;

Selamat Hari Paskah!

Mouq
sumber
Ini aturan kode golf, jadi mengingat itu, solusi Anda menang ... bahkan jika saya sendiri tidak terlalu suka Perl. ;-) Kerja bagus dengan konsol dan warna!
Dr. Rebmu
14

Jawa, 1,843

Percobaan pertama saya untuk memecahkan teka-teki ini dengan Java. Saya tahu, bahwa ada banyak perbaikan untuk membuatnya lebih pendek. Tetapi pada akhirnya itu berfungsi untuk saat ini.

Untuk mencobanya, Anda harus membuat kelas Cdan menempelkan kode. args[0](Sebenarnya a[0]) adalah untuk input. Metode cetak peta tidak termasuk karena tidak perlu untuk hasil 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  ) ;  } }

Untuk menjalankannya, coba misalnya:

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

Keluaran dari skenario besar terakhir satu belokan sebelum binatang makan pemain:

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

Tanpa spasi garis konyol: http://pastebin.com/raw.php?i=QhpxKcCT

Jadi cara pemain berakhir setelah bergerak RRDDDRRRWW, karena pada Wait terakhir , binatang buas ke kiri akan pergi ke kanan untuk memakan pemain.


Contoh lain dari peta besar asli tetapi gerakan yang berbeda:

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

Lihat animasi ini: http://youtu.be/0DIhEhjWd6s


Dan contoh terakhir dengan peta asli dan gerakan yang berbeda (sesuai dengan aturan pergerakan binatang buas baru):

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

Lihat di youtube: http://youtu.be/jXPzL88TU2A

bobbel
sumber
1
HHHa! :-) Sangat keren. Selama Anda sudah mendapatkannya, peduli untuk memainkan beberapa game dan memberikan lebih banyak data kasus uji pada peta itu?
Dr. Rebmu
Saya telah menambahkan skenario baru dengan peta asli dan gerakan yang berbeda. Tetapi Anda tidak dapat benar-benar mengikuti langkah-langkah ini, karena saya tidak ingin menempelkan 75 langkah ke pastebin :)
bobbel
Jadi, saya menambahkan video untuk melihat hasilnya sebagai animasi!
bobbel
Video yang bagus ... meskipun tampaknya ini menunjukkan binatang buas bergerak terlalu cepat untuk menyenangkan! Haruskah kita mengubah aturan sehingga mereka bergerak setiap belokan bukan setiap belokan?
Dr. Rebmu
Saya tidak keberatan. Sekitar sepuluh byte lebih banyak untuk saya! Tapi saya sangat setuju. Sulit untuk menang seperti sekarang :)
bobbel
5

C - 1004 984 917

Ahh, keindahan C. Mengikuti semangat jawaban yang lain, aku mencoba memformat milikku juga :)

Saya membayangkan masih ada beberapa perbaikan di sana-sini, tetapi ini benar-benar menyenangkan untuk ditulis dan golf. Hitungan karakter mencakup semua ruang yang diperlukan dan baris baru.

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

Saya menguji ini dengan semua kasing sampel dan beberapa lagi milik saya, dan tampaknya berfungsi dengan baik. Jika ada yang menemukan situasi yang tidak dijawab dengan baik, beri tahu saya.

Input dari stdin, dan output ke stdout. Tidak ada pemeriksaan untuk input yang salah. Dan, itu mengembalikan skor jika pemain dimakan, atau jika pemain masih hidup setelah semua gerakan dieksekusi (bahkan jika masih ada Hdi sekitar.

Versi tidak disatukan:

#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
sumber
Bagus!! Meskipun pada input @ bobbel RRRUWWWRRRURWWWWRDRRWWRDWWWWD pada peta besar, Anda mendapatkan 6 saat ia mendapat 8. Dia membuat video , Anda mungkin dapat mencetak setiap langkah dan mencari anomali ...
Dr. Rebmu
(memperhatikan tentu saja bahwa saya mengubah aturan untuk membuat binatang bergerak setiap saat ketika saya melihat betapa tidak bisa dimainkannya gerakan binatang ... setiap kali ...!)
Dr. Rebmu
Sejujurnya: Saya tidak yakin, apakah solusi saya bekerja 100% dengan benar juga. Tapi sepertinya saya :)
bobbel
@ Dr.Rebmu Saya menyadari Anda mengedit pertanyaan sekitar waktu yang sama ketika saya memposting pertanyaan saya. Jadi saya baru saja melakukan peretasan cepat yang tampaknya berhasil. Saya akan memeriksa ulang pekan ini dan memperbaruinya. Saya juga akan memposting versi "bagus" sehingga kesalahan bisa lebih mudah dikenali oleh orang lain :)
Allbeert
FWIW Saya memecahkan ini hari ini di Rebol dan saya mendapatkan jawaban 8 dari bobbel juga.
Dr. Rebmu