삼육구 프로그램
글쓴이: highwind / 작성시간: 목, 2008/02/28 - 4:03오전
웹 서핑을 하다가 미국식 삼육구 스타일 게임인 fizzbuzz라는 게임을 찾았습니다. 간단한 게임인데요, 3의배수면 'fizz'라고 5의 배수면 'buzz'라고 그리고 3과 5의 배수면 'fizzbuzz'라고 외치는 게임입니다.
http://l33tminion.livejournal.com/190270.html
위 사이트에 의하면 fizzbuzz를 implement하는 프로그램을 소개하는데요 다음과 같습니다.
Quote:
definition of fizzbuzz(n) is:
['fizzbuzz', 'fizz', 'buzz', n][[n%15,n%3,n%5,0].index(0)]
Python하고 Ruby에서 잘돌아 간다고 합니다. 멋있기도 하고 재미있어서 삼육구 버전을 python으로 만들어보았는데요.
def samYookGoo(n): cs = [] for c in str(n): if (c == "3" or c == "6"): cs.append("clap") if (cs.count("clap") == 0): return n else: return ''.join(cs)
좀더 멋있게 하는 방법이 없을까요?
[편집] 코드에 들여쓰기가 잘못되어있었습니다.
[편집2] 삼육구 룰에 마추어서 코드를 바꾸었습니다.
Forums:
def clap369(n): return
import redef
9는 안하나요?
삽질의 대마왕...
삽질의 대마왕...
보통 룰이 36같은
보통 룰이 36같은 경운 짝짝 두번 쳐야하지 않나요?
=====================================
http://www.timothylive.net
=====================================
http://timothylive.net
regex
다시 regex로...
삽질의 대마왕...
삽질의 대마왕...
def samYookGoo(n): return
펄 버젼입니다.
정상적인 perl 코드입니다.
1: 함수 헤드입니다. perl은 헤드에서 인자를 정의하지 않지요. 인자는 모두 하나의 리스트로 전달됩니다.
2: 전달된 인자 리스트 @_ 의 첫번째 인자를 $num이라는 변수에 넣습니다.
3: ?: 연산자는 c에서도 쓰이는 것이라 생략하고 정규표현식으로 3,6,9가 있으면 clap를 없으면 숫자를 그대로 반환
조금 줄여보겠습니다.
마법의 힘을 가진 변수인 $_와 return이 없으면 마지막 문장의 반환값이 자동으로 return된다는 성질을 이용한 거죠.
조금 더 짧게 쓰면서 리스트 입력에 대해 처리하려면
이상 #perl IRC 에서 pung96이었습니다.
바뀐 규칙의 펄 코드입니다.
void clap369(int
void clap369(int n){n%10%3?printf("%d\n",n):puts("clap");}
순코드37자(+함수화21자=총58자) 총 37자면 되는군요.
void clap369(int n){std::cout<<n%10%3?n:"clap"<<'\n';}
이렇게 짠 코드는 컴파일이 성공적으로 될는진 잘 모르겠지만, 더 짧군요.
이걸 puts 쪽으로 단일화해 크기를 줄이려고 비표준 itoa 함수를 쓰면,
itoa(n,"(아무 문자 11개)",10);처럼 되어 더 길어질 수도 있습니다.
참고로, 이런 코드는 두 가지 이유에서 위험합니다:
1. 문자열 상수는 상수이므로 unwritable한 메모리 영역에 배당될 수 있습니다.
2. int형이 32비트보다 큰 환경(일례로, 흔치는 않겠지만, ILP64 모델)에 대처하지 못합니다.
"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
n % 10 % 3이라면
n % 10 % 3이라면 끝자리가 3의 배수일 경우만 되지 않나요?
369 게임의 경우 자리에 관계 없이 3/6/9가 들어있으면 박수를 쳐야합니다.
그렇군요. -_- 이거
그렇군요.
-_- 이거 비-스크립트 언어로는 복잡해지겠는데요?
처음부터 문자열을 받거나, sprintf나 비표준 itoa를 통해 문자열로 변환(stringize? stringify?)해야 겠군요.
"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
369의 룰을 다시 정리
369의 룰을 다시 정리 해볼려고 합니다.
3, 6 혹은 9가 들어간 숫자는 박수를 3,6 혹은 9가 포함된 수만큼 친다.
예:
samYookGook(1) -> 1
samYookGook(6) -> clap
samYookGook(12) -> 12
samYookGook(13) -> clap
samYookGook(36) -> clap clap
samYookGook(963) -> clap clap clap
=====================================
http://www.timothylive.net
=====================================
http://timothylive.net
그렇다면... C/C++로
그렇다면... C/C++로 구현할 때
어떤 문자 c가 '3'(51=3*17), '6'(54=3*18) 혹은 '9'(57=3*19)인지 판별하려면 어떻게 해야 하죠?
c를 그냥 3으로 나눈 나머지를 구하려고 했는데, '0'(48=3*16) 때문에 안되네요.
void clap369(char *s){int c=0;while(*s++)if(!(*s%3)&&*s!=48)printf("clap ");else if(!c++)puts(s);if(!c)puts("");}
113자군요. 더 줄여 주실 분? (컴파일 오류 나거나 버그 있으면 뻘쭘)
"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
3, 6, 9 룰이 동네마다
3, 6, 9 룰이 동네마다 다른가요?
제가 알고 있는건 3의 배수일 때와 3, 6, 9가 들어갈 때에 박수를 치는 것으로 알고 있는데요.
1, 2, ㅂ, 4, 5, ㅂ, 7, 8, ㅂ, 10, 11, ㅂ, ㅂ, 14, ㅂ, ㅂ, 17, ㅂ, ㅂ, 20, ㅂ, 22, ㅂ, ㅂ, 25, ㅂ, ㅂ, 28, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, 40
댓글 달기