মাইন সুইপার ক্লুগুলি পূরণ করুন


54

মাইনসুইপার একটি জনপ্রিয় ধাঁধা গেম যেখানে আপনাকে অবশ্যই আবিষ্কার করতে হবে যে এই টাইলগুলিতে ক্লিক না করে কোন টাইলগুলি "খনি"। প্রতিটি টাইল হয় হয় খনি (দ্বারা প্রতিনিধিত্ব করা *) বা একটি সূত্র, অর্থাৎ 0 থেকে 8 পর্যন্ত একটি সংখ্যা 8 প্রতিবেশী টাইলগুলির মধ্যে কতগুলি খনি হয় তা উপস্থাপন করে। আপনার আজকের কাজটি খনিগুলির সমন্বিত একটি বোর্ড নেওয়া এবং সমস্ত ক্লু পূরণ করা। উদাহরণস্বরূপ, 5 টি মাইন সহ নিম্নলিখিত 5x4 বোর্ডটি দেখুন:

 *  
*  * 
  *  
    *

ক্লুগুলি পূরণ করার পরে, বোর্ডটি এর মতো দেখবে:

2*211
*33*1
12*32
0112*

বিস্তারিত

আপনাকে অবশ্যই একটি পূর্ণ-প্রোগ্রাম বা একটি ফাংশন লিখতে হবে যা কেবলমাত্র ফাঁকা স্থান এবং অ্যাসিস্ট্রিকস সহ অক্ষরগুলির গ্রিড গ্রহণ করে এবং অন্য গ্রিড আউটপুট করে যেখানে প্রতিটি স্থান সংলগ্ন খনিগুলির সংখ্যার (অ্যাসিরিস্ক) সংখ্যার সাথে প্রতিস্থাপিত হয়। এগুলির মধ্যে আপনার গ্রিডগুলির জন্য গ্রহণযোগ্য ফর্ম্যাটগুলি রয়েছে:

  • এটিতে নতুন লাইনের সাথে একটি স্ট্রিং

  • অক্ষর / একক অক্ষরের স্ট্রিংগুলির একটি 2D তালিকা

  • স্ট্রিংগুলির একটি তালিকা

আপনি ধরে নিতে পারেন যে গ্রিডটি কমপক্ষে 1x1 হবে, যদিও এটি সমস্ত খনি বা সমস্ত স্থান হতে পারে is

ইনপুট গ্রিড সর্বদা যথাযথ সংখ্যক স্পেস সহ প্যাড করা হবে। যথারীতি, এটি , সুতরাং স্ট্যান্ডার্ড লুফোলস প্রয়োগ হয় এবং বাইটের মধ্যে সবচেয়ে কম উত্তর!

নমুনা IO

যাতে আপনি সাদা স্থান দেখতে পারেন, আমি তার চারপাশে বন্ধনী সহ সমস্ত নমুনা আইও দেখাব।

Input:
[    * ]
[*     ]
[      ]
[      ]
[  **  ]
[ *  * ]

Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]

Input:
[****]
[****]

Output:
[****]
[****]

Input:
[   ]
[   ]
[   ]
[   ]

Output:
[000]
[000]
[000]
[000]

Input:
[*   ]
[**  ]
[    ]
[   *]

Ouput:
[*310]
[**10]
[2221]
[001*]

Input:
[**    ]
[*    *]
[  *   ]
[      ]
[*     ]
[****  ]

Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]

Input:
[     *    ]
[        * ]
[     *    ]
[**   ***  ]
[      *** ]
[          ]
[       ** ]
[  * *     ]
[*      ** ]
[       ** ]

Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]

2
এফওয়াইআই, আমি সমস্ত নমুনা আইও হাতে হাতে তৈরি করেছি, সুতরাং সেখানে কিছু ছোটখাটো ত্রুটি রয়েছে possible যদি কিছু বন্ধ হয়ে যায় তবে আমাকে জানান এবং আমি এএসপটিকে ঠিক করার চেষ্টা করব।
ডিজেএমসিএমহেম


1
গ্রিডটি কি অ-স্কোয়ার হতে পারে?
টন হসপেল

খনি অন্য চরিত্র দ্বারা প্রতিনিধিত্ব করতে পারেন?
আকাংকা

ক্রিশ্চিয়ান ইরওয়ান না, খনিগুলি সর্বদা একটি নক্ষত্রমণ্ডল হবে।
ডিজেএমসিএমহেম

উত্তর:


21

এমএটিএল , 18 17 বাইট

পরীক্ষার কেস 6 এর ইনপুটটিতে সংশোধন করার জন্য @ mbomb007 কে ধন্যবাদ

32>t3Y6Z+-6b(48+c

বিন্যাসে ইনপুটটি 2D চর অ্যারে is

[' *   '; '*  * '; '  *  '; '    *']

এটি অনলাইন চেষ্টা করুন!

পরীক্ষার কেস: 1 , 2 , 3 , 4 , 5 , 6

ব্যাখ্যা

32>      % Input 2D char array implicitly. Transform it into a 2D logical
         % array with asterisk replaced by true and space by false
t        % Duplicate
3Y6      % Push [1 1 1; 1 0 1; 1 1 1]. This defines the neighbourhood
Z+       % 2D convolution, keeping size. Gives the number of neighbouring
         % mines for each position
-6       % Push -6
b        % Bubble up in stack
(        % Assign -6 to the entries indicated by the logical array, i.e.
         % to the positions that originally contained asterisks 
48+      % Add 48. This transforms each number of neighbouring mines
         % into its ASCII code, and -6 into 42 (ASCII code of asterisk)
c        % Convert to char. Display implicitly

1
কি দারুন. এটা চিত্তাকর্ষক।
ব্লাডোরথইন গ্রি 15

2
পরীক্ষার কেস 6 পাওয়া আমার আসল গেমটি খেলতে ছাড়বে।
ম্যাজিক অক্টোপাস উরন

কেন? টেস্ট কেস 6 সবচেয়ে বাস্তববাদী বলে মনে হয়।
ডাব্লুবিটি

@ কারাসোকম্পুটিং পরীক্ষার কেস 2 পাওয়া আমার আরও অনেক বেশি প্রসারণ করবে। : পি
ডিজেএমসিএমহেম

10

জাভাস্ক্রিপ্ট (ES6), 114 96 বাইট

a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>g(k=>(s=a[i+k])?g(k=>s[j+k]>' '):0)),g=f=>f(-1)+f(0)+f(1))

সম্পাদনা করুন: 18 টি বাইটস সংরক্ষণ করা হয়েছে @ETH প্রোডাকশন দ্বারা একটি ধারণা ধন্যবাদ।


আমি মনে করি আপনি কোনও সূচকটি ফাঁকা নেই কিনা তা পরীক্ষা করতে কোনও ফাংশন সংজ্ঞায়িত করে একটি গুচ্ছ সংরক্ষণ করতে পারেন:a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
ETH প্রোডাকশনগুলি

@ উচ্চতর প্রোডাকশনগুলি আমি আপনার ধারণাকে চূড়ান্ত দিকে নিয়েছি ... আমি সাধারণত ফাংশন পরামিতিগুলি লিখতে পাই না!
নীল

7

আর, 127 112 বাইট

function(M){a=nrow(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}

উন্নতির জন্য @gtwebb এবং @ সেবাস্তিয়ান-সি ধন্যবাদ।

উল্লেখযোগ্য বিষয়:

ম্যাট্রিকগুলি আরে ভেক্টর হয় elements উপাদানগুলি বের করার জন্য আপনার 2-ডি সূচক প্রয়োজন হয় না।

seq(M)একই "দৈর্ঘ্য" (সারি x কলাম) এর ক্রম ফিরিয়ে দেবে M

আপনি আর তে ইতিবাচক এবং নেতিবাচক নিষ্কাশন সূচকগুলি মিশ্রিত করতে পারবেন না M[-3]বৈধ আর কোড, তবে যা পছন্দসই তা নয়।

ইনপুটটি আর ম্যাট্রিক্স আকারে। কিছু উদাহরণ:

> M <- matrix("",5,5)
> M[3,3] <- "*"
> f(M)
     [,1] [,2] [,3] [,4] [,5]
[1,] "0"  "0"  "0"  "0"  "0" 
[2,] "0"  "1"  "1"  "1"  "0" 
[3,] "0"  "1"  "*"  "1"  "0" 
[4,] "0"  "1"  "1"  "1"  "0" 
[5,] "0"  "0"  "0"  "0"  "0" 
> M[2,2] <- "*"
> f(M)
     [,1] [,2] [,3] [,4] [,5]
[1,] "1"  "1"  "1"  "0"  "0" 
[2,] "1"  "*"  "2"  "1"  "0" 
[3,] "1"  "2"  "*"  "1"  "0" 
[4,] "0"  "1"  "1"  "1"  "0" 
[5,] "0"  "0"  "0"  "0"  "0" 
> M[3,2] <- "*"
> f(M)
     [,1] [,2] [,3] [,4] [,5]
[1,] "1"  "1"  "1"  "0"  "0" 
[2,] "2"  "*"  "3"  "1"  "0" 
[3,] "2"  "*"  "*"  "1"  "0" 
[4,] "1"  "2"  "2"  "1"  "0" 
[5,] "0"  "0"  "0"  "0"  "0" 
> 

1
Tপরিবর্তে ব্যবহার করে আপনি কয়েকটি অক্ষর কেটে ফেলতে পারেন TRUE। আমি যদি কিছু কাজ করে তবে কিছু বন্ধনী স্লাইড করতে পেরেছি:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
সেবাস্তিয়ান-সি

1
আপনি সংজ্ঞা দিন b=ncol(M)এবং তারপরে এটি ব্যবহার করবেন না যাতে আপনি এটি থেকে মুক্তি পেতে পারেন।
gtwebb

আমি চারটি চরিত্র (এবং ভেক্টরাইজ) শেভ করতে পারি: M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}- তবে, এই চিটগুলি সামান্য কারণ এটির জন্য পুনরায় সংজ্ঞায়িত <-ল্যাম্বডা দরকার , দেখুন কেএলএমআর / ক্রিয়ামূলক / ল্যাম্বদা
কনরাড রুডল্ফ

@ কনরাডের আকর্ষণীয় ধারণা, তবে আমি এটি আরকে ধন্যবাদ জানাতে চাই!
জেডিএল

6

জাভা, 190 বাইট

সম্পাদনা:

  • -6 বাইট বন্ধ। @ ফ্রোজেনকে ধন্যবাদ
  • -1 বাইট বন্ধ। আমাকে ধন্যবাদ :)
  • -1 বাইট বন্ধ। কিছু ভুল ত্রুটিযুক্ত। কেভিন ক্রুইজসেনকে ধন্যবাদ

Snipet

c->{for(int x,y,j,i=-1;++i<c.length;)for(j=-1;++j<c[0].length;){if(c[i][j]<33){c[i][j]=48;for(x=i-2;++x<i+2;)for(y=j-2;++y<j+2;)try{if(c[x][y]==43)c[i][j]++;}catch(Exception e){}}}return c;}

Ungolfed:

public class Main{
  public static char[][] minesweeper(char[][] woclues){
    for(int i = 0; i < woclues.length ; i++){
      for(int j = 0; j < woclues[0].length ; j++){
        if( woclues[i][j] == ' '){
          woclues[i][j] = '0';
          for(int x = i - 1; x < i + 2 ; x++){
            for(int y = j - 1; y < j + 2 ; y++){
              try{
                if(woclues[x][y] == '*'){
                  woclues[i][j]++;
                }
              }catch( ArrayIndexOutOfBoundsException e){}
            }
          }
        }
      }
    }
    return woclues;
  }
  public static void main(String[]args){
    char[][] in = new char[args.length][args[0].length()];
    for(int i = 0; i < args.length;i++){
      in[i]=args[i].toCharArray();
    }
    for(char[] c:minesweeper(in)){
      System.out.println(new String(c));
    }
  }
}

এটি আদর্শ।


আপনি ASCII মানগুলির তুলনায় চর মানগুলি তুলনা করতে পারেন যা বেশিরভাগ ক্ষেত্রে সংক্ষিপ্ত হওয়া উচিত। এছাড়াও আপনি এর ঘোষণা একত্রিত করতে পারেনx,y,i,j
Frozn

আমি ইতিমধ্যে c[i][j]==32এবং আরও কিছু করেছি এবং কেবল তাদের উজ্জ্বল অংশে পরিবর্তন করেছি
রোমান গ্রাফ

আর আমি ফাইটনের চেয়ে ছোট অন্তত!
রোমান গ্রাফ

আপনি কি নিশ্চিত যে আপনার অলগল্ড কোডটি সঠিক? প্রথম টেস্ট কেস জন্য এটি আউটপুট: 0000*1\n*10011\n110000\n000000\n00**10\n0*22*1। আপনি সম্ভবত একটি আদর্শone.com পরীক্ষা লিঙ্ক যুক্ত করতে পারেন? সম্পাদনা: এছাড়াও, যদি না আমি নিজেই কিছু ভুল করি, আপনার গল্ফড কোড আউটপুট: ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0sপ্রথম পরীক্ষার ক্ষেত্রে (এটি *
সমস্তটি

সম্পাদনা করা হয়েছে। আমার পাইওর ইন্টারনেট এটি আমাকে অনুমতি দেওয়ার সাথে সাথে আমি একটি পরীক্ষার লিঙ্ক যুক্ত করব।
রোমান গ্রাফ

5

জাভাস্ক্রিপ্ট (ES6), 107

স্ট্রিংগুলির অ্যারে হিসাবে ইনপুট / আউটপুট

f=l=>l.map((r,i)=>r.replace(/ /g,(c,j)=>(s=r=>(c+r).substr(j,3).split`*`.length,s(l[i-1])+s(l[i+1])+s(r)-3)))

নোট যখন ফাংশন গুলি সীমার বাইরে তালিকা ঠ একটি উপাদান সঙ্গে বলা হয়, প্যারামিটার aহয় undefinedএবং c+aপরিণাম ডেকে আনবে " undefined"জাভাস্ক্রিপ্ট এর করা বিচিত্র রূপান্তর নিয়ম ধন্যবাদ

আরও পঠনযোগ্য

l=>
  l.map(
    (r,i) =>
      r.replace(/ /g, (c,j) =>
        (
          s = a => (c+a).substr(j,3).split`*`.length,
          s(l[i-1])+s(l[i+1])+s(r)-3
        )
      )
  )

5

পাইথন 2, 138 বাইট

def f(s):w=s.find('\n')+1;print''.join([c,`(s[i-(i>0):i+2]+(w*' '+s)[i-1:i+2]+s[i-1+w:i+2+w]).count('*')`][c==' ']for i,c in enumerate(s))

এমন কোনও ফাংশন সংজ্ঞায়িত করে fযা কোনও ইনপুট স্ট্রিংকে পছন্দ করে

"  *\n** \n*  \n"

এবং স্ট্রডিউটে একটি স্ট্রিং মুদ্রণ করে:

23*
**2
*31

1
2 (থেকে গনা শুরু করুন enumerate(s,2)), এবং এর সমস্ত সংঘটন প্রতিস্থাপন i + 2সঙ্গে iএবং i - 1সঙ্গে i - 3। এটি কয়েক বাইট শেভ করব
রবার্তো বনভোলেট

5

জাভাস্ক্রিপ্ট (ES6) 186 182 177 161 152 বাইট

f=a=>{for(s='',y=a[0].length;y--;)for(s=`
`+s,x=a.length;x--;)(k=>{for(t=0,i=9;i--;)t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k;s=(a[x][y]<k?t:k)+s})`*`;return s}

হালনাগাদ

" *"রিটার্নের জন্য উপরের কোড "2*"। এটি নিম্নলিখিত স্ক্রিপ্টে স্থির হয়েছে।

168 167 বাইট

f=a=>{for(s='',y=a[0].length;y--;)for(s=`
`+s,x=a.length;x--;)a[x][y]=='*'?s='*'+s:(k=>{for(t=0,j=3;j--;)for(i=3;i--;)t+=(a[x+i-1]||1)[y+j-1]=='*';s=t+s})`*`;return s}

এখানে চেষ্টা করুন।


1
আমার মনে হয় t+=(a[x+i%3-1]||[])[y+i/3-1|0]==kএকইভাবে কাজ করা উচিত এবং আপনাকে try/ catchঅংশটি সংরক্ষণ করতে হবে ।
আর্নল্ড

1
@Arnauld। প্রকৃতপক্ষে, আক্ষরিক সংখ্যার একটি সম্পত্তি পড়া কোনও ত্রুটি ছুঁড়ে ফেলবে না, তাই এটি হিসাবেও উন্নতি করা যায় (a[x+i%3-1]||1)[y+i/3-1|0]
sbisit

4

হাস্কেল, 115 বাইট

z=zip[1..]
x%i=[a|(j,a)<-z x,abs(i-j)<2]
f x=[[head$[c|c>' ']++show(sum[1|'*'<-(%j)=<<x%i])|(j,c)<-z r]|(i,r)<-z x]

fস্ট্রিংয়ের তালিকায় একটি ফাংশন সংজ্ঞায়িত করে


3

পাইথন 2, 192 বাইট

-৩ বাইটস কপারকে ধন্যবাদ, -১০ বাইট যদি ইনপুট গ্রিডে পরিবর্তন করার অনুমতি দেওয়া হয় তবে আরেকটি -11 বাইট পরিত্রাণ পেয়ে continueএবং কাউন্টার ভেরিয়েবলটি মুছে ফেলার জন্য আরেকটি -12 বাইট

def f(L):
 n,S,s=len(L[0]),[0,1,2],[' '];P=[s*(n+2)];K=P+[s+x+s for x in L]+P
 for y in range(len(L)):
    for x in range(n):
     if'*'!=L[y][x]:L[y][x]=`sum(K[y+d][x+e]=='*'for d in S for e in S)`

অক্ষরের তালিকার একটি তালিকা ব্যবহার Lকরে এবং একটি প্যাডেড সংস্করণ তৈরি করে K, তাই সীমানায় কোনও সমস্যা নেই। ইন্ডেন্টেশন হয়

  1. স্থান
  2. ট্যাব
  3. ট্যাব + স্পেস
  4. ট্যাব + ট্যাব

ব্যবহার:

s=""" *   
*  * 
  *  
    *"""
print s
s=[[c for c in x] for x in s.split('\n')]
f(s)
s='\n'.join([ ''.join(x) for x in s])
print s

1
কয়েকটি ছোটখাটো গল্ফ: আপনি আপনার প্রথম তিনটি ভেরিয়েবল অ্যাসাইনমেন্টগুলি সেমিকোলনের সাথে পৃথক একই লাইনে স্থাপন করতে পারেন এবং ইন্ডেন্টেশন হারাতে পারেন। এছাড়াও, if'*'==L[y][x]:একটি বাইট সংরক্ষণ করতে ব্যবহার করুন ।
তামা

আপনি দায়িত্ব অর্পণ তাহলে r=range;একই লাইনে যেমন n,S,s, আপনি কল প্রতিস্থাপন পাঁচটি অক্ষর সংরক্ষণ করতে পারবেন range(...)সঙ্গে r(...)
অ্যালেক্সওয়ালঞ্চন

@ আলেক্সওয়ালঞ্চ এটি করতে 2 * ange8 টি বাইট সাশ্রয় হয় তবে আমাকে যুক্ত করতে হবে ,rএবং ,rangeএটি 8 টি বাইটও যাতে কিছুই অর্জন করেনি।
কার্ল ন্যাপফ

@KarlNapf গাহ আপনি ঠিক - আমি সম্পর্কে ভুলেই গিয়েছিলাম range
অ্যালেক্সওয়ালচান

3

রুবি, 112

একটি স্ট্রিং নেয় এবং ফেরত দেয়। স্ট্রিং অবশ্যই নিউলাইন পৃথক এবং নিউলাইন সমাপ্ত হতে হবে।

->s{w=1+s=~/\n/
s.size.times{|i|s[i]==' '&&(n=0;9.times{|j|(s+$/*w)[i+j%3-1+j/3*w-w]==?*&&n+=1};s[i])=n.to_s}
s}

পরীক্ষা প্রোগ্রামে

f=->s{
  w=(s=~/\n/)+1                              #Calculate width.
  s.size.times{|i|                           #For each char in s
    s[i]==' '&&(                             #If it is a space
      n=0                                    #set counter n to 0 and visit
      9.times{|j|                            #a 3x3 square of chars.
        (s+$/*w)[i+j%3-1+j/3*w-w]==?*&&n+=1  #If *, increment n.
      }                                      #(Pad s with w newlines to avoid *'s detected by wraparound.)
      s[i]=n.to_s                            #Write n back to s in string format
    )
  }
s}                                           #Return s.

puts f[
" *   
*  * 
  *  
    *
"]

3

টিএসকিউএল 292 291 বাইট

Golfed:

DECLARE @ varchar(max)=
' *   
*  * 
  *  
    *';
WITH C as(SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c FROM master..spt_values CROSS APPLY(SELECT number x,charindex(char(10),@)z)z WHERE type='P'and x<len(@))SELECT @=stuff(@,i,1,z)FROM(SELECT i,(SELECT count(*)FROM C WHERE abs(D.c-c)<2and abs(D.r-r)<2and'*'=v)z FROM C D WHERE''=v)h PRINT @

Ungolfed:

DECLARE @ varchar(max)=
' *   
*  * 
  *  
    *';
WITH C as
(
  SELECT x+1i,substring(@,x+1,1)v,x/z r,x%z c
  FROM master..spt_values
  CROSS APPLY(SELECT number x,charindex(char(10),@)z)z
  WHERE type='P'and x<len(@)
)
SELECT @=stuff(@,i,1,z)
FROM
(
  SELECT
    i,
    (
      SELECT count(*)
      FROM C
      WHERE 
       abs(D.c-c)<2and abs(D.r-r)<2and'*'=v
    )z
  FROM C D
  WHERE''=v
)h
PRINT @

বেহালা


না ;আপনার কোড সামনে গণনা? দেখে মনে হচ্ছে আপনি এটি গণনা করেছেন।
এরিক আউটগল্ফার

@ এরিকথগল্ফার হ্যাঁ, যেখানে আগে স্ক্রিপ্ট রয়েছে। এটি মুছে ফেলা হলে সংকলক একটি ত্রুটি দেবে।
ফ্রিডલમાં

মানে, এটি কি সাধারণ উত্সের বাইট গণনায় থাকা উচিত? কারণ দেখে মনে হচ্ছে এটি পরিবর্তে "প্রাথমিক এসটিডিন" বিবৃতিটির অংশ হওয়া উচিত।
এরিক আউটগল্ফার

@ এরিক্থে গল্ফার আমি সত্যিই জানি না, আমি মনে করি এটি ঘোষণার অংশ হতে পারে। মাস্টারকেও বাদ দিতে পারে .. স্ক্রিপ্টের শুরুতে যদি কোনও ইউএসই মাস্টার থাকে। তবে এটি ঝাঁকুনিতে একটি বিরক্তিকর বার্তা দেয়।
t-clausen.dk

আমি সেমিকোলনটি আগের লাইনে লাগানোর চেষ্টা করেছি এবং এটি কার্যকর হয়েছে। আমি ধরে নিলাম শেষ লাইনটি গণনা করে।
এরিক আউটগল্ফার

2

র‌্যাকেট 415 বাইট

(let*((l(string->list s))(g (λ(r c)(if(or(>= r n)(>= c n)(< r 0)(< c 0))#f(list-ref l(+ c(* n r))))))(ng (λ(r c)(let*((h'(-1 0 1))(k(filter(λ(x)x)
(for*/list((i h)(j h)#:unless(= 0 i j))(g(+ r i)(+ c j))))))(count(λ(x)(equal? x #\*))k))))(k(for*/list((i n)(j n))(ng i j)))
(ol(map(λ(x y)(if(equal? x #\*)"*"(number->string y)))l k)))(for((i(* n n))(j ol))(display j)(when(= 0(modulo(add1 i)n))(displayln ""))))

Ungolfed:

(define (f s n)
  (let* ((l (string->list s))
         (get                            ; fn to get value at a (row, col)
          (lambda(r c)                   ; #f if invalid row or col
            (if (or (>= r n)
                    (>= c n)
                    (< r 0)
                    (< c 0))
                #f (list-ref l (+ c (* n r))))))

         (neighbors                      ; fn to count neighboring "*"
          (lambda(r c)
            (let* ((h '(-1 0 1))
                   (u (filter
                       (lambda(x) x)
                       (for*/list ((i h)(j h)
                                   #:unless (= 0 i j))
                         (get (+ r i) (+ c j))))))
              (count (lambda(x)(equal? x #\*)) u))))

         (k (for*/list ((i n) (j n))    ; for each row,col count neighboring "*"
              (neighbors i j)))
         (ol(map (lambda(x y)           ; get outlist- replace blanks with neighboring star count
                   (if(equal? x #\*) 
                      "*"
                      (number->string y)))
                 l k)))

    (for ((i (* n n))(j ol))            ; display outlist
      (display j)
      (when (= 0 (modulo (add1 i) n))
        (displayln "")))))

পরীক্ষা করা (নির্দিষ্ট কলাম নম্বর সহ একক স্ট্রিং হিসাবে তালিকাভুক্ত; স্পেসগুলির সাথেও কাজ করবে):

(f "----*-*-------------------**---*--*-" 6) 

আউটপুট:

1101*1
*10111
110000
012210
12**21
1*33*1

2

পিএইচপি, 145 133 132 127 বাইট

for($s=$argv[1];$s[$p];print$c)if(" "==$c=$s[$p++])for($y=-2;$y++<1;)for($x=$p-3;$x++<$p;)$c+="!"<$s[$x+$y*strpos($s,"\n")+$y];

একক স্ট্রিং হিসাবে ইনপুট লাগে, নতুন লাইন পৃথক। সাথে চালাও -r

ভাঙ্গন

for($s=$argv[1];$s[$p]; // loop through all characters (including newlines)
    print$c                     // 3. print result
)
    if(" "==$c=$s[$p++])        // 1. if character is space
        for($y=-2;$y++<1;)      // 2. count surrounding asterisk characters
            for($x=$p-3;$x++<$p;)
                $c+="!"<$s[$x+$y*strpos($s,"\n")+$y];

"!">$n=$s[$p]পরিবর্তে " "==$n=$s[$p]একটি বাইট সংরক্ষণ করুন
Jörg Hülsermann

@ JörgHülsermann এই লাইন ব্রেকগুলিকে ধ্বংস করবে
টাইটাস

@ জার্গহলসারম্যান ... তবে কৌশলটি নক্ষত্রের তুলনা (নতুন সংস্করণে) জন্য কাজ করে
টাইটাস

2

টার্টলিড , 99 বাইট

(উফফফ আমি লিঙ্কটি ভুলে যাচ্ছি: |)

প্রতিটি লাইনের চারপাশে বন্ধনী দিয়ে ইনপুট নেয়

টার্টল্ড মাল্টি-লাইন ইনপুট নিতে পারে না, সুতরাং শেষ লাইনের পরে, ইনপুটটির শেষের |সিগন্যালে লিখুন

অমিল বন্ধনীগুলি নোট করুন কারণ উন্মুক্ত বন্ধনীগুলি বন্ধনী কমান্ডের অংশ হিসাবে পরবর্তী চরকে পার্স করে

[|!.([[]r+.][[l]d)][ u]d[|[]r( #012345678#l(*+)u(*+)r(*+)r(*+)d(*+)d(*+)l(*+)l(*+)ur.)]' [[l]' d]' 

এটি অনলাইন চেষ্টা করুন!

এটি কীভাবে কাজ করে (সাধারণ বিবরণ):

|প্রবেশ না করা পর্যন্ত এটি প্রতিটি লাইনের ইনপুটটি লিখে দেয়, বন্ধনী দিয়ে প্রতিটি লাইনের শেষটি সনাক্ত করতে সহায়তা করে। এটি হওয়ার পরে, এটি ইনপুট শীর্ষে ফিরে যায়। এটি ইনপুট প্রতিটি অক্ষর মাধ্যমে যায়। যদি এটি কোনও স্থান হয় তবে এটি স্পেসের চারপাশে নজর রাখে এবং এটি খুঁজে পাওয়া প্রতিটি বোমাটির জন্য কাউন্টারে একটি যোগ করে। প্রতিটি লাইনের পরে, এটি বন্ধনীগুলি মুছে দেয়। এটি যখন শেষ লাইনে পৌঁছে যায় | এটিতে, এটি বন্ধ হয়ে যায় এবং | গ্রিড সুস্পষ্টভাবে মুদ্রিত হয়।


0

সি, 152 150 147 145 বাইট

i,j,r,c;f(B,R,C)char**B;{for(i=R*C;i--;)for(j=9;j--;){char*b=B[i/C]+i%C;r=i/C+j/3-1;c=i%C+j%3-1;r<0|c<0|r/R|c/C|*b&8||(*b=16|*b+(B[r][c]==42));}}

ইনপুটটি অক্ষরের দ্বি-মাত্রিক অ্যারের আকারে রয়েছে, এরপরে সারি এবং কলামগুলির সংখ্যা রয়েছে। ফলাফলটি জায়গায় ফিরে আসবে।

(বেশিরভাগ) অবহেলিত:

i, j, r, c;
f(B, R, C) char **B; {
    for (i = R*C; i--;)
        for (j = 9; j--;) {
            char *b = B[i/C] + i%C;
            r = i/C + j/3 - 1;
            c = i%C + j%3 - 1;
            r < 0 | c < 0 | r / R | c / C | *b & 8 ||
                (*b = 16 | *b + (B[r][c] == 42));
        }
}

পদ্ধতিটি সোজা-এগিয়ে - প্রতিটি অবস্থানের উপর লুপ, তার প্রতিবেশীদের উপর লুপ এবং সমস্ত নক্ষত্র যুক্ত করে। দুটি বিট-লেভেল ট্রিকস রয়েছে:

  • যখন আমরা সিদ্ধান্ত নিই যে কোনও ঘরটি তারকাচিহ্ন কিনা, আমরা কেবলমাত্র আট স্থান স্থান বিট সেট আছে কিনা তা খতিয়ে দেখতে পারি, কারণ ঘরের সংখ্যা অবশ্যই 8-এরও কম (সর্বোচ্চ ঘরের মান) হতে হবে।

  • আমরা একটি স্পেস অক্ষরকে OR-ing 16 দ্বারা শূন্য অক্ষরে পরিণত করতে পারি।

সম্পাদনা করুন: /জায়গায় ব্যবহার করে দুটি বাইট বন্ধ করে দেওয়া >=

সম্পাদনা করুন: লুপের দিকটি উল্টিয়ে আরও পাঁচটি বাইট।


0

সি #, 341 বাইট

একটি নির্লজ্জ বাস্তবায়ন যা অবশ্যই সংক্ষিপ্ত করা যেতে পারে।

s=>s=="*"?1:0;s=>{for(int i=0,j,n,l=s.Length,c=s[i].Length;i<l;++i)for(j=0;j<c;++j)if(s[i][j]!="*"){n=0;if(i>0){n+=a(s[i-1][j]);n+=j>0?a(s[i-1][j-1]):0;n+=j+1<c?a(s[i-1][j+1]):0;}n+=a(s[i][j]);n+=j>0?a(s[i][j-1]):0;n+=j+1<c?a(s[i][j+1]):0;if(i+1<l){n+=a(s[i+1][j]);n+=j>0?a(s[i+1][j-1]):0;n+=j+1<c?a(s[i+1][j+1]):0;}s[i][j]=n+"";}return s;};

0

পাইথন 2, 183 বাইট

def s(m):
 j=m.find('\n')+1;q='q'*j*2;m=list(q+m+q)
 for i in range(len(m)):
  if m[i]==' ':m[i]=`sum([m[k+i]=='*'for k in [-j-1,-j,-j+1,-1,1,j-1,j,j+1]])`
 return''.join(m)[j*2:-j*2]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.