이진수로 쿼터 허수를 출력


17

이진수로 표시된 Quater-imaginary base 를 출력하는 함수 또는 프로그램을 작성하십시오 . 기수는 2 i 이며, i 는 -1의 제곱근입니다. i 에 대한 자세한 내용 은 복소수 를 참조하십시오 . 각 실수 및 허수 부분이 이전 실수 및 허수 부분의 -4 배이므로 각 숫자 위치는 0에서 3 (사 분위수)으로 갈 수 있습니다. 이진수의 4 차 숫자는 다음과 같습니다. ,0: 001: 01 , 2: 10& 3: 11.

자릿수 위치 분석 :

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)

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

숫자 1100.1는 3x2 i + 2x-0.5 i = 6 i + -i입니다. = 5 i 입니다.

코드는 정수 또는 부동 소수점 일 수있는 한 쌍의 숫자를 취하고 복소수를 2 진수 문자열로 출력합니다. 첫 번째 숫자는 실수이고 두 번째 입력 숫자는 허수입니다. 이진수는 1 미만의 0이 아닌 숫자 위치가있는 경우에만 인쇄되어야합니다 (즉 , -0.5 i , -0.25, 0.125 i 등의 위치가 0이 아닌 숫자를 갖는 경우). 다른 숫자가없는 경우 이진수 지점 바로 앞의 단일 0 자리 숫자를 제외하고 선행 및 후행 0은 허용되지 않습니다. 출력은 이진 점으로 시작해서는 안됩니다 (* 00.1-잘못된, 0.1-오른쪽, * .1-잘못된, * 0.10-잘못된). 모든 입력 번호에 유한 이진 표현이 있다고 가정 할 수 있습니다.

시험 번호 :

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

참고 : .1허수 부분이 홀수이면 모든 정수 값의 출력이 끝납니다 .

표준 코드 골프.


4
이것은 좋은 도전이지만 설명은 훨씬 더 명확 할 수 있습니다. 프로세스를 명확히해야합니다. 복소수에서 인터리브 된 4 차 표현, 이진 표현 매핑으로 진행 0 → 00, 1 → 01, 2 → 10, 3 → 11됩니다.
Lynn

@Mauris 난 당신의 의견을 해결하기 위해 많은 편집을했습니다. 더 향상시킬 수 있는지 알려주십시오.
CJ Dennis

2
바이너리로 되풀이되면 어떻게 되나요?
Leaky Nun

1
@LeakyNun 도전 과제에서 "모든 입력 숫자가 유한 한 이진 표현을 가질 것이라고 가정 할 수 있습니다."
Mego

답변:


2

자바 스크립트 (ES6), 340 바이트

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

f숫자를 밑으로 변환합니다 -4( .숫자가 정수이면 후행 ). g두 개의 기본 -4숫자를 가져 와서 양쪽 끝을 같은 길이와 .위치로 채우고 숫자를 섞고 모든 것을 기본에서 기본 4으로 변환 2한 다음 마지막으로 선행 및 후행 0을 제거합니다.

설명 : 수정 된 밑줄에서 주어진 복소수 2i를 나타내려면 2i2i²(즉 -4) 에서 복소수 부분의 실수 부분과 반 (즉, 허수 부분을으로 나눔 )을 나타내고 숫자를 함께 섞은 다음 밑에서 변환해야합니다. 4기초에 2. 기본에서 실수를 나타 내기 -4위해 기본 4변환으로 시작합니다 . 다른 숫자는 올바른 부호를 갖습니다 (양수의 경우 짝수 위치의 숫자입니다. 음수의 경우 홀수 위치의 숫자입니다). 나머지 숫자의 부호가 잘못되었습니다. 수정이 적용되어야합니다. 예 :

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

보시다시피, 수정은 8원래 숫자 mod를 뺀 것 8입니다. 그러나 약간 더 편리한 계산은 원래 숫자에 3, xor 3을 더한 것입니다 (실제로 32 비트 정수 산술 +0xCCCCCCCC^0xCCCCCCCC에서는 전체 숫자를 한 번에 변환하기 위해 쓸 수 있습니다 ). 보정이 다른 자리에 적용 최종적으로는 기지국에 초기 변환을 수행하는 단순 16자동 염기 쌍 픽업 4의 두 배를 이용하고 정확한 숫자 3또는 0xC적절한. 그것은 단지 -기호 를 무시하는 것으로 남아 있습니다 .


0

펄-313 바이트

아직 아무도 답변을 게시하지 않았기 때문에 나는 스스로 그것을 쫓아 낼 것이라고 생각했다.

$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

골프를 더 많이 할 수있는 기회가 많이 있다고 확신합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.