Kazı ocağı timelapse


11

Birkaç dakika içinde yapılan inşaatların veya diğer büyük çalışmaların harika zaman aralıklarını izlemeyi seviyor musunuz? Burada bir tane yapalım.
Tüm ilerlemeyi görmek için her gün fotoğraf çekerek bir kazıcı ocağına bakacağız. Ve göreviniz bize bu süreci göstermek!

Taş ocağı ilk katının genişliği ile tanımlanır.
Ekskavatör, bir gün içinde kazma kabiliyeti ile tanımlanır.

Giriş

Taş ocağı genişliği. Tam sayı, her zaman> = 1.
Ekskavatör kazma hızı. Tam sayı, her zaman> = 1.

Çıktı

Her gün taş ocağı kazma süreci. Düz el değmemiş zeminle başladı ve tamamlanmış taş ocağı ile tamamlandı.

kurallar

  • Son gün, ekskavatörün yapabileceğinden daha az kazmak için birimler olabilir. Aşırı çalışma hiçbir yerde kullanılmayacaktır, bu yüzden tamamen kazılmış taş ocağı vermelisiniz.

  • Tüm günlerde ilerleme bir kerede çıktıda bulunmalıdır. Çıktıda önceki günkü ilerlemeyi silemez veya üzerine yazamazsınız.

  • Her bir günlük çıktı için takip eden ve önde gelen yeni satırlar herhangi bir makul sayıda kabul edilebilir.

  • Bu , bu nedenle kodunuzu olabildiğince kompakt hale getirin.

Açıklamalar

İş düz bir zeminle başlar. Gösterilen zeminin uzunluğu taş ocağı genişliği + 2'dir. Dolayısıyla, taş ocağının her iki tarafında daima bir alt çizgi karakteri olacaktır.

__________

Kazık ocağı eşit genişlik için şöyle görünür:

_        _      
 \      /
  \    /
   \  /
    \/

Ve garip genişlik için böyle

_       _      
 \     /
  \   /
   \ /
    V

İşte taş ocağı ilerlemesine örnekler:

_ _______
 V          dug 1 unit

_  ______
 \/         dug 2 units

_     ___
 \___/      dug 5 units


_       _
 \   __/    dug 10 units
  \_/

Tam ilerleme örneği. Ocak genişliği: 8. Ekskavatör hızı: günde 4 adet.

__________

_    _____
 \__/

_        _
 \______/

_        _
 \    __/
  \__/

_        _
 \      /
  \  __/
   \/

_        _
 \      /
  \    /
   \  /
    \/

Cornercases

Ekskavatör son gün tam olarak kapasitesini kazmaya ihtiyaç duyacaktır (hız)

Width: 7, Speed: 3
Width: 10, Speed: 4 

Yanıtlar:


1

Stax , 65 bayt

Θ└R4∞√4Fµ■zJ┐╚▌▼ZJ╧fφ½à╘▲☼å♥s≥┤ÖòOúU╬ΩmPê|ë↕ƒ].Y┴↓á÷>}St☺┐B╒╞O☼╧O

Çalıştır ve hata ayıkla

Önce kazma karakterlerini bir düz dize olarak hesaplarsa. Sonra derinlik katar. Örneğin "_V___"bir gün kazma ve "_\V/_"tamamlanmış düz dizedir.

Bir birim kazma yapmak için bu yöntemi kullanır.

  1. Tek bir "\" artı uygun sayıda "_" karakteriyle başlayın.
  2. Dizede "V_" varsa, "/" ile değiştirin.
  3. Aksi takdirde, dizede "/ _" varsa, "_ /" ile değiştirin.
  4. Aksi takdirde, dizede "\ _" varsa, "\ V" ile değiştirin.
  5. Yeni dize, bir kazma biriminin sonucudur. 2. adımdan itibaren tekrarlayın.

İşte tüm program paketten çıkarılmış, çözülmemiş ve yorumlanmıştır.

'_*'\s+                 initial string e.g. "\_______"
{                       generator block to get each day's flat digging results
  {                     block to repeat digging within each day
    "V_\//__/\_\V"4/    replacement strings
    {[2:/|em|!H         find the first substring that exists and do replacement
  };*                   repeat digging within day specified number of times
gu                      get all unique results
                            when digging is complete, the result duplicates
{Dm                     drop the leading "\" characters from each result
F                       for each day's flat result, execute the rest of the program
  '_|S                  surround with "_"
  M                     split into chars; e.g. ["_", "\", "/", "_"]
  c|[                   copy and get all prefixes
  {                     mapping block to get "depth" of each character
    '\#                 get number of backslashes in this prefix (A)
    _1T'/#-             get number of forward slashes prior to last character of prefix (B)
    'V_H=+^             is the current character "V"? 1 for yes. (C)
  m                     map prefixes to A - B + C + 1
  \                     zip depths with original characters
  {E)m                  prefix each character with spaces; e.g. ["_", " \", " /", "_"]
  M                     transpose grid; e.g. ["_  _", " \/ "]
  m                     print each row

Çalıştır ve hata ayıkla


Aferin! Açıklama bekleniyor: D
Ölü Possum

@DeadPossum: Sadece bir hafta beklemelisin!
özyinelemeli

3

Retina 0.8.2 , 163 156 bayt

.+
$*_
(_+)¶(_+)
$2¶$1¶$1
r`__\G
$%`$&
¶
;
(?<=(_+);.*)(?<=;_+;\1*)_
¶$`_
m`^_+;
__
+`(>*)_(_+)(_+<?;)\2
$1_$.2$* $3¶$1>$2<;
T`>\_` \\`>+_
T`\\\_;<`V/_`.<|;

Çevrimiçi deneyin! Açıklama:

.+
$*_

Girişleri tekli olarak dönüştürün. Bu bize verir W¶S.

(_+)¶(_+)
$2¶$1¶$1

Girişleri değiştirin ve genişliği çoğaltın. Bu bize verir S¶W¶W.

r`__\G
$%`$&

Taş ocağının hacmini hesaplayın. Bu bize verir S¶W¶V.

¶
;

Girişleri tek bir satıra birleştirin. Bu bize verir S;W;V.

(?<=(_+);.*)(?<=;_+;\1*)_
¶$`_

Her bir gün için ilerleme miktarını kendi satırında hesaplayın. Her gün biçimdedir S;W;Dburada, Dbir 0birinci hattı ve artışlar Sulaşana kadar her gün V.

m`^_+;
__

Silin Sve Wher satırda 2 artırın . Bu bize G;Dher gün için verir .

+`(>*)_(_+)(_+<?;)\2
$1_$.2$* $3¶$1>$2<;

İken Dya sıfırdan farklı, kazmak Dveya G-2sonraki satıra derinliğini hareketli (ilk ve son karakterler hep bırakılır böylece) hattından,. Her satır bir >öncekinden daha fazla girintiyle girintilidir . Yeni kazılmış çizgiler de a <.

T`>\_` \\`>+_

Alanlara girinti ve aşağıdaki çevirin _bir içine \.

T`\\\_;<`V/_`.<|;

Bir Eğer <bir takip \ardından çevirmek Vbir takip edilirse, _o zaman bir çevirmek /. Tüm <s ve ;s'yi silin .


Retina beni bir nedenden dolayı şaşırtıyor ._. Aferin!
Dead Possum

1

Python 2 , 265 bayt

w,s=input();R=range((3+w)/2)
d=0
while d-s<sum(range(w%2,w+1,2)):
 q=[[' _'[i<1]]*(w+2)for i in R];D=d
 for i in R[:-1]:
  a=min(D,w-i*2);D-=a
  if a:q[i][1+i:1+i+a]=[' ']*a;q[i+1][1+i:1+i+a]=(['\\']+['_']*(a-2)+['/'])*(a>1)or['v']
 for l in q:print''.join(l)
 d+=s

Çevrimiçi deneyin!


2x 1+i+aila i-~a.
Kevin Cruijssen

sum(range(0,w+1,2))olabilirw/2*(w/2+1)
ovs

@ov'lar tda muhtemelen satır içi olabilir ve 257 bayt elde edilir .
Jonathan Frech

@DeadPossum Sabit
TFeld

@TFeld İyi iş çıkardın!
Dead Possum

1
  • golf devam ediyor

JavaScript (node.js) , 329 315 307 300 301 298 285 275 260 254 bayt

  • garip w'de hataya sabit çözüm ikilisi (@Shaggy sayesinde) + 2 bayt azaltıldı
  • @Herman Lauenstein'a 1 bayt azalttığı için teşekkürler
(w,s)=>{h=[...Array(-~w/2+1|0)].map((x,i)=>[...(i?" ":"_").repeat(w)])
for(t=S="";t<s&&h.map((x,i)=>S+=(p=i?" ":"_")+x.join``+p+`
`);)for(y in t=s,h)for(x in D=h[y])if(D[x]=="_"&&t){(d=h[-~y])[x]=x^y?(d[x-1]=x^-~y?"_":"\\","/"):"v"
D[x]=" "
t--}return S}

Çevrimiçi deneyin!

açıklama

(w,s)=>{
h=[...Array(-~w/2+1|0)]                       //the height of the quarry when finished is w/2+1 if even or (w+1)/2+1 if odd
.map((x,i)=>                                  
    [...(i?" ":"_").repeat(w)]                //the first row is the _ w times (i will explain why w and not w+2 in the following lines) afterwards lets just fill with spaces so the output would be clear(when convertion to string)
    )                                         
for(t=S="";                                   //t="" is like t=0(we actually need t to be different from s in the start and s>=1), S will hold the final output
t^s&&                                         //if t not equals s -> it means that now changes were made to the quarry->it means we finished digging
h.map((x,i)=>                                 
S+=(p=i?" ":"_")+x.join``+p+`                 //here comes the reason for w and not w+2. because the border _XXXX_ are not to be touched i only add them to the output and not woking with them in the solution
                                              //that ways its much easier to replace the correct chars. so here i just add _ to either sides if its the first row otherwise space(to pad correctly).
                                              //in the end i add a new line to differ from the previous day
`);)
    for(y in t=s,h)                           //always update t back to s so we know weve passed a day
        for(x in D=h[y])
            if(D[x]=="_"&&t)                  //if the current cell is _ we need to work, but only if the day have yet to pass(t)
            {
                (d=h[-~y])[x]=                //updating the row below us because we just dug a hole
                x^y?                          //if x == y that means we are digging the first hole in the row below
                (d[x-1]=x^-~y?"_":"\\", //we want to update the row below and cell before([y+1][x-1]) only if its not the first cell(AKA not space). if v we need \ other wise _
                    "/")                          //other wise (x!=y) we put "/"
                :"v"                          //so we should put v (if they are equal)
                D[x]=" "                      //always remove the _ from the current one because we dug it
                t--}                          //decrement the counter for the day by one digging
return S}

Tuhafsa çalışmaz w.
Shaggy

@Shaggy fixed :)
DanielIndie

@HermanLauenstein daha spesifik olabilir misiniz?
DanielIndie

Değişken atamasını ( f=) saymanıza gerek yoktur ve ( w=>s=>) parametrelerini kırarak başka bir bayt kaydedebilirsiniz .
Shaggy

@DeadPossum 7,3 için çalışıyor gibi görünüyor emin misiniz? beklenen çıktıyı koyabilir misiniz?
DanielIndie
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.