マインスイーパグリッドの生成


14

マインスイーパは、ほとんどのOSに搭載されているロジックゲームです。ゲームの目標は、そのスポット周辺の地雷の数を示す数字が与えられ、地雷がグリッド上のどこにあるかを判断することです。

グリッドサイズと一連の地雷を指定して、その一連の地雷の掃海艇グリッドを生成します。

入力:グリッドサイズを示す2つの整数と、地雷の位置を示す未定義の整数。位置は(列位置、行位置)として指定され、インデックスは行1から始まります。

出力:マインスイーパグリッド。ブロックの周囲に地雷がない場合は、を印刷しxます。新しい行ごとに、改行を印刷します。すべての地雷をアスタリスクとして出力してください*。印刷時に行の値の間に空白を残さないでください。

テストケース:

入力「5 5 1 3 3 5 2 4」:

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

入力「3 4 3 1 1 4 2 3 3 2」:

x2*
13*
2*2
*21

最短のコードが優先されます。


すべての入力に偶数の引数があると仮定しても安全ですか?すなわち、5 5 1決して渡されることはありませんか?
ガフィ

@Gaffi:はい。入力は常に有効な入力になります。
beary605

現在、仕様では、位置が1ベースのインデックスを使用し、行1が最上部にあることを、例から推測します。(または、少なくとも後者は交渉可能ですか?)
ピーターテイラー

@PeterTaylor:はい。もっとはっきりさせるべきだと思います。
beary605

1
問題ない。私はまだいくつかのキャラクターを剃り落とし、リードを取り戻す方法を見つけることを決心しています。:
ガレス

回答:


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必要以上に1文字を使用します。配列に入れてから配列を文字列化'*'する42ため、に置き換えることができます。同様に、他の出力文字にASCIIコードを使用しor、特殊なケースを処理するために文字を保存できます。
ピーターテイラー

@PeterTaylorうわー、!!{a}{b}if本当に馬鹿だった。:)詳細に集中しているときに、どのような高度なミスを犯すことができるのか、おかしいです。を使用してあなたが何を意味したのかわかりませんor
クリスチャンルパスク

確かに!時間の経過後に問題に戻ることも役立ちます。GolfScriptブログ用にいくつかのコード分析を書いたとき、かなりの改善が見られました。私の最後の提案に関して、,,あなたが数を手に入れた後。0でない限り、対応する文字列(またはASCIIコード)に変換します。その場合、xが必要です。数字のASCIIコードは連続しており、48から実行されます。ASCII120 xは72 + 48です。その72or 48+ため、文字列ベースのアプローチで文字を保存できます。
ピーターテイラー

@PeterTaylor素晴らしい!あなたが答える前に、私はその部分をに減らすことができました.48 120if+が、あなたのorトリックは2文字短くなります。
クリスチャンルパスク

@ w0lf Gah!リードを取り戻したと思うとき!
ガレス

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ていないが、x2.地雷のセットが空の場合は失敗します(例:10 10-空の10x10ボードを印刷する必要がありますが、戻ります|length error
Cristian Lupascu

しかし、そうでなければ機能するので、+ 1。
クリスチャンルパスク

@ w0lfああ、私はまだ質問の最初の草案を考えていました-そのバージョンではxちょうどスペースを表しています。変わったことに気づかなかった。うーん、鉱山のセットが空になるとは思わなかった...私はそれに取り組む必要があります。
ガレス

質問が編集されたことがわかりました。私は古いリビジョンを見ていませんでした。:)
クリスチャンルパスク

@ w0lfありがとう。いくつかの不必要なブラケットを取り除くのに役立ついくつかの適切な再配置を見つけました。削除できるスペースが1つありますが、ほとんど限界に達していると思われます。そして、まだ空の鉱山リストの問題があります... :
ガレス

2

Mathematica-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"

出力:

output

ChessboardDistance各セルが地雷からどれだけ離れているかを計算します。1は「地雷の隣」に対応します。のCount1は、セルの番号を生成します。次に、地雷(*)が配列に挿入されます。


David、ここで別のMathematicaユーザーに会えてうれしい。これを打ち負かすことができるかどうかを確認します!:-)
Mr.Wizard

@ Mr.Wizardあなたのソリューションを見ることに興味があります。必要に応じて自由に改善してください。
DavidC

2

Mathematicaの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。今すぐ修正します。ps:どうしてこれに気付いたのですか?
ミスターウィザード

別の掃海艇の質問である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

Python、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

Scala、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>。これら2つのインクルードも削除できます!。さらに、using name.....長すぎるため、std::cin, std::cout, std::string代わりに使用できます。
レイ

@Ray Aye、名前空間については正しいです...これをまとめてからしばらく経ちましたが、std::もっと価値のある呼び出しがもっとあったと思っています(もう1つはそれstringをやったと思います))。#include行についての情報もありがとう。私はC ++の専門家ではありません。;-)
ガフィ

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(モダンJavascript)-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))

無償版

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

brainfuck1001 896バイト

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

オンラインでお試しください!または整数入力で古いバージョンを試してください

プログラミングの1日とバグ修正の3日^^

これは私のGame Of Lifeコードのいくつかの部分を使用します。生きている細胞を数える代わりに、これは爆弾を数えます。一般的な規則ではコードポイントとしての入力が許可されているため、「読み取り可能な」整数の代わりにコードポイントを使用します。

[
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ソリューションの始まりです。インデントとスタックコメント(@スタックポインターを示します)を使用すると、かなり読みやすいはずです。

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

しかし、それは完全とはほど遠いものであり、私のアプローチが最適かどうか疑問に思っています。これまでのところ、最初の2つの入力文字のみを考慮し、Xの表を出力します。たとえば、「43」は次のようになります。

XXXX
XXXX
XXXX

他の誰かが必要なものを持っているか、Brainfuckでこの問題を解決できるかどうかを確認したいと思います。


BrainFuckを扱うとき、Optimalは私の頭の中ではまったく無関係です。どのインタープリター仕様をターゲットにしていますか?8ビットセルのようなものですか?これが完成するのを楽しみにしています。
captncraig

特定のインタープリターからはかなり独立していると思いますか?数字が不当に大きくない限り。
-paldepind

解決に取り組んでいますが、もちろん、Brainfuckで最初に思われるよりも難しいことが常に判明しています。
captncraig

私はこのために実行中のブレインコードを作成するために最後の数日間を費やしました。
ドリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.