ค้นหากองหญ้าในเข็ม


18

ในการบิดในการหาเข็มในกองหญ้าที่คุณต้องพบกองหญ้าติดกันมากที่สุดที่มีตรง หนึ่ง เข็ม โปรดทราบว่าคุณไม่สามารถเชื่อมต่อเซลล์กับเส้นทแยงมุมได้เฉพาะด้านซ้าย / ขวา / ขึ้น / ลง

อินพุต

อาร์เรย์ (หรือจำนวนบรรทัดอินพุตของผู้ใช้, การเลือกของคุณ) ของ'N'(เข็ม) และ'#'(เฮย์) อินพุตมีอักขระสองตัวเหล่านั้นเท่านั้นและต้องมีอย่างน้อยหนึ่งตัว ตัวอย่างเช่น:

N#N#N
#NN##
###N#
N##N#

เอาท์พุต

ขนาดของกองหญ้าที่ถูกต้องที่เป็นไปได้มากที่สุด ตัวอย่างของเราเราจะเอาท์พุท 11 (มีหญ้าแห้ง 11 ชิ้นและเข็มหนึ่งอัน)

   # 
#  ##
###N#
 ## #

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ มีข้อ จำกัด ช่องโหว่มาตรฐาน

กรณีทดสอบ

ใส่ทางซ้ายเป็นไปได้สูงสุดที่กองฟางทางด้านขวา

กรณีที่ 1: 4

N##    ##
NN#     #
#NN     N
#N#     #

กรณีที่ 2: 7

###   ###
N#N    # 
NNN    N 
###   ###

กรณีที่ 3: 10

N###N    ### 
#N#N#   #N#  
#N#N#   # #  
N###N    ###

กรณีที่ 4: 10

N#N#N        
#N#N#   # # #
##N##   ##N##
#N#N#   # # #
N#N#N        

กรณีที่ 5: 1

NN#NN        
NNNNN         
#NNN#   #N    
NN#NN        

คำตอบ:


4

JavaScript (ES6), 152 ไบต์

s=>[...s].map((n,i)=>n>'M'&&(a=[...s],a[i]=r=1,a.map(_=>a.map((c,j)=>c=='#'&&a[j+1]|a[j-1]|a[j+l]|a[j-l]?a[j]=++r:0)),o=r>o?r:o),o=0,l=~s.search`
`)|o-1

คำอธิบาย

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

var solution =

s=>
  [...s].map((n,i)=>n>'M'&&(          // for each needle in s at index i
      a=[...s],                       // a = array of each character in s
      a[i]=1,                         // set the starting needle to 1 (haystack)
      r=0,                            // r = haystack size starting from this needle
      a.map(_=>                       // loop to ensure the complete haystack is found
        a.map((c,j)=>                 // for each cell c at index j
          c=='#'&&                    // if the current cell is hay
          a[j+1]|a[j-1]|a[j+l]|a[j-l] // and any adjacent cells are part of the haystack
          ?a[j]=++r:0                 // add the current cell to the haystack, increment r
        )
      ),
      o=r>o?r:o                       // o = max of o and r
    ),
    o=0,                              // o = final output, initialise to 0
    l=~s.search`
`                                     // l = line length of s
  )
  |o                                  // return o
<textarea id="input" rows="6" cols="40">N#N#N
#N#N#
##N##
#N#N#
N#N#N</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


4

ทับทิม, 207

->a{d=->b{0...b.size}
f=c=s=->y,x{(d[a]===y&&d[a[0]]===x&&!f[y][x]&&a[y][x]==c)?(c,f[y][x]=?#,1
1+s[y,x-1]+s[y,x+1]+s[y-1,x]+s[y+1,x]):0}
d[a].map{|y|d[y].map{|x|f,c=a.map{|b|b.map{p}},?N
s[y,x]}.max}.max-1}

นี่คือฟังก์ชั่นไม่ระบุชื่อที่ใช้ในการป้อนข้อมูลเป็นอาร์เรย์ของอาร์เรย์ การใช้งาน:

f=->a{......}

f["
N##
NN#
#NN
#N#
".strip.split.map(&:chars)] # => 4

proc ที่มีชื่อsเรียกซ้ำพบขนาดของกองหญ้าด้วยเข็มที่พิกัดเฉพาะและถูกเรียกใช้บนแต่ละเข็มในกองหญ้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.