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 - sed

無駄にsedで実装してみます。標準入力。2進のみ。

かなりダサいので誰か短くしてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sed -f
s/^/@/
:a
/@0\?$/{s///;b}
/[02468]$/s/.*@/0&/
/[13579]$/s/.*@/1&/
s/@/&#/
:b
/#1$/{
  s///
  ba
}
/#10/{s//5#/;bb}
/#11/{s//5#1/;bb}
/#12/{s//6#/;bb}
/#13/{s//6#1/;bb}
/#14/{s//7#/;bb}
/#15/{s//7#1/;bb}
/#16/{s//8#/;bb}
/#17/{s//8#1/;bb}
/#18/{s//9#/;bb}
/#19/{s//9#1/;bb}
/#[3579]/{
  h
  s/.*#\(.\)*/\1/
  y/3579/1234/
  G
  /#.$/{s/\(.\)\n\(.*\)#./\2\1/;ba}
  s/\(.\)\n\(.*\)#./\2\1#1/
  bb
}
/#[02468]/{
  h
  s/.*#\(.\).*/\1/
  y/02468/01234/
  G
  s/\(.\)\n\(.*\)#./\2\1#/
}
/#./bb
s/#//
ba

外部コマンドを使って楽するとこんな感じ。ほとんど単なるsh。

標準入力に「10」とか食わせると2進変換、「10 8」のように空白で区切って基数を付けるとその基数で変換。

1
2
/\(.*\) \+\(.*\)/{s//echo "obase=\2;\1"|bc/e;b}
s/.*/echo "obase=2;&"|bc/e

こっちのほうが短いですね。

1
2
3
s/\(.*\) \+\(.*\)/echo "obase=\2;\1"|bc/e
t
s/.*/echo "obase=2;&"|bc/e

Index

Feed

Other

Link

Pathtraq

loading...