Konversi dari basis 10 ke basis 2 tanpa konversi basis bawaan

16

Latar belakang :

Anda telah diberi tugas untuk mengonversi angka 10 basis ke basis 2 tanpa menggunakan fungsi konversi basis basis apa pun. Anda juga tidak dapat menggunakan perpustakaan yang diimpor.

Masalah :

Ubah string input dari basis 10 (desimal) ke basis 2 (biner). Anda tidak boleh menggunakan kode / fungsi / metode konversi basis premade, atau pustaka yang diimpor. Karena ini adalah , jawaban terpendek dalam byte akan menang.

Input akan berupa apa saja dari -32768 hingga 32767 (termasuk penanganan byte sign dalam kode Anda)

Dokter
sumber
3
T: apa arti dari "sign byte handling" - apakah saya harus mengeluarkan "-xxxx" untuk angka negatif? Maka sebagian dari kita salah, termasuk. saya, karena saya output "11 ... 11" untuk -1 (alias sebagai unsigned)
blabla999
Sign byte handling - MSB dari variabel yang ditandatangani mengontrol jika
hasilnya
1
yakin, tetapi apakah saya harus> mencetak <mereka sebagai tanda '-' diikuti oleh besarnya?
blabla999
@ blabla999 - Tidak, Anda tidak
TheDoctor
3
the MSB of signed variables controls if they are negative- kedengarannya seperti tanda bit, namun seperti yang -32768..32767disarankan oleh rentang , Anda ingin melengkapi 2's. Jadi yang mana yang Anda inginkan? ..
mniip

Jawaban:

4

GolfScript - 17 byte

~{.1&\2/}16*;]-1%

Tidak terlalu banyak verbose daripada built-in ~2base.

primo
sumber
1
Saya tidak tahu skrip golf tetapi beberapa contoh dijalankan menuntun saya untuk menyimpulkan bahwa Anda harus menghapus~
user12205
@ace Karena input awal adalah string "37", misalnya, operasi "37" & 1(in infix) adalah operasi yang diatur dengan bijak. Di ~bagian depan mengubah input ke integer.
Primo
Saya melakukan pengujian di sini golfscript.apphb.com/... apakah ini berarti penerjemah ini salah? (Maaf saya benar-benar tidak tahu apa-apa tentang skrip golf)
user12205
2
Penerjemahnya benar; karena Anda telah mendorong nilai integer 10ke stack, tidak perlu untuk mengevaluasinya. Namun, ketika membaca dari stdin, input akan berupa string ( tes di sini ). Deskripsi masalah juga secara eksplisit menyatakan bahwa input adalah string.
Primo
12

JavaScript, 46

for(x=prompt(o='');x;x>>>=1)o=(x&1)+o;alert(o)
salinan
sumber
Lol, saya bahkan tidak tahu ada operator 4 karakter ( >>>=)! +1 (Juga, jika Anda menjalankannya di konsol, Anda dapat menyimpan 9 karakter terakhir.)
Gagang pintu
1
Ini bukan 4 karakter, ini adalah dua operator: >>> adalah pergeseran kanan bitwise 0-filling, diikuti oleh penugasan. Coba: x=8; x>>>=1; x;dan x=8; x>>>1; x;- dalam kasus pertama, nilai x telah berubah; yang kedua, belum.
Graham Charles
3
@GrahamCharles >>>=adalah operator tunggal .
primo
Nah, lihat itu! Terima kasih, @primo ... Anda mempelajari sesuatu setiap hari!
Graham Charles
2
@ComFreek Itu akan membalik urutan angka
salin
4

Brainf * ck, 98 77

Jelas ini bukan untuk tujuan menang, tetapi apa yang akan terjadi jika tidak memiliki solusi brainfk

++++[>++++<-]>>,<[->>++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]++++++[->++++++++<]>.[-]>[-<<<+>>>]<<<<]

Karena brainfk hanya dapat menangani bilangan bulat 8bit dan tidak ada negatif saya kira itu tidak sepenuhnya mematuhi aturan tapi hei saya tidak pernah di dalamnya untuk memenangkannya.

Ini sebenarnya berfungsi untuk input 16-bit jika penerjemah Anda mendukung

Saya bahkan mendapatkannya untuk output dalam nilai ascii

Berikut adalah kode yang dianotasi:

++[>++++<-]                       preload 8 onto cell 1
>>,<                                input into cell 2
[-                                  iterate over cell 1
    >>++<                               put 2 in cell 3
    [->-[>+>>]>[+[-<+>]>+>>]<<<<<]      division algorithm: converts {n d} into {0 d_minus_n%d n%d n/d}
    >[-]++++++[->++++++++<]>           clears cell 4 and puts 48(ascii of 0) into cell 5
    .[-]                                output n%2 and clear it (the bit)
    >[-<<<+>>>]                         bring n/2 into cell 2 (to be used for division in next iteration)
<<<<]                               end iterate

Algoritma yang lebih pendek (77):

+>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+>+>+>+>+>+<<<<<<<<]>[.>]

Yang ini hanya bisa menangani bilangan bulat 8bit.

Algoritme bekerja dengan menggunakan penghitung biner yang sebenarnya sangat pendek (satu kenaikan adalah >[->]++[-<+]-<-yang kemudian menjabarkan bit-bit. Masalahnya adalah sulit untuk mencetak semua bit

Algoritma terakhir itu dapat diadaptasi agar sesuai dengan sejumlah bit dengan mengorbankan byte. Untuk dapat berurusan dengan integer N bit, diperlukan 53 + 3 * N byte untuk menyandikan.

contoh:

(1 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+<]>[.>]
(2 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+<<]>[.>]
(3 bit) +>,>-<[>>[->]++[-<+]-<-]++++++++[->++++++<]>+[->+>+>+<<<]>[.>]
etc
ASKASK
sumber
3

Wajib jawab APL - 21 22

"01"[1+2|⌊⎕÷2⋆⊖0,⍳15]

Contoh:

      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 0
0000000000000000
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 13
0000000000001101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 9999
0010011100001111
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: -3
1111111111111101
      "01"[1+2|⌊⎕÷2⋆⊖0,⍳15]
⎕: 32767
0111111111111111
mniip
sumber
Anda dapat mengurangi dengan hampir 50% dengan menggunakan ⎕IO←0, dan kembali array bit bukan string: 2|⌊⎕÷2*⊖⍳16.
Adám
3

Kode Mesin Turing, 272 byte

Seperti biasa, saya menggunakan sintaks tabel aturan yang didefinisikan di sini. Anda dapat mengujinya di situs itu atau, sebagai alternatif, menggunakan implementasi java ini.

Banyak kode disalin dari konverter desimal ke heks saya di sini.

0 * * l B
B * * l C
C * 0 r D
D * * r E
E * * r A
A _ * l 1
A * * r *
1 0 9 l 1
1 1 0 l 2
1 2 1 l 2
1 3 2 l 2
1 4 3 l 2
1 5 4 l 2
1 6 5 l 2
1 7 6 l 2
1 8 7 l 2
1 9 8 l 2
1 _ * r Y
Y * * * X
X * _ r X
X _ _ * halt
2 * * l 2
2 _ _ l 3
3 * 1 r 4
3 1 0 l 3
4 * * r 4
4 _ _ r A

Menghitung mundur dari input pada basis 10 sambil menghitung dari 0 pada basis 2. Pada penurunan nol, itu menghapus blok input dan berakhir.

SuperJedi224
sumber
2

Javascript 59

o='';i=parseInt(prompt());do{o=(i&1)+o}while(i>>=1)alert(o)
Michael M.
sumber
Anda dapat menggunakan +xsebagai gantinyaparseInt(x)
Cyoce
2

Perl, 44

Ini adalah program Perl pertama saya, jadi tolong maafkan saya jika ini dapat dengan mudah diturunkan. Sunting: Terima kasih @primo karena telah mengambil 7 karakter dari jawaban saya.

$x=<>;do{@s=($x&1,@s)}while($x>>=1);print@s

$x=<>;do{push@s,$x&1}while($x>>=1);print reverse@s

Logikanya pada dasarnya sama dengan solusi C saya sebelumnya.

Juga, gunakan 64 bit.

pengguna12205
sumber
1
Anda dapat menyimpan reversedengan membangun mundur array yang: @s=($x&1,@s).
primo
1
Sekarang bahwa kontes berakhir, yang terbaik yang saya temukan adalah 34: $\=$_%2 .$\while$_=$_>>1||<>;print. Atau, jika opsi baris perintah masing-masing menghitung satu byte, 27: 1while$\=$_%2 .$\,$_>>=1}{menggunakan -p.
Primo
2

Javascript - 56 48 dan 36 28 karakter

  • Tidak berfungsi dengan angka negatif.

Terima kasih kepada @Blender karena telah mencukur 8 karakter.

Formulir ini mengambil input dan menampilkan output, 48 karakter:

x=prompt();for(a="";x;x=~~(x/2))a=x%2+a;alert(a)

Jika hanya sebuah instruksi yang memasukkan variabel a, bentuk biner dari variabel xdiperlukan (dan Anda tidak repot-repot menghancurkan xnilai sebagai efek samping), ini dia dengan 28 karakter:

for(a="";x;x=~~(x/2))a=x%2+a
Victor Stafusa
sumber
1
Anda dapat mengganti Math.floordengan ~~, karena kisaran untuk angka kecil.
Blender
@Blender Terima kasih, saya tahu ada beberapa cara, tidak bisa menemukannya.
Victor Stafusa
@ Viktor Saya tidak tahu javascript jadi saya mungkin salah tetapi pada akhirnya ketika Anda mengatakan a=x%2+aini bisa disingkat a+=x%2? Ini bekerja dalam semua bahasa yang saya tahu.
Albert Renshaw
@AlbertRenshaw Tidak, ini akan sama dengan a=a+x%2, tapi itu +untuk penggabungan string. Yaitu, saran Anda menghasilkan angka dalam urutan terbalik.
Victor Stafusa
@ Viktor Ah! Terima kasih!
Albert Renshaw
2

Python - 61 60 karakter

x=input();print"".join("01"[x>>i&1]for i in range(15,-1,-1))
C0deH4cker
sumber
2
Anda dapat menyingkirkan ruang antara printdan "".
Blender
@Blender Saya baru saja akan menyarankan hal yang sama :)
Albert Renshaw
@Blender Ha benar, bahkan tidak menyadarinya. Selesai!
C0deH4cker
jika Anda memanggilnya dari command-line, Anda bisa mengesampingkannya printkarena secara otomatis mengembalikan hasilnya
paul.oderso
2

C, 55 karakter

Mencetak nol di depan ekstra (untuk 2 byte).
Rekursi dalam printfmembalik urutan cetak, sehingga algoritma mengekstraksi bit dari kanan ke kiri tetapi mencetak dari kiri ke kanan.

EDIT : Menyimpan char dengan menggunakan putcharbukan printf.

f(x){(x*=x<0?-printf("-"):1)&&f(x/2);putchar(48+x%2);}
ugoren
sumber
2

Dyalog APL , 11 byte

2|⌊⎕÷2*⌽⍳16

2|Pembagian tetap ada ketika dibelah dua dari
nilai dibulatkan dari
input
÷dibagi oleh masing-masing
2*dua untuk kekuatan masing-masing
⍳16 {0, 1, 2, ..., 15}

Membutuhkan ⎕IO←0yang default pada banyak sistem.

TryAPL online!

Adám
sumber
1

C, 81

char b[17];i=15;main(x){scanf("%d",&x);while(i+1)b[i--]=(x&1)+48,x>>=1;puts(b);}

Outputnya memiliki 16 bit (termasuk padding zero)

pengguna12205
sumber
1

Aplikasi Script + Google Sheets, 147 144 121 byte

Naskah

function j(decNumb){var str='';do{str=String(decNumb%2)+str;decNumb=decNumb/2|0;}while(decNumb>=1);return parseInt(str);}

Lembar

=j(b1)

Versi modifikasi dari skrip ini oleh ZygD.

petugas cuaca115
sumber
Bisakah Anda menghapus spasi?
NoOneIsHere
1

Haskell, 66 byte

c 0=0
c n=c(div n 2)*10+mod n 2
b('-':r)='-':b r
b r=show.c.read$r

Panggil dengan b "-1023", tambahkan main=interact buntuk program lengkap atau coba di Ideon.

cmelakukan konversi untuk bilangan bulat positif.
b r=show.c.read$rmengubah string menjadi angka, menerapkan cdan mengkonversi kembali ke string.
b('-':r)='-':b rmenghapus kemungkinan memimpin -dan menambahkannya kembali ke hasilnya.

Laikoni
sumber
1

PowerShell, 59 87 82 70 byte

+28 byte untuk mendukung angka negatif.
-12 byte terima kasih hanya untuk @ ASCII

param($d)$m=$d-lt0;while($d){$n="01"[$d%2]+$n;$d=($d-$d%2)/2}'-'*$m+$n

Cobalah online!

Diadaptasi dari kode ini . Mengambil input melalui parameter commandline -d.

Gabriel Mills
sumber
Bagaimana dengan angka dengan tanda?
mazzy
73?
ASCII
oh, tunggu 70
ASCII
1

APL (NARS), 17 karakter, 34 byte

{2∣⌊⍵÷2*(⍺-1)..0}

Ini adalah salinan dan modifikasi jawaban Adam /codegolf//a/90107 dengan cara seseorang dapat menambahkan parameter untuk panjang bit, dan ⎕IO untuk fungsi ini (di sini adalah ⎕IO = 1) harus tidak penting ...

  f←{2∣⌊⍵÷2*(⍺-1)..0}
  16 f 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 
  32 f 2
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 
  32 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  16 f ¯1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  64 f ¯12345678
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 

itu mudah menangani jumlah bit dengan cara ini (saya cheked bahwa hasil terakhir harus benar)

RosLuP
sumber
0

Smalltalk (Smalltalk / X), 63/78

versi pertama membuat string perantara (78):

t:=Number readFrom:Stdin.
((15to:1by:-1)collect:[:i|$0+(t>>i&1)]as:String)print

sebenarnya, tidak perlu membuat string; cukup output karakter (63):

t:=Number readFrom:Stdin.
15to:1by:-1 do:[:i|($0+(t>>i&1))print]

mhmh - apakah ada cara yang lebih pendek untuk membaca ke suatu nomor

blabla999
sumber
0

Python 3.x: 65 karakter

b=lambda n:n<2 and'01'[n]or b(n//2)+b(n%2);print(b(int(input())))
dan04
sumber
0

Bash, 44

f=b+=n/2**e%2*10**e,2**e++/n?f=b:f;echo $[f]

Berikan nilai input ke skrip melalui variabel lingkungan n. Representasi desimal dari hasil biner tidak dapat melebihi LONG_MAX.

Ini juga harus kompatibel dengan ksh93dan zshjika bdan ediinisialisasi 0dan ekspansi aritmatika yang tepat digunakan.

ormaaj
sumber
1
Saya tidak percaya ini valid karena mengasumsikan yang nsudah didefinisikan, menjadikannya cuplikan. Itu bisa diperbaiki dengan mengambil input sebagai argumen baris perintah dan mengaturnya ndalam skrip Anda.
spaghetto
@quartata Variabel dalam konteks matematika di shell secara implisit nol. Untuk tujuan golf lebih masuk akal untuk dilakukan n=127 sh -c '...'daripada sh -c 'n=$1 ...' _ 127. Tidak ada alasan untuk memilih satu dari yang lain dalam hal ini karena keduanya merupakan cara yang tipikal untuk memberikan nilai.
ormaaj
0

C # - 104

string p(int d){var r="";long i=1;while(r.Length<=64){var g=d&i;r=(g!=0)? "1"+r:"0"+r;i=i<<1;}return r;}

Metode ini akan mengkonversi desimal ke biner hingga 64 bit.

Ketika dieksekusi metode di atas dalam Linqpad - rr = p (-32768); rr.Dump ();

Keluaran: 01111111111111111111111111111111111111111111111111000000000000000

Rajesh
sumber
Panggilan spec untuk "string input". Sepertinya metode ini menerima int.
Poke
0

Java 8, 80 71 byte

n->{String r="";for(int i=n<0?-n:n;i>0;i/=2)r=i%2+r;return n==0?"0":r;}

-9 byte karena aturan dalam komentar .. Input basis-10 negatif dapat mengembalikan nilai base-2 positif / absolut sebagai output tampaknya.

Penjelasan:

Cobalah online.

n->{                   // Method with integer parameter and String return-type
  String r="";         //  Result-String, starting empty
  for(int i=n<0?-n:n;  //  Start `i` at the absolute (non-negative) value of the input
      i>0;             //  Loop as long as `i` is not 0
      i/=2)            //    After every iteration: integer-divide `i` by 2
    r=i%2+r;           //   Prepend the result with `i` modulo-2
  return n==0?         //  If the input is 0:
          "0"          //   Return literal "0"
         :             //  Else:
          r;           //   Return the result-String
Kevin Cruijssen
sumber
0

Kotlin , 82 byte

{s:String->{var i=s.toInt()
var r=""
(0..15).map{r="${i and 1}$r"
i=i shr 1}
r}()}

Cobalah online!

JohnWells
sumber
0

Small Basic , 133 byte

Sebuah skrip yang input dari dan output ke TextWindowkonsol.

n=TextWindow.Read()
While n>0
c=c+1
x[c]=Math.Remainder(n,2)
n=Math.Floor(n/2)
EndWhile
For i=0To c-1
TextWindow.Write(x[c-i])
EndFor

Cobalah di SmallBasic.com Membutuhkan Silverlight dan karenanya harus dijalankan di IE.

I / O diambil / diberikan dari konsol hitam.

-22 byte terima kasih kepada @Neil

Taylor Scott
sumber
Bisakah kamu tidak menggunakan For i=0To c-1?
Neil
@ Neil - Saya benar-benar bisa. Tangkapan hebat!
Taylor Scott
0

MATL , 15 17 byte

t0<?16Ww+]`2&\t]x

Cobalah di MATL Online

TIO

(+2 byte menghapus angka 0 untuk angka negatif, bit tanda haruslah bit pertama.)

Output pada MATL Online harus dibaca dari bawah ke atas (MSB ada di bawah).

Bagian utamanya cukup sederhana: `2&\t = sementara nilainya lebih besar dari 0, bagi dengan 2 dan akumulasikan sisanya.

Menangani angka negatif dan memberi mereka representasi pelengkap 2 adalah bagian yang sulit. Pada akhirnya saya pergi dengan " kurangi dari2N"metode untuk mendapatkan komplemen dua angka. Karena kita hanya diharuskan untuk menangani nilai hingga -32768, untuk angka negatif kode menciptakan 216=65536dengan 16W, menambahkan input untuk itu (mis. 65536 + (-42)), yang memberikan sesuatu yang dilihat MATLAB sebagai angka positif tetapi mewakili representasi biner input yang ditandatangani dalam bentuk 16-bit.

sundar - mengembalikan Monica
sumber