In một bảng số ở dạng số thập phân và 2 ** i


9

Máy tính sống bằng nhị phân. Tất cả các lập trình viên đều biết nhị phân.

Nhưng các 2**xcơ sở thường bị bỏ qua là không thực tế, trong khi chúng có quan hệ đẹp với nhị phân.

Để cho bạn thấy một ví dụ về một mối quan hệ đẹp đẽ như vậy, 19 sẽ là lời chứng thực của tôi.

19 10011 103 23 13 j
  • 19 là số thập phân, bao gồm cho rõ ràng.

  • 10011 là 19 ở dạng nhị phân.

  • 103, trong cơ sở 4 được thực hiện bắt đầu từ nhị phân theo cách này:

    • log2 (4) == 2, chúng ta hãy nhớ hai.
    • Pad 10011 sao cho nó có bội số 2 chiều dài -> 010011
    • Lấy các chữ số 2 x 2 từ trái sang phải và coi chúng là các số nhị phân 2 chữ số:

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

    Xong , 10011 trong cơ sở 4 là 103.

Đối với cơ sở 8, thực hiện tương tự nhưng 3 nhân 3 như log2 (8) = 3.

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

    23, Xong .

Đối với cơ sở 16, thực hiện tương tự nhưng 4 nhân 4 như log2 (16) = 4.

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

    13, Xong .

Bài tập

Cho một số lượng tối đa làm đầu vào, bạn sẽ xuất một bảng

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

cho tôi mà đi từ 0 đến n bao gồm. Số nhị phân là mẫu mực của mức tối thiểu tuyệt đối cần thiết để làm việc, vì vậy mã của bạn phải càng ngắn càng tốt.

Hạn chế và tiền thưởng

  • Base-ten -> binary và binary -> Base-ten được coi là sơ hở như Base-a -> Base-b.

  • Nếu bạn tạo tất cả các cơ sở 2**i(cho i> 2) bằng cách sử dụng các mối quan hệ được đề cập, bạn sẽ nhận được *0.6tiền thưởng, nhưng các chuyển đổi cơ sở chung (do chính bạn viết) được cho phép.

Bảng ví dụ

> 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

4
Bị từ chối vì "Bạn phải tạo tất cả các cơ sở 2 ** i (cho i> 2) bằng cách sử dụng các mối quan hệ được đề cập". Yêu cầu một thuật toán cụ thể loại bỏ rất nhiều điều làm cho mã golf trở nên thú vị. Bạn có thể cấm các hàm chuyển đổi cơ sở tích hợp trong khi vẫn cho phép lựa chọn thuật toán.
xnor

@xnor hiện sử dụng phương pháp của tôi chỉ mang lại tiền thưởng, để mang lại nhiều tự do hơn cho người chơi golf
Caridorc

1
Tôi cũng không phải là một fan hâm mộ của tiền thưởng. Điều đó có nghĩa là bạn phải sử dụng thuật toán tích hợp hoặc thuật toán của mình và không có thuật toán nào khác khả thi.
xnor

@xnor tích hợp không được phép. Một công cụ chuyển đổi chung sẽ ngắn hơn, vì vậy tôi sẽ thưởng nếu bạn sử dụng các quy tắc chuyển đổi có sẵn của tôi
Caridorc

Câu trả lời:


2

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

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

Kiểm tra nó ở đây.

Để tham khảo, đây là một giải pháp ngắn hơn không đủ điều kiện nhận thưởng (ở mức 39 ​​byte):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

Tôi đã cập nhật challange, bạn có thể yêu cầu phần thưởng 0,6 * nếu bạn sử dụng phương pháp của tôi
Caridorc

1

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

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

Kiểm tra trực tuyến

Câu trả lời không thưởng của tôi là 39 byte

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

0

PHP, 232 230 233 217 * 0.6 = 130.2

không có cơ hội đánh bại các ngôn ngữ chơi gôn, nhưng tôi thích thử thách này.

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];}
  • sử dụng: trả trước $n=32;hoặc thay thế $nbằng32 (hoặc bất kỳ số nguyên không âm nào khác); gọi qua cli
  • Nếu điều đó không được chấp nhận, hãy thay thế $nbằng $_GET[n](+ 6 / + 3.6) và gọi trong trình duyệt
    hoặc trên cli bằngphp-cgi -f bases.php -n=32
  • Thay thế ngắt dòng bằng <br>hoặc trả trước<pre> để kiểm tra trong trình duyệt
  • có thể đưa ra các thông báo cho các biến không xác định và các chuỗi không xác định trong các phiên bản PHP mới hơn.
    Xóa E_NOTICE khỏi error_Vporting (trả trước error_reporting(0);) để loại bỏ chúng.
  • thử nghiệm trong 5,6

phá vỡ:

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
}

chỉnh sửa lớn:

  • đã sử dụng một số phép thuật chỉ mục để tân trang vòng lặp bên trong -> bây giờ hoạt động ngược trên toàn bộ chuỗi (không còn phần đệm, không còn phân tách hoặc sao chép nhị phân)
  • di chuyển các bộ phận của cơ thể vòng đến đầu để loại bỏ niềng răng
  • đã phải thêm 7 4 byte để sửa kết quả thập phân 0 sau khi tân trang

phiên bản không thưởng, 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 đánh bại Python?
Ngay cả khi tôi đã thêm 6 (3.6) byte để biến đoạn mã thành chương trình, tôi cũng vẫn đánh bại Python (223 * 0.6 = 133.8 hoặc 148 không thưởng so với 158). Kinh ngạc.


Tôi gặp lỗi 'Biến không xác định: n: 1' và tôi nghĩ rằng bạn có thể lưu 1 byte bằng cách xóa khoảng trắng sau fortừ khóa trong vòng lặp ngoài cùng.
Yytsi

@TuukkaX: xem cách sử dụng: $ n phải được xác định trước đoạn trích. Tôi tìm thấy byte đó, nhưng cảm ơn. Và một điều nữa: "\n"-> ngắt dòng vật lý.
Tít

nhưng tôi đã phải thêm 3 byte để in 0. đầu tiên (đó là 5 byte để khởi tạo biến).
Tít

0

Ruby, 80 byte (phiên bản không thưởng)

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

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

Đã lưu 16 byte với sự trợ giúp của @ LeakyNun !

Phiên bản thưởng - 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))

Phiên bản thưởng dễ đọc hơn một chút.

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

Tôi khá chắc chắn rằng tiền thưởng không áp dụng. Bạn không sử dụng nhị phân để tạo số cơ bản 2 ** x.
Tít

@Titus ơi, mình hiểu nhầm rồi. Tôi sẽ chỉnh sửa số byte. Cảm ơn!
Yytsi

Khá chắc chắn "0123456789abcdefghijklmnopqrstuv" là ngắn hơnfrom string import* digits+ascii_lowercase
Leaky Nun

@LeakyNun Rất tiếc. Bạn đúng. Tôi chỉ nghĩ rằng nó ngắn như thế nào để viếtdigits+ascii_lowercase : D. Cảm ơn!
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)) (một dòng)
Leaky Nun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.