 |
파이썬 마을 우리나라 파이썬 사용자들의 이야기 마을
|
|
| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
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/ 아.. 상품은... 에이 그런 것 기대하지 마세요.  _________________ 장기적으로 우리는 모두 죽는다 - J. M. Keynes
nohmad 가 2004 3월 12 2:01 pm에 수정함, 총 1 번 수정됨 |
|
| 위로 |
|
 |
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 주제: |
|
|
감사합니다!
문제는 해결됐지만 혹시 다른 구현이 있으신 분은 계속 리플을...  _________________ 장기적으로 우리는 모두 죽는다 - J. M. Keynes |
|
| 위로 |
|
 |
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 |
|
| 위로 |
|
 |
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 |
|
| 위로 |
|
 |
nohmad

가입: 올린 글: 234
|
올려짐: 2004 4월 30 9:58 pm 주제: |
|
|
저도 한 번 해봤는데, 별로 독창적이지는 않군요.
| 코드: | >>> (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 |
|
| 위로 |
|
 |
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 |
|
| 위로 |
|
 |
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' |
|
| 위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
|