Menghitung dari 1 hingga Integer ... di Binary

13

Pengantar:

Saya ingat, ketika saya masih kecil, saya akan mendapatkan kalkulator dan terus menekan +tombol, dan melihat seberapa tinggi saya bisa menghitung. Sekarang, saya suka memprogram, dan saya sedang mengembangkan untuk iOS.

Menghitung adalah keterampilan mendasar bagi manusia dan komputer. Tanpa itu, sisa matematika tidak bisa dilakukan. Ini dilakukan hanya dengan memulai 1dan secara berulang menambahkannya 1.

Tantangan:

Ini hanyalah tantangan sederhana. Apa yang saya ingin program Anda lakukan adalah mencetak dari 1apa pun Integeryang diperlukan. Namun, saya akan melintirnya, karena penghitungan desimal agak membosankan:

Penghitungan tidak bisa di basis 10, itu harus menunjukkan dirinya menghitung dalam biner.

Jadi, untuk menghitung sampai 5, menggunakan bilangan bulat 32-bit, akan terlihat seperti ini:

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

Ini komputer. Mereka tahu biner terbaik. Input Anda dapat berupa bilangan bulat 32-bit atau 64-bit. Ini benar-benar terserah Anda. Namun, jika Anda menggunakan bilangan bulat 32-bit, output Anda harus bilangan bulat 32-bit dalam biner , dan jika Anda menggunakan bilangan bulat 64-bit, output Anda harus bilangan bulat 64-bit dalam biner .

Input sampel:

integer 32-bit, 5

Output sampel:

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

Mencetak:

Skor Anda sama dengan berapa banyak byte kode Anda. Karena ini Golf Code, skor terendah akan menang.

Poin bonus:

Jika Anda menunjukkan, dalam output, angka itu sebagai angka basis 10 (misalnya, 0000 0000 0000 0000 0000 0000 0000 0001dalam biner sama dengan basis 10 1), kalikan skor Anda dengan 0.8.

Jika Anda mengelompokkan 4 digit output seperti yang saya lakukan, maka kalikan skor Anda dengan 0.8(lagi). Ini tidak wajib.

Jangan mengumpulkan, dan jangan membulatkan ke bawah. Skor Anda adalah angka floating-point.

Semoga berhasil!

DDPWNAGE
sumber
Apakah Anda harus meletakkan digit dalam potongan empat dipisahkan oleh spasi?
xnor
@ xnor Tidak. Saya melakukannya untuk keterbacaan, tetapi saya akan menyertakan peluang bonus untuk itu juga.
DDPWNAGE
Bagaimana jika saya menggunakan tipe data yang ukurannya tidak terbatas (misalnya Python 3 int)?
isaacg
@isaacg Tentukan apakah program Anda menggunakan bilangan bulat 32 atau 64-bit. Anda tidak harus mengakomodasi bilangan bulat yang berada di luar batas; Anda hanya perlu menampilkan apa yang Anda masukan. Dengan kata lain, pilihan ada di tangan Anda.
DDPWNAGE
4
Bagaimana jika langauge kami menggunakan sesuatu yang berbeda, seperti bilangan bulat 30 (Haskell) atau bilangan bulat presisi acak (J)?
FUZxxl

Jawaban:

14

APL, 10 karakter

Lain di dalam APL. Asumsikan ⎕IO←1(default). Tidak ada poin bonus. Membaca nomor dari perangkat input. Jika APL Anda menggunakan integer 64 bit alih-alih 32 bit integer, gantikan 64 untuk 32 sesuai kebutuhan.

Perhatikan bahwa APL secara transparan mengkonversi ke angka floating point ketika rentang bilangan bulat terlampaui. Sangat sulit untuk mengatakan dengan pasti apa yang bekerja dengan ukuran integ APL.

⍉(32⍴2)⊤⍳⎕

penjelasan

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)
FUZxxl
sumber
Sepertinya saya seharusnya tidak berusaha keras untuk mendapatkan 4 pengelompokan haha
protist
@protist Jangan mencoba untuk mendapatkan poin bonus yang terlalu sulit untuk diterapkan. Itu hampir tidak pernah sepadan dengan usaha.
FUZxxl
Pertanyaannya secara khusus meminta jumlah byte daripada karakter sehingga, skor harus 20 byte.
ankh-morpork
@ dohaqatar7 Ada penyandian APL (seperti codepage 907 ) yang sesuai dengan seluruh karakter APL yang ditetapkan menjadi satu byte. Ada beberapa ekstensi APL yang tidak dapat dikodekan dengan halaman kode APL tradisional, tapi saya tidak menggunakannya.
FUZxxl
7

JavaScript ( ES6 ) 56.8 (71 * 0.8)

Versi 32 bit, karena JavaScript tidak dapat menangani presisi 64 bit (paling banyak 53 bit menggunakan floating point doubles)

Tanpa pengelompokan

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

Dengan pengelompokan - skor 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)}

Uji di browser apa saja (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>

edc65
sumber
6

Pyth, 18 * 0.8 * 0.8 = 11.52 byte

VSQjd+c.[64.BN\04N

Contoh output:

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
orlp
sumber
2
@DDPWNAGE Beri orang lain waktu untuk berkompetisi sebelum menerima jawaban :)
orlp
Baiklah, saya berpikir untuk menerimanya sementara waktu, jadi orang tahu apa yang harus dikalahkan.
DDPWNAGE
2
@DDPWNAGE Ingatlah bahwa Anda tidak dapat dengan mudah menerima jawaban setelah Anda menerima jawaban dan menunggu beberapa jam.
FUZxxl
4

Pyth, 19 * 0,8 * 0,8 = 12,16 byte

VSQjd+cjk.[032.BN4N

Contoh output untuk input 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

Demonstrasi.

isaacg
sumber
4

Python 2, 48 * 0.8 = 38.4

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

Mengonversi angka menjadi biner, menggunakan pemformatan string untuk mengubahnya menjadi biner dengan 32 digit, dan kemudian juga mencetak angka desimal untuk bonus. Menggunakan execloop untuk menambah dari 1ke nilai input.

Tidak
sumber
Solusi bagus! Saya tidak percaya itu ditentukan, tetapi ini akan gagal pada jumlah besar di kisaran 32-bit: OverflowError: repeated string is too long. Tidak yakin apakah itu hanya batas pada mesin saya saja.
Kade
4

CJam, 13,44 (21 × 0,64)

ri{)_2b64Ue[4/S*S@N}/

Cobalah online.

Dennis
sumber
4

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

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

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

Saya merasa sedikit sedih dengan kiriman saya :( Seharusnya ada cara yang lebih baik untuk melakukan ini!

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

Penjelasan

                                         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

Uji

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
WooiKent Lee
sumber
2
baik Anda bisa jatuh ke K;)k){-1{" "/:,/'$:(0N 4#0b\:x),x}@'1+!x}
protista
3

Common Lisp, 96.0

Skor: (* 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)))))

Contoh

Memanggil fungsi dengan 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

Penjelasan

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

"000000000000000000000000000101010101010 2730"

String perantara (array) dimodifikasi untuk menempatkan karakter spasi pada indeks berbasis nol berikut: 4 9 14 19 24 29 34. Kemudian dicetak.

Perhatikan bahwa (format t"~39,'0,' ,4:b ~:*~d" #b101010101010)format yang tampaknya langsung tidak melakukan apa yang kita inginkan. Mencetak:

00000000000000000000000001010 1010 1010 2730

(padding tidak dikelompokkan berdasarkan 4)

coredump
sumber
3

Ruby, 28 (35 * 0.8)

?1.upto(*$*){|x|puts"%.32b #{x}"%x}
addison
sumber
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);}

Contoh output untuk input "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

Saya dapat menambahkan satu lagi karakter spasi putih untuk memisahkan angka desimal dari angka biner, tetapi secara teknis masalahnya tidak memerlukannya, saya pikir? Sunting: Terima kasih, CL!

Lynn
sumber
1
Secara kebetulan Anda dapat mengganti x%-4-1dengan x%-4-2untuk menambahkan ruang antara biner dan desimal tanpa biaya byte tambahan. (Ini juga akan menghilangkan ruang ekstra di awal setiap baris.)
CL-
2

Oktaf, 23 karakter

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

Contoh output untuk input 5:

ans =
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101
pengguna0815
sumber
2

MatLab, 19 byte

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

Tidak terlalu banyak untuk yang ini, MatLab memiliki built in decimal to binary converter dan secara otomatis mencetak hasilnya.

Robby
sumber
1
Ini tidak mencetak bilangan bulat 32-bit / 64-bit.
user0815
Maaf, terima kasih atas perhatiannya. Saya telah mengubah kodenya.
Robby
Jawaban ini hampir seluruhnya identik dengan jawaban Oktaf .
Alex A.
2

Julia, 42 byte

Ini sedikit lebih pendek tanpa bonus.

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

Ini menciptakan fungsi tanpa nama yang mengambil integer dan mencetak representasi biner dari setiap angka dari 1 hingga n , masing-masing dibiarkan dengan nol hingga 64 karakter.


Dengan bonus, 78 byte * 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

Ini menciptakan fungsi tanpa nama yang mengambil integer dan mencetak representasi biner seperti sebelumnya, kali ini dipecah menjadi kelompok-kelompok 4 dengan angka di basis 10 di akhir.

Alex A.
sumber
2

Gangguan Umum, skor: 64.0

100 byte * 0.8 * 0.8

Saya cukup senang dengan skor saya, tetapi saya masih merasa harus ada kemungkinan untuk menyederhanakan kode saya sedikit.

Keluaran

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

Kode

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

Penjelasan

Seperti yang dijelaskan dalam jawaban coredump , format string

"~32,'0B"

tidak menghasilkan angka-angka base2 tetapi tampaknya tidak ada kemungkinan untuk mendapatkan pengelompokan yang tepat juga. Karenanya saya memaksa string ke dalam daftar dan mengulanginya dengan memilih grup 4 dengan string format ini:

"~ {~ a ~ a ~ a ~ a ~} ~ a ~%"

Setelah setiap kelompok 4 ada yang kosong, dan setelah kelompok terakhir, nomor base10 dicetak.

Tanpa pengelompokan (60x0.8 => 48.0)

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

Ini menggunakan ~: * untuk memproses argumen format (tunggal) lagi.

Florian Patzl
sumber
1

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

Versi 32-bit, karena PHP hanya terbatas pada 32-bit pada Windows terlepas dari apakah OS 64-bit.

Mengambil satu argumen baris perintah.

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

CoffeeScript, 60.8 (76 × .8)

Versi 32-bit untuk alasan yang disebutkan di atas , ketika CoffeeScript mengkompilasi ke JavaScript.

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

Dengan pengelompokan menjadi sedikit lebih lama: 64,64 (101 × 0,8 × 0,8)

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

Haskell, 56 byte

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

Pemakaian:

*Main> f 5 
00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000011
00000000000000000000000000000100
00000000000000000000000000000101

Untuk 64bit, ganti 32dengan 64. Setiap angka lainnya juga berfungsi.

nimi
sumber
1

J, 20 byte

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

Input dan output sampel:

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
gar
sumber
1

Swift: 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)")}
addison
sumber
1

Ruby, 64 bit

70 * 0.8 * 0.8 = 44.8 byte (split, desimal)

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

51 * 0.8 = 40.8 byte (desimal)

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

67 * 0.8 = 53.6 byte (terpisah)

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

44 byte (tidak ada bonus)

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

05AB1E , 13 11 byte

Lb32jsäð0:»

-2 byte terima kasih kepada @ Mr.Xcoder .

Output tanpa pembatas ruang atau nomor urut.

Cobalah online.

Penjelasan:

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)
Kevin Cruijssen
sumber
1
Lb32jsäð0:»bekerja untuk 11 byte
Mr. Xcoder
@ Mr.Xcoder Terima kasih, benar-benar lupa untuk menggunakan jprepend sehingga menjadi panjang yang benar.
Kevin Cruijssen