माइनस्वीपर ग्रिड बनाना


14

माइनस्वीपर एक लॉजिक गेम है जो अधिकांश OS पर पाया जाता है। खेल का लक्ष्य यह निर्धारित करना है कि खदानें ग्रिड पर हैं, दिए गए नंबर उस स्थान के आसपास की खानों की संख्या को दर्शाते हैं।

एक ग्रिड आकार और खानों के एक सेट को देखते हुए, खानों के उस सेट के लिए माइनस्वीपर ग्रिड उत्पन्न करें।

इनपुट: ग्रिड आकार का संकेत करने वाले दो पूर्णांक, और पूर्णांक की एक अपरिभाषित संख्या जो खदान स्थितियों को दर्शाती है। पदों को (कॉलम स्थिति, पंक्ति स्थिति) के रूप में दिया जाएगा, और अनुक्रमित पंक्ति 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कभी पास नहीं होगा?
गफ्फी

@ गफ्फी: हां। इनपुट हमेशा मान्य इनपुट होगा।
beary605

वर्तमान में पाठक पाठक को उन उदाहरणों से कटौती करने के लिए छोड़ देता है जो स्थिति 1-आधारित अनुक्रमित का उपयोग करते हैं और यह पंक्ति 1 शीर्ष पर है। (या बाद का है, कम से कम, परक्राम्य?)
पीटर टेलर

@PeterTaylor: हां। मुझे लगता है कि मुझे इसे और स्पष्ट करना चाहिए।
beary605

1
कोई दिक्कत नहीं है। मैं अभी भी वर्णों के एक जोड़े को दाढ़ी बनाने का एक तरीका खोजने के लिए दृढ़ हूं और हालांकि लीड हासिल कर सकता हूं। :-)
गैरेथ

जवाबों:


10

गोल्फस्क्रिप्ट 122 98 94 93 91 88 87 85 82 81 80 71

~]2/(\:m;~\:w*,{[.w%)\w/)]:^m\?)42{m{^*~-.*@@-.*+3<},,72or 48+}if}%w/n*

ऑनलाइन डेमो:

टेस्ट केस 1: लिंक

टेस्ट केस 2: लिंक


!!{a}{b}ifआवश्यकता से अधिक एक पात्र का उपयोग करता है। '*'के साथ प्रतिस्थापित किया जा सकता है 42क्योंकि आप इसे एक सरणी में रख रहे हैं और फिर सरणी को संशोधित कर रहे हैं। इसी तरह आप अन्य आउटपुट वर्णों के लिए ASCII कोड का उपयोग कर सकते हैं और orविशेष मामले को संभालने के लिए एक चरित्र को बचा सकते हैं।
पीटर टेलर

@PeterTaylor वाह, !!{a}{b}ifवास्तव में वास्तव में बेवकूफ था। :) यह हास्यास्पद है कि विवरणों पर ध्यान केंद्रित करते समय आप उच्च-स्तरीय गलतियाँ क्या कर सकते हैं। मैं यह पता नहीं लगा सकता कि आपके उपयोग का क्या मतलब है or
क्रिस्टियन लुपस्कू

वास्तव में! समय के बाद किसी समस्या पर वापस आना भी मदद करता है। जब मैंने अपने गोल्फस्क्रिप्ट ब्लॉग के लिए कोड विच्छेद की एक जोड़ी लिखी तो मैंने काफी सुधार देखा। मेरे आखिरी सुझाव के संबंध में, ,,आपके पास एक नंबर होने के बाद । आप इसे संबंधित स्ट्रिंग (या ASCII कोड) में तब तक बदलना चाहते हैं जब तक कि यह 0 नहीं है, जिस स्थिति में आप x चाहते हैं। अंकों के लिए ASCII कोड अनुक्रमिक हैं और 48 से चलते हैं। xASCII 120 है, जो 72 + 48 है। तो आप कर सकते हैं 72or 48+और स्ट्रिंग-आधारित दृष्टिकोण पर एक चरित्र को बचा सकते हैं ।
पीटर टेलर

@PeterTaylor बढ़िया! इससे पहले कि आप जवाब दें मैं उस हिस्से को कम करने में कामयाब रहा .48 120if+, लेकिन आपकी orचाल दो चार्ट कम है।
क्रिस्टियन लुपस्कू

@ w0lf जीएएच! बस जब मुझे लगता है कि मुझे वापस मिल गया है!
गारेथ

8

जे, 124 116 112 101 87 86 85 84 83 82 79 76 75 72 68 वर्ण

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

पाया कि मैं क्या ढूंढ रहा था - रिक्त स्थान से छुटकारा पाने का एक तरीका ( 1":) - और अंत में मैं प्रतिस्पर्धी हूं। अब मुझे खानों की समस्या के खाली सेट का पता लगाने की जरूरत है।

कीबोर्ड से इनपुट लेता है।

संपादित करें

नया संस्करण एक साइड इफेक्ट का उपयोग करता है 1":- 9 से बड़ी संख्या को प्रतिस्थापित किया जाता है *


मैंने दो चीजों पर ध्यान दिया है: 1. यह रिक्त स्थान के बजाय प्रिंट करता है 0, नहीं x; 2. अगर खानों का सेट खाली है (पूर्व: 10 10- एक खाली 10x10 बोर्ड प्रिंट करना चाहिए, लेकिन रिटर्न |length error)
क्रिस्टियन लुपस्कू

लेकिन यह काम करता है, तो +1।
क्रिस्टियन लुपस्कू

@ w0lf आह, मैं अभी भी सवाल के पहले मसौदे के बारे में सोच रहा था - उस संस्करण में xसिर्फ एक जगह का प्रतिनिधित्व किया। मैंने यह नहीं देखा कि यह बदल गया था। हम्म, कभी नहीं सोचा था कि खानों का सेट खाली होगा ... मुझे उस पर काम करना होगा।
गारेथ

अब मैं देखता हूं कि प्रश्न संपादित किया गया है। मैंने पुराना संशोधन नहीं देखा था। :)
क्रिस्चियन लुपस्कु

@ w0lf धन्यवाद। मुझे कुछ अच्छी व्यवस्थाएँ मिलीं, जिन्होंने कुछ अनावश्यक कोष्ठक से छुटकारा पाने में मदद की। मैं एक जगह देख सकता हूं जिसे मैं हटा सकता हूं, लेकिन मुझे संदेह है कि मैं अपनी सीमा पर बहुत अधिक हूं। और अभी भी खाली खानों की सूची की समस्या है ... :-)
गैरेथ

2

गणितज्ञ - २४ char वर्ण

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 के सेल की संख्या अर्जित करता है। फिर खानों (*) को सरणी में डाला जाता है।


डेविड, यहां एक और गणितज्ञ उपयोगकर्ता को देखकर अच्छा लगा । मैं देखूंगा कि क्या मैं इसे हरा सकता हूं! :-)
श्री। छिपकली

@ Mr.Wizard मैं अपने समाधान को देखने में रुचि होगी। यदि आप चाहें तो मेरा सुधार करने के लिए स्वतंत्र महसूस करें।
डेविड

2

गणितज्ञ , १४० १३ ९ १३atic

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]इसका जादू कैसा है।
डेविड

@ डेविड मुझे खुशी है कि आपने (संक्षेप में) पूछा कि यह मेरा पसंदीदा हिस्सा है। ListCorrelateप्रभावी रूप BoxMatrix@1से ग्रिड में प्रत्येक स्थान पर कर्नेल ( ) को ओवरले करता है , गुणा करता है और योग देता है। (एमएमए चैट में मुझे पिंग करें यदि आप एक चित्रण चाहेंगे) - आपकी टिप्पणी मुझे याद दिलाती है कि ListConvolveयहां भी काम करना चाहिए क्योंकि यह एक प्रकार की दर्पण छवि है ListCorrelateऔर मेरी कर्नेल सममित है। जो मुझे एक किरदार से बचाएगा। :-)
श्री। छिपकली २

आपका कोड गलत तरीके से (5,5) पर एक खदान उत्पन्न करता है। "5 5" ग्रिड के आयाम देता है।
डेविड एफसी

@ डेविड धन्यवाद। आप सही हैं, लेकिन यह केवल सफेद-स्थान संस्करण में है; मैं किसी भी तरह खो 2में ##2। मैं अब इसे ठीक कर दूंगा। ps: आप इसे इतने लंबे समय के बाद कैसे नोटिस करने आए?
श्री। छिपकली

एक अन्य खानों का प्रश्नकर्ता, codegolf.stackexchange.com/questions/10635/… , हाल ही में दिखाई दिया और मैंने आपके समाधान को एक और रूप देने का निर्णय लिया।
डेविड एफसी

1

VBA - 298 वर्ण

Sub m(x,y,ParamArray a())
On Error Resume Next:ReDim b(x,y):For i=0 To (UBound(a)-1) Step 2:c=a(i):d=a(i+1):b(c,d)="*":For e=c-1 To c+1:For f=d-1 To d+1:v=b(e,f):If v<>"*" Then b(e,f)=v+1
Next:Next:Next:For f=1 To y:For e=1 To x:v=b(e,f):s=s & IIf(v<>"",v,"x")
Next:s=s & vbCr:Next:MsgBox s
End Sub

On Error Resume Nextकुछ वर्णों को सहेजने में त्रुटियों पर लंघन , लेकिन यह अभी भी लगभग अन्य उत्तरों के रूप में अच्छा नहीं है। : - /


1

पायथन, 192 182 180 वर्ण

अगर इनपुट अल्पविराम से अलग हो जाता तो मैं कुछ बचा सकता था। फिर पहली पंक्ति होगी d=input()और लंबाई 171 वर्ण।
खदान के 1-आधारित होने के बजाय 0-आधारित होने से भी मदद मिलेगी। यह मुझे दूर करने के लिए 8 आकर्षण की लागत।

d=map(int,raw_input().split())
m=zip(d[2::2],d[3::2])
for y in range(d[1]):print"".join((str(sum(abs(a-x-1)|abs(b-y-1)<2for a,b in m)or'x')+'*')[(x+1,y+1)in m]for x in range(d[0]))

Ungolfed संस्करण:

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

सी ++ - 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इसके बजाय उपयोग कर सकते हैं ।
रे

@ राय ऐ, आप नाम स्थान के बारे में सही हैं ... मुझे इसे एक साथ रखे हुए कुछ समय हो गया है, लेकिन मैं सोच रहा हूं कि मेरे पास अधिक std::कॉल थे जो इसे और अधिक लायक बना देंगे (मुझे लगता है कि एक और 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

के, 175

f:{g::(y;x)#(x*y)#"x";{.[`g;x;:;"*"]}@'-1+|:'(_(#z)%2;2)#z;{if[~"0"~z;$["x"=g .(x;y);.[`g;(x;y);:;z];]]}.'i,'$s:+/'{"*"=g . x}''{,/((x-1)+!3),\:/:(y-1)+!3}.'i:,/(!x),\:/:!y;g}

k)f[5;5;1 3 3 5 2 4]
"xxxxx"
"11xxx"
"*21xx"
"2*21x"
"12*1x"
k)f[3;4;3 1 1 4 2 3 3 2]
"x2*"
"13*"
"2*2"
"*21"

0

ECMAScript 2019 (आधुनिक जावास्क्रिप्ट) - 116 बाइट्स

m.map((r,i)=>r.map((c,j)=>c=='X'?c:[,...m].splice(i,3).map(r=>[,...r].splice(j,3)).flat().filter(v=>v=='X').length))

ungolfed संस्करण

m.map(
  (r,i) => r.map(
    (c,j) => c=='X' ? c :
      [,...m].splice(i,3).map(r=>[,...r].splice(j,3)).flat().filter(v=>v=='X').length
  )
)

यह समाधान इनपुट / आउटपुट प्रारूप का कड़ाई से पालन नहीं करता है, लेकिन एक रसीला एल्गोरिथ्म प्रदर्शित करता है।

उदाहरण: https://gist.github.com/missinglink/ee02084cfb523665e8c9d34c24f01537


0

ब्रेनफक , 1001 896 बाइट्स

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

इसे ऑनलाइन आज़माएं! या पूर्णांक इनपुट के साथ पुराने संस्करण का प्रयास करें

प्रोग्रामिंग का एक दिन और बगफिनिंग के तीन दिन ^ ^

यह मेरे गेम ऑफ लाइफ कोड के कुछ हिस्सों का उपयोग करता है। जीवित कोशिकाओं की गिनती के बजाय, यह बम गिना जाता है। चूंकि कोडपॉइंट के रूप में इनपुट सामान्य नियमों द्वारा अनुमत है, इसलिए यह "पठनीय" पूर्णांक के बजाय उनका उपयोग करता है।

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

हालांकि यह पूरी तरह से दूर है और मुझे संदेह होने लगा है कि क्या मेरा दृष्टिकोण इष्टतम है। अब तक यह केवल पहले दो इनपुट पात्रों को मानता है और एक्स की एक तालिका प्रिंट करता है। उदाहरण के लिए "43" आपको देगा:

XXXX
XXXX
XXXX

मैं यह देखना पसंद करूंगा कि क्या किसी और के पास यह है और वह ब्रेनफक में इस समस्या को हल करने में सक्षम है।


BrainFuck के साथ काम करते समय Optimal मेरे दिमाग में पूरी तरह से अप्रासंगिक है। आप क्या दुभाषिया चश्मा लक्षित कर रहे हैं? जैसे 8-बिट सेल या क्या? मुझे यह देखना अच्छा लगेगा।
captncraig

मुझे लगता है कि यह किसी भी विशिष्ट घुसपैठिये से बहुत स्वतंत्र है? जब तक संख्या अनुचित रूप से बड़ी नहीं होती।
पालपाइंड

एक आत्मा पर काम करना, लेकिन निश्चित रूप से यह हमेशा मुश्किल होता है जितना कि ब्रेनफक में पहले लगता है।
19n में कैप्टनरिग जूल

मैंने इसके लिए एक रनिंग ब्रेनफक कोड बनाने के लिए पिछले कुछ दिन बिताए।
डोरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.