একটি মাইনসুইপার বোর্ড উল্টে দিন


32

মাইনসুইপার একটি জনপ্রিয় কম্পিউটার গেম যা আপনি সম্ভবত খেলতে সময় নষ্ট করেছেন যেখানে আপনি প্রতিটি অ-খনি কোষের কতগুলি প্রতিবেশী খনি রয়েছে তার ইঙ্গিতের উপর ভিত্তি করে একটি আয়তক্ষেত্রাকার গ্রিডের খনিগুলি যে ঘরগুলি প্রকাশ করার চেষ্টা করছেন reveal আপনি যদি এটি খেলেন নি তবে এখানে এটি করুন

মাইনসুইপার গ্রিড (ওরফে বোর্ড) সম্পর্কে একটি নিমফ গাণিতিক সত্য হ'ল:

একটি বোর্ড এবং এর পরিপূরকগুলিতে খনিতে মোট নম্বর রয়েছে । ( প্রুফ )

এর অর্থ এটি হ'ল যদি আপনার কাছে সম্পূর্ণ প্রকাশিত মাইনসুইপার গ্রিড থাকে তবে সেই গ্রিডের সমস্ত সংখ্যার সমতুল্য, খনি মোট , গ্রিডের পরিপূরকের খনি মোটের সমান হবে, যা গ্রিড যেখানে প্রতিটি খনি প্রতিস্থাপন করা হয়েছে একটি অ-খনি এবং প্রতিটি নন-মাইন প্রতিস্থাপন করে।

উদাহরণস্বরূপ, মাইনসুইপার গ্রিডের জন্য

**1..
34321
*2**1

খনি মোট 1 + 3 + 4 + 3 + 2 + 1 + 2 + 1 = 17।

গ্রিডের পরিপূরক হ'ল

24***
*****
3*44*

যার আবার আমার মোট 2 + 4 + 3 + 4 + 4 = 17 আছে।

একটি প্রোগ্রাম যা টেক্সট আকারে একটি অবাধ শত্রু কর্তৃক স্থাপিত মাইন সরইয়া ফেলিবার কাজে নিযুক্ত জাহাজ গ্রিড যেখানে লাগে লিখুন *এবং খনি প্রতিনিধিত্ব করে 1মাধ্যমে 8একটি অ-খনি সেল সংলগ্ন খনি সংখ্যা প্রতিনিধিত্ব করে। আপনি ব্যবহার করতে পারেন .বা 0বা (স্থান) কোন খনি প্রতিবেশী, আপনার পছন্দের সঙ্গে কোষ প্রতিনিধিত্ব করতে। আপনি ধরে নিতে পারেন যে ইনপুট গ্রিডটি সঠিকভাবে চিহ্নিত হবে, অর্থাত প্রতিটি নন-মাইন সেল যথাযথভাবে তার সাথে সংলগ্ন মোট খনিগুলির সংক্ষিপ্ততাটি তাত্ক্ষণিকভাবে বা ত্রিভুজযুক্তভাবে চিহ্নিত করবে।

(একই ব্যবহার করে আপনার প্রোগ্রাম একই বিন্যাসে গ্রিড সম্পূরক প্রিন্ট করার প্রয়োজন ., 0অথবা হিসাবে আপনি ইনপুটে প্রত্যাশিত)।

বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।

  • কোনও প্রোগ্রামের পরিবর্তে আপনি কোনও ফাংশন লিখতে পারেন যা ইনপুট গ্রিডটিকে স্ট্রিং হিসাবে গ্রহণ করে এবং পরিপূরক গ্রিডটি প্রিন্ট করে বা প্রদান করে।
  • ইনপুট বা আউটপুটে একটি পিছনে থাকা নতুন লাইন ঠিক আছে, তবে গ্রিড গঠন করে এমনগুলি ছাড়া আর কোনও অক্ষর নেই।
  • আপনি ধরে নিতে পারেন যে 1 × 1 গ্রিডটি সবচেয়ে ছোট ইনপুট হবে।

পরীক্ষার মামলা

পরিপূরকের পরিপূরক মূল গ্রিড হওয়ায় সমস্ত ইনপুট এবং আউটপুটগুলি অদলবদল হতে পারে। আরও পরীক্ষার ক্ষেত্রে গ্রিডগুলিও ঘোরানো যেতে পারে।

ইনপুট:

111
1*1
111

আউটপুট:

***
*8*
***

ইনপুট:

.

আউটপুট:

*

ইনপুট:

*11*1.1**1...1***1.....1*****1..........

আউটপুট:

1**2***11*****1.1*******1...1***********

ইনপুট: ( নট উদাহরণ কাটা )

**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*

আউটপুট:

24***4**
***7**64
*8**7***
******8*
4**7****
*33**5*3

টিআই-বেসিক খালি লাইন ইনপুট গ্রহণ করতে পারে না। ?বোর্ডের চূড়ান্ত লাইনের পরে লাইনে একটি শেষ ডিলিমিটার ব্যবহার করা (উদাহরণস্বরূপ ), অথবা আমি কমান্ড লাইনের মাধ্যমে ইনপুট লাইনের সংখ্যা নিতে পারি?
lirtosiast

@ থমাসকওয়া টিআই-বেসিক এবং অন্যান্য ভাষার যে নতুন লাইনের সীমাবদ্ধতা রয়েছে তার জন্য একটি শেষ সীমানা সূক্ষ্ম মনে হচ্ছে।
ক্যালভিনের

উত্তর:


12

পাইথ, 39 38 বাইট

j.es.eh-+K\*l-s:RtWYY+Y2:+K.zk+k3KZb.z

অনলাইনে চেষ্টা করুন: বিক্ষোভ

মূল অ্যালগরিদম সত্যিই সোজা। আমি কেবল প্রতিটি ঘরে ঘুরে দেখি, আশেপাশের 3x3 বাক্সটি নিয়ে যাই (বা ঘরটি যখন সীমান্তে থাকে তখন ছোট) এবং তারার বা সেই বাক্সে নন-তারাগুলির সংখ্যা মুদ্রণ করি।

ব্যাখ্যা:

j.es.eh-+K\*l-s:RtWYY+Y2:+K.zk+k3KZb.z  implicit: .z = list of input strings
 .e                                 .z  map each index k, line b of .z to:
    .e                             b      map each index Y, char Z of b to:
         K\*                                assign "*" to K
                         +K.z               insert K at the front of .z
                        :    k+k3           slice from k to k+3
               :RtWYY+Y2                    take the slice from Y-1 or 0 
                                            to Y+2 for each line
              s                             join, this gives the 3x3 rectangle
                                             (or smaller on the border)
             -                   K          remove all "*"s
            l                               take the length
        +K                                   "*" + ^
       -                          Z         remove Z from this string
      h                                     and take the first char
                                            (if cell=mine take the number, 
                                             otherwise take the number)
  s                                       join the chars of one line
j                                       join by newlines

সত্যিই ঝরঝরে, +1
MKII

22

সিজেম, 58 57 বাইট

0WX]2m*qN/{'*f+z}2*f{\~@m<fm<W<}:..+{W<{_'*#'*@'*-,?}/N}/

ইনপুট একটি লাইনফিড দিয়ে শেষ করা উচিত নয়। আউটপুটটিতে 0কাছাকাছি খনি ছাড়া সেলগুলির জন্য রয়েছে ।

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

ধারণা

আমরা ইনপুট ম্যাট্রিক্সকে এক সারি এবং একটি কক্ষের কলাম দিয়ে প্যাডিং দিয়ে শুরু করি।

ইনপুট জন্য

*4*
**2

এর ফলে

*4**
**2*
****

এখন আমরা সমস্ত সম্ভাব্য পরিবর্তনগুলি উত্পন্ন করি যা সারি এবং কলাম 0, -1 বা 1 ইউনিট উপরে / বামে ঘোরার ফলাফল:

*4** **** **2* **4* **** ***2 4*** **** *2**
**2* *4** **** ***2 **4* **** *2** 4*** ****
**** **2* *4** **** ***2 **4* **** *2** 4***

আমরা প্রতিটি ঘূর্ণন থেকে "প্যাডিং অবস্থানগুলি" ফেলে রাখি, অর্থাৎ,

*4* *** **2 **4 *** *** 4** *** *2*
**2 *4* *** *** **4 *** *2* 4** ***

এবং প্রতিটি ঘূর্ণনের সম্পর্কিত অক্ষরগুলি একত্রিত করে একটি একক ম্যাট্রিক্স গঠন করুন:

******4** 4*******2 **24*****
*******4* *4****2** 2***4****

প্রতিটি পদের প্রথম চরিত্রটি এর মূল চরিত্র।

  • এটি যদি অ-অ্যাসিটার্ক্ক হয় তবে এটি একটি নক্ষত্রের সাথে প্রতিস্থাপন করতে হবে।

  • যদি এটি একটি তারকাচিহ্ন হয়, তবে স্ট্রিংয়ের অ-অরস্টিকগুলির সংখ্যা হ'ল প্রতিবেশী খনিগুলির সংখ্যা।

কিভাবে এটা কাজ করে

0WX]2m*   e# Push the array of all vectors of {0,-1,1}^2.
qN/       e# Read all input from STDIN and split at linefeeds.
{'*f+z}2* e# Append a '*' to each row and transpose rows with columns. Repeat.
f{        e# For each vector [A B], push the modified input Q; then:
  \~      e#   Swap Q with [A B] and dump A and B on the stack.
  @m<     e#   Rotate the rows of Q B units up.
  fm<     e#   Rotate each row of the result A units left.
  W<      e#   Discard the last row.
}         e# This pushes all nine rotations with Manhattan distance 1.
:..+      e# Concatenate the corresponding characters for each position.
{         e# For each row:
  W<      e#   Discard the character corresponding to the last column.
  {       e#   For each remaining string:
    _'*#  e#     Find the first index of '*' in a copy.
    '*    e#     Push '*'.
    @'*-, e#     Count the non-asterisks in the string.
    ?     e#     Select '*' if the index is non-zero, the count otherwise.
  }/      e#
  N       e#   Push a linefeed.
}/        e#

7
আমি ভীত - এটি আশ্চর্যজনক।
দেউসোভি

আপনি স্যার, সবেমাত্র সিস্টেমটি ভেঙে দিয়েছেন। +1 টি! আমি জিজ্ঞাসা করতে পারি আপনি এই তত্ত্বটি কোথায় পেয়েছেন?
গামারকম্পস

9
@IonLee এই একমাত্র আমি। এটি একটি খুব সহজ ধারণা, সত্যই: প্রদত্ত কক্ষের চারপাশে ঘরগুলি পরীক্ষা করার পরিবর্তে, আমরা পুরো গ্রিডটি চারপাশে সরিয়ে নিয়ে কোষের মধ্যে পড়ে তা পর্যবেক্ষণ করি।
ডেনিস

বলিহারি! আমি এটা কখনই ভাবিনি।
গ্যামারকর্পস

7

রুবি, 119

->s{w=1+s.index('
')
s.size.times{|c|t=0;9.times{|i|(s+?**w*2)[c+i/3*w-w+i%3-1]<?0||t+=1}
print [t,?*,'
'][s[c]<=>?*]}}

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ:

f=->s{
  w=1+s.index("\n")                          #width of board
  s.size.times{|c|                           #iterate through input
    t=0;                                     #number of digits surrounding current cell
    9.times{|i|                              #iterate through 3x3 box (centre must be * if this ever gets printed.)
      (s+"*"*w*2)[c+i/3*w-w+i%3-1]<"0"||t+=1 #copy of s has plenty of * appended to avoid index errors
    }                                        #add 1 every time a number is found.
  print [t,"*","\n"][s[c]<=>"*"]             #if * print t. if after * in ACSII it's a number, print *. if before, it's \n, print \n
  }
}


f['**212*32
333*33**
1*22*333
222222*1
*33*2232
2**22*2*']

2

অক্টাভা, 76

m=@(s)char(conv2(b=(cell2mat(strsplit(s)'))~='*',ones(3),'same').*~b-6*b+48)

ব্যাখ্যা

  • রূপান্তর ইনপুট স্ট্রিং ব্যবহার করে স্ট্রিং ম্যাট্রিক্স থেকে strsplitএবং cell2mat

  • মূল ম্যাট্রিক্সে 1যেখানে নেই সেখানে লজিকাল ম্যাট্রিক্স পান *

  • এর কনভলিউশনটি 1 এর 3x3 ম্যাট্রিক্সের সাথে নিন।

  • বিপরীত লজিকাল ম্যাট্রিক্স *দিয়ে এটি মাস্ক করুন এবং মাস্কের জায়গায় রাখুন।

  • দ্রষ্টব্য: কোনও খনি প্রতিবেশী নয় এমন কক্ষগুলি প্রতিনিধিত্ব করা হচ্ছে 0

ফাঁসি

>> m(['**100' 10 '34321' 10 '*2**1'])   %// `10` is newline
ans =

24***
*****
3*44*

>> m(['24***' 10 '*****' 10 '3*44*'])
ans =

**100
34321
*2**1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.