Đầu ra số cơ sở quater-tưởng tượng trong nhị phân


17

Viết hàm hoặc chương trình xuất ra cơ sở Quater-fantasy được hiển thị dưới dạng chữ số nhị phân. Cơ sở số là 2 i , trong đó i là căn bậc hai của -1. Xem Số phức để biết thêm chi tiết về i . Mỗi vị trí chữ số có thể đi từ 0 đến 3 (bậc bốn), vì mỗi phần thực và phần ảo lớn gấp 4 lần phần thực và phần ảo trước đó. Các chữ số bậc bốn trong hệ nhị phân như sau: 0: 00, 1: 01, 2: 103: 11.

Phân tích các vị trí chữ số:

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 4    0        1   0   3   0   0        (quaternary representation)
              01  00  11  00  00        (binary representation)

Số 100110000là 1x16 + 3x-4 = 16 + -12 = 4.

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 0    5        0   0   0   3   0   2    (quaternary representation)
              00  00  00  11  00 .10    (binary representation)

Số 1100.1là 3x2 i + 2x - 0,5 i = 6 i + - i = 5 i .

Mã của bạn sẽ lấy một cặp số, có thể là số nguyên hoặc dấu phẩy động và sẽ xuất ra số phức dưới dạng một chuỗi các chữ số nhị phân. Số đầu tiên sẽ là số thực, số đầu vào thứ hai sẽ là giá trị tưởng tượng. Một điểm nhị phân chỉ phải được in nếu có các vị trí số khác không dưới 1 (nghĩa là nếu bất kỳ vị trí nào cho -0,5 i , -0,25, 0,125 i , v.v. có chữ số khác không). Các số 0 đứng đầu và cuối không được phép, ngoại trừ một chữ số 0 duy nhất ngay trước điểm nhị phân nếu không có các chữ số khác. Đầu ra không được bắt đầu bằng điểm nhị phân (* 00.1- sai, 0.1- đúng, * .1- sai, * 0.10- sai). Bạn có thể giả định rằng tất cả các số đầu vào sẽ có các biểu diễn nhị phân hữu hạn.

Số kiểm tra:

re   im            output
 0    0                 0
 1    0                 1
 2    0                10
 3    0                11
 4    0         100110000
-1    0             10011
-2    0             10010
-3    0             10001
 0    1               100.1
 0    2               100
 0    3              1000.1
 0    4              1000
 0   -1                 0.1
 0   -2           1001100
 0   -3           1001100.1
 3    4              1011
 4    3         100111000.1
 6   -9         101110010.1
-6    9       10011100110.1
-9   -6           1110111
 0.5 14.125   10011001101.001001

Lưu ý: Đầu ra của tất cả các giá trị nguyên sẽ kết thúc .1nếu phần ảo là số lẻ.

Mã tiêu chuẩn-golf.


4
Đây là một thách thức tốt, nhưng lời giải thích có thể rõ ràng hơn nhiều. Bạn nên làm rõ quá trình: nó đi từ số phức, đến biểu diễn bậc bốn xen kẽ , đến ánh xạ biểu diễn nhị phân0 → 00, 1 → 01, 2 → 10, 3 → 11 .
Lynn

@Mauris Tôi đã thực hiện một loạt các chỉnh sửa để giải quyết nhận xét của bạn. Hãy cho tôi biết nếu tôi có thể cải thiện nó hơn nữa.
CJ Dennis

2
Điều gì nếu nó được lặp lại trong nhị phân?
Leaky Nun

1
@LeakyNun Nó nói đúng trong thử thách: "Bạn có thể cho rằng tất cả các số đầu vào sẽ có các biểu diễn nhị phân hữu hạn."
Mego

Câu trả lời:


2

JavaScript (ES6), 340 byte

f=x=>[0,...x.toString(16)].reverse().map(d=>s=d<'.'?s:d<`0`?d+s.slice(0,-1):`${(c=+`0x${d}`+(c>>4)+m^m)>>2&3}${c&3}`+s,c=s='.',m=x<0?3:12)&&s
g=(s,t,n=s.indexOf`.`,m=t.indexOf`.`)=>n<m?g(0+s,t):n>m?g(s,0+t):t[s.length]?g(s+0,t):s.replace(/\d/g,(c,i)=>`${t[i]>>1}${t[i]&1}${c>>1}${c&1}`).replace(/^0+(\d)|\.?0*$/g,'$1')
(r,i)=>g(f(r),f(i/2))

fchuyển đổi một số thành cơ sở -4(với dấu .nếu số đó là một số nguyên). glấy hai -4số cơ sở , đệm chúng ở cả hai đầu có cùng độ dài và .vị trí, xáo trộn các chữ số lại với nhau, chuyển đổi mọi thứ từ cơ sở 4sang cơ sở 2, sau đó cuối cùng là các dải số 0 và cuối.

Giải thích: Để biểu diễn số phức đã cho trong cơ sở đã sửa đổi, 2ichúng ta cần biểu diễn phần thực và một nửa phần phức (nghĩa là chia phần ảo cho 2i) trong cơ sở 2i²(nghĩa là -4), trộn các chữ số lại với nhau, sau đó chuyển đổi chúng từ cơ sở 4để căn cứ 2. Để thể hiện một số thực trong cơ sở, -4chúng tôi bắt đầu với 4chuyển đổi cơ sở . Các chữ số thay thế có dấu chính xác (trong trường hợp số dương, đây là các chữ số ở vị trí chẵn; trong trường hợp số âm, đây là các chữ số ở vị trí lẻ) nhưng các chữ số còn lại có dấu sai và một sự điều chỉnh cần phải được áp dụng. Ví dụ:

 0 -> 000 -> 000 (no correction needed)
 4 -> 010 -> 130 }
 8 -> 020 -> 120 } (correction includes carry)
12 -> 030 -> 110 }

Như bạn có thể thấy, việc hiệu chỉnh là 8trừ chữ số gốc, mod 8. Tuy nhiên, một phép tính thuận tiện hơn một chút là chữ số gốc, cộng với 3, xor 3 (thực sự trong số học số nguyên 32 bit, chúng ta có thể chỉ cần viết +0xCCCCCCCC^0xCCCCCCCCđể chuyển đổi toàn bộ số trong một lần). Cuối cùng, khi hiệu chỉnh áp dụng cho các chữ số thay thế, việc chuyển đổi ban đầu sang cơ sở 16sẽ tự động chọn các cặp 4chữ số cơ bản , sau đó sửa lại bằng cách sử dụng hệ số 3hoặc 0xClà phù hợp. Nó chỉ còn lại để bỏ qua các -dấu hiệu.


0

Perl - 313 byte

Vì chưa có ai đăng câu trả lời nhưng tôi nghĩ tôi sẽ tự đá nó.

$r=$ARGV[0];$i=$ARGV[1]/2;$m=1;while($r!=int($r)||$i!=int($i)){$c++;$m*=-1;$i*=4;$r*=4}while($r||$i){$r-=($d[$n++]=$r/$m%4)*$m;$i-=($d[$n++]=$i/$m%4)*$m;$m*=-4}$_=join("",map({sprintf"%02b",$_}reverse splice(@d,$c*2)))||"0";@d and$_.=".".join("",map({sprintf"%02b",$_}reverse@d));s/^0+1/1/;s/(\.\d*1)0+$/$1/;print

Tôi chắc chắn có rất nhiều cơ hội để chơi gôn hơn nữa.

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.