도발 봇

아직 제출이 없습니다시간 제한1초메모리 제한128 MB

문제

중세 기사 시대에는 사악한 조롱을 견디는 정신력, 이른바 '멘탈'이 아주 중요했다.

현우 왕은 부하들의 멘탈이 약한 것을 두고 볼 수 없었다. 그래서 뛰어난 코딩 실력으로 훈련용 도발 봇을 만들었다.

문제는 현우 왕이 인공지능 수업을 아직 듣지 않았고 아는 것이라곤 오토마타 1단원뿐이었다는 점이다. 그래서 같은 상태에서 같은 입력을 받으면 언제나 똑같이 행동하는 봇 하나를 짜는 데 그쳤다.

도발 봇은 아래 문법과 뒤이어 설명할 규칙에 따라 행동한다.

<taunt> ::= <sentence> | <taunt> <sentence> | <noun>! | <sentence>
<sentence> ::= <past-rel> <noun-phrase> | <present-rel> <noun-phrase> | <past-rel> <article> <noun>
<noun-phrase> ::= <article> <modified-noun>
<modified-noun> ::= <noun> | <modifier> <noun>
<modifier> ::= <adjective> | <adverb> <adjective>
<present-rel> ::= your <present-person> <present-verb>
<past-rel> ::= your <past-person> <past-verb>
<present-person> ::= steed | king | first-born
<past-person> ::= mother | father | grandmother | grandfather | godfather
<noun> ::= hamster | coconut | duck | herring | newt | peril | chicken | vole | parrot | mouse | twit
<present-verb> ::= is | "masquerades as"
<past-verb> ::= was | personified
<article> ::= a
<adjective> ::= silly | wicked | sordid | naughty | repulsive | malodorous | ill-tempered
<adverb> ::= conspicuously | categorically | positively | cruelly | incontrovertibly

큰따옴표로 묶인 문구는 언제나 한 단어로 센다.

위 문법을 읽는 방법이 낯설다면 배커스-나우르 표기법을 참고하자.

봇은 이 문법을 참조해 다음 규칙대로 도발한다.

  • 공백으로 구분되는 문자열 하나를 토큰이라 하고, 그중 영어 알파벳을 최소 한 개 포함한 토큰을 단어라 한다.
  • 봇은 상대의 말을 한 줄 끝까지 듣고, 그 줄의 단어 수로 도발 횟수를 정한다. 단어 3개마다 도발을 한 번 하고, 단어 수가 3으로 나누어떨어지지 않으면 도발을 한 번 더 한다.
  • 도발은 <taunt> 하나에서 시작해 재귀적으로 확장한다. 문법을 자세히 보면 <taunt>가 다시 <taunt>를 만들 수 있어서 한 줄에 도발이 두 번 들어가기도 하는데, 이런 줄은 도발을 두 번 한 것으로 센다. 상대가 단어 4개를 말했고 봇이 한 줄에 도발을 두 번 했다면 봇은 할 일을 다 한 것이다.
  • 어떤 기호의 표현식이 모두 NN가지이고 봇이 이 기호를 지금 KK번째로 만났다면 ((K1)modN)+1((K-1) \bmod N) + 1번째 표현식을 고른다. 이 선택은 기호마다 독립이며, 선택 상태는 입력 줄이 바뀌어도 초기화되지 않는다.

첫 번째 도발은 이렇게 만들어진다.

<taunt>
=> <sentence>
=> <past-rel> <noun-phrase>
=> your <past-person> <past-verb> <article> <modified-noun>
=> your mother was a <noun>
=> your mother was a hamster

두 번째 도발의 앞부분은 이렇게 시작한다.

<taunt>
=> <taunt> <sentence>
=> <noun>! <present-rel> <noun-phrase>
=> ...

여기에 언제나 적용되는 예외가 하나 더 있다. 상대가 말한 줄에 t, h, e, h, o, l, y, g, r, a, i, l 열두 글자가 대소문자 구분 없이 순서대로 나타나면 (중간에 다른 문자가 끼어 있어도 된다) 그 줄의 첫 도발은 (A childish hand gesture)가 된다. 이 도발은 문법을 거치지 않으므로 어떤 기호의 선택 상태도 바꾸지 않고, 도발 한 번으로 센다.

현우 왕은 이 봇으로 부하들을 훈련시킬 것이다. 도발 봇이 어떻게 행동할지 시뮬레이션하자.

입력

입력은 여러 줄로 이루어지고, 각 줄은 봇의 상대가 말한 내용이다. 입력이 끝날 때까지 모든 줄을 처리한다.

각 줄은 영어 대소문자, 숫자, ,.-!?, 공백으로만 이루어지며 길이는 1자 이상 72자 이하다.

토큰은 하나 이상의 공백으로 서로 구분된다. 단어가 하나도 없는 줄은 주어지지 않는다.

출력

입력 줄마다 다음을 차례대로 출력한다.

  • Knight:를 출력하고, 이어서 그 줄의 토큰을 입력 순서대로 출력한다.
  • 그 줄에 필요한 도발 수만큼 줄을 출력한다. 각 줄은 Taunter:로 시작하고 도발과 마침표 하나가 이어진다.
  • 빈 줄 하나를 출력한다.

출력하는 토큰 뒤에는 스페이스(아스키 코드 32)를 정확히 하나씩 붙인다. 그래서 Knight: 줄과 Taunter: 줄은 스페이스 하나로 끝나고, 입력에 공백이 몇 개 연속으로 있든 토큰 사이는 스페이스 하나로 벌어진다.

출력 전체의 맨 끝에 남는 공백 문자와 빈 줄은 모두 지운다. 그래서 마지막 Taunter: 줄은 마침표 다음에 개행 문자 하나로 끝난다.

도발은 대문자로 시작한다. 한 줄에 도발이 두 번 들어가면 둘 다 대문자로 시작한다. 큰따옴표로 묶인 문구는 한 단어로 취급하고 큰따옴표는 출력하지 않는다.