Cetak tabel angka dalam bilangan desimal dan 2 ** i

9

Komputer hidup dengan biner. Semua programmer tahu biner.

Tetapi 2**xpangkalan sering diabaikan sebagai tidak praktis, sementara mereka memiliki hubungan yang indah dengan biner.

Untuk menunjukkan kepada Anda satu contoh hubungan yang begitu indah, 19 akan menjadi kesaksian saya.

19 10011 103 23 13 j
  • 19 adalah desimal, termasuk untuk kejelasan.

  • 10011 adalah 19 dalam biner.

  • 103, dalam basis 4 dibuat mulai dari biner dengan cara ini:

    • log2 (4) == 2, mari kita ingat dua.
    • Pad 10011 sehingga memiliki kelipatan 2 panjang -> 010011
    • Ambil digit 2 dengan 2 dari kiri ke kanan dan perlakukan mereka sebagai 2 digit angka biner:

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

    Selesai , 10011 di basis-4 adalah 103.

Untuk basis 8, lakukan hal yang sama tetapi 3-oleh-3 seperti log2 (8) = 3.

  • Pad 010011
  • 010 -> 2
  • 011 -> 3

    23, Selesai .

Untuk base 16, lakukan hal yang sama tetapi 4-oleh-4 seperti log2 (16) = 4.

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

    13, selesai .

Tugas

Diberikan angka maksimal sebagai input, Anda harus menampilkan tabel

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

untuk saya yang masuk dari 0 hingga n inklusif. Angka biner adalah contoh minimum absolut yang diperlukan untuk bekerja, jadi kode Anda harus sesingkat mungkin.

Batasan dan bonus

  • Basis-sepuluh -> biner dan biner -> Basis-sepuluh built-in dianggap sebagai Basis-a -> Basis-b.

  • Jika Anda menghasilkan semua basis 2**i(untuk i> 2) dengan menggunakan relasi yang disebutkan di atas Anda mendapatkan *0.6bonus, tetapi konversi basis umum (ditulis sendiri) diizinkan.

Tabel contoh

> 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
Caridorc
sumber
4
Turun karena "Anda harus menghasilkan semua basis 2 ** i (untuk i> 2) dengan menggunakan relasi yang disebutkan di atas". Membutuhkan algoritme tertentu menghilangkan banyak hal yang membuat golf kode menarik. Anda dapat melarang fungsi konversi basis bawaan sambil tetap membolehkan pilihan algoritma.
xnor
@xnor sekarang menggunakan metode saya hanya memberikan bonus, untuk memberikan lebih banyak kebebasan untuk pegolf
Caridorc
1
Saya juga bukan penggemar bonus. Ini secara efektif berarti Anda harus menggunakan built-in atau algoritma Anda, dan tidak ada algoritma lain yang bisa berjalan.
xnor
@xnor bawaan tidak diizinkan. Konverter umum akan lebih pendek, jadi saya memberikan bonus jika Anda menggunakan aturan konversi yang saya buat
Caridorc

Jawaban:

2

CJam, 54 * 0,6 = 32,4 byte

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

Uji di sini.

Untuk referensi, berikut adalah solusi yang lebih pendek yang tidak memenuhi syarat untuk bonus (sebesar 39 byte):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/
Martin Ender
sumber
Saya memperbarui tantangan, Anda dapat mengklaim bonus 0,6 * jika Anda menggunakan metode saya
Caridorc
1

Pyth, 52 * 0,6 = 31,2 byte

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

Uji secara online

Jawaban non-bonus saya adalah 39 byte

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

PHP, 232 230 233 217 * 0.6 = 130.2

tidak ada kesempatan mengalahkan bahasa golf, tapi saya suka tantangannya.

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];}
  • penggunaan: diawali $n=32;atau diganti $ndengan 32(atau bilangan bulat non-negatif lainnya); hubungi via cli
  • Jika itu tidak diterima, ganti $ndengan $_GET[n](+ 6 / + 3.6) dan panggil di browser
    atau di cli denganphp-cgi -f bases.php -n=32
  • Ganti jeda baris dengan <br>atau sebelumnya <pre>untuk menguji di browser
  • dapat melempar pemberitahuan untuk variabel yang tidak ditentukan dan offset string yang tidak diintegrasikan dalam versi PHP yang lebih baru.
    Hapus E_NOTICE dari error_reporting (prepend error_reporting(0);) untuk menekannya.
  • diuji dalam 5.6

kerusakan:

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
}

hasil edit utama:

  • menggunakan beberapa indeks ajaib untuk mengubah lingkaran dalam -> sekarang bekerja mundur pada seluruh string (tidak ada lagi padding, tidak ada lagi membelah atau menyalin biner)
  • memindahkan bagian-bagian tubuh loop ke kepala untuk menghilangkan kawat gigi
  • harus menambahkan 7 4 byte untuk memperbaiki hasil desimal 0 setelah revamp

versi non-bonus, 142 byte

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 mengalahkan Python?
Bahkan jika saya menambahkan 6 (3,6) byte untuk membuat potongan program, saya masih mengalahkan Python (223 * 0,6 = 133,8 atau 148 non-bonus vs 158). Luar biasa.

Titus
sumber
Saya mendapatkan pesan kesalahan 'Variabel tidak terdefinisi: n: 1' dan saya pikir Anda dapat menghemat 1 byte dengan menghapus spasi setelah forkata kunci di loop terluar.
Yytsi
@TuukkaX: lihat penggunaan: $ n harus ditentukan sebelum snippet. Saya menemukan byte itu, tapi terima kasih. Dan satu lagi: "\n"-> garis fisik putus.
Titus
tapi saya harus menambahkan 3 byte untuk mencetak 0. pertama (itu atau 5 byte untuk init variabel).
Titus
0

Ruby, 80 byte (versi non-bonus)

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

Python3 - 189, 167, 166 150 byte

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

Disimpan 16 byte dengan bantuan @ LeakyNun !

Versi bonus - 296 * 0,6 = 177,6 279 * 0,6 = 167,4 byte

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

Versi bonus versi yang lebih mudah dibaca.

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))
Yytsi
sumber
Saya cukup yakin bahwa bonus tidak berlaku. Anda tidak menggunakan biner untuk menghasilkan angka dasar 2 ** x.
Titus
@Itus Oh, saya mengerti bonus itu salah. Saya akan mengedit jumlah byte. Terima kasih!
Yytsi
Cukup yakin "0123456789abcdefghijklmnopqrstuv"lebih pendek darifrom string import* digits+ascii_lowercase
Leaky Nun
@LeakyNun Ups. Kamu benar. Saya hanya memikirkan betapa singkatnya menulis digits+ascii_lowercase: D. Terima kasih!
Yytsi
150 byte: 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))(satu baris)
Leaky Nun