파이썬 마을 게시판 인덱스 파이썬 마을
우리나라 파이썬 사용자들의 이야기 마을
 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 
Google
python.or.kr Web

[퀴즈?] 3자리 숫자마다 컴마(,) 찍어주는 one-li
페이지로 1, 2  다음
 
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 3월 12 11:48 am    주제: [퀴즈?] 3자리 숫자마다 컴마(,) 찍어주는 one-li 인용과 함께 답변

큰 숫자를 입력받아 읽기 편하게 3자리수마다 컴마(,)를 넣어서 출력하려고 합니다. 단 python 2.3 버전의 __builtin__ 모듈과 기본자료형에 있는 method만으로 해결해야 합니다. 그리고 one-liner라고 한 것은 하나의 식(expression)으로 평가되어야 한다는 말입니다.

어렵지 않을 줄 알았는데, 한참을 붙잡고 있어도 잘 안되네요. 풀어쓰면 대략 아래와 같겠지요. 많은 열혈 pythoneer들의 참여를 바라며~!

코드:
N = 12345678
S = str(N)
L = (lambda S: range(len(S)%3, len(S), 3))(S)
T = []
for i in range(len(S)):
    if len(S)%(i+1) in L:
        T.append(',')
    T.append(S[i])

print ''.join(T)


PS/ 아.. 상품은... 에이 그런 것 기대하지 마세요. Neutral
_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes


nohmad 가 2004 3월 12 2:01 pm에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
feanor
사이트 관리자


가입:
올린 글: 161
소속: SPARCS, KAIST

올리기올려짐: 2004 3월 12 12:13 pm    주제: 인용과 함께 답변

코드:

>>> commafy = lambda n: ','.join([ i-3<0 and str(n)[:i] or str(n)[i-3:i] for i in range(len(str(n))%3, len(str(n))+1, 3) if i ])
>>> for i in 1, 12, 123, 1234, 12345, 123456, 1234567:
        print commafy(i)

1
12
123
1,234
12,345
123,456
1,234,567
>>>


--feanor
위로
사용자 정보 보기 비밀 메시지 보내기    
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 3월 12 1:49 pm    주제: 인용과 함께 답변

감사합니다!

문제는 해결됐지만 혹시 다른 구현이 있으신 분은 계속 리플을... Wink
_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 3월 12 3:56 pm    주제: 인용과 함께 답변

코드:

>>> x = lambda n: (n < 0 and '-' or '') + (lambda num=str(abs(n)): ''.join([(i % 3 == 0 and i != -(len(num))) and (','+num[i]) or num[i] for i in range(-len(num), 0)]))()
>>>
>>> x(1), x(12), x(123), x(1234), x(12345), x(123456), x(1234567), x(0), x(-1), x(-12), x(-123), x(-1234)
('1', '12', '123', '1,234', '12,345', '123,456', '1,234,567', '0', '-1', '-12', '-123', '-1,234')



정수만 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기    
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 3월 12 4:40 pm    주제: 인용과 함께 답변

비슷한...

코드:

>>> x = lambda n: (n < 0 and '-' or '') + (lambda num=str(abs(n)): ''.join([(i and i % 3 == len(num) % 3) and (','+ch) or ch for i, ch in enumerate(num)]))()
>>> x(1), x(12), x(123), x(1234), x(12345), x(123456), x(1234567), x(0), x(-1), x(-12), x(-123), x(-1234)
('1', '12', '123', '1,234', '12,345', '123,456', '1,234,567', '0', '-1', '-12', '-123', '-1,234')
위로
사용자 정보 보기 비밀 메시지 보내기    
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 3월 13 10:47 am    주제: 인용과 함께 답변

코드:

x = lambda num: (num < 0 and '-' or '') + (lambda l=list(str(abs(num))): ''.join([[l.insert(0, ((i != -len(l) and i % 3 == 0) and ',' or '') + l.pop()) for i in range(-1,-len(l)-1,-1)], l][1]))()

y = lambda num: (num < 0 and '-' or '') + (lambda l=list(str(abs(num))): ''.join([[l.append(((i and i % 3 == len(l) % 3) and ',' or '') + l.pop(0)) for i in range(len(l))], l][1]))()

z = lambda num: (num < 0 and '-' or '') + (lambda s=str(abs(num)): ','.join([s[i:(i+3) or len(s)] for i in range((-len(s))/3*3,0,3)]))()



_num_pair = [
   (1, '1'),
   (12, '12'),
   (123, '123'),
   (1234, '1,234'),
   (12345, '12,345'),
   (123456, '123,456'),
   (1234567, '1,234,567'),
]
num_pair = _num_pair + [(-n, '-'+s) for n, s in _num_pair]

for func in (x,y,z):
   for n, s in (num_pair):
      assert func(n) == s
위로
사용자 정보 보기 비밀 메시지 보내기    
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 3월 13 11:20 am    주제: 인용과 함께 답변

처음에 작성할 때는 몰랐는데 작성하고 나서 코드를 보니 대략 정신이 혼미해질려고 하는....

one-liner라기보다는 long~~~liner 인듯한 코드가 되버린듯하네요..
위로
사용자 정보 보기 비밀 메시지 보내기    
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 3월 13 12:30 pm    주제: 인용과 함께 답변

멋진 코드, 감사합니다! :>
_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 4월 29 1:21 am    주제: 오오 step... 인용과 함께 답변

>>> ''.join([('',',')[i and i % 3 == 0]+c for i, c in enumerate('1234'[::-1])])[::-1]
'1,234'
>>>
위로
사용자 정보 보기 비밀 메시지 보내기    
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 4월 29 6:24 am    주제: 인용과 함께 답변

falsetrue님 one-liner들은 기상천외하다 못해 속고 있는 듯한 느낌마저 드는군요.

그 옛날 마이크로소프트웨어였나?에서 주최한 one-line 컨테스트가 생각나는군요. 256바이트 제한이었던 걸로 기억되는데...
_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 4월 30 9:58 pm    주제: 인용과 함께 답변

저도 한 번 해봤는데, 별로 독창적이지는 않군요. Neutral

코드:
>>> (lambda x: ''.join([(i%3 and y or ','+y) for i,y in enumerate(str(x)[::-1])])[:0:-1])(1234567)
'1,234,567'

_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
nohmad



가입:
올린 글: 234

올리기올려짐: 2004 4월 30 11:05 pm    주제: 인용과 함께 답변

zip 버전

코드:
>>> for i in range(1,12):
...   (lambda X: ''.join([Z[0]+Z[1] for Z in zip([(i+1)%3==0 and i<len(X)-1 and ',' or '' for i in range(len(X))][::-1], list(X))]))('3'*i)
...
'3'
'33'
'333'
'3,333'
'33,333'
'333,333'
'3,333,333'
'33,333,333'
'333,333,333'
'3,333,333,333'
'33,333,333,333'

_________________
장기적으로 우리는 모두 죽는다 - J. M. Keynes
위로
사용자 정보 보기 비밀 메시지 보내기     MSN 메신저
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 5월 01 1:15 am    주제: 요즘 일은 안하고 이 퀴즈의 또 다른 해법을 인용과 함께 답변

>>> (lambda s: ','.join([s[i:(i+3) or None] for i in (range(-3,-len(s)-3,-3))[::-1]]))('1234')
'1,234'
위로
사용자 정보 보기 비밀 메시지 보내기    
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 5월 01 1:34 am    주제: 오.. 또 생각났다. 인용과 함께 답변

>>> ','.join([''.join([n or '' for n in x]) for x in map(None, *['1234'[-i::-3] for i in 1,2,3])])[::-1]
'1,234'
위로
사용자 정보 보기 비밀 메시지 보내기    
falsetru



가입:
올린 글: 2431

올리기올려짐: 2004 5월 01 1:36 am    주제: 약간의 변형... 인용과 함께 답변

>>> ','.join([''.join([n or '' for n in x]) for x in map(None, *['1234'[-i::-3] for i in 3,2,1])][::-1])
'1,234'
위로
사용자 정보 보기 비밀 메시지 보내기    
이전 글 표시:   
글 쓰기   답변 달기    파이썬 마을 게시판 인덱스 -> 파이썬 질문과 답변 시간대: GMT + 9 시간(한국)
페이지로 1, 2  다음
페이지 12

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다



Powered by phpBB © 2001, 2005 phpBB Group
회선/장비: Daum DNA , 관리: 장혜식,서상현