Создание сеток тральщика


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, в этом случае вы хотите х. Коды ASCII для цифр являются последовательными и начинаются с 48. xЭто ASCII 120, что составляет 72 + 48. Таким образом, вы можете сделать 72or 48+и сохранить символ поверх строкового подхода.
Питер Тейлор

@PeterTaylor Отлично! До того, как вы ответили, мне удалось уменьшить эту часть до .48 120if+, но ваш orтрюк на два знака короче.
Кристиан Лупаску

@ w0lf Гах! Как раз тогда, когда я думаю, что вернул себе лидерство!
Гарет

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

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"

Выход:

выход

ChessboardDistanceвычисляет, как далеко каждая ячейка от шахты, где 1 соответствует «рядом с шахтой». Из Count1 дает номер ячейки. Затем мины (*) вставляются в массив.


Дэвид, приятно видеть другого пользователя 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

@ Давид, я рад, что ты (неявно) спросил, так как это моя любимая часть. ListCorrelateэффективно накладывает ядро ​​( BoxMatrix@1) на каждую позицию в сетке, умножает и дает сумму. (пингуйте меня в чате мма, если вам нужна иллюстрация) - Ваш комментарий напоминает мне, что он ListConvolveдолжен работать и здесь, так как это своего рода зеркальное отображение ListCorrelateи мое ядро ​​симметрично. Это спасет меня от характера. :-)
Mr.Wizard

Ваш код неправильно генерирует шахту в (5,5). «5 5» дает размеры сетки.
DavidC

@ Дэвид Спасибо. Вы правы, но это только в версии с пробелами; Я как-то потерял 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

Питон, 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

Скала, 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 Да, вы правы насчет пространства имен ... Прошло много времени с тех пор, как я соединил это, но я думаю, что у меня было больше 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

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