Копання часового проміжку кар'єру


11

Ви любите дивитися круті часові проміжки споруд чи інші масивні роботи, виконані за лічені хвилини? Давайте зробимо тут.
Ми будемо дивитись на кар'єр, що викопує екскаватор, щодня робимо знімки, щоб побачити весь прогрес. І ваше завдання - показати нам цей процес!

Кар'єр визначається шириною його першого шару.
Екскаватор визначається його здатністю копати за один день.

Вхідні дані

Ширина кар’єру. Цілий номер, завжди> = 1.
Швидкість копання екскаватора. Ціле число, завжди> = 1.

Вихідні дані

Хід викопування кар'єру щодня. Почав з плоскою незайманою землею і закінчив завершеним кар’єром.

Правила

  • В останній день копати може менше одиниць, ніж здатний екскаватор. Надмірна робота ніде не буде використовуватися, тому слід просто вивести повністю викопаний кар'єр.

  • Прогрес на всі дні повинен бути присутній одразу у результатах. Ви не можете очистити або замінити прогрес попереднього дня у висновку.

  • Останнє та головне рядки для кожного вихідного дня прийнятні в будь-якій розумній кількості.

  • Це , тому зробіть свій код максимально компактним.

Роз'яснення

Робота починається з плоского ґрунту. Довжина відображеного ґрунту - ширина кар'єру + 2. Отже, завжди буде один знак підкреслення з обох боків кар'єру.

__________

Викопаний кар'єр виглядає так за рівну ширину:

_        _      
 \      /
  \    /
   \  /
    \/

І як це для непарної ширини

_       _      
 \     /
  \   /
   \ /
    V

Ось приклади прогресу кар'єру:

_ _______
 V          dug 1 unit

_  ______
 \/         dug 2 units

_     ___
 \___/      dug 5 units


_       _
 \   __/    dug 10 units
  \_/

Приклад повного прогресу Ширина кар'єру: 8. Швидкість екскаватора: 4 одиниці на день.

__________

_    _____
 \__/

_        _
 \______/

_        _
 \    __/
  \__/

_        _
 \      /
  \  __/
   \/

_        _
 \      /
  \    /
   \  /
    \/

Куточки

Екскаватору потрібно буде копати в останній день саме його потужність (швидкість)

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

Відповіді:


1

Стакс , 65 байт

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

Запустіть і налагоджуйте його

Якщо спочатку обчислюються символи копання, в одну плоску рядок. Потім це додає глибини. Наприклад, "_V___"це один день копання, і "_\V/_"це завершена плоска струна.

Він використовує цей метод для виконання однієї одиниці копання.

  1. Почніть з одного "\" плюс відповідної кількості символів "_".
  2. Якщо "V_" знаходиться в рядку, замініть його на "/".
  3. В іншому випадку, якщо "/ _" знаходиться в рядку, замініть його на "_ /".
  4. В іншому випадку, якщо "\ _" знаходиться в рядку, замініть його на "\ V".
  5. Нова рядок є результатом однієї одиниці копання. Повторіть з кроку 2.

Ось вся програма розпаковується, не злітається та коментується.

'_*'\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

Запустіть і налагоджуйте його


Хороша робота! Чекаю пояснення: D
Dead Possum

@DeadPossum: Вам потрібно було лише зачекати тиждень!
рекурсивний

3

Сітківка 0,8.2 , 163 156 байт

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

Спробуйте в Інтернеті! Пояснення:

.+
$*_

Перетворити вхідні дані в одинакові. Це нам дає W¶S.

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

Поміняйте місцями введення та дублюйте ширину. Це нам дає S¶W¶W.

r`__\G
$%`$&

Обчисліть об’єм кар’єру. Це нам дає S¶W¶V.

¶
;

Об'єднайте входи в один рядок. Це нам дає S;W;V.

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

Обчисліть суму прогресу за кожен день по своєму рядку. Кожен день має формат S;W;D, де Dзнаходиться 0на першому рядку і з кроком на Sкожен день, поки не досягне V.

m`^_+;
__

Видаліть Sі збільшуйте Wна 2 у кожному рядку. Це дає нам G;Dна кожен день.

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

Поки Dне нульове значення, викопайте Dабо G-2з рядка, або з першого (останнього символу завжди залишається), переміщуючи глибину до наступного рядка. Кожен рядок відступає на один більше, >ніж попередній. Нещодавно вириті лінії також включають в себе <.

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

Перетворіть відступ на пробіли, а наступне - _на a \.

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

Якщо <після a, \то перетворіть його на a V, якщо після нього, _тоді перетворіть його на a /. Видаліть всі <s і ;s.


Ретіна мене чомусь дивує ._. Хороша робота!
Мертвий Поссум

1

Python 2 , 265 байт

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

Спробуйте в Інтернеті!


2x 1+i+aдо i-~a.
Кевін Кройссен

sum(range(0,w+1,2))можнаw/2*(w/2+1)
ов

@ovs, tможливо, також може бути вбудований, в результаті чого вийде 257 байт .
Джонатан Фрех

Виправлено @DeadPossum
TFeld

@TFeld Гарна робота!
Мертвий Поссум

1
  • гольф в процесі роботи

JavaScript (Node.js) , 329 315 307 300 301 298 285 275 260 254 байт

  • фіксований дует рішення на помилку на непарному w (завдяки @Shaggy) + зменшити на 2 байти
  • завдяки @Herman Lauenstein за зменшення на 1 байт
(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}

Спробуйте в Інтернеті!

Пояснення

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

Не працює, якщо wце непарно.
Кудлатий

@Shaggy fix :)
DanielIndie

@HermanLauenstein Ви можете бути більш конкретними?
DanielIndie

Вам не потрібно рахувати призначення змінної ( f=), і ви можете зберегти інший байт, перебравши параметри ( w=>s=>).
Кудлатий

@DeadPossum, здається, працює 7,3 Ви впевнені? Ви можете поставити очікуваний вихід?
DanielIndie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.