Mayın Tarlası ızgaraları oluşturma


14

Mayın Tarlası , çoğu işletim sisteminde bulunan bir mantık oyunudur. Oyunun amacı, mayınların bir ızgarada nerede olduğunu belirlemektir, bu noktadaki mayınların sayısını gösteren sayılar verilmiştir.

Bir ızgara boyutu ve bir dizi mayın verildiğinde, o mayın grubu için Mayın Tarlası ızgarasını oluşturun.

Girdi: Izgara boyutunu gösteren iki tamsayı ve mayın konumlarını gösteren tanımsız sayıda tamsayı. Konumlar (sütun konumu, satır konumu) olarak verilir ve dizinler 1. satırdan başlar.

Çıktı: Mayın Tarlası ızgarası. Bir bloğun etrafında mayın yoksa, bir x. Her yeni satır için bir yeni satır yazdırın. Lütfen tüm madenleri yıldız işareti olarak gönderin *. Yazdırırken satırdaki değerler arasında boşluk bırakmayın.

Test Durumları:

"5 5 1 3 3 5 2 4" girişi:

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

"3 4 3 1 1 4 2 3 3 2" girişi:

x2*
13*
2*2
*21

En kısa kod kazanır.


Tüm girdilerin eşit sayıda argümana sahip olacağını varsayabilir miyiz? yani 5 5 1asla geçilmeyecek mi?
Gaffi

@Gaffi: Evet. Giriş her zaman geçerli giriş olacaktır.
beary605

Spesifikasyon şu anda okuyucunun, konumların 1 tabanlı indeksler kullandığını ve bu satır 1'in üstte olduğu örneklerden çıkmasını sağlar. (Ya da en azından ikincisi pazarlık edilebilir mi?)
Peter Taylor

@PeterTaylor: Evet. Sanırım daha açık hale getirmeliyim.
beary605

1
Sorun değil. Yine de birkaç karakteri traş etmenin ve liderliği tekrar kazanmanın bir yolunu bulmaya kararlıyım. :-)
Gareth

Yanıtlar:


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*

Çevrimiçi demolar:

Test Durumu 1: bağlantı

Test Durumu 2: bağlantı


!!{a}{b}ifgereğinden fazla bir karakter kullanır. bir diziye koyup diziyi dizgi yaptığınız için '*'bununla değiştirilebilir 42. Benzer şekilde diğer çıkış karakterleri için ASCII kodlarını kullanabilir orve özel durumu işlemek için bir karakteri kaydedebilirsiniz .
Peter Taylor

@PeterTaylor Wow, !!{a}{b}ifgerçekten aptalcaydı. :) Detaylara konsantre olurken yapabileceğiniz üst düzey hatalar ne kadar komik. Ne demek istediğini anlayamıyorum or.
Cristian Lupascu

Aslında! Zaman geçtikten sonra bir probleme geri dönmek de yardımcı olur. GolfScript bloğum için birkaç kod diseksiyonu yazdığımda önemli gelişmeler olduğunu fark ettim. Son önerime gelince, ,,bir numaraya sahip olduktan sonra . 0 olmadığı sürece karşılık gelen dizeye (veya ASCII koduna) dönüştürmek istiyorsunuz, bu durumda x istiyorsunuz. Rakamlar için ASCII kodları ardışıktır ve x48'den çalıştırılır. 72 + 48 olan ASCII 120'dir. Böylece, 72or 48+karakter temelli yaklaşım üzerinden bir karakter kaydedebilir ve kaydedebilirsiniz.
Peter Taylor

@PeterTaylor Harika! Cevap vermeden önce bu kısmı azaltmayı başardım .48 120if+, ama orhileniz iki karakter daha kısadır.
Cristian Lupascu

@ w0lf Gah! Tam ipucunu bulduğumu düşündüğümde!
Gareth

8

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

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

Aradığımı buldum - boşluklardan kurtulmanın bir yolu ( 1":) - ve sonunda rekabetçiyim. Şimdi boş mayın sorununu çözmem gerekiyor.

Klavyeden giriş alır.

Düzenle

Yeni sürüm bir yan etkiyi kullanır 1":- 9'dan büyük sayılar ile değiştirilir *.


İki şey fark ettim: 1. Bunun yerine boşluk basar 0, değil x; 2. Maden grubu boşsa başarısız olur (örn: 10 10- 10x10 boş bir tahta yazdırmalı, ancak geri |length error
dönmeli

Ama aksi yönde çalışır, bu yüzden +1.
Cristian Lupascu

@ w0lf Ah, hala sorunun ilk taslağını düşünüyordum - bu versiyonda xsadece bir alanı temsil ediyordu. Değiştiğini fark etmedim. Hmm, mayın setinin boş olacağını asla düşünmemiştim ... Bunun üzerinde çalışmam gerekecek.
Gareth

şimdi sorunun düzenlendiğini görüyorum. Eski revizyonu görmemiştim. :)
Cristian Lupascu

@ w0lf Teşekkürler. Bazı gereksiz parantezlerden kurtulmaya yardımcı olan birkaç iyi yeniden düzenleme buldum. Çıkarabileceğim bir alan görebiliyorum, ama neredeyse sınırımda olduğundan şüpheleniyorum. Ve hala boş mayınlar listesi sorunu var ... :-)
Gareth

2

Mathematica - 247 karakter

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]

Örnekler:

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

Çıktı:

çıktı

ChessboardDistanceher bir hücrenin bir madenden ne kadar uzak olduğunu hesaplar; burada 1, "bir madenin yanında" ifadesine karşılık gelir. Count1 'lerin hücre sayısı elde edilir. Ardından diziye mayınlar (*) eklenir.


David, burada başka bir Mathematica kullanıcısı görmek güzel . Bunu yenip yenemeyeceğimi göreceğim! :-)
Mr.Wizard

@ Mr.Wizard Çözümünüzü görmekle ilgileneceğim. İsterseniz benimkini geliştirmekten çekinmeyin.
DavidC

2

Mathematica , 140 139 137

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

Bunu daha okunabilir bir biçimde yazmak:

"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

Zarif! İtiraf ediyorum ListCorrelate[BoxMatrix@1, %, 2, 0], büyüsünü nasıl yaptığını anlayamıyorum .
DavidC

@David (dolaylı olarak) en sevdiğim kısım olduğu için sorduğunuza sevindim. ızgaradaki her pozisyonda ListCorrelateçekirdeği ( BoxMatrix@1) etkili bir şekilde kaplar , çarpar ve toplamı verir. (bir illüstrasyon isterseniz bana sohbette bana ping atın) - Yorumunuz bana ListConvolvebir tür ayna görüntüsü olduğu ListCorrelateve çekirdeğimin simetrik olduğu için burada da çalışması gerektiğini hatırlatıyor . Bu bana bir karakter kazandıracak. :-)
Mr.Wizard

Kodunuz yanlış (5,5) değerinde bir maden üretir. "5 5" ızgaranın boyutlarını verir.
DavidC

@David Teşekkürler. Haklısın, ama sadece boşluk versiyonunda; Bir şekilde kayıp 2in ##2. Şimdi tamir edeceğim. ps: Bu kadar uzun bir süre sonra bunu nasıl fark ettiniz?
Mr.Wizard

Başka bir mayın tarama gemisi sorusu olan codegolf.stackexchange.com/questions/10635/… , yakın zamanda ortaya çıktı ve çözümünüze başka bir bakış atmaya karar verdim.
DavidC

1

VBA - 298 karakter

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

Hataların üzerinden atlamak On Error Resume Nextbana bazı karakterler kazandırdı, ancak bu hala diğer cevapların bazıları kadar iyi değil. : - /


1

Python, 192 182 180 karakter

Giriş virgülle ayrılmışsa bazılarını kaydedebilirim. Sonra ilk satır d=input()ve uzunluğu 171 karakter olacaktır.
Maden koordinatlarının 1 yerine 0 tabanlı olması da yardımcı olacaktır. Üstesinden gelmek için 8 karakter bana mal oldu.

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 sürümü:

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 karakter

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 karakter

Bu benim VBA cevabımdan daha kötü, yani muhtemelen C ++ 'da ne yaptığımı bilmiyorum. Ancak, C ++ hakkında bildiklerimi inşa etmeye çalışıyorum, işte burada. Herhangi birinin iyileştirilmesi için herhangi bir önerisi varsa, onları duymak için minnettar olurum!

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

gerek yok return 0. Ve yapabilirsiniz #include<cstdio>, #include<cstdlib>. Hatta bu iki içerir silebilirsiniz !. Dahası using name....., çok uzun, std::cin, std::cout, std::stringbunun yerine kullanabilirsiniz .
Ray

@Ray Aye, ad alanı konusunda haklısın ... Bunu bir araya getirdiğimden beri bir süre geçti, ama std::daha değerli hale getirecek daha fazla aramam olduğunu düşünüyorum (sanırım bir tane daha stringyapacaktı) ). #includeÇizgilerle ilgili bilgi için de teşekkürler . C ++ uzmanı değilim. ;-)
Gaffi

0

C # (691 Karakter)

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

Golfsiz Sürüm:

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 (Modern Javascript) - 116 bayt

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 versiyonu

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

bu çözüm giriş / çıkış formatına sıkı sıkıya bağlı kalmaz, ancak kısa bir algoritma gösterir.

örnek: https://gist.github.com/missinglink/ee02084cfb523665e8c9d34c24f01537


0

beyin , 1001 896 bytes

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

Çevrimiçi deneyin! veya tamsayı girdisi ile eski sürümü deneyin

Bir gün programlama ve üç gün hata düzeltme ^^

Bu, Game Of Life kodumun birkaç bölümünü kullanıyor. Canlı hücreleri saymak yerine, bu bombaları sayar. Kod noktası olarak girişe genel kurallar tarafından izin verildiğinden, bunlar "okunabilir" tamsayılar yerine bunları kullanır.

[
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

Bu bir Brainfuck çözümünün başlangıcıdır. Girinti ve yığın yorumları ile oldukça okunabilir olmalıdır ( @yığın işaretçisini gösterir):

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

Ancak tamamlanmaktan çok uzak ve yaklaşımımın optimal olup olmadığından şüphe etmeye başlıyorum. Şimdiye kadar sadece ilk iki giriş karakterini dikkate alıyor ve bir Xs tablosu yazdırıyor. Örneğin "43" size şunları verir:

XXXX
XXXX
XXXX

Brainfuck'ta başka birinin ne gerektirdiğini ve bu sorunu çözebildiğini görmek isterim.


BrainFuck ile uğraşırken en uygun olan aklımda tamamen önemsizdir. Hangi tercüman özelliklerini hedefliyorsunuz? 8 bitlik hücreler gibi mi? Bunun bittiğini görmek isterim.
captncraig

Herhangi bir yorumlayıcıdan oldukça bağımsız olduğunu düşünüyorum. Rakamlar mantıksız derecede büyük olmadığı sürece.
paldepind

Bir ruh üzerinde çalışmak, ama elbette Brainfuck'ta ilk başta göründüğünden daha zor olduğu ortaya çıkıyor.
captncraig

Son birkaç günü bunun için çalışan bir beyin kodunu oluşturmak için harcadım.
Dorian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.