이발주세요!


18

이것은 내 머리입니다.

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

정확히 8 개의 머리카락으로 구성되어 있습니다. 머리가 너무 깁니다. 각 가닥을 내가 지정한 길이로 자르십시오.

입력

이 섹션의 주요 매력은 실제 머리카락입니다. 여기의 그래픽, 색상으로 구분 표현은 애니메이션과 함께, 게으른를 들어, :

컬러 코딩 애니메이션 물건

그리고 머리카락 세트가 무엇인지에 대한 전체 사양 은 다음과 같습니다.

  • 우리가 호출 개별 머리카락 가닥 의 밖으로 될 것이다 /, \, |, 그리고 -이제부터라고, ASCII 문자 원자 .
  • 전체 헤드 듣고의 (결합 가닥 모두)입니다 c의한 열 r행, c≥ 1 r≥ 2.
  • 각 가닥은 ...
    • 머리의 마지막 줄에서 시작하십시오 (행 r-1).
    • 길이 ll≥ 2 인 곳
  • 가닥은 다음 방법으로 구문 분석 될 수 있습니다.
    1. 스트랜드의 바닥에서 시작하십시오. 이것은있을 것입니다 /, |또는 \우리가 호출 원자, 루트를 . (가닥은 왼쪽에서 오른쪽으로 구문 분석되며 루트 순서로 정렬됩니다.)
    2. 뿌리를 가리키는 원자를 찾으십시오.
      • |위아래로 원자를 가리 킵니다. -원자 포인트는 왼쪽과 오른쪽 (만 뿌리는 맨 아래 행에있을 수 있기 때문에 루트를 가리 수 없다). /원자 포인트 다운 좌 상향 우측, 및 \원자 반대한다.
      • 항상 루트 원자를 가리키는 정확히 하나의 원자가 있습니다.
    3. 이 원자를 가리키고이 원자 아래에 있지 않은 미사용 원자 (아직 가닥의 일부가 아닌 원자)를 찾으십시오 (모발은 아래쪽으로 자라지 않지만 옆으로는 괜찮습니다).
      • 0이 없으면 스트랜드의 끝에 도달 한 것입니다!
      • 하나 있으면 가닥의 다음 원자입니다. 이 원자로 3 단계를 반복하십시오. (이 원자는 이제 가닥의 일부이기 때문에 3 단계의 목적으로 "사용됨"으로 표시됩니다.)
      • 머리의 어느 시점에도 여러 개의 미사용 원자가 존재하지 않습니다 .

입력 형식이 될 것입니다 :

  • 머리카락. 그대로 입력 (리터럴 개행 문자가 포함 된 여러 줄 입력)이거나 개행 문자 대신에 선택한 구분 기호를 사용하여 입력 할 수 있습니다. 머리는 항상 사각형입니다. 즉, 후행 공백이 필요에 따라 추가됩니다 (오른쪽의 이상한 직선 머리카락은 혼동을 피하기 위해 추가 후행 공백을 제거하는 것입니다).
  • 절단 할 머리카락의 양을 지정하는 숫자 ≥ 1 이에 대해서는 다음 섹션에서 자세히 설명합니다.

함수에 대한 입력을 수락하고 STDIN / STDOUT 등을 사용할 수 있습니다 ( 합리적인 모든 ).

산출

출력은 이발이 적용된 머리카락입니다. 이발을 제공하려면 머리카락의 끝점에서 시작하여 뿌리를 향하여 지정된 양 (항상 1 이상)으로 각 머리카락 가닥의 길이를 줄이십시오. 그러나 항상 뿌리를 그대로 두십시오!

다음은 간단한 예입니다. 헤드 입력이

\ 
 /
| 
| 

의 두 번째 입력을 사용 2하면 스트랜드에서 두 개의 원자를 자르고

|
|

그리고의 입력으로 42출력은

|

헤드 전후의 공백은 완전히 관련이 없습니다. 줄 바꿈을 추가로 줄이거 나 패딩을 더 추가 할 수 있습니다. 머리가 손상되지 않는 한 중요하지 않습니다. (후행 공백으로도 원하는 것을 할 수 있습니다.)

테스트 사례

모든 테스트 사례에 대해이 게시물의 맨 처음에 제시된 예제가 사용됩니다.

이발 길이 = 1 :

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

3의 길이 :

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

7의 길이

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

1337의 길이 :

| \  /|  //  \ |

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 이길 것입니다!


맨 아래 줄에 원자 '-'가 있습니까? 포인트 2는 '예', 포인트 1은 '아니오'로 나타납니다.
edc65

아니요. 없습니다. (명확하게하기 위해 편집 됨)
손잡이

테스트 케이스에 실수가 있다고 생각합니다. 바닥 에서 네 번째 줄에서, 왼쪽에서 네 번째 가닥에서 -세 번째 가닥에서 왼쪽에서 |네 번째 가닥
feersum

@feersum 맞습니다. 경로가 결정됩니다 에 어떤 점- 아니라 어떤 이를 가리 킵니다 . 예를 들어,는 첫 번째 스트랜드에서를 |가리 키지 않지만을 가리 킵니다 . (예, 혼란 스럽습니다. 나 자신도 혼란스러워 GIF를 여러 번 다시 실행해야했습니다!) 이것을 이해하는 더 쉬운 방법은 두 번째 가닥의 상단을 보는 것입니다. //
Doorknob

나는 그것이 이전 조각을 가리키는 나중에 조각으로 결정된다는 것을 알고 있습니다. 내 주장은 세 번째 가닥이 아닌 네 번째 가닥에 -결합되어야한다는 것 입니다.
feersum

답변:


12

자바 스크립트 (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))

산출

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

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


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






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








| \  /|  //  \ |    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.