challenge LL Golf Hole 6 - 10進数を2進数に基数変換する

与えられた10進数の整数を2進数に変換してください。ただし、与えられる整数は0以上とします。

与える整数についてはリテラルで与える、標準入力で与える、引数で与えるなどは自由とします。

余力のあるものはこのプログラムを短くしてみたり、さまざまな基数への変換に対応させてみてください。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

1
2
# 標準入力から整数を受け取る
ruby -e 'puts gets.to_i.to_s(2)'

Posted feedbacks - Python

コマンドライン引数から整数、基数を受け取る

1
2
python -c 'import sys;print int(sys.argv[1], int(sys.argv[2]))' 1010 2
# 出力 -> 10

対話形式で整数、基数を受け取る

1
2
3
python -c 'n,m=raw_input().split();print int(n, int(m))'
# 入力 -> 1010 2
# 出力 -> 10

お題(10進数 -> 2進数)を読み違えてた。。。
#7226, #7227のやつは、2進数 -> 10進数 だった。

なので改めて考えてみる。
文字列フォーマットでは8進数と16進数しかないので(多分)

  #10進数を8進数に
  python -c 'print "%o" % 64' #=> '100'
  #10進数を16進数に
  python -c 'print "%x" % 256' #=> '100'

2~36進数に対応するように書いてみた。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 10進数を2~36進数に変換
def f(n, m):
    t = '0123456789abcdefghijklmnopqrstuvwxyz'
    if not 2 <= m <= len(t): return 'error'
    if n == 0: return '0'
    r = []
    while n > 0:
        r.append(t[n % m]); n /= m
    return ''.join([i for i in reversed(r)])

f(4, 2) #=> '100'
f(64, 8) #=> '100'
f(256, 16) #=> '100'
f(1024, 32) #=> '100'

再帰バージョン

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'''
>>> f(0, 0)
'0'
>>> f(4, 2)
'100'
>>> f(64, 8)
'100'
>>> f(256, 16)
'100'
>>> f(1024, 32)
'100'
'''

def f(dec, base):
  digit = '0123456789abcdefghijklmnopqrstuvwxyz'
  d, m = divmod(dec, base)
  if d:
    return f(d, base) + digit[m]
  else:
    return digit[m]

if __name__ == '__main__':
  import doctest
  doctest.testmod()

Python2.6でbin()関数が追加されました。他の解答にあわせるなら、0bは削除するといいと思います。

1
2
print bin(105) # '0b1101001'
print bin(105)[2:] # '1101001'

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def fmt_iter(n, base):
    if n / base:
        for x in fmt(n / base, base):
            yield x
    yield DIGITS[n % base]

def fmt(n, base):
    return ''.join(fmt_iter(n, base))

#for i in range(100):
#    print fmt(i, 2)

Index

Feed

Other

Link

Pathtraq

loading...