지뢰 찾기 그리드 생성


14

지뢰 찾기 는 대부분의 OS에서 발견되는 논리 게임입니다. 게임의 목표는 해당 지점 주변의 광산 수를 나타내는 숫자가 주어지면 지뢰가 그리드에있는 위치를 결정하는 것입니다.

그리드 크기와 광산 세트가 주어지면 해당 광산 세트에 대한 지뢰 찾기 그리드를 생성합니다.

입력 : 그리드 크기를 나타내는 2 개의 정수와 광산 위치를 나타내는 정의되지 않은 정수. 위치는 (열 위치, 행 위치)로 주어지며 인덱스는 1 행에서 시작합니다.

출력 : 지뢰 찾기 그리드. 블록 주위에 지뢰가 없으면을 인쇄하십시오 x. 새 행마다 줄 바꿈을 인쇄하십시오. 모든 광산을 별표로 출력하십시오 *. 인쇄시 행의 값 사이에 공백을 두지 마십시오.

테스트 사례 :

"5 5 1 3 3 5 2 4"입력 :

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

"34 3 1 1 2 3 3 2"를 입력하십시오 :

x2*
13*
2*2
*21

가장 짧은 코드가 승리합니다.


모든 입력에 짝수의 인수가 있다고 가정해도 안전합니까? 즉, 5 5 1전달되지 않습니다?
Gaffi

@Gaffi : 예. 입력은 항상 유효한 입력입니다.
beary605

이 스펙은 현재 독자들이 위치가 1 기반 인덱스를 사용하고 행 1이 맨 위에 있다는 예를 추론하도록 남겨두고 있습니다. (또는 적어도 후자는 협상 가능한가?)
Peter Taylor

@ 피터 테일러 : Ye. 나는 그것을 더 분명하게 만들어야한다고 생각합니다.
beary605

1
문제 없어요. 나는 여전히 두 명의 캐릭터를 면도하고 리드를 되 찾을 방법을 찾기로 결심했습니다. :-)
Gareth 2016 년

답변:


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*

온라인 데모 :

테스트 사례 1 : 링크

테스트 사례 2 : 링크


!!{a}{b}if하나 이상의 문자를 필요 이상으로 사용합니다. 배열에 넣은 다음 배열을 스트링 화하기 때문에 '*'대체 할 수 있습니다 42. 마찬가지로 다른 출력 문자에 ASCII 코드를 사용 or하고 특수한 경우를 처리하기 위해 문자를 저장할 수 있습니다.
피터 테일러

@PeterTaylor 와우, !!{a}{b}if정말 멍청했습니다. :) 세부 사항에 집중하면서 할 수있는 높은 수준의 실수는 재미 있습니다. 을 (를) 사용하여 무슨 뜻인지 알 수 없습니다 or.
Cristian Lupascu

과연! 시간이 지나면 문제로 돌아 오는 것도 도움이됩니다. 내 GolfScript 블로그에 대한 몇 가지 코드 해부를 작성했을 때 상당한 개선점을 발견했습니다. 내 마지막 제안과 관련하여, ,,당신은 숫자가 있습니다. 0이 아닌 경우 해당 문자열 (또는 ASCII 코드)로 변환하려고합니다.이 경우 x가 필요합니다. 숫자의 ASCII 코드는 순차적이며 48부터 실행됩니다. xASCII 120은 72 + 48입니다. 따라서 72or 48+문자열 기반 접근 방식을 통해 문자를 수행 하고 저장할 수 있습니다 .
피터 테일러

@PeterTaylor 위대한! 당신이 대답하기 전에 나는 그 부분을로 줄 .48 120if+였지만, 당신의 or트릭은 두 자 더 짧습니다.
Cristian Lupascu

@ w0lf가! 내가 리드를 되찾은 것 같아요!
Gareth

8

J, 124 (116) 112 (101) 87 86 85 84 83 82 79 개 76 75 72 68 문자

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

내가 찾고있는 것을 발견했습니다-공간을 없애는 방법 ( 1":)-마침내 나는 경쟁적입니다. 이제 빈 광산 문제 세트를 알아 내야합니다.

키보드에서 입력을받습니다.

편집하다

새 버전에서는 1":9보다 큰 숫자 의 부작용이 사용 됩니다 *.


나는 두 가지를 발견했습니다 : 1. 그것은 공백 대신 인쇄 0하지를 x; 2. 광산 세트가 비어 있으면 실패합니다 (예 : 10 10-빈 10x10 보드를 인쇄해야하지만을 반환해야 함 |length error)
Cristian Lupascu

그러나 더 이상 작동하지 않으므로 +1입니다.
Cristian Lupascu

@ w0lf 아, 나는 아직도 질문의 첫 번째 초안을 생각하고있었습니다. 그 버전에서 x단지 공간을 나타 냈습니다 . 나는 그것이 바뀌 었다는 것을 알지 못했다. 흠, 광산 세트가 비어 있다고 생각하지 않았습니다 ... 나는 그 일을해야합니다.
Gareth

이제 질문이 편집되었음을 알 수 있습니다. 이전 개정판을 보지 못했습니다. :)
Cristian Lupascu

@ w0lf 감사합니다. 불필요한 브래킷을 제거하는 데 도움이되는 몇 가지 좋은 재 배열을 발견했습니다. 하나의 공간을 제거 할 수 있지만 한계가 거의없는 것 같습니다. 그리고 여전히 빈 광산 목록 문제가 있습니다 ... :-)
Gareth

2

매스 매 티카-247 자

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]

예 :

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

산출:

산출

ChessboardDistance각 셀이 광산에서 얼마나 떨어져 있는지 계산합니다. 여기서 1은 "내 옆에"에 해당합니다. Count일 개의의는 세포의 수를 산출한다. 그런 다음 광산 (*)이 배열에 삽입됩니다.


David, 다른 Mathematica 사용자를 만나서 반가워요 . 내가 이길 수 있는지 보자! :-)
Mr.Wizard 2016 년

@ Mr.Wizard 솔루션을 보는 데 관심이 있습니다. 원한다면 내 것을 개선하십시오.
DavidC

2

매쓰 , 140 (139) 137

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

더 읽기 쉬운 형태로 작성 :

"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

우아한! 나는 ListCorrelate[BoxMatrix@1, %, 2, 0]그 마법 이 어떻게 작동 하는지 이해할 수 없다고 고백한다 .
DavidC

@David 나는 그것이 내가 가장 좋아하는 부분이기 때문에 (암묵적으로) 당신에게 기쁘다. 그리드의 각 위치에서 ListCorrelate커널 ( BoxMatrix@1)을 효과적으로 오버레이하고 곱한 다음 합계를 제공합니다. (당신이 그림을 원한다면 mma 채팅으로 나를 핑)-당신의 의견은 ListConvolve여기서 거울 이미지의 일종 ListCorrelate이며 내 커널은 대칭 이므로 여기에서도 작동해야한다는 것을 상기시킵니다 . 그것은 저에게 캐릭터를 구할 것입니다. :-)
Mr.Wizard

코드가 (5,5)에서 광산을 잘못 생성합니다. "5 5"는 격자의 치수를 나타냅니다.
DavidC

@David 감사합니다. 당신 말이 맞습니다. 그러나 그것은 공백 버전에만 있습니다. 나는 어떻게 든 손실 2에를 ##2. 이제 고칠 게요. 추신 : 어떻게 그렇게 오래 후에 이것을 알게 되었습니까?
Mr.Wizard

또 다른 지뢰 찾기 질문 인 codegolf.stackexchange.com/questions/10635/… 이 최근에 나타 났으며 솔루션에 다른 모양을 제공하기로 결정했습니다.
DavidC

1

VBA-298 자

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

오류를 건너 뛰면 On Error Resume Next일부 문자 가 저장되었지만 여전히 다른 대답보다 좋지 않습니다. :-/


1

파이썬 192 개 182 180 문자

입력이 쉼표로 구분되어 있으면 일부를 저장할 수 있습니다. 그런 다음 첫 번째 줄은 d=input()길이가 171 자입니다.
광산 좌표를 1 기반이 아닌 0 기반으로 조정하면 도움이됩니다. 극복하는 데 8 문자가 들었습니다.

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

언 골프 버전 :

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

스칼라, 280 자

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 자

이것은 내 VBA 답변보다 나쁩니다. 아마도 C ++에서 내가하는 일을 모른다는 것을 의미합니다. 그러나 나는 C ++에 대해 알고있는 것을 구축하려고 노력하고 있습니다. 누구든지 개선에 대한 제안이 있으면, 그 의견에 감사드립니다!

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

당신은 필요가 없습니다 return 0. 그리고 당신은 할 수 있습니다 #include<cstdio>, #include<cstdlib>. 이 두 포함을 삭제할 수도 있습니다!. 무엇보다, using name.....너무 오래, 당신은 사용할 수 있습니다 std::cin, std::cout, std::string대신.
Ray

@ Ray Aye, 당신은 네임 스페이스에 대해 맞습니다 ... 이걸 합한 지 오래되었습니다.하지만 std::더 가치가있는 전화 가 더 있다고 생각합니다 (하나 string더했을 것입니다) ). #include라인 에 대한 정보도 감사합니다 . 저는 C ++ 전문가가 아닙니다. ;-)
Gaffi

0

C # (691 문자)

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

골프 용이 아닌 버전 :

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 (현대 자바 스크립트)-116 바이트

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 버전

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

이 솔루션은 입력 / 출력 형식을 엄격하게 준수하지는 않지만 간결한 알고리즘을 보여줍니다.

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


0

brainfuck , 1001 896 바이트

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

온라인으로 사용해보십시오! 또는 정수 입력으로 이전 버전을 사용해보십시오

프로그래밍의 하루와 3 일의 버그 수정 ^^

이것은 내 게임 오브 라이프 코드의 일부를 사용합니다. 살아있는 세포를 세는 대신 폭탄을 세어보세요. 코드 포인트로서의 입력은 일반적인 규칙에 의해 허용되므로 "판독 가능"정수 대신에이를 사용합니다.

[
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

이것이 Brainfuck 솔루션의 시작입니다. indention과 스택 주석 ( @스택 포인터를 나타냄)으로 읽을 수 있어야합니다 .

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

그러나 그것은 완전하지 않으며 내 접근 방식이 최적인지 의심하기 시작합니다. 지금까지는 처음 두 개의 입력 문자 만 고려하고 X 표를 인쇄합니다. 예를 들어 "43"은 다음을 제공합니다.

XXXX
XXXX
XXXX

누군가 다른 사람이 가지고 있고 Brainfuck 에서이 문제를 해결할 수 있는지 확인하고 싶습니다.


BrainFuck을 다룰 때 Optimal은 전적으로 관련이 없습니다. 어떤 통역사 사양을 타겟팅하고 있습니까? 8 비트 셀처럼? 이 작업이 완료된 것을보고 싶습니다.
captncraig

나는 그것이 특정 통역사와는 꽤 독립적이라고 생각합니까? 숫자가 부당하게 크지 않은 한.
paldepind

soulution에 대한 작업은 물론 Brainfuck에서 처음보다 더 어려워 보입니다.
captncraig

나는 지난 며칠 동안 이것을 실행하는 brainfuck 코드를 작성했습니다.
Dorian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.