Дай мені стрижку!


18

Це моя голова:

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

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

Вхідні дані

Основна визначна пам'ятка в цьому розділі - власне волосся на волоссі. Ось графічне кольорове представлення разом із анімацією для лінивих:

кольорові речі анімовані речі

І ось повна специфікація того, що таке набір волосків:

  • Окремі волоски, які ми будемо називати пасма , будуть зроблені з /, \, |і -символи ASCII, відтепер відомий як атоми .
  • Вся голова чути (всі пасма поєднані) будуть cстовпцями по rрядках, де c≥ 1 і r≥ 2.
  • Кожна пасма буде ...
    • починати з останнього ряду голови (ряд r- 1).
    • мають довжину, lде l≥ 2.
  • Пасма можуть бути розібрані наступним способом:
    1. Починайте внизу пасма. Це буде а /, |або \атом, який ми будемо називати коренем . (Пасма аналізуються зліва направо, упорядковуються коренем.)
    2. Знайдіть атом, який вказує на корінь.
      • А |точка атом вгору і вниз. Через -точки атом вліво і вправо (але ніколи не може вказувати на корені , так як тільки коріння можуть перебувати в нижньому ряду). А /точка атом зліва вниз і вгору-вправо, а \атом робить протилежний.
      • Завжди буде рівно один атом, який вказує на атом кореня.
    3. Знайдіть невикористаний атом (той, який ще не є частиною жодної нитки), який вказує на цей атом, а також не знаходиться нижче цього атома (волосся не можуть рости вниз, але збоку все в порядку).
      • Якщо є нуль, ви дійшли до кінця пасма!
      • Якщо такий є, це наступний атом пасма. Повторіть крок 3 з цим атомом. (Цей атом зараз позначений як "використаний" для цілей кроку 3, оскільки він є частиною ланцюга.)
      • Тут ніколи не буде безлічі невикористаних атомів в будь-якій точці голови.

Формат введення буде наступним:

  • Голова волосся. Може бути введено як є (багаторядковий вхід з буквальними новими рядками), або з роздільником на ваш вибір замість нових рядків. Зверніть увагу, що голова завжди буде прямокутником; тобто пробіли пробілів додаватимуться за необхідності (дивне волосся прямолінійної форми справа - це лише усунути зайвий пробіл, щоб уникнути плутанини).
  • Число ≥ 1, яке визначає, скільки волосся потрібно стригти. Це буде детально описано в наступному розділі.

Ви можете прийняти вхід до функції, використовувати STDIN / STDOUT тощо (що-небудь розумне ).

Вихід

Вашим результатом буде головка волосся з нанесеною стрижкою. Щоб надати стрижку, просто зменшіть довжину кожної пасма волосся на вказану кількість (яка завжди буде 1 або більше), починаючи з кінцевої точки волосся, що рухається до кореня. Однак завжди залишайте корінь недоторканим!

Ось простий приклад. Скажіть, вхід для голови є

\ 
 /
| 
| 

З другим входом 2, ви вирізали б два атоми з нитки і отримали результат

|
|

І з введенням 42, вихід був би просто

|

Зауважте, що пробіли до голови та після неї абсолютно не мають значення; ви можете обрізати зайві нові рядки або ви можете додати більше накладок. Не має значення, доки голова залишається недоторканою. (Ви можете робити все, що завгодно, і з пробілом пробілів.)

Випробування

Для всіх тестових випадків буде використано приклад, поданий на самому початку цієї публікації.

Довжина стрижки = 1:

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |

Довжина 3:

         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |

Довжина 7:

  |-  /   |     
  |  |    /    |
| \  /|  //  \ |

Довжина 1337:

| \  /|  //  \ |

Оцінка балів

Це , тому найкоротший код у байтах виграє!


Чи є атоми '-' у нижньому ряду? Точка 2, здається, говорить так, а пункт 1, здається, говорить ні.
edc65

@ edc65 Ні, немає. (Відредаговано для уточнення)
Doorknob

Я думаю, що в тестовій справі є помилка. На четвертому ряду знизу, на -третьому пасма з лівих точок на |на четвертому пасма зліва
feersum

@feersum Правильно. Шлях визначається , що вказує на- , а не те , що він вказує на . Наприклад, |не вказує на /першу нитку, але на неї вказує /. (Так, я знаю, що це заплутано; мені довелося переробляти GIF кілька разів, тому що я плутав навіть себе!) Більш простий спосіб зрозуміти це, можливо, просто подивитися на верхню частину другої нитки.
Дверна ручка

Я знаю, це визначається пізнішими фрагментами, які вказують на більш ранні. Мій аргумент полягає в тому, що -слід приєднати четверту нитку, а не третю.
feersum

Відповіді:


12

JavaScript (E6) 195 212 222 232

Використовуючи рекурсивну функцію R, щоб знайти шлях кожної нитки та позначити позиції, починаючи з 1 для виступу від кореня. Тоді легко, за другий прохід, підставити нижнє відмічене положення заготовками.

F=(h,t,
   n=[...h],c=h.search('\n'),
   R=p=>[1,-1,c+2,c+1,c].some((d,i)=>n[p-d]=='--\\|/'[i]?n[p-=d]=1:0)&&R(p)+(R[p]=l++)
  )=>
  n.map((v,p)=>R[p]<t?' ':h[p],n.map((a,p)=>!h[p+c]&a>' '&&R(p,l=0))).join('')

Тест в консолі FireFox / FireBug

head = "\\         /-- -|\n /   -\\  |  |  |\n\\      \\ \\  \\  |\n --\\    | \\  | |\n    / |--| / / |\n /|-  //--| /  |\n| |  ||   //\\  |\n| \\  /|  //  \\ |";
console.log(F(head,0))
console.log(F(head,1))
console.log(F(head,3))
console.log(F(head,7))
console.log(F(head, 1337))

Вихід

\         /-- -|
 /   -\  |  |  |
\      \ \  \  |
 --\    | \  | |
    / |--| / / |
 /|-  //--| /  |
| |  ||   //\  |
| \  /|  //  \ |

          /-   |
 /    \  |     |
\      \ \  \  |
 --\    | \  | |
    / |--  / / |
  |-  //--| /  |
| |  ||   //   |
| \  /|  //  \ |


         |      
         \     |
 --\    | \    |
    / |--  / / |
  |-  //  | /  |
  |  ||   //   |
| \  /|  //  \ |






  |-  /   |     
  |  |    /    |
| \  /|  //  \ |








| \  /|  //  \ |    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.