Minesweeper-Gitter generieren


14

Minesweeper ist ein Logikspiel, das auf den meisten Betriebssystemen zu finden ist. Das Ziel des Spiels ist es, zu bestimmen, wo sich die Minen auf einem Gitter befinden. Die angegebenen Zahlen geben die Anzahl der Minen um diesen Punkt an.

Erstellen Sie bei gegebener Rastergröße und einer Reihe von Minen das Minesweeper-Raster für diese Minen.

Eingabe: Zwei Ganzzahlen, die die Rastergröße angeben, und eine undefinierte Anzahl von Ganzzahlen, die die Minenpositionen angeben. Die Positionen werden als (Spaltenposition, Zeilenposition) angegeben und die Indizes beginnen in Zeile 1.

Ausgabe: Das Minesweeper-Gitter. Wenn sich um einen Block keine Minen befinden, drucken Sie ein x. Drucken Sie für jede neue Zeile eine neue Zeile. Bitte geben Sie alle Minen als Stern aus *. Lassen Sie beim Drucken kein Leerzeichen zwischen den Werten in der Zeile.

Testfälle:

Eingabe "5 5 1 3 3 5 2 4":

xxxxx
11xxx
*21xx
2*21x
12*1x

Eingabe "3 4 3 1 1 4 2 3 3 2":

x2*
13*
2*2
*21

Kürzester Code gewinnt.


Können wir davon ausgehen, dass alle Eingaben eine gerade Anzahl von Argumenten haben werden? dh 5 5 1wird nie bestanden?
Gaffi

@ Gaffi: Ja. Die Eingabe ist immer eine gültige Eingabe.
beary605

Die Spezifikation lässt den Leser derzeit aus den Beispielen ableiten, dass die Positionen 1-basierte Indizes verwenden und dass Zeile 1 oben steht. (Oder ist letzteres zumindest verhandelbar?)
Peter Taylor

@ PeterTaylor: Ja. Ich denke, ich sollte es offensichtlicher machen.
beary605

1
Kein Problem. Ich bin immer noch fest entschlossen, ein paar Charaktere zu rasieren und die Führung zurückzugewinnen. :-)
Gareth

Antworten:


10

GolfScript 122 98 94 93 91 88 87 85 82 81 80 71

~]2/(\:m;~\:w*,{[.w%)\w/)]:^m\?)42{m{^*~-.*@@-.*+3<},,72or 48+}if}%w/n*

Online-Demos:

Testfall 1: Link

Testfall 2: Link


!!{a}{b}ifVerwendet ein Zeichen mehr als nötig. '*'kann durch ersetzt werden, 42da Sie es in ein Array einfügen und dann das Array stringifizieren. Ebenso können Sie ASCII-Codes für die anderen Ausgabezeichen verwenden und ein Zeichen mit speichern or, um den Sonderfall zu behandeln.
Peter Taylor

@PeterTaylor Wow, !!{a}{b}ifwar in der Tat wirklich dumm. :) Es ist lustig, welche Fehler Sie auf höchster Ebene machen können, während Sie sich auf Details konzentrieren. Ich kann nicht herausfinden, was Sie damit gemeint haben or.
Cristian Lupascu

Tatsächlich! Es hilft auch, nach einiger Zeit auf ein Problem zurückzukommen. Als ich ein paar Codezerlegungen für mein GolfScript-Blog schrieb, entdeckte ich erhebliche Verbesserungen. In Bezug auf meinen letzten Vorschlag, nachdem ,,Sie eine Nummer haben. Sie möchten es in den entsprechenden String (oder ASCII-Code) konvertieren, es sei denn, es ist 0. In diesem Fall möchten Sie x. Die ASCII-Codes für Ziffern sind sequentiell und werden ab 48 ausgeführt. xASCII 120 entspricht 72 + 48. So können Sie 72or 48+ein Zeichen über den String-basierten Ansatz erstellen und speichern.
Peter Taylor

@PeterTaylor Großartig! Bevor du geantwortet hast, habe ich es geschafft, diesen Teil auf zu reduzieren .48 120if+, aber dein orTrick ist zwei Zeichen kürzer.
Cristian Lupascu

@ w0lf Gah! Gerade wenn ich denke, ich habe den Vorsprung zurück!
Gareth

8

J, 124 116 112 101 87 86 85 84 83 82 79 76 75 72 68 Zeichen

'0x'charsub|:1":3 3(+/@,+9*4&{@,);._3[1(}.x)}0$~2+>{.x=._2<\".1!:1[1

Ich habe gefunden, wonach ich gesucht habe - eine Möglichkeit, die Leerzeichen loszuwerden ( 1":) - und schließlich bin ich wettbewerbsfähig. Jetzt muss ich nur noch das Problem mit den leeren Minensätzen herausfinden.

Übernimmt Eingaben von der Tastatur.

Bearbeiten

Neue Version nutzt einen Nebeneffekt von 1":- Zahlen größer als 9 werden durch ersetzt *.


Ich habe zwei Dinge bemerkt: 1. Es druckt Leerzeichen anstatt 0, nicht x; 2. Scheitert, wenn der 10 10|length error
Minensatz

Aber ansonsten funktioniert es, also +1.
Cristian Lupascu

@w0lf Ah, ich habe noch an den ersten Entwurf der Frage gedacht - in dieser Version xnur ein Leerzeichen. Ich habe nicht bemerkt, dass es sich geändert hat. Hmm, hätte nie gedacht, dass die Minen leer sind ... Daran muss ich arbeiten.
Gareth

jetzt sehe ich, dass die frage bearbeitet wurde. Ich hatte die alte Revision nicht gesehen. :)
Cristian Lupascu

@w0lf Danke. Ich fand ein paar gute Umlagerungen, die dazu beitrugen, einige unnötige Klammern loszuwerden. Ich sehe ein Leerzeichen, das ich entfernen könnte, aber ich vermute, dass ich so ziemlich an meiner Grenze bin. Und es gibt immer noch das Problem mit der Liste leerer Minen ... :-)
Gareth

2

Mathematica - 247 Zeichen

s[q_] :=
  Module[{d, r},
    d = ToExpression@Partition[Cases[Characters@q, Except@" "], 2];
    r = Rest@d;
    StringJoin @@@ 
    ReplacePart[
    Table[ToString@
       Count[ChessboardDistance[{i, j}, #] & /@ Reverse /@ r, 1], {i,d[[1, 2]]}, 
       {j, d[[1, 1]]}] /. {"0" -> "x"}, # -> "*" & /@ Reverse /@ r] // TableForm]

Beispiele:

s@"5 5 1 3 3 5 2 4"
s@"3 4 3 1 1 4 2 3 3 2"

Ausgabe:

Ausgabe

ChessboardDistanceberechnet, wie weit jede Zelle von einer Mine entfernt ist, wobei 1 "neben einer Mine" entspricht. Die Countvon 1 ergibt die Nummer der Zelle. Dann werden Minen (*) in das Array eingefügt.


David, schön, einen anderen Mathematica- Benutzer hier zu sehen. Ich werde sehen, ob ich das schlagen kann! :-)
Mr.Wizard

@ Mr.Wizard Ich bin an Ihrer Lösung interessiert. Fühlen Sie sich frei, meine zu verbessern, wenn Sie möchten.
DavidC

2

Mathematica , 140, 139, 137

Grid[(ListConvolve[BoxMatrix@1,#,2,0]/. 0->x)(1-#)/. 0->"*"]&@Transpose@SparseArray[{##2}->1,#]&@@#~Partition~2&@@#~ImportString~"Table"&

Schreiben Sie das in einer besser lesbaren Form:

"5 5 1 3 3 5 2 4"

ImportString[%, "Table"][[1]] ~Partition~ 2

Transpose @ SparseArray[{##2} -> 1, #]& @@ %

ListConvolve[BoxMatrix@1, %, 2, 0]

(% /. 0 -> x) (1 - %%) /. 0 -> "*" // Grid

Elegant! Ich gebe zu, ich kann nicht verstehen, wie ListCorrelate[BoxMatrix@1, %, 2, 0]seine Magie funktioniert.
DavidC

@ David Ich bin froh, dass du (implizit) gefragt hast, weil das mein Lieblingsteil ist. ListCorrelateÜberlagert effektiv den Kernel ( BoxMatrix@1) an jeder Position im Gitter, multipliziert und gibt die Summe. (Pingen Sie mich im MMA-Chat an, wenn Sie eine Illustration wünschen.) - Ihr Kommentar erinnert mich daran, dass dies auch ListConvolvehier funktionieren sollte, da es eine Art Spiegelbild von ist ListCorrelateund mein Kernel symmetrisch ist. Das wird mir einen Charakter ersparen. :-)
Mr.Wizard

Ihr Code generiert fälschlicherweise eine Mine bei (5,5). "5 5" gibt die Abmessungen des Gitters an.
DavidC

@ David Danke. Du hast recht, aber es ist nur in der White-Space-Version; Ich verlor irgendwie die 2in ##2. Ich werde es jetzt reparieren. ps: Wie sind Sie darauf aufmerksam geworden?
Mr.Wizard

Eine weitere Frage von Minensuchbooten, codegolf.stackexchange.com/questions/10635/… , ist kürzlich aufgetaucht, und ich habe mich entschlossen, Ihre Lösung noch einmal durchzusehen.
DavidC

1

VBA - 298 Zeichen

Sub m(x,y,ParamArray a())
On Error Resume Next:ReDim b(x,y):For i=0 To (UBound(a)-1) Step 2:c=a(i):d=a(i+1):b(c,d)="*":For e=c-1 To c+1:For f=d-1 To d+1:v=b(e,f):If v<>"*" Then b(e,f)=v+1
Next:Next:Next:For f=1 To y:For e=1 To x:v=b(e,f):s=s & IIf(v<>"",v,"x")
Next:s=s & vbCr:Next:MsgBox s
End Sub

Überspringen von Fehlern mit On Error Resume Nextgespeicherten Zeichen, aber dies ist bei weitem nicht so gut wie bei einigen anderen Antworten. : - /


1

Python, 192 182 180 Zeichen

Ich könnte einiges sparen, wenn die Eingabe durch Kommas getrennt wäre. Dann wäre die erste Zeile d=input()und die Länge 171 Zeichen.
Es wäre auch hilfreich, wenn die Minenkoordinaten auf 0 und nicht auf 1 basieren würden. Die Überwindung hat mich 8 Zeichen gekostet.

d=map(int,raw_input().split())
m=zip(d[2::2],d[3::2])
for y in range(d[1]):print"".join((str(sum(abs(a-x-1)|abs(b-y-1)<2for a,b in m)or'x')+'*')[(x+1,y+1)in m]for x in range(d[0]))

Ungolfed-Version:

d=map(int,raw_input().split())          # Read whitespace terminated numbers into a list of numbers
xsize,ysize = d[:2]                     # The first two numbers are the board size
mines=zip(d[2::2],d[3::2])              # Convert items 3,4,5,6... to pairs (3,4),(5,6) representine mine coordinates

def dist(point,mine):                   # Distance between point (0-based coordinates) and mine (1-based coordinates)
    dx = abs(mine[0]-(point[0]+1))
    dy = abs(mine[1]-(point[1]+1))
    return dx | dy                      # Should be max(dx,dy), but this is close enough. Wrong for d>=2, but returns >=2 in this case.

for y in range(ysize):                  # Print lines one by one
    line_chars = [
        (str(
            sum(dist((x,y),(a,b))<2 for a,b in mines)   # Number of neighboring mines
            or 'x'                                  # 'x' instead of 0
        )
        +'*')                                       # For a single neighbor, we get "1*"
        [(x+1,y+1)in mines]                         # If a mine, get the '*', else the neighbor number
        for x in range(xsize)
    ]
    print "".join(line_chars)

1

Scala, 280 Zeichen

val n=readLine split" "map{_.toInt}
val b=Array.fill(n(1),n(0))(0)
n drop 2 sliding(2,2)foreach{case Array(x,y)=>b(y-1)(x-1)=9
for{i<-(x-2 max 0)to(x min n(0)-1);j<-(y-2 max 0)to(y min n(1)-1)}b(j)(i)+=1}
b.map{r=>println(r.map{case 0=>"x"case x if x>8=>"*"case x=>""+x}mkString)}

0

C ++ - 454 Zeichen

Dies ist schlimmer als meine VBA-Antwort, was wahrscheinlich bedeutet, dass ich nicht weiß, was ich in C ++ tue. Ich versuche jedoch, auf dem aufzubauen, was ich über C ++ weiß. Wenn jemand Verbesserungsvorschläge hat, wäre ich dankbar, wenn ich sie höre!

#define Z for(int i=
#define Y for(int j=
#define X d[i][j]
#define W Z 0;i<x;i++){
#define V Y 0;j<y;j++){
#define U cout<<
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
int main(){using namespace std;int x,y,a,b;cin>>y>>x;string c[x][y];int d[x][y];W V X=0;}}while(cin>>b>>a){c[--a][--b]="*";Z a-1;i<=a+1;i++){Y b-1;j<=b+1;j++){if(x>i&&i>=0&&y>j&&j>=0){X=X+1;}}}}W V if(c[i][j]!="*"){if(X>0){U X;}else{U"x";}}else{U"*";}}U endl;}return 0;}

das brauchst du nicht return 0. Und Sie können #include<cstdio>, #include<cstdlib>. Sie können diese beiden Includes sogar löschen !. Was mehr ist, using name.....ist zu lang, können Sie std::cin, std::cout, std::stringstattdessen verwenden.
Ray

@ Ray Aye, du hast Recht mit dem Namensraum ... Es ist schon eine Weile her, seit ich das zusammengestellt habe, aber ich denke, ich hatte mehr std::Anrufe, die es mehr wert gemacht hätten (ich denke, ein weiterer stringhätte es getan) ). Danke auch für die Infos zu den #includeLeitungen. Ich bin kein C ++ - Experte. ;-)
Gaffi

0

C # (691 Zeichen)

using System;namespace M{class P{static char C(char[][] g,int r,int c){int n=0;for(int i=r-1;i<=r+1;i++){if(i<0||i>=g.Length)continue;for(int j=c-1;j<=c+1;j++){if((j<0||j>=g[0].Length)||(i==r&&j==c))continue;if(g[i][j]=='*')n++;}}return n==0?'x':(char)(n+48);}static char[][] G(int[] p){char[][] r=new char[p[1]][];for(int i=0;i<r.Length;i++)r[i]=new char[p[0]];for(int i=2;i<p.Length;){r[p[i+1]-1][p[i]-1]='*';i+=2;}for(int i=0;i<r.Length;i++)for(int j=0; j<r[0].Length;j++)if(r[i][j]!='*')r[i][j]=C(r,i,j);for(int i=0;i<r.Length;i++){for(int j=0;j<r[0].Length;j++)Console.Write(r[i][j]);Console.WriteLine();}return r;}static void Main(string[] args){G(new int[]{3,4,3,1,1,4,2,3,3,2});}}}

Nicht Golf Version:

using System;
namespace M
{
    class P
    {
        static char C(char[][] g, int r, int c)
        {
            int n = 0;
            for (int i = r - 1; i <= r + 1; i++)
            {
                if (i < 0 || i >= g.Length) continue;
                for (int j = c - 1; j <= c + 1; j++)
                {
                    if ((j < 0 || j >= g[0].Length) || (i == r && j == c)) continue;
                    if (g[i][j] == '*') n++;
                }
            }
            return n == 0 ? 'x' : (char)(n + 48);
        }

        static char[][] G(int[] p)
        {
            char[][] r = new char[p[1]][];
            for (int i = 0; i < r.Length; i++)
                r[i] = new char[p[0]];
            for (int i = 2; i < p.Length; )
            {
                r[p[i + 1] - 1][p[i] - 1] = '*';
                i += 2;
            }
            for (int i = 0; i < r.Length; i++)
                for (int j = 0; j < r[0].Length; j++)
                    if (r[i][j] != '*') r[i][j] = C(r, i, j);
            for (int i = 0; i < r.Length; i++)
            {
                for (int j = 0; j < r[0].Length; j++)
                    Console.Write(r[i][j]);
                Console.WriteLine();
            } return r;
        } 
        static void Main(string[] args) 
        { 
            G(new int[] { 3, 4, 3, 1, 1, 4, 2, 3, 3, 2 }); 
        }
    }
}

0

K 175

f:{g::(y;x)#(x*y)#"x";{.[`g;x;:;"*"]}@'-1+|:'(_(#z)%2;2)#z;{if[~"0"~z;$["x"=g .(x;y);.[`g;(x;y);:;z];]]}.'i,'$s:+/'{"*"=g . x}''{,/((x-1)+!3),\:/:(y-1)+!3}.'i:,/(!x),\:/:!y;g}

.

k)f[5;5;1 3 3 5 2 4]
"xxxxx"
"11xxx"
"*21xx"
"2*21x"
"12*1x"
k)f[3;4;3 1 1 4 2 3 3 2]
"x2*"
"13*"
"2*2"
"*21"

0

ECMAScript 2019 (Modernes Javascript) - 116 Bytes

m.map((r,i)=>r.map((c,j)=>c=='X'?c:[,...m].splice(i,3).map(r=>[,...r].splice(j,3)).flat().filter(v=>v=='X').length))

ungolfed version

m.map(
  (r,i) => r.map(
    (c,j) => c=='X' ? c :
      [,...m].splice(i,3).map(r=>[,...r].splice(j,3)).flat().filter(v=>v=='X').length
  )
)

Diese Lösung hält sich nicht strikt an das Eingabe- / Ausgabeformat, sondern demonstriert einen prägnanten Algorithmus.

Beispiel: https://gist.github.com/missinglink/ee02084cfb523665e8c9d34c24f01537


0

Brainfuck , 1001 896 Bytes

,[>,]-[<]>>++[<[<+<+>>-]<[>+<-]>[>]>[>>[>>>>]>]++[-<+]-[<]<++[>>[>]>[>>[>>>>]>]+<++[-<+]-[<]<-]>>>-]>[>]>[>>[>>>>]<<<->>>>]+[-<+]-[<]>>[[>]>--<<[<]>>[[>]+[->+]+>>[>>>>]>--<+[-<+]-[<]>>-]>[>]+[->+]+>>--<+[-<+]-[<]<[>>[>]+[->+]+>>>>--<+[-<+]-[<]<-]>>[>]+[->+]+>++[-<+]-[<]>>]>[+>>[>>>>]>]<<<<<[<<<<]>>-<+[-<+]>>>>[>>>>]>[-[--<<<<<[<<<<]>>>>--[>>>>]>>>[>>>>]>>>--<+[-<+]++>>>>>>[>[<--<<<[-[>>>>>>+<<<<<+<-]>+<]>[<+>-]>>>>+++[<<<+[-<+]->[-[+[->+]->>>+<<<<+[-<+]->>+<-]>+<]>[<+>-]+[->+]->>-[<<<+[-<+]+>>>>-->+[->+]->>[<<<+>>>-]]<<<[>>>+<<<-]>>>]<<<+[-<+]+<<<<-->+[->+]->>>>>[-[<<+>>>+<-]>+<]>[<+>-]<<<<+++[+[->+]->[-[<<+[-<+]->>>++[->+]->>+<-]>+<]>[<+>-]<<<+[-<+]->>-[+[->+]+>>>>--<+[-<+]->>[<<<+>>>-]]<<<[>>>+<<<-]>>>]+[->+]+<<<<--<+[-<+]->-[>>[-]<<++++++[>++++++<-]>.[-]+<<<]<[>>>[<++++++[>++++++++<-]>.[-]<]<<<[<++++++++[<+++++++++++>-]<.[-]>]<]>>>>+<<++>]>[<+>-]>>]->+[->+]++[-<+]++++++++++.[-]]>]

Probieren Sie es online! oder probieren Sie die alte Version mit Integer-Eingabe

Ein Tag Programmieren und drei Tage Bugfixing ^^

Dabei werden einige Teile meines Game Of Life-Codes verwendet. Anstatt lebende Zellen zu zählen, zählt dies Bomben. Da die Eingabe als Codepunkte nach den allgemeinen Regeln zulässig ist, werden diese anstelle von "lesbaren" Ganzzahlen verwendet.

[
Data: colCount, rowCount, {BombCoordinates}, -1 (start of arrays/"soa"), 0, {RowData}
BombCoordinates: bombCol, bombRow
RowData: rowFlag, 0, {CellData}, 0
CellData: cellFlag, cellState, temp, bombCount

rowFlag: 0=EOF, 1=inactive (all cells inactive), 2=active
cellFlag: -1=marker for finding cell (cell to be counted or current cell), 0=EOF, 1=normal
cellState: 0=inactive, 1=normal, 2=bomb
temp: helper to exit if-statements
bombCount: count of neighbor cells that contain bombs
inactive cells or rows will not be printed. They are only used for an easier counting algorithm.
]

#### input values as codepoints ####
,[>,]

#### setup two dimensional array ####
-                   set soa
[<]>>               go to rowCount
++                  add two inactive rows
[                   for each row
  <[<+<+>>-]          copy colCount two times to the next left cells
  <[>+<-]             move one of the copies back to the original cell
  >[>]>[>>[>>>>]>]    go to new row position
  +                   set rowFlag (only 1 while initialization)
  +[-<+]-[<]<         go to copy of colCount
  ++                  add two inactive cells per row
  [                   for each col
    >>[>]>[>>[>>>>]>]   go to new cell position
    +<+                 set cellFlag and cellState = normal
    +[-<+]-[<]<         return to copy of colCount
    -                   decrement
  ]
  >>>-                decrement rowCount
]

#### setup active/inactive flags of cells ####
>[>]>[              for each row
  >>[>>>>]<<<-        set last cell inactive
  >>>>                go to next row
]

#### mark the bombs ####
+[-<+]-[<]>>        go to bombRow
[                   while there are bombRow values left
  [>]>--              set rowFlag of first row = neg 1 (as a marker)
  <<[<]>>             return to bombRow
  [                   for each bombRow
    [>]+[->+]           find first marker after soa
    +                   set rowFlag = 1
    >>[>>>>]>           go to next rowFlag
    --                  make a marker of it
    <+[-<+]-[<]>>       return to bombRow
    -                   decrement
  ]
  >[>]+[->+]          go to selected rowFlag
  +                   set rowFlag = 1
  >>--                set cellFlag of first cell = marker
  <+[-<+]-[<]<        go to bombCol
  [                   for each bombCol
    >>[>]+[->+]         find first marker after soa
    +                   set cellState = 1
    >>>>                go to next cellState
    --                  set it neg 1 (as a marker)
    <+[-<+]-[<]<        return to bombCol
    -                   decrement
  ]
  >>[>]+[->+]         find first marker after soa
  +                   set cellFlag = normal
  >+                  set cellState = bomb
  +[-<+]-[<]>>        go to next bombRow
]

#### setup active/inactive flags of rows ####
>[                  for each row
  +                   set rowFlag = 2 (active)
  >>[>>>>]>           go to next rowFlag
]
<<<<<[<<<<]>>-      set rowFlag of last row = 1 (inactive)

#### count bombs in neighborhood ####
<+[-<+]>>>>[>>>>]>  go to second row
[                   for each row
  -[                  if active
    --                  set it neg 1 (marker)
    <<<<<[<<<<]>>>>     go to cellFlag of first cell in previous row
    --                  set it neg 1 (marker)
    [>>>>]>>>[>>>>]>>>  go to cellFlag of first cell in next row
    --                  set it neg 1 (marker)
    <+[-<+]             return to rowFlag
    ++                  set rowFlag = 2 (active)

    >> >>>>[            for each cell (starting with second)
      >[                  if active
        <--                 set cellFlag = neg 1 (marker)

        # check if cell to the left is a bomb
        < <<                go to cellState of previous cell
        [                   if active
          -[                  if bomb
            >> >>>>+            increment bombCount
            <<<< <              go back to checked cell
            +                   set temp = 1
            <-                  set cellState = 0 to exit if
          ]
          >+<                 increment temp
        ]
        >[<+>-]             restore cellState

        # check if cells on top are bombs
        > >>>               go to temp of current cell
        +++[                do three times
          <<<+[-<+]-          go to next marker to the left
          >[                  if active
            -[                  if bomb
              +[->+]-             return to current cell
              >>>+                increment bombCount
              <<<<+[-<+]->        return to counted cell
              >+                  set temp = 1
              <-                  set cellState = 0 to exit if
            ]
            >+<                 increment temp
          ]
          >[<+>-]             restore cellState
          +[->+]-             go to current cell
          >>-                 decrement temp
          [                   if temp != 0
            <<<+[-<+]           go to marked cell
            +                   set cellFlag = normal
            >>>>--              set cellFlag of next cell = marker
            >+[->+]->>          return to currentCell temp
            [<<<+>>>-]          store value of temp in previous cell bombCount (to exit if)
          ]
          <<<[>>>+<<<-]>>>    restore temp value
        ]
        <<<+[-<+]           go to marked cell
        +                   set cellFlag = normal
        <<<<--              set previous cellFlag = marker
        >+[->+]-            return to current cell

        # check if cell to the right is a bomb
        >>> >>              go to cellState of next cell
        [                   if active
          -[                  if bomb
            <<+                 increment bombCount
            >>>                 go back to checked cell
            +                   set temp = 1
            <-                  set cellState = 0 to exit if
          ]
          >+<                 increment temp
        ]
        >[<+>-]             restore cellState

        # check if cells below are bombs
        <<< <               go to currentCell temp
        +++[                do three times
          +[->+]-         go to next marker to the right
          >[              if active
            -[              if bomb
              <<+[-<+]-       return to current cell
              >>>+            increment bombCount
              +[->+]->        return to counted cell
              >+              set temp = 1
              <-              set cellState = 0 to exit if
            ]
            >+<             increment temp
          ]
          >[<+>-]         restore cellState
          <<<+[-<+]-      go to current cell
          >>-             decrement temp
          [               if temp != 0
            +[->+]          go to marked cell
            +               set cellFlag = normal
            >>>>--          set cellFlag of next cell = marker
            <+[-<+]->>      return to currentCell temp
            [<<<+>>>-]      store value of temp in previous cell bombCount (to exit if)
          ]
          <<<[>>>+<<<-]>>>restore temp value
        ]
        +[->+]          go to marked cell
        +               set cellFlag = normal
        <<<<--          set previous cellFlag = marker
        <+[-<+]-        return to current cell

        # print
        >-[             if bomb
          >>[-]<<         delete bombCount
          ++++++[>++++++<-]>.print "*"
          [-]+            set temp = 1
          <<<             use previous cell bombCount as exitIf
        ]
        <[              else
          >>>[            if bombCount != 0
            <++++++[>++++++++<-]add 48 to get ascii number
            >.              print
            [-]             set number = 0 (for use as exitIf from next cell)
            <               go to temp for exit if
          ]
          <<<[            else
            <++++++++[<+++++++++++>-]<.print "X"
            [-]             delete value (for use as exitIf from next cell)
            >               go to exitIf
          ]
          <               go to exitElse
        ]
        > >>>+          increment temp
        <<++>           set cellFlag = normal
      ]
      >[<+>-]         restore cellState
      >>              go to cellFlag of next cell
    ]
    -               set marker
    >+[->+]         go to next marker
    +               set cellFlag = normal
    +[-<+]          return to marker
    +++++ +++++.[-] print newline
  ]
  >               go to next row
]

0

Dies ist der Beginn einer Brainfuck-Lösung. Es sollte mit Einrückungen und Stapelkommentaren gut lesbar sein ( @gibt den Stapelzeiger an):

>>,>,  |0|x|@y| Pop the first two characters
[>>+<<-]>>  |0|x|0|0|@y|
[<<+>+>-]<  |0|x|@y|y|0|
[  |0|x|y|@y|
  [>>+<<-]< |0|x|@y|0|0|y|
  [>>+<<-]< |0|@x|0|0|y|y|
  [>>+<<-]>> |0|0|0|@x|y|y|
  [<<+>+>-]<<  |0|@x|x|0|y|y|
  [>>+<<-]> |0|0|@x|x|y|y|
  [<< |@0|0|x|x|y|y|
    ++++++++[>+++++++++++<-]>>>>> |0|88|x|x|@y|y|
    [>+<-]< [>+<-]< [>+<-]< [>+<-]< |0|@88|0|x|x|y|y|
    [<+>-]>>-  |88|0|0|@x_1|x|y|y|
  ]<< |x x's|@0|0|0|x|y|y|
  ++++++++++>>> x's|\n|0|0|@x|y|y|
  [<+>-]>  x's|\n|0|x|0|@y|y|
  [<+>-]>  x's|\n|0|x|y|0|@y|
  [<+>-]<- |x 88s|0|x|@y_1|y|
] |@x 88s|0|x|y|

Es ist jedoch alles andere als vollständig und ich beginne zu zweifeln, ob mein Ansatz optimal ist. Bisher werden nur die ersten beiden eingegebenen Zeichen berücksichtigt und eine Tabelle mit Xs gedruckt. Zum Beispiel würde "43" Ihnen geben:

XXXX
XXXX
XXXX

Ich würde gerne sehen, ob jemand anderes das Zeug dazu hat und in der Lage ist, dieses Problem in Brainfuck zu lösen.


Optimal ist für mich völlig irrelevant, wenn ich mich mit BrainFuck beschäftige. Auf welche Dolmetscherspezifikationen zielen Sie ab? Wie 8-Bit-Zellen oder was? Ich würde es lieben, wenn das fertig wäre.
Captncraig

Ich denke, es ist ziemlich unabhängig von einem bestimmten Interpreter? Solange die Zahlen nicht unangemessen groß sind.
Paldepind

An einer Soulution zu arbeiten, stellt sich natürlich immer als schwieriger heraus, als es zunächst in Brainfuck scheint.
Captncraig

Ich habe die letzten Tage damit verbracht, einen Brainfuck-Code dafür zu erstellen.
Dorian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.