การเติมน้ำแข็ง Cube โดยพลการ


27

สมมติว่ากริดของช่องว่างนี้และXแสดงถึงส่วนตัดของถาดน้ำแข็งเปล่าที่มีรูปร่างแปลก ๆ:

   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

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

หากเราต้องวางก๊อกน้ำเหนือถาดและให้เติมน้ำจนระดับน้ำในห้องทั้งหมดยังคงมีความเสถียรช่องที่แน่นอนที่เติมจะขึ้นอยู่กับตำแหน่งที่น้ำไหลอยู่เหนือถาด (สมมติว่ามีกระแสน้ำที่บางและมั่นคงโดยไม่มีการสาด)


ตัวอย่างเช่นถ้า faucet ของเราFอยู่เหนือคอลัมน์กริดที่เหลือ

F                   
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

น้ำจะตกลงมาถึงจุดสูงสุดXในคอลัมน์นั้นและกระจายไปทางซ้ายและขวาครึ่งซ้ายที่หกลงในอ่างด้านล่างและครึ่งทางขวาเติมช่อง 2 × 1 เมื่อช่องเติมน้ำครึ่งทางขวาของกระแสน้ำไหลไม่ไหล แต่เข้าสู่อ่างล้างจานและระดับน้ำในทุกที่นั้นคงที่

เมื่อปิดก๊อกน้ำถาดจะมีลักษณะดังนี้: ( ~เหมือนน้ำ)

   X     X X        
X~~X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

ในทำนองเดียวกันถ้าเราวางตำแหน่ง faucet ดังนี้:

   F                
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

มันจะเติมช่องว่างที่เหลือทั้งสองให้เต็ม แต่น้ำที่เหลือจะระบายออก:

   X     X X        
X~~X~X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

ถ้าเราวางตำแหน่ง faucet ดังนี้:

         F          
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

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

   X     X~X        
X  X X  XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX

อย่างไรก็ตามตำแหน่งในลักษณะนี้:

        F           
   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

น้ำไหลออกหมดและไม่มีช่องใส่

   X     X X        
X  X X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในช่องสี่เหลี่ยมของช่องว่างXและหนึ่งFช่อง แถวบนสุดจะมีFและจะมีช่องว่างเสมอ X's ในแต่ละคอลัมน์ (ถ้ามี) จะขยายในเส้นทึบขึ้นมาจากฐานของตารางคือจะไม่มีการยื่นหรือถ้ำ

พิมพ์หรือส่งคืนกริดหลังจาก faucet Fได้เติมน้ำ~เท่าที่จะทำได้ตามที่อธิบายไว้ข้างต้น ปล่อยFแถวบนออกจากเอาต์พุต

  • ตารางแยกจากแถว faucet จะเป็น 1 × 1 อย่างน้อย

    F
    X
    

    เป็นอินพุตที่เล็กที่สุดที่คุณต้องการสนับสนุน

  • การป้อนข้อมูลจะเข้ามาเป็นรูปสี่เหลี่ยมผืนผ้าข้อความที่สมบูรณ์ ช่องว่างนำหน้าและส่วนท้ายมีความสำคัญในอินพุตและเอาต์พุต เช่นอินพุท

        F     
      X  X    
      XXXX    
    

    ควรส่งผลให้

      X~~X    
      XXXX    
    

    (บันทึกช่องว่างนำหน้าและต่อท้าย)

  • มีบรรทัดใหม่ต่อท้ายเดียวในอินพุตหรือเอาต์พุตนั้นเป็นเรื่องปกติ

  • คุณสามารถใช้ใด ๆ ที่แตกต่างกันสี่ASCII พิมพ์ตัวอักษรในสถานที่ของพื้นที่X, ,F~

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ตัวอย่างใหญ่:

การป้อนข้อมูล:

                F                                 
              X             X                     
              X             X X                   
X            XXX       X    X X           X    X  
X   X     XXXXXXX      X    XXX     XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

เอาท์พุท:

              X~~~~~~~~~~~~~X                     
              X~~~~~~~~~~~~~X~X                   
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X    X  
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

โอ้ใช่เป็นโอกาสที่ดีสำหรับฉันที่จะใช้ที่รักของฉันzip()<3
cjfaure

2
สิ่งนี้ต้องการคำตอบ: / ฉันจะแก้ไขมัน
TheNumberOne

มันค่อนข้างง่ายที่จะสร้างหุ่นยนต์เซลลูลาร์ที่จำลองสิ่งนี้ แต่ฉันไม่สามารถคิดวิธีที่จะจบได้
DanTheMan

ยังไม่มีใครที่จะแข่งขัน? ความท้าทายที่น่ารักมาก ดูเหมือนว่าฉันจะต้องเอาชนะตัวเอง :)
Jakuje

ดูเหมือนซ้ำซ้อนนี้: codegolf.stackexchange.com/questions/2563/fill-in-the-lakes
12Me21

คำตอบ:


1

perl -p0, 204 + 2 ไบต์

IDEA

  • หากทั้งสองด้านของเกาะด้านล่าง F มีความสูงเท่ากันให้แทนที่X *Xes ทั้งหมดด้วยX~*Xes บนเกาะนั้น
  • หากด้านใดด้านหนึ่งสูงกว่าให้แทนที่X *Xes ทั้งหมดด้วยX~*Xes ระหว่างท่อระบายน้ำที่ด้านล่างและจุดที่ใกล้เคียงกับ F ที่สูงกว่าด้านบนของด้านล่าง

ดินแดนด้านล่างฉนั้นนับเป็นส่วนหนึ่งของทั้งสองข้างตรงนี้

กอล์ฟ

s/.*(F).*
//;$f=@-[1];($%,$r)=map{y///c}/(.{0,$f})\bX+?\b(.*)$/;($a,$b)=map{y///c}/[^~]*^(?(?=(.{$%,$f}X)).{$f} *|.{$f} *X(.*)).{$r}
/m;$a=$%if!$a||$b;$b+=$r;s/(?<=.{$a})\b *\b(?=.{$b})/"~"x length($&)/ge

หมายเหตุ

perl -p0e ' # slurp stdin, print the result

s/.*(F).*\n//; # remove the first line, record the index of F
$f=@-[1]; # get the index of F

($l,$r)=map{length}m/(.{0,$f})\bX+?\b(.*)$/;
# gets the distance from either side to the drains closest to F
($a,$b)=map{length}m/[^~]*^(?(?=(.{$l,$f}X)).{$f} *|.{$f} *X(.*)).{$r}\n/m;
# tries to find the lowest line that has at least one X on
# one side of the island, but none on the other
$a=$l if !$a||$b;
$b+=$r; # use the captured groups to calculate the left and right bounds
s/(?<=.{$a})\b *\b(?=.{$b})/"~" x length($&)/ge;
# replace all pools within those bounds
'

มันอาจจะยากที่จะรับรู้อัลกอริทึมดั้งเดิมในการใช้งานนี้เนื่องจาก Perl ไม่สนับสนุน lookbehinds ของความยาวตัวแปร


6

Lua 5.2, 581 Bytes

อีกครั้งเริ่มต้นช้าด้วยภาษาที่ไม่มีประสิทธิภาพสำหรับการเล่นกอล์ฟและอัลกอริทึมที่ไม่มีประสิทธิภาพ แต่ฉันจะปรับปรุง :)

r=io.read w=io.write F=r()f=F:find("F")o={[1]=F}W=#F i=2 
repeat s=r()if s==nil then break end o[i]={}for j=1,W do o[i][j]=s:sub(j,j)end i=i+1 until false
function e(i,j)
local k,l,b,c=j+1,j-1,false
if i>=#o or(o[i+1][j]==" "and e(i+1,j)==0)then return 0 end
while k<=W do
b=b or o[i][k]=="X"
if b or(o[i+1][k]==" "and e(i+1,k)==0)then break end
k=k+1 end
while l>0 do
c=c or o[i][l]=="X"
if c or(o[i+1][l]==" "and e(i+1,l)==0)then break end
l=l-1 end
if b and c then for m=l+1,k-1 do o[i][m]="~"end return 1 end
return 0 end
e(1,f)for i=2,#o do for j=1,W do w(o[i][j])end w"\n"end

กรณีทดสอบ (ที่มีแหล่งน้ำ):

---------
    F    
  X~~X   
  XXXX   
--------------------
         F          
   X     X~X        
X  X X  XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX
--------------------
   F                
   X     X X        
X~~X~X  XX X  XX   X
XXXXXX XXXXXXXXXXXXX
--------------------------------------------------
                F                                 
              X~~~~~~~~~~~~~X                     
              X~~~~~~~~~~~~~X~X                   
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X    X  
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X  X  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX

จาก bash เป็นไปได้ที่จะทดสอบด้วยวิธีนี้ แต่ดูไม่ดีนัก:

$ echo "    F     
  X  X    
  XXXX   " | lua f.lua

ใช้เอกสารที่นี่เพื่อทดสอบง่ายขึ้น! เช่นนี้
ravron

1

Javascript, 460 ไบต์

การสาธิตออนไลน์ (ในคอนโซลทดสอบใน Chrome และ Firefox ปัจจุบัน)

function e(i,j){var k=j+1,l=j-1,b=0,c=0,I=i+1
if(i>(O-2)||(o[I][j]==" "&&e(I,j)==0))return 0
while(k<W){b=b||(o[i][k]=="X")
if(b||(o[I][k]==" "&&e(I,k)==0))break
k++}while(l>=0){c=c||(o[i][l]=="X")
if(c||(o[I][l]==" "&&e(I,l)==0))break
l--}if(b&&c){for(m=l+1;m<k;m++)o[i][m]="~"
return 1}return 0}function f(d){o=d.split("\n")
F=o[0];s=F.indexOf("F");W=F.length;O=o.length
for(i=0;i<O;i++)o[i]=o[i].split("")
e(0,s);for(i=1;i<O;i++)console.log(o[i].join(""))}

การท้าทายตัวเองไม่สนุก แต่ก็ยังเป็นไปได้ อัลกอริทึมเช่นเดียวกับ Lua หนึ่งตอนนี้ในจาวาสคริปต์

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