삼육구 프로그램

highwind의 이미지

웹 서핑을 하다가 미국식 삼육구 스타일 게임인 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] 삼육구 룰에 마추어서 코드를 바꾸었습니다.

creativeidler의 이미지

def clap369(n):
    return "clap" if set(str(n)) & set('36') else n
litdream의 이미지

9는 안하나요?

import re
def samYookGoo(n):
   return "clap" if re.search('(3|6|9)',str(n)) else n

삽질의 대마왕...

삽질의 대마왕...

highwind의 이미지

보통 룰이 36같은 경운 짝짝 두번 쳐야하지 않나요?

=====================================
http://www.timothylive.net

=====================================
http://timothylive.net

litdream의 이미지

다시 regex로...

import re
def samYookGoo(n):
    lst = re.findall('(3|6|9)', str(n))
    return len(lst) * 'clap ' if len(lst) > 0 else n

삽질의 대마왕...

삽질의 대마왕...

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

def samYookGoo(n):
  return filter(lambda x:x in'369',`n`)and'clap'or`n`
pung96의 이미지

정상적인 perl 코드입니다.

1: sub clap369{
2:    my $num =shift @_;
3:    return $num=~/3|6|9/ ? 'clap' : $num;
4: }

1: 함수 헤드입니다. perl은 헤드에서 인자를 정의하지 않지요. 인자는 모두 하나의 리스트로 전달됩니다.
2: 전달된 인자 리스트 @_ 의 첫번째 인자를 $num이라는 변수에 넣습니다.
3: ?: 연산자는 c에서도 쓰이는 것이라 생략하고 정규표현식으로 3,6,9가 있으면 clap를 없으면 숫자를 그대로 반환

조금 줄여보겠습니다.

sub clap369{local($_)=@_;/3|6|9/?'clap:$_}

마법의 힘을 가진 변수인 $_와 return이 없으면 마지막 문장의 반환값이 자동으로 return된다는 성질을 이용한 거죠.

조금 더 짧게 쓰면서 리스트 입력에 대해 처리하려면

sub clap369{map/3|6|9/?'clap':$_,@_}

이상 #perl IRC 에서 pung96이었습니다.
pung96의 이미지

sub clap369{map'crap 'x y/369//||$_,@_} 
cppig1995의 이미지

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.

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

n % 10 % 3이라면 끝자리가 3의 배수일 경우만 되지 않나요?
369 게임의 경우 자리에 관계 없이 3/6/9가 들어있으면 박수를 쳐야합니다.

cppig1995의 이미지

그렇군요.
-_- 이거 비-스크립트 언어로는 복잡해지겠는데요?
처음부터 문자열을 받거나, 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.

highwind의 이미지

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

cppig1995의 이미지

그렇다면... 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.

Scarecrow의 이미지

3, 6, 9 룰이 동네마다 다른가요?
제가 알고 있는건 3의 배수일 때와 3, 6, 9가 들어갈 때에 박수를 치는 것으로 알고 있는데요.

1, 2, ㅂ, 4, 5, ㅂ, 7, 8, ㅂ, 10, 11, ㅂ, ㅂ, 14, ㅂ, ㅂ, 17, ㅂ, ㅂ, 20, ㅂ, 22, ㅂ, ㅂ, 25, ㅂ, ㅂ, 28, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, ㅂ, 40

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.