กรอกข้อมูลใน Minesweeper clues


54

Minesweeperเป็นเกมตัวต่อยอดนิยมที่คุณต้องค้นหาว่าแผ่นไหนเป็น "เหมือง" โดยไม่ต้องคลิกบนแผ่นเหล่านั้น แต่ละแผ่นเป็นทั้งเหมือง (แสดงโดย*) หรือเบาะแสเช่นหมายเลขตั้งแต่ 0 ถึง 8 แสดงถึงจำนวนของกระเบื้อง 8 แผ่นที่อยู่ใกล้เคียงคือเหมือง งานของคุณในวันนี้คือนำกระดานที่มีเหมืองและกรอกข้อมูลทั้งหมด ตัวอย่างเช่นดูกระดานต่อไปนี้ 5x4 โดยมี 5 เหมือง:

 *  
*  * 
  *  
    *

หลังจากเติมเบาะแสบอร์ดจะมีลักษณะเช่นนี้:

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

รายละเอียด

คุณต้องเขียนโปรแกรมเต็มหรือฟังก์ชั่นที่ใช้ในตารางของตัวละครที่มีเพียงช่องว่างและเครื่องหมายดอกจันและส่งออกตารางอื่นที่แต่ละช่องว่างจะถูกแทนที่ด้วยจำนวนของเหมืองที่อยู่ติดกัน (เครื่องหมายดอกจัน) สิ่งเหล่านี้เป็นรูปแบบที่ยอมรับได้สำหรับกริดของคุณ:

  • สตริงที่มีการขึ้นบรรทัดใหม่

  • รายการ 2D ของตัวละคร / สายอักขระเดียว

  • รายการของสตริง

คุณสามารถสมมติว่ากริดจะต้องมีอย่างน้อย 1x1 ถึงแม้ว่ามันจะเป็นไปได้ที่จะเป็นเหมืองทั้งหมดหรือช่องว่างทั้งหมด

กริดอินพุตจะถูกเสริมด้วยจำนวนช่องว่างที่เหมาะสมเสมอ ตามปกตินี่คือดังนั้นช่องโหว่มาตรฐานจึงนำมาใช้และคำตอบที่สั้นที่สุดในการชนะไบต์!

ตัวอย่าง IO

เพื่อให้คุณเห็นช่องว่างฉันจะแสดงตัวอย่าง 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
FYI ฉันทำตัวอย่าง IO ด้วยมือทั้งหมดดังนั้นจึงเป็นไปได้ว่ามีข้อผิดพลาดเล็กน้อยอยู่ในนั้น แจ้งให้เราทราบว่ามีบางอย่างผิดปกติและฉันจะพยายามแก้ไขโดยเร็วที่สุด
DJMcMayhem


1
ตารางเป็นตารางที่ไม่ใช่สแควร์ได้หรือไม่?
Ton Hospel

เหมืองสามารถเป็นตัวแทนของตัวละครอื่นได้หรือไม่?
Akangka

@ChristianIrwan ไม่เหมืองจะเป็นเครื่องหมายดอกจันเสมอ
DJMcMayhem

คำตอบ:


21

MATL , 18 17 ไบต์

ขอบคุณ@ mbomb007สำหรับการแก้ไขในอินพุตของกรณีทดสอบ 6

32>t3Y6Z+-6b(48+c

อินพุตเป็นอาร์เรย์ถ่าน 2 มิติในรูปแบบ

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

ลองออนไลน์!

กรณีการทดสอบ: 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
ว้าว. นั่นเป็นสิ่งที่น่าประทับใจ
BladorthinTheGrey

2
รับกรณีทดสอบ 6 จะฉี่ฉันออกไปเล่นเกมจริง
Magic Octopus Urn

ทำไม? กรณีทดสอบ 6 ดูสมจริงที่สุด
WBT

@carusocomputing การรับกรณีทดสอบ 2 จะทำให้ฉันโกรธมากขึ้น : P
DJMcMayhem

10

JavaScript (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 ไบต์ขอบคุณแนวคิดโดย @ETHproductions


ฉันคิดว่าคุณสามารถบันทึกพวงโดยกำหนดฟังก์ชั่นเพื่อตรวจสอบว่าดัชนีไม่ว่าง: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)))
ETHproductions

@ ETHproductions ฉันเอาความคิดของคุณไปสุดโต่ง ... ฉันมักจะไม่ได้เขียนพารามิเตอร์ฟังก์ชั่น!
Neil

7

R, 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 และ @ sebastian-c สำหรับการปรับปรุง

จุดที่น่าสังเกต:

เมทริกซ์เป็นเวกเตอร์ในอาร์คุณไม่จำเป็นต้องทำดรรชนีแบบ 2 มิติเพื่อดึงองค์ประกอบออกมา

seq(M)จะกลับลำดับเดียวกัน "ความยาว" (แถว x คอลัมน์) Mเป็น

คุณไม่สามารถผสมดัชนีการแยกในเชิงบวกและลบใน R M[-3]คือรหัส R ที่ถูกต้อง แต่ไม่ใช่สิ่งที่ต้องการ

อินพุตอยู่ในรูปแบบของเมทริกซ์ R ตัวอย่างบางส่วน:

> 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}
sebastian-c

1
คุณให้คำจำกัดความb=ncol(M)แล้วอย่าใช้มันเพื่อที่คุณจะสามารถกำจัดมันได้
gtwebb

ฉันสามารถโกนอักขระสี่ตัว (และ vectorise): 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)))}- อย่างไรก็ตามกลโกงนี้เล็กน้อยเนื่องจากต้องการ<-แลมบ์ดาที่กำหนดใหม่ดูklmr / functional / lambda
Konrad Rudolph

@ Konrad ความคิดที่น่าสนใจ แต่ฉันจะให้มันไปที่ฐาน R ขอบคุณ!
JDL

6

Java, 190 ไบต์

แก้ไข:

  • ปิด-6ไบต์ ขอบคุณ @Frozn
  • -1ไบต์ ขอบคุณตัวเอง :)
  • -1ไบต์ พบข้อผิดพลาดบางอย่าง ขอบคุณ @Kevin Cruijssen

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ไปเรื่อย ๆ และเปลี่ยนมันในส่วน Ungolfed
Roman Gräf

และฉันสั้นกว่า Phyton อย่างน้อย!
Roman Gräf

คุณแน่ใจว่ารหัส ungolfed ของคุณถูกต้องหรือไม่ สำหรับกรณีทดสอบแรกมันจะส่งออก: 0000*1\n*10011\n110000\n000000\n00**10\n0*22*1. คุณสามารถเพิ่มลิงค์ทดสอบ ideone.com ได้ไหม แก้ไข: นอกจากนี้หากฉันทำอะไรผิดพลาดตัวเองรหัสสนามกอล์ฟของคุณ: ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0sสำหรับกรณีทดสอบครั้งแรก (มันแทนที่*ด้วยศูนย์ทั้งหมด.. ): S
Kevin Cruijssen

แก้ไข ฉันจะเพิ่มลิงก์ทดสอบทันทีที่อินเทอร์เน็ต pior ของฉันอนุญาตให้ฉันทำเช่นนั้น
Roman Gräf

5

JavaScript (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)))

ทราบเมื่อฟังก์ชั่น s ถูกเรียกด้วยองค์ประกอบของรายการ l นอกขอบเขตพารามิเตอร์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

Python 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"

และพิมพ์สตริงไปที่ STDOUT:

23*
**2
*31

1
ทำให้การเริ่มต้นการระบุจาก 2 ( enumerate(s,2)) และแทนที่เกิดขึ้นทั้งหมดi + 2ด้วยiและมีi - 1 i - 3ที่จะโกนออกสองสามไบต์
Roberto Bonvallet

5

JavaScript (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ส่วน
Arnauld

1
@Arnauld ที่จริงแล้วการอ่านคุณสมบัติของจำนวนตัวอักษรจะไม่เกิดข้อผิดพลาดดังนั้นจึงสามารถปรับปรุงได้เช่น(a[x+i%3-1]||1)[y+i/3-1|0]กัน
sbisit

4

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

Python 2, 192 ไบต์

-3 ไบท์ขอบคุณทองแดง, -10 ไบต์หากการแก้ไขกริดอินพุตได้รับอนุญาต, อีก -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. แท็บ + Space
  4. แท็บ + Tab

การใช้งาน:

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(...)
alexwlchan

@alexwlchan การทำเช่นนี้ช่วยประหยัด 2 * angeดังนั้น 8 ไบต์ แต่ฉันต้องเพิ่ม,rและ,rangeซึ่งเป็น 8 ไบต์จึงไม่มีอะไรได้รับ
Karl Napf

@KarlNapf Gah คุณพูดถูก - ฉันลืมไปrangeแล้ว
alexwlchan

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

TSQL 292 291 ไบต์

แข็งแรงเล่นกอล์ฟ:

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 @

ซอ


ที่ไม่;ที่ด้านหน้าของรหัสของคุณนับ? ดูเหมือนว่าคุณจะนับมัน
Erik the Outgolfer

@EriktheGolfer ใช่ที่มีสคริปต์ก่อนหน้าด้วย คอมไพเลอร์จะให้ข้อผิดพลาดถ้ามันจะถูกลบออก เป็นไปได้ที่จะทดสอบแนวคิดในซอ
t-clausen.dk

ฉันหมายถึงควรเป็นจำนวนไบต์ของแหล่งข้อมูลทั่วไปหรือไม่ เพราะดูเหมือนว่ามันควรเป็นส่วนหนึ่งของคำสั่ง "Initial STDIN" แทน
Erik the Outgolfer

@EriktheGolfer ฉันไม่รู้จริงๆฉันคิดว่ามันสามารถเป็นส่วนหนึ่งของการประกาศได้ ยังสามารถยกเว้น ต้นแบบ ..หากมีต้นแบบ USE ในตอนเริ่มต้นของสคริปต์ แต่มันให้ข้อความที่น่ารำคาญในซอ
t-clausen.dk

ฉันพยายามใส่เครื่องหมายอัฒภาคบนบรรทัดก่อนหน้าและใช้งานได้ ฉันถือว่าบรรทัดสุดท้ายคือสิ่งที่นับ
Erik the Outgolfer

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

PHP, 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örgHülsermann

@ JörgHülsermannนั่นจะทำลาย linebreaks
ติตัส

@ JörgHülsermann ... แต่เคล็ดลับการทำงานสำหรับการเปรียบเทียบเครื่องหมายดอกจัน (ในรุ่นใหม่)
ติตัส

2

Turtlèd , 99 ไบต์

(ขออภัยฉันลืมลิงค์: |)

รับอินพุตด้วยวงเล็บเหลี่ยมแต่ละบรรทัด

Turtlèdไม่สามารถรับอินพุตหลายบรรทัดได้ดังนั้นหลังจากบรรทัดสุดท้ายให้เขียน|ไปที่สัญญาณสิ้นสุดของอินพุต

โปรดสังเกตว่าวงเล็บเหลี่ยมที่ไม่ตรงกันนั้นเป็นเพราะวงเล็บเปิดเปิดแยกอักขระอักขระถัดไปซึ่งเป็นส่วนหนึ่งของคำสั่ง Bracket

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

ลองออนไลน์!

มันทำงานอย่างไร (คำอธิบายทั่วไป):

จนกว่า|จะมีการป้อนเข้าก็จะเขียนอินพุตในแต่ละบรรทัดพร้อมเครื่องหมายวงเล็บเพื่อช่วยให้จดจำจุดสิ้นสุดของแต่ละบรรทัด หลังจากนั้นก็เกิดขึ้นมันจะกลับขึ้นไปด้านบนของอินพุต มันจะผ่านตัวละครแต่ละตัวในการป้อนข้อมูล ถ้าเป็นช่องว่างมันจะดูรอบ ๆ ช่องว่างเพิ่มอีกหนึ่งช่องเพื่อนับจำนวนระเบิดที่พบ หลังจากแต่ละบรรทัดมันจะลบวงเล็บเหลี่ยม เมื่อถึงบรรทัดสุดท้ายด้วยเครื่องหมาย | ในนั้นจะหยุดและลบ | กริดจะถูกพิมพ์โดยปริยาย


0

C, 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));}}

อินพุตอยู่ในรูปแบบของอักขระสองมิติตามด้วยหมายเลขของแถวและคอลัมน์ ผลลัพธ์จะถูกส่งกลับในสถานที่

(ส่วนใหญ่) Ungolfed:

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

C #, 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

Python 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.