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


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 Нет, нет. (Отредактировано для уточнения)
Дверная ручка

Я думаю, что есть ошибка в тестовом случае. В четвертом ряду снизу, -в третьем ряду слева указывает на |в в четвертом
ряду

@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.