给我理发!


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

@feersum正确。路径是通过确定哪些点-,不是它指向。例如,|不会/在第一行中指向,而是由指向/。(是的,我知道这很令人困惑;我不得不重做GIF几次,因为我甚至自己也感到困惑!)一种更容易理解的方法可能只是看第二个子句的顶部。
门把手

我知道这是由指向较早版本的文章确定的。我的观点是,-应当将第四条链而不是第三条链连接在一起。
feersum 2014年

Answers:


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))

输出量

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

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


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






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








| \  /|  //  \ |    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.