Generazione di griglie per dragamine


14

Minesweeper è un gioco di logica presente sulla maggior parte dei SO. L'obiettivo del gioco è determinare dove si trovano le mine su una griglia, dati i numeri che indicano il numero di mine attorno a quel punto.

Data una dimensione della griglia e un set di mine, genera la griglia di Minesweeper per quel set di mine.

Input: due numeri interi che indicano le dimensioni della griglia e un numero indefinito di numeri interi che indicano le posizioni delle mine. Le posizioni verranno indicate come (posizione della colonna, posizione della riga) e gli indici inizieranno alla riga 1.

Output: la griglia di Minesweeper. Se non ci sono mine attorno a un blocco, stampare un x. Per ogni nuova riga, stampa una nuova riga. Invia tutte le miniere come un asterisco *. Non lasciare spazi bianchi tra i valori nella riga durante la stampa.

Casi test:

Ingresso "5 5 1 3 3 5 2 4":

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

Ingresso "3 4 3 1 1 4 2 3 3 2":

x2*
13*
2*2
*21

Il codice più corto vince.


Siamo sicuri di presumere che tutti gli input abbiano un numero pari di argomenti? cioè 5 5 1non sarà mai passato?
Gaffi,

@Gaffi: Sì. L'input sarà sempre input valido.
beary605,

La specifica attualmente lascia il lettore a dedurre dagli esempi che le posizioni utilizzano indici basati su 1 e che la riga 1 è in cima. (O è il secondo, almeno, negoziabile?)
Peter Taylor,

@PeterTaylor: Sì. Immagino che dovrei renderlo più ovvio.
beary605,

1
Nessun problema. Sono ancora determinato a trovare un modo per radere un paio di personaggi e riguadagnare il comando. :-)
Gareth,

Risposte:


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*

Demo online:

Caso di prova 1: collegamento

Caso di prova 2: collegamento


!!{a}{b}ifusa un carattere in più del necessario. '*'può essere sostituito con 42perché lo stai inserendo in un array e quindi stringendo l'array. Allo stesso modo è possibile utilizzare i codici ASCII per gli altri caratteri di output e salvare un carattere con orper gestire il caso speciale.
Peter Taylor,

@PeterTaylor Wow, !!{a}{b}ifera davvero davvero stupido. :) È divertente quali errori di alto livello puoi fare mentre ti concentri sui dettagli. Non riesco a capire cosa volevi dire usando or.
Cristian Lupascu,

Infatti! Anche tornare a un problema dopo il tempo aiuta. Quando ho scritto un paio di dissezioni di codice per il mio blog GolfScript ho notato notevoli miglioramenti. Per quanto riguarda il mio ultimo suggerimento, dopo ,,che hai un numero. Vuoi convertirlo nella stringa corrispondente (o codice ASCII) a meno che non sia 0, nel qual caso vuoi x. I codici ASCII per le cifre sono sequenziali ed eseguiti da 48. xè ASCII 120, ovvero 72 + 48. Quindi puoi fare 72or 48+e salvare un personaggio con l'approccio basato su stringhe.
Peter Taylor,

@PeterTaylor Ottimo! Prima che tu rispondessi, sono riuscito a ridurre quella parte a .48 120if+, ma il tuo ortrucco è più corto di due caratteri.
Cristian Lupascu,

@ w0lf Gah! Proprio quando penso di avere il vantaggio!
Gareth,

8

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

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

Ho trovato quello che cercavo - un modo per sbarazzarmi degli spazi ( 1":) - e finalmente sono competitivo. Ora ho solo bisogno di capire il problema del set vuoto di mine.

Riceve input dalla tastiera.

modificare

La nuova versione utilizza un effetto collaterale di 1":: i numeri maggiori di 9 sono sostituiti da *.


Ho notato due cose: 1. Stampa gli spazi anziché 0, non x; 2. Non riesce se il set di mine è vuoto (es: 10 10- dovrebbe stampare una scheda vuota 10x10, ma ritorna |length error)
Cristian Lupascu,

Ma funziona diversamente, quindi +1.
Cristian Lupascu,

@ w0lf Ah, stavo ancora pensando alla prima bozza della domanda - in quella versione xrappresentava solo uno spazio. Non ho notato che era cambiato. Hmm, non avrei mai pensato che il set di mine sarebbe stato vuoto ... Ci dovrò lavorare.
Gareth,

ora vedo che la domanda è stata modificata. Non avevo visto la vecchia revisione. :)
Cristian Lupascu,

@ w0lf Grazie. Ho trovato un paio di buoni riarrangiamenti che mi hanno aiutato a liberarmi di alcune parentesi non necessarie. Riesco a vedere uno spazio che potrei rimuovere, ma sospetto di essere praticamente al limite. E c'è ancora il problema dell'elenco delle miniere vuote ... :-)
Gareth,

2

Mathematica - 247 caratteri

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]

Esempi:

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

Produzione:

produzione

ChessboardDistancecalcola quanto dista ogni cella da una miniera, dove 1 corrisponde a "accanto a una miniera". Il Countsimbolo 1 indica il numero della cella. Quindi le mine (*) vengono inserite nell'array.


David, è bello vedere un altro utente Mathematica qui. Vedrò se riesco a battere questo! :-)
Mr.Wizard,

@ Mr.Wizard Sarò interessato a vedere la tua soluzione. Sentiti libero di migliorare il mio se vuoi.
DavidC,

2

Mathematica , 140 139 137

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

Scrivendolo in una forma più leggibile:

"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

Elegante! Confesso che non riesco a capire come ListCorrelate[BoxMatrix@1, %, 2, 0]funziona la sua magia.
DavidC,

@David Sono contento che tu (implicitamente) mi abbia chiesto perché è la mia parte preferita. ListCorrelatesovrappone efficacemente il kernel ( BoxMatrix@1) in ogni posizione della griglia, si moltiplica e fornisce la somma. (eseguimi un ping nella chat di mma se desideri un'illustrazione) - Il tuo commento mi ricorda che ListConvolvedovrebbe funzionare anche qui perché è una specie di immagine speculare ListCorrelatee il mio kernel è simmetrico. Questo mi salverà un personaggio. :-)
Mr.Wizard,

Il tuo codice genera erroneamente una miniera a (5,5). "5 5" indica le dimensioni della griglia.
DavidC

@ Grazie David. Hai ragione, ma è solo nella versione white-space; Ho in qualche modo perso l' 2entusiasmo ##2. Lo riparerò ora. ps: Come sei arrivato a notare questo dopo così tanto tempo?
Mr.Wizard,

Un'altra domanda dei dragamine, codegolf.stackexchange.com/questions/10635/… , è apparsa di recente e ho deciso di dare un'altra occhiata alla tua soluzione.
DavidC,

1

VBA - 298 caratteri

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

Ignorare gli errori On Error Resume Nextmi ha salvato alcuni personaggi, ma questo non è ancora buono come alcune delle altre risposte. : - /


1

Python, 192 182 180 caratteri

Potrei salvarne alcuni se l'input fosse separato da virgola. Quindi la prima riga sarebbe d=input()e la lunghezza 171 caratteri.
Avere le coordinate della miniera basate su 0 anziché su 1 sarebbe di aiuto. Mi è costato 8 caratteri da superare.

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]))

Versione non golfata:

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 caratteri

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 caratteri

Questo è peggio della mia risposta VBA, il che probabilmente significa che non so cosa sto facendo in C ++. Tuttavia, sto cercando di basarmi su ciò che so del C ++, quindi eccolo qui. Se qualcuno ha qualche suggerimento per migliorare, sarei grato di ascoltarli!

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

non è necessario return 0. E si può #include<cstdio>, #include<cstdlib>. Puoi persino eliminare queste due inclusioni !. Inoltre, using name.....è troppo lungo, puoi std::cin, std::cout, std::stringinvece usarlo .
Ray,

@Ray Aye, hai ragione riguardo allo spazio dei nomi ... È da un po 'che non lo metto insieme, ma sto pensando di avere più std::chiamate che ne avrebbero valso la pena (penso che ne stringavrebbe fatto uno in più ). Grazie anche per le informazioni sulle #includelinee. Non sono un esperto di C ++. ;-)
Gaffi,

0

C # (691 Chars)

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

Versione non golfata:

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 (Javascript moderno) - 116 byte

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

versione non golfata

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

questa soluzione non aderisce rigorosamente al formato input / output ma mostra un algoritmo sintetico.

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


0

Brainfuck , 1001 896 byte

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

Provalo online! oppure prova la versione precedente con input intero

Un giorno di programmazione e tre giorni di correzione di errori ^^

Questo utilizza alcune parti del mio codice Game Of Life. Invece di contare le cellule viventi, questo conta le bombe. Poiché l'input come punti di codice è consentito dalle regole generali, questo li utilizza invece di numeri interi "leggibili".

[
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

Questo è l'inizio di una soluzione Brainfuck. Dovrebbe essere abbastanza leggibile con commenti di incisione e stack ( @indica il puntatore dello stack):

>>,>,  |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|

È tuttavia tutt'altro che completo e sto iniziando a dubitare che il mio approccio sia ottimale. Finora considera solo i primi due caratteri di input e stampa una tabella di Xs. Ad esempio "43" ti darebbe:

XXXX
XXXX
XXXX

Mi piacerebbe vedere se qualcun altro ha quello che serve ed è in grado di risolvere questo problema in Brainfuck.


Optimal è del tutto irrilevante nella mia mente quando si tratta di BrainFuck. Quali specifiche di interprete stai prendendo di mira? Come celle a 8 bit o cosa? Mi piacerebbe vederlo finito.
captncraig,

Penso che sia abbastanza indipendente da qualsiasi integer specifico? Finché i numeri non sono irragionevolmente grandi.
paldepind,

Lavorare su un'anima, ma ovviamente risulta sempre più difficile di quanto sembri inizialmente in Brainfuck.
captncraig,

Ho trascorso gli ultimi giorni a creare un codice Brainfuck in esecuzione per questo.
Dorian,
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.