从1到整数…在二进制中计数


13

介绍:

我记得,当我还是个孩子的时候,我会得到一个计算器并继续按下+按钮,看看我能数多少。现在,我喜欢编程,并且正在为iOS开发。

计数是人类和计算机都要做的一项基本技能。没有它,其余的数学将无法完成。只需从头开始1并重复添加1即可完成。

挑战:

这只是一个简单的挑战。我希望您的程序执行的工作是从打印1到打印的所有Integer内容。但是,由于十进制计数有点无聊,因此我会在其中加点麻烦:

计数不能以10为底,它必须以二进制形式显示计数。

因此,使用32位整数计算为5时,将如下所示:

0000 0000 0000 0000 0000 0000 0000 0001 ..... 1
0000 0000 0000 0000 0000 0000 0000 0010 ..... 2
0000 0000 0000 0000 0000 0000 0000 0011 ..... 3
0000 0000 0000 0000 0000 0000 0000 0100 ..... 4
0000 0000 0000 0000 0000 0000 0000 0101 ..... 5

这是一台电脑。他们最了解二进制。您的输入可以是32位或64位整数。这完全取决于您。但是,如果使用32位整数,则输出必须二进制的 32位整数,如果使用64位整数,则输出必须binary的 64位整数。

输入样例:

一个32位整数 5

样本输出:

0000 0000 0000 0000 0000 0000 0000 0001
0000 0000 0000 0000 0000 0000 0000 0010
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 0100
0000 0000 0000 0000 0000 0000 0000 0101

得分:

您的分数等于代码中有多少字节。因为这是Code Golf,所以最低分获胜。

奖励积分:

如果在输出中显示以10为底的数字(例如,0000 0000 0000 0000 0000 0000 0000 0001二进制等于10 1),则将分数乘以0.8

如果像我一样将输出的4位数字分组,则将您的分数再乘以0.8(再次)。这不是必需的。

不要向上舍入,也不要向下舍入。您的分数是一个浮点数。

祝好运!


您是否必须将数字分成四部分,并用空格隔开?
xnor

@xnor不。我这样做是为了提高可读性,但我还将为此提供一个额外的机会。
DDPWNAGE

如果我使用无限制大小的数据类型(int例如Python 3 )怎么办?
isaacg 2015年

@isaacg指定您的程序使用32位还是64位整数。您不必容纳那些超出范围的整数。您只需要输出您输入的内容。换句话说,选择是您的。
DDPWNAGE

4
如果我们的语言使用不同的东西,例如30位整数(Haskell)或任意精度整数(J),该怎么办?
FUZxxl 2015年

Answers:


14

APL,10个字符

APL中的另一个。假设⎕IO←1(默认)。没有奖励积分。从输入设备读取号码。如果您的APL使用64位整数而不是32位整数,请根据需要用64代替32。

请注意,当超出整数范围时,APL透明地转换为浮点数。因此很难确切地说出APL使用的整数大小。

⍉(32⍴2)⊤⍳⎕

说明

2          ⍝ the number 2
32⍴2       ⍝ a vector of 32 twos.
(32⍴2)⊤X   ⍝ X represented as base 2 to 32 digits precision
⍳X         ⍝ a vector of the integers from 1 to X
⎕          ⍝ a number queried from the terminal
(32⍴2)⊤⍳⎕  ⍝ the output we want, flipped by 90°
⍉(32⍴2)⊤⍳⎕ ⍝ the output we want in correct orientation (⍉ is transpose)

看起来我不应该这么努力地获得这4个分组哈哈
Protist

@protist不要试图获得太难实现的奖励积分。这几乎是不值得的。
FUZxxl

该问题专门要求字节计数而不是字符,因此分数应为20个字节。
ankh-morpork

@ dohaqatar7有一些APL的编码(如代码页907)适合整个APL字符集为一个字节。有些APL扩展无法使用传统的APL代码页进行编码,但是我不使用其中的任何扩展。
FUZxxl

7

JavaScript(ES6)56.8(71 * 0.8)

32位版本,因为JavaScript无法处理64位精度(使用浮点双精度最多53位)

不分组

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1),i)} 

有分组-得分60.16(94 * .64)

f=n=>{for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).slice(1).match(/..../g).join` `,i)}

在任何浏览器中测试(ES5)

function f(n)
{
  for(i=0;i++<n;)console.log((8*(8<<26)+i).toString(2).substr(1).match(/..../g).join(' '),i)
}

// Test
console.log = function(x,y) { O.innerHTML += x+' '+y+'\n' }
Count to: <input id=I><button onclick="O.innerHTML='';f(+I.value)">-></button>
<pre id=O></pre>


6

Pyth,18 * 0.8 * 0.8 = 11.52字节

VSQjd+c.[64.BN\04N

输出示例:

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010 10

2
@DDPWNAGE在接受答案之前给其他人一些时间来竞争:)
orlp

好吧,我正在考虑暂时接受它,所以人们知道该怎么做。
DDPWNAGE

2
@DDPWNAGE请记住,在接受答案并等待了几个小时之后,您不能轻易拒绝接受答案。
FUZxxl 2015年

4

Pyth,19 * 0.8 * 0.8 = 12.16字节

VSQjd+cjk.[032.BN4N

输入5的示例输出:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5

示范。


4

python 2,48 * 0.8 = 38.4

i=0;exec"i+=1;print format(i,'032b'),i;"*input()

将数字转换为二进制,使用字符串格式将其转换为具有32位数字的二进制,然后还打印奖励的十进制数字。使用exec循环从递增1到输入值。


不错的解决方案!我不相信它是指定的,但是对于32位范围内的大数,这将失败OverflowError: repeated string is too long。不知道这是否只是我的机器的限制。
卡德2015年


4

APL,23.68(37×.8×.8)

{⎕←(⍕⍵),⍨⊃,/,/' ',⍨⍕¨8 4⍴(32⍴2)⊤⍵}¨⍳⎕

3

KDB(Q),50 * 0.8 * 0.8 = 32

我对提交的内容感到有些难过:(应该有一种更好的方法!

{-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}

说明

                                         1+til x     / counting
   {                                  }@'            / lambda each
                      (0N 4#0b vs x),x               / convert to binary and join with input
    " "sv raze@'string                               / convert to string, concatenate each string and join with space
{-1                                             ;}   / print and surpress output in lambda

测试

q){-1{" "sv raze@'string(0N 4#0b vs x),x}@'1+til x;}5
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0101 5

2
好吧,你可以加入K;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
protist

3

普通Lisp,96.0

得分了: (* 150 .8 .8)

(lambda(y)(flet((p(n &aux(x(format()"~39,'0b ~:*~d"n)))(dolist(p'(4 9 14 19 24 29 34))(setf(aref x p)#\ ))(princ x)(terpri)))(dotimes(i y)(p(1+ i)))))

用10调用函数:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9
0000 0000 0000 0000 0000 0000 0000 1010 10

说明

(format()"~39,'0b ~:*~d" #b101010101010) 给出:

"000000000000000000000000000101010101010 2730"

修改中间字符串(数组)以在以下从零开始的索引处放置一个空格字符:4 9 14 19 24 2934。然后将其打印出来。

请注意,看似简单的(format t"~39,'0,' ,4:b ~:*~d" #b101010101010)格式并不能满足我们的要求。它打印:

00000000000000000000000001010 1010 1010 2730

(填充未按4分组)


3

Ruby,28岁(35 * 0.8)

?1.upto(*$*){|x|puts"%.32b #{x}"%x}

3

C,97 * 0.8 * 0.8 = 62.08

a,x;main(b){for(scanf("%u",&b);a++<b;printf("%d\n",a))for(x=32;x--;)printf("%*d",x%-4-2,a>>x&1);}

输入“ 5”的示例输出:

0000 0000 0000 0000 0000 0000 0000 0001 1
0000 0000 0000 0000 0000 0000 0000 0010 2
0000 0000 0000 0000 0000 0000 0000 0011 3
0000 0000 0000 0000 0000 0000 0000 0100 4
0000 0000 0000 0000 0000 0000 0000 0101 5
0000 0000 0000 0000 0000 0000 0000 0110 6
0000 0000 0000 0000 0000 0000 0000 0111 7
0000 0000 0000 0000 0000 0000 0000 1000 8
0000 0000 0000 0000 0000 0000 0000 1001 9

我可以再添加一个空格字符,以将十进制数字与二进制数字分开,但是从技术上讲,该问题不需要它,我想吗?编辑:谢谢,CL!


1
顺便说一句,您可以替换为x%-4-1x%-4-2以在二进制和十进制之间添加空格,而无需增加字节成本。(这也将消除每行开头的多余空间。)
CL

2

八度,23个字符

dec2bin(1:input(""),32)

输入5的示例输出:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab,19个字节

@(x)dec2bin(1:x,32)

MatLab对此不多,有一个内置的十进制到二进制转换器,并自动打印结果。


1
这不会打印32位/ 64位整数。
user0815

对不起,谢谢大家的注意。我已经相应地更改了代码。
罗比,2015年

这个答案几乎与八度答案完全相同。
Alex A.

2

朱莉娅,42个字节

没有奖金的话,这要短一些。

n->for i=1:n println(lpad(bin(i),64,0))end

这将创建一个未命名的函数,该函数采用整数,并打印从1到n的每个数字的二进制表示形式,每个左边用零填充到64个字符。


有奖金,78字节* 0.8 * 0.8 = 49.92

n->for i=1:n for j=1:4:64 print(lpad(bin(i),64,0)[j:j+3]*" ")end;println(i)end

这将创建一个未命名的函数,该函数采用整数并像以前一样打印二进制表示形式,这次将其分为4组,数字以10为底。


2

普通Lisp,得分:64.0

100字节* 0.8 * 0.8

我对自己的分数感到非常满意,但是我仍然觉得应该可以稍微简化一下代码。

输出量

0000 0000 0000 0000 0000 0000 0000 0001  1
0000 0000 0000 0000 0000 0000 0000 0010  2
0000 0000 0000 0000 0000 0000 0000 0011  3
0000 0000 0000 0000 0000 0000 0000 0100  4
0000 0000 0000 0000 0000 0000 0000 0101  5
0000 0000 0000 0000 0000 0000 0000 0110  6
0000 0000 0000 0000 0000 0000 0000 0111  7
0000 0000 0000 0000 0000 0000 0000 1000  8
0000 0000 0000 0000 0000 0000 0000 1001  9
0000 0000 0000 0000 0000 0000 0000 1010  10

(defun r(n)(dotimes(i n)(format t"~{~a~a~a~a ~}~a~%"(coerce(format()"~32,'0B"(1+ i))'list)(1+ i))))

说明

coredump的answer中所述,格式字符串

"~32,'0B"

确实输出base2数字,但似乎也没有可能正确进行分组。因此,我将字符串强制转换为列表,并通过使用以下格式字符串选择4个一组来对其进行迭代:

“〜{〜a〜a〜a〜a〜}〜a〜%”

在每组4个之后有一个空白,在最后一组之后有一个base10数字。

不分组(60x0.8 => 48.0)

(defun r(n)(dotimes(i n)(format t"~32,'0B ~:*~a~%"(1+ i))))

它使用〜:*再次处理(单个)格式参数。


1

PHP,51.84(81×.8×.8)

32位版本,因为Windows上PHP仅限于32位,而与操作系统是否为64位无关。

接受一个命令行参数。

for($i=0;$i++<$argv[1];)echo chunk_split(str_pad(decbin($i),32,0,0),4," ")."$i\n";

1

CoffeeScript,60.8(76×.8)

由于上述原因,CoffeeScript编译为JavaScript时使用32位版本。

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32),i)for i in[1..x]

随着分组,它变得稍长:64.64(101×.8×.8)

f=(x)->console.log(("0".repeat(32)+i.toString 2).slice(-32).match(/.{4}/g).join(" "),i)for i in[1..x]

1

Haskell,56个字节

f n=putStr$unlines$take n$tail$sequence$replicate 32"01"

用法:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

对于64位,更换3264。其他所有号码也都有效。


1

J,20个字节

(32#2)#:>:i.".1!:1<1

样本输入和输出:

3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1

1

斯威夫特:98.56(154 * 0.8 * 0.8)

for x in 1...Int(Process.arguments[1].toInt()!){var p=String(x,radix:2)
let q=count(p)
for i in 0..<32-q{p=(((q+i)%4==0) ?"0 ":"0")+p}
println("\(p) \(x)")}

1

Ruby,64位

70 * 0.8 * 0.8 = 44.8个字节(拆分,十进制)

1.upto(gets.to_i){|i|puts ("%064d"%i.to_s 2).scan(/.{4}/)*?\s+" #{i}"}

51 * 0.8 = 40.8字节(十进制)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)+" #{i}"}

67 * 0.8 = 53.6字节(拆分)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2).scan/.{4}/}

44个字节(无奖金)

1.upto(gets.to_i){|i|puts "%064d"%i.to_s(2)}

1

05AB1E13 11 字节

Lb32jsäð0:»

-2个字节,感谢@ Mr.Xcoder

输出不带空格分隔符或序列号。

在线尝试。

说明:

L              # List of range [1,input]
               #  i.e. 5 → [1,2,3,4,5]
 b             # Convert each to a binary string
               #  i.e. [1,2,3,4,5] → ['1','10','11','100','101']
  32j          # Join everything together with a minimum length per item of 32,
               # which basically prepends spaces to make it length 32
               #  i.e. ['1','10','11','100','101'] → '                               1                              10                              11                             100                             101'
     sä        # Split it into the input amount of parts
               #  i.e. 5 → ['                               1','                              10','                              11','                             100','                             101']
       ð0:     # Replace every space with a 0
               #  i.e. '                             101' → '00000000000000000000000000000101'
          »    # Join everything together by newlines (and output implicitly)

1
Lb32jsäð0:»工作11字节
Xcoder先生,18年

@ Mr.Xcoder谢谢,完全忘记了使用j前缀,因此它变为正确的长度。
凯文·克鲁伊森
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.