레이블이 근성인 게시물을 표시합니다. 모든 게시물 표시
레이블이 근성인 게시물을 표시합니다. 모든 게시물 표시

2009년 8월 4일 화요일

[Perl] 분리된 한글 자모 합치기 스크립트

스크립트 소스:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;

my @charset = qw/ㅇ ㅖ ㅈ ㅔ 1 ㅂ ㅓ ㄴ /; # 쓸 문자열을 지정합니다.

# %cho, %jun, %jon 은 초성, 중성, 종성의 순서를 나타냅니다.
# print "$_ : ".chr($_)."\n" foreach keys %cho;
# 같은 코드를 이용하면 확인해보실 수 있습니다.


my %cho = (
12593 => 0 , 12594 => 1 , 12596 => 2 , 12599 => 3 , 12600 => 4 , 12601 => 5 , 12609 => 6 , 12610 => 7 , 12611 => 8 , 12613 => 9 , 12614 => 10 , 12615 => 11 , 12616 => 12 , 12617 => 13 , 12618 => 14 , 12619 => 15 , 12620 => 16 , 12621 => 17 , 12622 => 18 , );
my %jun = (
12623 => 0 , 12624 => 1 , 12625 => 2 , 12626 => 3 , 12627 => 4 , 12628 => 5 , 12629 => 6 , 12630 => 7 , 12631 => 8 , 12632 => 9 , 12633 => 10 , 12634 => 11 , 12635 => 12 , 12636 => 13 , 12637 => 14 , 12638 => 15 , 12639 => 16 , 12640 => 17 , 12641 => 18 , 12642 => 19 , 12643 => 20 , );
my %jon = (
0 => 0 , 12593 => 1 , 12594 => 2 , 12595 => 3 , 12596 => 4 , 12597 => 5 , 12598 => 6 , 12599 => 7 , 12601 => 8 , 12602 => 9 , 12603 => 10 , 12604 => 11 , 12605 => 12 , 12606 => 13 , 12607 => 14 , 12608 => 15 , 12609 => 16 , 12610 => 17 , 12612 => 18 , 12613 => 19 , 12614 => 20 , 12615 => 21 , 12616 => 22 , 12618 => 23 , 12619 => 24 ,
12620 => 25 , 12621 => 26 , 12622 => 27 , );


my @numset;
#map { push @numset, ord $_ foreach (split //, $_) } @charset;
# @ARGV에서 받은 한글을 split 하니까 오류가 나서 포기했습니다.


map { push @numset, ord $_ } @charset; # 한글 문자열을 유니코드 문자세트로 바꿉니다.

my @output;
my $type=0;

while (@numset) { # 문자세트를 한 글자마다 분리시키기 위해 루프를 돌립니다.
# @$numset[0]은 초성, [1]에는 중성, [2]에는 종성을 넣도록 합니다.

my $qq = shift @numset;
if ( $qq > 12643 || $qq < 12593 ) { # 초, 중, 종성의 문자셋이 아니면 한 글자로 집어넣습니다.
$type++; push @{$output[$type]}, $qq;
next; # 지금 것은 처리가 끝났으니 다음 문자로 갑시다.
}
if (
($qq <= 12622 && $numset[0] > 12622 ) ||
( ${$output[$type]}[2] )) {
$type++; # 지금 글자에 종성까지 들어가 있거나
# 다음 문자가 모음이라면 다음 글자로 가서

}
push @{$output[$type]}, $qq; # 집어 넣습니다.
}


foreach ( @output ) {
($_=$$_[0])&&(next) unless $$_[1]; # 중성도 없다면
$_ 를 그 배열(@$_)의 첫번째 값으로 바꿉니다.

$$_[2] = $$_[2] || "0"; # null 대신 0을 넣어줍니다.
# 안 해주면, 종성이 없을 때에는 경고메세지를 출력합니다.

$_ = ($cho{$$_[0]}*21 + $jun{$$_[1]}) * 28 + $jon{$$_[2] } + 44032; # $_에 배열 대신 계산값 대입.
}
print encode('utf-8',chr($_)) foreach @output;
# 출력합니다.
# wide character 어쩌구 오류메세지를 막기 위해 인코딩을 사용했습니다.

print "\n";


출력 결과:
$ ./asdf.pl
예제1번



이 스크립트는 소정의 개인적인 목적을 위해 짜여졌으며, 내가 원하는 스크립트를 위한 중간발판 정도입니다. 때문에 저는 그냥 테스트 코드로만 작성을 해서 예외처리라든지 지저분한 점이라든지 있습니다. 태그 문제로 코드 정리도 지저분하고, 취향 때문에 사용한 몇몇 더러운 코드도 있긴 할테지만 자비롭게 봐주시면 감사합니다.
CPAN에 한국어 자모분리/합치기 모듈이 있긴 하지만 도무지 이용이 어려워 아예 스크립트를 새로 짰습니다. 그리고 딱히 자모 합치기에 대한 perl 스크립트는 보이지 않아 새로 게시를 하였습니다.

mwultong 님의 게시물에서 많은 도움을 받았습니다.

추가> 자음이나 모음만 들어간 경우를 처리하기 위해서는 좀 더 코드가 필요합니다. 중간에 while 문 안에 적당한 조건을 더 집어넣으면 되는데, 생각해보니 이프문을 두 개로 나눠놨는데 하는 짓은 똑같더군요. 예. 합쳐주면 조금이나마 더 깔끔한 코드가 될 것 같습니다.


덧.
아무래도 블로그 글 예쁘게 쓰기는 나랑 성향이 영 안 맞는 것 같다. 다음부터 대충 써야지 역시……
이 게시물 태그에 뻘짓이 있는 건, 나름 예쁘게 써보겠답시고 태그 만지고 블로그 편집기랑 싸움을 한 것 때문이다.
급 반말이 나오는 이유는, 애당초 여긴 배설 블로그였기 때문에 :P

8월 4일 16시 51분 출력 결과 수정 및 추가사항 입력. 아놔 예문 줄였으면서 그대로 올리면 어쩌자는 거지;

2009년 8월 2일 일요일

[잡담] 발자취 및 irc perl bot

사실 윈도를 쓸 때에는 mIRC를 사용하고 있었다. 아마 크랙 된 놈으로. 그래도 버전이 무지 낮더라;

아마 irc를 언제 처음 썼더라…… 6년도 말쯤이 아니려나? 오게임 하면서 무슨 동맹에서 나눠주기에 받아서 써봤다. 금방 그만뒀지만.



여하간 좀 더 하다가 아마 삼발이(부족전쟁) 하면서 irc를 다시 쓰게 됐던가 하는 기억이다.



찾아보니 역시 오게임 하면서 재시작 한 모양이다 -_-; 부족은 덤이었고.

하여간 irc를 시작하면서, 다른 사람들이 자동으로 반응하는 것들이 신기했다.(자반) 그래서 나는 여러 검색창에 "자동 반응" 정도를 검색했던 걸로 기억하고… mIRC 스크립트를 접하게 되었다. 지금은 거의 만지지만 :P 이후 자동 반응이라든지(이건 식상해서 그만 둔 것 같다) 여러가지 스크립트를 삽질 하면서 만들고, IRC 클라이언트에 얹어놓고 썼다. 대개 혼자 쓰긴 했는데, 좀 쓴 것 같다. mIRC를 메인으로 사용한 건 대충 08년도 초부터 08년도 11월 10일9월 말까지 쓴 것 같다. 이건 자동 로깅 데이터의 마지막 정보를 기초로 함(...) => xchat 로그 제일 처음을 보니 10월 1일.

XChat 하니 뭔가 감이 잡히실 분이 있을 것도 같은데, 저때부터 과감하게 우분투 리눅스로 OS를 갈아탔다. 이유는 간단한데 ; 윈도가 설치된 하드디스크가 고장이 났는지 겁나 느렸다. 그래서 외장하드 지르고, 거기에 OS를 설치했다. 나 좀 짱인듯?[1] 그러고 wine으로 mIRC를 돌리기도 거북하여…… XChat을 설치해서 사용하게 되었다. 이 때 당시에는 perl script에 약간 익숙해진 상태였기 때문에[2] 과감하게 mIRC 스크립트를 버리고 XChat에 Perl 스크립트를 얹어서 돌려볼 생각을 가지고 있었다. 솔까 mIRC 스크립트보다 펄이 편하다-_-; 근데 그냥 perl과 perl in xchat은 약간 달랐던 모양이다. 난 그냥 주눅이 들어서 GG를 치고 xchat도 켜고, wine으로 mirc도 켜고 양다리를 타고 있었다. mirc로 켠 놈은 그냥 봇 용도로만 썼다.

그런데 최근에 hanirc가 ddos 공격을 받으면서 서버가 죽었다. 덕분에 hanirc에 있던 많은 유저는 뿔뿔히 흩어져야 했고, 나 또한 흩어졌다. 그런데 내 mirc 버전이 구려서 다중 탭이 안 되잖아. 난 새 버전을 깔려고 시도해보았으나, 여태까지 정리해온 스크립트를 옮기기가 귀찮아서 이전부터 생각했던 wine으로 어정쩡하게 돌리는 거 말고, 간지나게 새 봇을 굴려보자! 프로젝트를 시작하게 되었다. 그냥 그렇다고.

도움이 많이 된 JEEN 님의 블로그.
아무튼 보고 스텝바이스텝 하면서 봇을 만들고 있다. 느낌이, 적어도 mIRC 스크립트로 굴리던 녀석보다는 더 간지나게 만들 수 있을 것 같다.

아, perl 채널도 안 간지 우주 오래 됐는데 그냥 가서 죽만 치고 있을까나……



______

[1]여담으로 지금도 OS는 외장하드에 설치되어 있다. 그래서 USB 연결이 실수로라도 뽑히면 컴퓨터가 멈춘다. 예전 설치 그대로인 건 아니고, 우분투가 판올림 될때마다 포맷하고 설치하고 했는데도 아직 OS는 처음 자리에 있다. 물론 파티션은 좀 다르게 나누긴 했지만 :P
[2]아직 초보.

2009년 7월 12일 일요일

우주 골프 게임


근성 자극 게임이다.
아, 물론 impossible 뱃지에 신경 끄면 상관 없을건데, 뭔가 할 수 있을 것 같단 말이지.

저게 가이드라인 안 켜고 9홀을 모조리 4회 이하로 홀인을 시키면 플래티넘 메달을 하나씩 준다.
총 10라운드가 있는데, 그래서 플래티넘 메달 10개를 모으면 임파서블 뱃지를 딸 수 있다.

……뱃지에 신경 쓰는 건 아니지만,
왠지 할 수 있을 것 같으니까.

근데 이게 존나 근성 자극 게임인게,
9홀을 달리면 한 홀이나 두 홀씩 미스가 난다. 4타를 쳐야 하는데 5타를 친다든지 함정에 빠져서 6~타를 친다든지. 난 처음에 애버리지 4타 이하인 줄 알고 "휴, 아슬하게 통과이군" 했는데 대뜸 은메달을 주는 거다. 아 샹……

암튼 존나 근성 달리자 하앜하앜


============================================

아, 그래. 이 게임 최악의 단점을 안 적었는데,

끝내는 과정이 너무 불편하다. 중간에 샷을 잘못 해서 4타가 넘어가게 되면 어서 끝내고 새 판을 시작하는게 바람직한데,

1) 타 끝내기 버튼 클릭
화면 중간에 글씨 큼지막하게 나오면서 딜레이

2) 홀 끝내기 버튼 클릭
3) Yes, No 물어보는 창 뜨면 당연히 Quit 클릭
=>화면 중간에 글씨 큼지막하게 나오면서 딜레이

4) 라운드 끝내기 버튼 클릭
5) 정말 끝낼거냐고 물어보는 창 뜨면 또 클릭
6) 라운드 종류 클릭

끝내는데 존나 오래 걸린다. 이건 에ㅔㅔㅔㅔㅔ러.