// 초성 추출. 한글 음절마다 첫 자음을 뽑고 나머지 글자는 그대로 둡니다.
// 입력은 아무 글이고, 출력은 입력 원문과 초성으로 바꾼 글을 위아래로 담은 HTML 조각입니다.
// 같은 입력이면 인터프리터와 웹 빌드에서 바이트까지 같은 출력을 냅니다.
// 조합된 음절만 바꾸며 낱자 자모, 옛한글, 영문, 이모지는 건드리지 않습니다.
// Choseong extractor: replaces each Hangul syllable with its leading consonant.

let 초성표 = [
  "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ",
  "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ",
]

// 공용 도우미 시작 (본문이스케이프)
// 여러 도구가 같은 원본을 씁니다. 여기서 고치지 않고 원본에서 고친 뒤 다시 생성합니다.

// 요소 본문에 넣는 사용자 입력에 씁니다. 큰따옴표를 그대로 두므로 속성 값에는 이스케이프를 씁니다.
function 본문이스케이프(원문: string) -> string {
  원문.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
}

// 공용 도우미 끝

// 한글 음절 U+AC00 ~ U+D7A3 을 10진수로 적습니다. 토파즈 과제 '16진 정수 리터럴' 의 우회입니다.
// 588 은 초성 하나에 속하는 음절 수로 중성 21개와 종성 28개의 곱입니다.
function 초성(글자: string) -> string {
  let 코드 = 글자.codePointAt(0) ?? 0
  if 코드 >= 44032 && 코드 <= 55203 { 초성표[(코드 - 44032) / 588] } else { 글자 }
}

function 초성보기(텍스트: string) -> string {
  let 변환 = 텍스트.scalars().map(초성).join("")
  "<div class=\"choseong\"><div class=\"src\">{본문이스케이프(텍스트)}</div><div class=\"out\">{본문이스케이프(변환)}</div></div>"
}

input() |> 초성보기 |> print
