Ahhhh! Canavarlar HHH İşte!


19

IBM PC AT, YouTube (videoya bakın) , Wikipedia (makaleye bakın) ve Susam Sokağı'ndan öğrendiğimiz gibi :

Mektup H, alfabenin en acımasız mektubu !

(Aslında iki elementlerden oluşan bile Kod Sayfa 437 . In gerçeği, hatta DAHA acımasız tarafta.)

Yabancılar gibi, ah ... Yabancılar , Canavarlar acımasızca yumurtalarının yanına gelmeye cesaret eden herkesi kovalarlar. Onlarla hiçbir mantık yok. Yok olmak için onları ezmelisin.

4H Club ile korkutucu bir karşılaşma

Bu senaryo için, son yaşamınıza düştüğünüzü varsayalım ve yumurtasız bir arazide sade Canavarlarla tanıştınız (Wikipedia ekran görüntüsünde olduğu gibi). Sayısal bir tuş takımınız yok ve yalnızca doğrudan yukarı / aşağı / sola / sağa hareket edebiliyorsunuz ... ama canavarların görünüşte bir tane var ve sırayla çapraz olarak hareket edebiliyorlar.

Bir Canavar'ın seçenekleri arasında hareket etme seçeneği, oyuncuya olan mesafeyi en aza indiren seçim olacaktır. Mesafeler eşitse, kravat kırma sol + yukarı sağ + aşağı lehine yapılır, ancak burada açık olmak için belirsizlik matrisi ... kravat kopması için en düşük sayı:

1 3 4
2 H 5
6 8 7

Bir canavar asla uyumaz, ama neyse ki oyuncudan biraz daha yavaştır. Diğer iki turda hareket ederler (oyuncuya ikinci turda değişikliklerine başlayarak kafa vuruşu verir). Bir hamle mümkünse, oyuncudan daha ileri götürürse de hareket etmelidirler.

Kapalı bir boşlukta oturduğu hareketli duvarlardan oluşan bir treni hareket ettirirseniz bir canavarı ezersiniz. Bu sade hayvanlar bir kafa 2 puan değerindedir.

Giriş

  1. Bir haritanın sütunlar ve ardından satırlardaki boyutunu belirten bir tam sayı çifti.

  2. Giriş satırlarının satır sayısı, sütun boyutlarının her biri ... katı bir duvar ( #), hareketli bir duvar ( ~), bir canavar ( H), oyuncu ( O) veya sadece bir boşluk içerir.

  3. Oynatıcı tarafından hareket ettirilmeye çalışıldığını gösteren U, D, L, R olacak şekilde giriş veya sadece beklemek için W. Engellenen hareketli bir duvarı itmeye teşebbüsün yasal girdi olduğuna dikkat edin, hiçbir işlem yapılmayacaktır.

Çıktı

  1. aHHHH! Canavarlar oyuncuyu öldürdüyse ... ya da hiç canavar kalmadan kazanırsa hiçbir şey

  2. Puan

(Not: Hata ayıklama amaçları ve / veya eğlence için, muhtemelen her adımda durumun çıktısını almak isteyeceksinizdir; ancak burada yayınlamak için çok uzun.)

Açıklamalar

  • Haritaların sağlam duvarlarla sınırlandırılması garanti edilir.

  • Kimin sırayla hareket ettiği, sonuç için önemlidir. Böylece: Oyuncu her zaman önce gelir, daha sonra ekranın solundan sağına doğru süpürüyorsanız , hayvanlara başlangıç ​​harita konumlarına göre bir sıralama verilir . (Sıra 1 canavarı sıra 2 canavarı önünde hareket eder ve aynı sıradaki iki hayvan, diğerinden önce hareket edecek en düşük sütun sayısına sahip olan canavardır)

  • Çapraz hareketli hayvanlar, duvarlar arasında sıkma gerektirip gerektirmediğine bakılmaksızın, bitişik herhangi bir açık çapraz alana hareket edebilir.

  • Bir oyuncu, diğer ucunda bir boşluk veya canavar olması koşuluyla, herhangi bir sayıda hareketli duvarı bir çizgiye itebilir. Ancak bir duvar trenini duvarlar arasına sabitlenmemiş bir Canavara itmeye çalışmak Canavarı bir duvar gibi ele alır ve harekete izin vermez.

  • Bir Canavar'ın bir tur sırasında hareket kararı, oyuncunun turun başlangıcındaki konumuna dayanır . İstediği "oyuncuya mesafe" optimizasyonu, "karga uçarken" hesaplamasıyla yapılır. Karesinin ortasından oyuncunun karesinin ortasına kadar ölçülenle aynı sonucu verecek herhangi bir tahmin iyidir.

  • Eğer bir Canavar ilk tercih edilen hamlesini bir sırayla yapamazsa, çünkü daha yüksek önceliğe sahip bir Canavar yerini aldı, (bir hamle hala mümkünse) yerinde kalmak yerine bir sonraki en iyi seçimini alacaktır.

Örnek Vakalar

Basit Ezilme

Giriş

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

Çıktı

2

Tercih Matrisi -> Ölüm

Giriş

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

Çıktı

aHHHH!
0

Tercih Matrisi -> Kazan

Giriş

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

Çıktı

2

Azrail Beklerken

Giriş

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

Çıktı

aHHHH!
0

Wikipedia Senaryosunda Başarılı Yenilgi

Giriş

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

Çıktı

8

Benim tarafımdan sağlanan harita, @bobbel tarafından taşındı ve çıktı, kendim ve @Allbeert tarafından desteklendi.

Kazanma Kriterleri

Bu golfable olduğunu düşünüyorum, bu yüzden insanlar şikayet sürece kod golf kuralları ile gidecek.

Ekstra kredi

Görüntüye benzeyen çift geniş karakterli oynanabilir Unicode uygulaması!


Çapraz hareketler duvarların antidiagonal çizgileri üzerinden atlıyor mu? Bir canavarı her turda hareket ettirdiği göz önüne alındığında, iki yatay hareket veya iki dikey hareket arasındaki mesafe bağlarını nasıl keser? Oyuncunun dönüşün başlangıcında veya oyuncunun hareketinden sonra olduğu yere doğru hareket ediyor mu? "Hareketli duvarların treni" demek, oyuncunun diğer ucunda bir boşluk ya da canavar olması koşuluyla, herhangi bir sayıda hareketli duvarı itebileceği anlamına mı geliyor?
Peter Taylor

2
Doğru anlıyorsam, ikinci örnek yanlış, çünkü pastebin.com/raw.php?i=CqPJPjTR .
Doorknob

1
@ Dr.Rebmu: Genel olarak görevinizi çok seviyorum, ama sorulacak birçok soru var. Açıkladığınız için teşekkürler! Şimdi, bu iki canavar durumu hakkında: pastebin.com/raw.php?i=FENVAkCH Varsayım doğru mu?
bobbel

1
Başka bir soru: Bir duvar trenini 'sabitlenmemiş' bir canavara taşırsanız ne olur? pastebin.com/raw.php?i=isN4L6pJ
Claudiu

3
@bobbel Dostum, soru yazmak onları çözmekten daha zor! :-) Diyorum ki Canavarlar hareketsiz kalmama eğilimi göz önüne alındığında, eğer daha yüksek öncelikli bir Canavar ideal yerlerini aldıysa, bu sıradaki hamlelerinin önüne geçmek yerine, eğer varsa, bir sonraki en iyi hamlelerini yapacaklardır. Aydınlatılmış.
Dr. Rebmu

Yanıtlar:


3

Perl 6: 741 karakter, 758 bayt

Golfen sürümü temelde keten olduğundan, altta. Yukarıda benim golf öncesi versiyonu. Her ikisi de etkileşimlidir (giriş dosyasından mümkün olduğunca çok komut okuyacak ve daha sonra komut almak için STDIN kullanmaya devam edeceklerdir). Orijinal karakterleri ve renkleri kullanmaya çalışırlar.

Kullanımı gibi 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;

Golfçü versiyon:

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;

Mutlu Paskalyalar!


Kod golf kuralları, bu nedenle, çözümün kazanıyor ... Perl'i çok sevmese bile. ;-) Konsol ve renk ile iyi iş!
Dr. Rebmu

14

Java, 1.843

Bu bulmacayı Java ile çözmeyi ilk denemem. Biliyorum, kısaltmak için birçok gelişme var. Ama sonunda şimdilik çalışıyor.

Denemek için bir sınıf oluşturmanız Cve kodu yapıştırmanız gerekir. args[0](açık konuşmak gerekirse a[0]) giriş içindir. Bulmacanın çıktısı için gerekli olmadığından haritanın yazdırma yöntemi dahil değildir.

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

Çalıştırmak için örneğin şunu deneyin:

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

Bir canavarın oyuncuyu yemesinden önceki son büyük senaryonun çıktısı:

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

Aptal satır boşlukları olmadan: http://pastebin.com/raw.php?i=QhpxKcCT

Yani oyuncuların hamlelerden sonra yolu bitiyor RRDDDRRRWW, çünkü son Waitinde soldaki canavar oyuncuyu yemek için sağa gidecek.


Orijinal büyük haritanın başka bir örneği ancak farklı hamleler:

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

Bu animasyona bakın: http://youtu.be/0DIhEhjWd6s


Ve orijinal harita ve farklı hareketlerle son örnek (yeni canavar hareketi kurallarına göre):

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

Youtube'da bakın: http://youtu.be/jXPzL88TU2A


1
HHHa! :-) Çok havalı. Aldığınız sürece, birkaç oyun oynamayı ve bu haritada daha fazla test durumu verisi vermeyi düşünüyor musunuz?
Dr. Rebmu

Orijinal harita ve farklı hareketlerle yeni bir senaryo ekledim. Ama gerçekten adımları takip edemezsiniz, çünkü 75 adımı yapıştırmak için yapıştırmak istemedim :)
bobbel

Sonuç olarak bir animasyon olarak görmek için bir video ekledim!
bobbel

İyi video ... hayvanların herhangi bir eğlence için çok hızlı hareket ettiğini gösteriyor gibi görünüyor! Kuralı değiştirmeli miyiz, böylece her tur yerine her turu değiştirecekler mi?
Dr. Rebmu

Umurumda değil. Benim için yaklaşık on byte daha! Ama tamamen katılıyorum. Şimdi olduğu gibi kazanmak zor :)
bobbel

5

C - 1004 984 917

Ahh, C'nin güzelliği. Diğer cevabın ruhunu takiben benimkini de biçimlendirmeye çalıştım :)

Hala orada bazı gelişmeler olduğunu hayal ediyorum, ama bu yazmak ve golf gerçekten eğlenceliydi. Karakter sayısı, gerekli tüm boşlukları ve yeni satırları içerir.

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

Bunu tüm örnek vakalar ve birkaç tane daha ile test ettim ve düzgün çalışıyor gibi görünüyor. Eğer birisi düzgün cevap vermediği bir durum bulursa, lütfen bana bildirin.

Girdi stdin'den ve çıkış stdout'a. Yanlış giriş kontrolü yoktur. Ve eğer oyuncu yenilirse veya tüm hareketler yapıldıktan sonra oyuncu canlıysa skoru döndürür (hala Hetrafta olsa bile) .

Ungolfed sürümü:

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

Güzel!! @ Bobbel'in RRRUWWWRRRURWWWWRDRRWWRDWWWWD büyük haritadaki girdisine rağmen, 8 alırken 6 elde edersiniz. Bir video yaptı , belki her adımı yazdırabilir ve herhangi bir anormallik
arayabilirsiniz

(elbette, canavarların her turda ne kadar oynanamaz olduğunu gördüğümde canavarların her dönüşte hareket etmesini sağlamak için kuralı değiştirdiğimi fark ettim ...!)
Dr. Rebmu

Dürüst olmak gerekirse: Çözümüm de% 100 düzgün çalışıyorsa emin değilim. Ama bana benziyor :)
bobbel

@ Dr.Rebmu Soruyu, benimkini yayınladığım sırada düzenlediğinizi fark ettim. Bu yüzden görünüşte işe yarayan hızlı bir kesmek yaptım. Bu hafta sonu tekrar kontrol edip güncelleyeceğim. Ben de "güzel" bir sürüm
yayınlayacağım,

FWIW Bunu bugün Rebol'da çözdüm ve bobbel'in 8 cevabını da alıyorum.
Dr. Rebmu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.