Генерування сітки шахт


14

Сапер - це логічна гра, знайдена в більшості ОС. Мета гри - визначити, де знаходяться міни на сітці, задавши цифри, що вказують на кількість мін навколо цього місця.

Враховуючи розмір сітки та набір мін, генеруйте сітку шахтного трактора для цього набору мін.

Вхід: два цілих числа, що вказують на розмір сітки, і невизначене число цілих чисел, що вказують на положення міни. Позиції будуть надані як (позиція стовпця, позиція рядка), а індекси почнуться в рядку 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використовує один символ більше, ніж потрібно. '*'можна замінити тим, 42що ви ставите його в масив, а потім послідовно налаштовуєте масив. Аналогічно ви можете використовувати ASCII-коди для інших вихідних символів і зберегти символ orдля обробки спеціального випадку.
Пітер Тейлор

@PeterTaylor Wow, !!{a}{b}ifсправді було дурним насправді. :) Смішно, які помилки на високому рівні ви можете робити, зосереджуючись на деталях. Я не можу зрозуміти, що ти мав на увазі, використовуючи or.
Крістіан Лупаску

Справді! Повернення до проблеми через час також допомагає. Коли я написав пару розсічень коду для свого блогу GolfScript, я помітив значні вдосконалення. Що стосується моєї останньої пропозиції, після того, як ,,ви отримаєте номер. Ви хочете перетворити його у відповідний рядок (або ASCII-код), якщо він не дорівнює 0, і в цьому випадку ви хочете x. Коди ASCII для цифр є послідовними і працюють з 48. xASCII 120, що становить 72 + 48. Таким чином, ви можете зробити 72or 48+і зберегти персонаж через підхід на основі рядків.
Пітер Тейлор

@PeterTaylor Чудово! Перш ніж ви відповіли, мені вдалося скоротити цю частину .48 120if+, але ваш orтрюк на два рази коротший.
Крістіан Лупаску

@ 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, а не x; 2. Збій, якщо набір мін порожній (напр .: 10 10- слід надрукувати порожню дошку 10х10, але повертається |length error)
Крістіан Лупаску

Але в іншому випадку це працює, тому +1.
Крістіан Лупаску

@ w0lf Ага, я ще думав над першою чергою запитання - у цій версії xпросто представлений пробіл. Я не помітив, що це змінилося. Хм, ніколи не думав, що набір мін буде порожнім ... Мені доведеться над цим працювати.
Гарет

тепер я бачу, що питання було відредаговано. Я не бачив старої редакції. :)
Крістіан Лупаску

@ w0lf Дякую Я знайшов пару хороших перестановок, які допомогли позбутися деяких непотрібних дужок. Я бачу один простір, який я міг би видалити, але я підозрюю, що я знаходяться на своїй межі. А ще є проблема зі списком порожніх мін ... :-)
Гарет

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"1" дає номер комірки. Потім міни (*) вставляються в масив.


Девід, приємно бачити тут іншого користувача Mathematica . Я побачу, чи зможу це перемогти! :-)
Mr.Wizard

@ 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. Я зараз це виправлю. ps: Як ви помітили це через стільки часу?
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 символів.
Також допоможе наявність координат шахти на 0, а не на 1. Мені коштувало 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>. Ви навіть можете видалити ці два включення !. Більше того, using name.....занадто довго, ви можете використовувати std::cin, std::cout, std::stringзамість цього.
Рей

@Ray Aye, ти маєш рацію щодо простору імен ... Минув час, коли я склав це разом, але я думаю, що у мене було більше std::дзвінків, які зробили б це більш вартим (я думаю, ще один stringзробив би це ). Дякуємо також за інформацію про #includeлінії. Я не експерт по С ++. ;-)
Гаффі

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

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

мозковий ебать , 1001 896 байт

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

Спробуйте в Інтернеті! або спробуйте стару версію з цілим числом

Один день програмування та три дні помилок ^^

Тут використовується декілька частин мого коду 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|

Однак це ще далеко не завершено, і я починаю сумніватися, чи мій підхід є оптимальним. Поки що він розглядає лише перші два вхідні символи та друкує таблицю Xs. Наприклад, "43" дасть вам:

XXXX
XXXX
XXXX

Я хотів би побачити, чи хтось ще має те, що потрібно, і чи здатний вирішити цю проблему в Brainfuck.


Оптималь на мою думку абсолютно не має значення при роботі з BrainFuck. На які специфікації перекладача ви орієнтуєтесь? Як 8-бітові клітини чи що? Я хотів би, щоб це було закінчено.
captncraig

Я думаю, це досить незалежно від будь-якого конкретного інтепретератора? Поки цифри не є надмірно великими.
paldepind

Працювати над сулютацією, але, звичайно, це завжди виявляється важче, ніж здається спочатку у Brainfuck.
captncraig

Останні декілька днів я витратив на те, щоб створити для цього працюючий код.
Доріан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.