Keyfi Ice Cube Tepsilerini Doldurma


27

Diyelim ki bu boşluk ızgarası ve Xtuhaf şekilli boş buz küpü tepsilerinin kesitini temsil ediyor :

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

Olmadan sütunlar X, sonsuz kapasiteli bir lavaboya boşaltıp tepsilerde su tutamayan delikleri veya boşlukları temsil eder. Şebekenin en sol veya en sağ kenarından düşen su da bu sonsuz lavaboya girer.

Bir musluğu tepsilerin üzerine yerleştirip tüm bölmelerdeki su seviyesi sabit kalana kadar suyla doldurmalarını sağlayacak olsaydık, doldurulan kesin bölmeler, su akışının tepsilerin tam olarak bulunduğu yere bağlı olacaktır. (Sıçrama olmadan ince, sabit bir su akışı olduğunu varsayalım.)


Mesela, musluğumuz Fçok soldaki ızgara kolonunun üzerindeyse

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

su X, bu sütunda en üst seviyeye düşecek ve sola ve sağa doğru yayılacak, sol yarısı aşağıdaki lavaboya dökülecek ve sağ yarısı 2 x 1 bölmesini dolduruyor. Bölme dolduğunda, su akışının sağ yarısı akacak hiçbir yere sahip değildir ancak lavaboya akar ve her yerdeki su seviyesi esasen kararlıdır.

Musluğu kapattığınızda, tepsi şimdi şöyle görünür: ( ~su ile)

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

Benzer şekilde, musluğu şu şekilde yerleştirirsek:

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

En soldaki iki bölmeyi dolduracak, ancak suyun geri kalanı boşalacak:

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

Musluğu şu şekilde yerleştirirsek:

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

Akışın sol yarısı lavaboya akacak ancak sağ yarısı sonunda en sağdaki üç bölmeyi dolduracak, çünkü suyun düz bir yüzeyde yatay olarak ne kadar yatay hareket edebileceğinin bir sınırı yok:

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

Ancak, bu şekilde konumlandırılmış:

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

Tüm su boşalır ve hiçbir bölme doldurulmaz:

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

Meydan okuma

Boşluk, bir dikdörtgen bir ızgara alan bir program ya da işlev Yazın X's, ve bir F. En üstteki satır daima içerecektir Fve aksi halde sadece boşluklar içerecektir. XHer sütunda sitesindeki (eğer varsa) ızgara tabanından bir çizgi kadar uzar, yani hiçbir mağaralar ya da çıkıntılar olacaktır.

Musluk yukarıda anlatıldığı gibi Fsuyla doldurduktan sonra ızgarayı yazdırın veya iade edin ~. Üst Fsatırı çıktıların dışında bırakın .

  • Musluk sırasının dışındaki ızgara minimumda 1 × 1 olacaktır.

    F
    X
    

    Desteklemeniz gereken en küçük girdi.

  • Giriş tam bir metin dikdörtgeni olarak gelecektir. Önde gelen ve arkadaki boşluklar girdi ve çıktıda önemlidir. örneğin giriş

        F     
      X  X    
      XXXX    
    

    sonuçlanmalı

      X~~X    
      XXXX    
    

    (önde gelen ve sondaki boşlukları not edin)

  • Girdide veya çıktıda tek bir son satırın olması gerekir.

  • Herhangi dört ayrı kullanabilirsiniz yazdırılabilir ASCII alanı yerine karakterler, X, F, ~.

Bayt cinsinden en kısa kod kazanır.


Büyük Örnek:

Giriş:

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

Çıktı:

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

Oh evet, sevgilim zip()<3
cjfaure 12:15

2
Bu bir cevap gerektirir: / Üzerinde çalışacağım.
TheNumberOne

Bunu simüle eden hücresel bir otomat yapmak oldukça kolaydır, ancak bitmesi için bir yol düşünemiyorum.
DanTheMan 13:15

Hala rekabet edecek kimse yok mu? Çok tatlı bir meydan okuma. Görünüşe göre kendimi yenmek zorunda
kalacağım

Yanıtlar:


1

perl -p0, 204 + 2 bayt

IDEA

  • F altında adanın iki kesiminin eşit yüksekliktedir, tüm değiştirin X *Xile es X~*Xo adada es.
  • Bir tarafı yüksek ise, hepsini yerine X *Xile es X~*Xalt tarafında drenaj ve alt tarafının üst daha yüksek bulunuyor F en yakın nokta arasındaki es.

Doğrudan F altındaki topraklar burada iki tarafın da bir parçası olarak sayılır.

GOLF

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

NOTLAR

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 değişken uzunluktaki görünüşleri desteklemediğinden, bu uygulamadaki orijinal algoritmayı tanımak zor olabilir.


6

Lua 5.2, 581 Bayt

Yine, golf için etkisiz bir dille ve etkisiz algoritma ile yavaş başlangıç. Ama ben gelişirim :)

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

Test durumları (su kaynaklı):

---------
    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 bu şekilde test etmek mümkün, ama çok hoş görünmüyor:

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

Bunu daha kolay test etmek için here-docs kullanın ! Bunun gibi .
ravron

1

Javascript, 460 Bayt

Çevrimiçi demo (konsolda, geçerli Chrome ve Firefox'ta test edilmiştir).

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(""))}

Kendime meydan okumak çok eğlenceli değil ama yine de mümkün. Lua ile aynı algoritma, şimdi javascript.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.