以十进制和2 ** i为基数打印数字表


9

计算机以二进制形式存在。所有程序员都知道二进制。

但是2**x,尽管它们与二进制文件有着良好的联系,但它们经常被忽略为不实用的。

为了向您展示这种美丽关系的一个例子,我将为19作见证。

19 10011 103 23 13 j
  • 19是十进制数,为清楚起见包括在内。

  • 10011是19的二进制文件。

  • 103,以二进制方式从基数开始以这种方式制作:

    • log2(4)== 2,让我们记住两个。
    • 填充10011,使其长度为2的倍数-> 010011
    • 从左至右取数字2乘2,并将其视为2位数的二进制数:

      • 01-> 1
      • 00-> 0
      • 11-> 3

    完成在,10011碱-4是103。

对于基数8,执行与log2(8)= 3相同的操作,但三乘三。

  • 垫子010011
  • 010-> 2
  • 011-> 3

    23,完成

对于基数16,请执行与log2(16)= 4相同的操作,但4乘4。

  • 垫00010011
  • 0001-> 1
  • 0011-> 3

    13,完成

任务

给定一个最大数字作为输入,您将输出一个表

base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i

因为我从0到n(含)。二进制数是工作所需的绝对最小值的缩影,因此您的代码应尽可能短。

限制和奖金

  • Base-ten->二进制和Binary-> Base-ten内置插件被视为漏洞,就像Base-a-> Base-b一样。

  • 如果2**i通过使用上述关系生成所有(对于i> 2)基数,则将获得*0.6奖励,但允许进行常规基数转换(由您自己编写)。

示例表

> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10

4
由于“您必须使用上述关系生成所有2 ** i(对于i> 2)个基数”,因此被否决。要求特定的算法可以消除很多使代码有趣的东西。您可以禁止内置的基本转换函数,同时仍然允许选择算法。
xnor

@xnor现在使用我的方法只会给高尔夫球手带来更多的自由
Caridorc

1
我也不喜欢奖金。它有效地意味着您必须使用内置算法或算法,并且没有其他算法可行。
xnor 2015年

不允许使用@xnor内置。通用转换器会更短一些,所以如果您使用我自己的转换规则,我会给您带来额外的好处
Caridorc

Answers:


2

CJam,54 * 0.6 = 32.4字节

q~){_5,f{)L@{2md@+\}h(%/Wf%W%{{\2*+}*_9>{'W+}&}%S\}N}/

在这里测试。

供参考,这是一个较短的解决方案,不符合赠金资格(39个字节):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

我更新了挑战,如果使用我的方法,您可能会要求获得0.6 *奖金
Caridorc

1

Pyth,52 * 0.6 = 31.2字节

L?b+%b2y/b2YVUhQjd+NmjkX|_uL++GGHZ_McyNd]ZUQ+jkUTGS5

在线测试

我的非奖励答案是39个字节

M?G+g/GHH@+jkUTG%GHkVUhQjd+N|R0gLN^L2S5

0

PHP,232 230 233 217 * 0.6 = 130.2

没有机会击败高尔夫语言,但我喜欢挑战。

for(;$d<=$n;$d++){echo'
',$d|0;for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b;for($w=1;$w<6;$w++,print" $z"|' 0')for($z='',$k=strlen($b);-$w<$k-=$w;$z=($e>9?chr($e+87):$e).$z)for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k];}
  • 用法:在(或任何其他非负整数)之前$n=32;或替换$n32;通过cli致电
  • 如果不接受,则$n$_GET[n](+ 6 / + 3.6)替换,然后在浏览器
    或cli中调用php-cgi -f bases.php -n=32
  • 将换行符替换为<br><pre>在浏览器中进行测试
  • 可能会在较新的PHP版本中引发有关未定义变量和未初始化的字符串偏移量的通知。
    从error_reporting中删除E_NOTICE(prepend error_reporting(0);)以取消显示它们。
  • 在5.6中测试

分解:

for(;$d<=$n;$d++) // loop decimal $d from 0 to $n
{
    echo'
',$d|0; // print line break and decimal
    for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b; // convert $d to binary
    for($w=1;$w<6;$w++,
        print" $z"|' 0' // print number generated in inner loop (echo doesn´t work here)
    )
        for($z='',$k=strlen($b);-$w<$k-=$w; // loop from end by $w
            $z=($e>9?chr($e+87):$e).$z // prepend digit created in body
        )
            for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k]; // convert chunk to 2**$w
}

主要编辑:

  • 使用了一些索引魔术来修改内部循环->现在可以在整个字符串上向后工作(不再填充,不再拆分或复制二进制文件)
  • 将环体的一部分移到头部以消除支撑
  • 修改后必须添加7个 4字节来修复小数点后0个结果

非奖励版本,142字节

for(;$d<=$n;$d++,print'
',$d|0)for($w=1;$w<6;$w++,print" $z"|' 0')for($k=$d,$y=1,$z='';$k&&$y<<=$w;$k>>=$w)$z=(9<($e=$k%$y)?chr($e+87):$e).$z;

PHP胜过Python?
即使我添加了6(3.6)个字节来使代码片段成为程序,我仍然击败了Python(223 * 0.6 = 133.8或148非奖励vs 158)。惊人。


我收到一个错误“未定义的变量:n:1”,我认为可以通过for在最外层的for循环中的关键字后面删除一个空格来节省1个字节。
Yytsi '16

@TuukkaX:请参见用法:$ n必须在代码片段之前定义。我找到了那个字节,但是谢谢。还有一个:"\n"->物理换行。
泰特斯(Titus)

但我必须添加3个字节才能打印第一个0。(即5个字节来初始化变量)。
泰特斯

0

Ruby,80字节(非奖励版本)

m=ARGV[0].to_i;(0..m).each{|n|puts [10,2,4,8,16,32].map{|b|n.to_s(b)}.join(' ')}

0

Python3 - 189,167,166个 150字节

for i in range(int(input())+1):f=lambda b,n=i,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(b,n//b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))

在@ LeakyNun的帮助下保存了16个字节!

奖励版本-296 * 0.6 = 177.6 279 * 0.6 = 167.4字节

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];v=f(i,2);d=z(v);print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

奖金版本的可读性更高。

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):
    f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n] or f(n//b,b) + c[n%b]
    v=f(i,2)
    d=z(v)
    print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

我可以肯定奖金不适用。您没有使用二进制来产生基数2 ** x。
泰特斯

@Titus哦,我当时理解奖金错误。我将编辑字节数。谢谢!
Yytsi '16

可以肯定的"0123456789abcdefghijklmnopqrstuv"是,比from string import* digits+ascii_lowercase
Leaky Nun

@LeakyNun糟糕。你是对的。我只想到写digits+ascii_lowercase:D 多短。谢谢!
Yytsi '16

150字节:(for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))一行)
Leaky Nun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.