バイナリで1から整数までカウント…


13

イントロ:

私が子供の頃、電卓を手に入れて+ボタンを押し続け、どれだけ高く計算できるかを覚えていました。今、私はプログラミングが好きで、iOS用に開発しています。

カウントは、人間とコンピューターの両方にとって基本的なスキルです。それがなければ、残りの数学はできません。単に開始し1て繰り返し追加1するだけです。

チャレンジ:

これは単なる挑戦です。あなたのプログラムにし1たいIntegerことは、それが取り込むものすべてに印刷することです。しかし、10進数のカウントはちょっと退屈なので、それにひねりを加えます。

カウントは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ビット整数を使用する場合は、あなたの出力はしなければならない 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

得点:

スコアは、コードのバイト数に等しくなります。これはコードゴルフなので、最低スコアが勝ちます。

ボーナスポイント:

出力に、基数10の数値(たとえば、0000 0000 0000 0000 0000 0000 0000 0001バイナリの基数10に等しい1)を表示する場合、スコアにを掛けます0.8

私のように4桁の出力をグループ化する場合、スコアを0.8(もう一度)掛けます。これは必須ではありません。

切り上げたり、切り捨てたりしないでください。あなたのスコアは浮動小数点数です。

幸運を!


スペースで区切られた4つのチャンクに数字を入れる必要がありますか?
xnor

@xnorいいえ。読みやすさのためにしましたが、そのためのボーナスの機会も含めます。
DDPWNAGE

制限のないサイズのデータ​​型を使用するとどうintなりますか(Python 3 など)。
isaacg

@isaacgプログラムが32ビット整数と64ビット整数のどちらを使用するかを指定します。範囲外の整数に対応する必要はありません。入力したものを出力するだけです。言い換えれば、選択はあなた次第です。
DDPWNAGE

4
langaugeが30ビット整数(Haskell)や任意精度整数(J)などの異なるものを使用している場合はどうなりますか?
FUZxxl

回答:


14

APL、10文字

APLでもう1つ。想定⎕IO←1(デフォルト)。ボーナスポイントはありません。入力デバイスから数値を読み取ります。APLが32ビット整数ではなく64ビット整数を使用する場合、必要に応じて32を64に置き換えます。

整数の範囲を超えると、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実装が難しいボーナスポイントを取得しようとしないでください。努力する価値はほとんどありません。
FUZxxl

質問では、文字ではなくバイトカウントを具体的に求めたため、スコアは20バイトである必要があります。
ankh-morpork

@ dohaqatar7 APL文字セット全体を1バイトに収めるAPLのエンコード(コードページ907など)があります。従来のAPLコードページでエンコードできないAPL拡張機能がいくつかありますが、私はそれらを使用しません。
FUZxxl

7

JavaScript(ES6)56.8(71 * 0.8)

JavaScriptは64ビット精度を処理できないため、32ビットバージョン(浮動小数点の倍精度を使用して最大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

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()

数値を2進数に変換し、文字列の書式設定を使用して32桁の2進数に変換し、ボーナスの10進数も出力します。execループを使用し1て、入力値から増分します。


いい解決策!指定されたとは思いませんが、32ビットの範囲の大きな数値では失敗しますOverflowError: repeated string is too long。ただし、それが私のマシンだけの制限かどうかはわかりません。
ケイド


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}
原生生物

3

Common 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

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

空白文字をもう1つ追加して、10進数と2進数を分離することもできますが、技術的には問題は必要ありません。編集:ありがとう、CL!


1
ちなみにあなたは置き換えることができx%-4-1x%-4-2いない余分なバイトの費用のためのバイナリと小数の間にスペースを追加します。(これにより、各行の先頭にある余分なスペースも
削除され

2

オクターブ、23文字

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

入力5の出力例:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

2

MatLab、19バイト

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

これにはあまり多くありませんが、MatLabには10進数からバイナリへのコンバータが組み込まれており、結果を自動的に出力します。


1
これは、32ビット/ 64ビット整数を出力しません。
user0815

申し訳ありませんが、ありがとうございます。それに応じてコードを変更しました。
ロビー

この答えはオクターブ答えとほとんど完全に同じです。
アレックスA.

2

ジュリア、42バイト

これはボーナスなしで少し短くなります。

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

これにより、整数を取り、1からnまでの各数値のバイナリ表現を出力する名前のない関数が作成されます。各数値には、0〜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

これは、整数を取り、以前と同様にバイナリ表現を出力する名前のない関数を作成します。今回は、末尾に10を基数とする4つのグループに分割されます。


2

Common 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's 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ビットバージョン。OSが64ビットかどうかに関係なく、PHPはWindowsでは32ビットのみに制限されます。

1つのコマンドライン引数を取ります。

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バイト(分割、10進数)

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

51 * 0.8 = 40.8バイト(10進数)

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:»

@ Mr.Xcoderのおかげで-2バイト

スペース区切り文字もシーケンス番号もない出力。

オンラインでお試しください。

説明:

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バイトで動作
Mr. Xcoder

@ Mr.Xcoderおかげでj、正しい長さになるように先頭に追加することを完全に忘れてしまいました。
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.