한 번호에서 다른 번호로 이동하는 최소 작업


16

단일 8 비트 값에서 작동하는 간단한 언어를 정의 해 봅시다. 세 가지 비트 연산을 정의합니다 (코드 설명에서는 8 비트 value변수로 가정 ).

  • !최하위 비트 무효화 ( value ^= 1)
  • <왼쪽 시프트 줄 바꿈 ( value = value << 1 | value >> 7)
  • >오른쪽 시프트 줄 바꿈 ( value = value >> 1 | value << 7)

입력:

2 개의 8 비트 숫자, 와 B . 그것들은 8 비트이므로 문자로 사용할 수 있습니다.

산출:

위에서 정의한 세 가지 연산을 사용하여 a에서 b로가는 가장 짧은 방법입니다. 문자열 또는 문자 배열을 반환하거나 각 작업에 대해 일정하고 고유 한 값을 정의하고 해당 배열을 반환 할 수 있습니다 (예, <평균 >>방법 이라고도 함 <). 출력 형식을 답으로 설명하십시오.

똑같이 긴 방법이 여러 개 있으면 그 중 일부 또는 전부를 출력 할 수 있습니다.

규칙 :

  • 프로그램이나 기능을 제출할 수 있습니다
  • 표준 허점 적용
  • 각 언어에서 가장 적은 바이트 제출하면 승리합니다 (답변은 허용되지 않습니다)

무차별 강요가없는 솔루션 (또는 적어도 무차별 강요 만이 아닌)은 저의 공감을 얻을 수 있습니다.

테스트 사례 :

12, 13 => '!'
1, 2 => '<'
254, 253 => '<'
5, 5 => ''
98, 226 -> '<!>'
64, 154 -> '!>!>>>!>'
177, 164 -> '!>>!>>>!'
109, 11 -> '>>!>!>>'
126, 92 -> '!>!>!>!<' or '!>!>>!<!'
26, 85 -> '<!<<!<!<' or '<!<<!<!>' or '<!<<<!>!'
123, 241 -> '!>!<<!' or '>!<!<!'
236, 50 -> '<<!<!>' or '<<<!>!'
59, 246 -> '<<!>'
132, 95 -> '!<<!<!<!'
74, 53 -> '!>>>!>!'
171, 127 -> '<<!<<!<'
109, 141 -> '!>>>'
185, 92 -> '!>'
166, 201 -> '!<!>>>' or '<!>!>>'
77, 155 -> '<!'
124, 181 -> '!<<<<!>>' or '!>>>>!>>'
108, 85 -> '!<<<!<!<!<' or '!<<<!<!<!>' or '!<<<!<<!>!' or '!>>>!>!>!<' or '!>>>!>!>!>' or '!>>>!>>!<!'
185, 144 -> '<!<<!<!'
70, 179 -> '<<<!<!>' or '<<<<!>!' or '>>>>!>!'

다음 은 몇 가지를 더 생성하는 프로그램입니다.

답변:


4

자바 스크립트 (ES6), 100 96 86 바이트

f=(a,b,[c,d,...e]=[a,''])=>c-b?f(a,b,[...e,c^1,d+1,c/2|c%2<<7,d+2,c%128*2|c>>7,d+0]):d
<div oninput=o.textContent=f(a.value,b.value).replace(/./g,c=&gt;`&lt;!&gt;`[c])>a: <input type=number min=0 max=255 value=0 id=a> b: <input type=number min=0 max=255 value=0 id=b><pre id=o>

이중 확인없이 너비 우선 검색이 다소 느려집니다. 약간 더 효율적인 114 바이트 버전 :

f=(a,b,c=[],[d,e,...g]=[a,''])=>c[d]?f(a,b,c,g):d-b?f(a,b,c,[...g,d^1,c[d]=e+1,d/2|d%2<<7,e+2,d%128*2|d>>7,e+0]):e
<div oninput=o.textContent=f(a.value,b.value).replace(/./g,c=&gt;`&lt;!&gt;`[c])>a: <input type=number min=0 max=255 value=0 id=a> b: <input type=number min=0 max=255 value=0 id=b><pre id=o>

두 버전 모두 인코딩 <!>으로 012하지만 조각은 당신을 위해 이것을 디코딩. 편집 : @RickHitchcock 덕분에 전혀 쓸모없는 바이트 10 개가 절약되었습니다.


@wastl 감사합니다, 나는 세 번째 상징이 무엇인지 잘못 알고 있습니다.
Neil

훌륭합니다. 10 바이트를 절약 할 수 있다고 생각합니다. f=(a,b,[c,d,...e]=[a,''])=>c-b?f(a,b,[...e,c^1,d+1,c/2|c%2<<7,d+2,c%128*2|c>>7,d+0]):d
Rick Hitchcock

@RickHitchcock 와우, 이것들은 내가 한 번의 대답으로 본 것 중 가장 쓸모없는 10 바이트 여야합니다 ...
Neil


1

파이썬 2 , 111 바이트

l=[input()+('',)]
for(a,b,i)in l:a==b>exit(i);l+=[(x,b,i+y)for x,y in zip((a*2%256|a>>7,a/2|a%2<<7,a^1),'<>!')]

온라인으로 사용해보십시오!


함수를 재사용 할 수 있어야하므로 exit출력을 생성 하는 데 사용할 수 있다고 생각하지 않습니다 .
Dennis

@Dennis 나는 이것이 전체 프로그램과 같은 방식으로 출력 할 수있는 기능으로 처리 될 것이라고 생각했지만 종료는 출력의 일부가 아닙니다. 이것은 종료 코드를 통해 함수를 출력 할 수 없다는 것을 의미합니까?
ovs

나도 그렇게 생각해. 함수가 전체 프로그램으로 출력되도록 허용한다고해서 함수 제출 규칙을 무시할 수는 없습니다.
Dennis

1

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

카레 구문에서 2 바이트를 사용합니다 (a)(b).

다음과 같은 문자열을 반환합니다.

  • 0 = !
  • 1 = >
  • 2 = <

하늘의 배열의 경우 A는 동일하다 B .

a=>g=(b,m=1)=>(h=(n,s=[])=>n^b?s[m]?0:h(n^1,s+0)+h(n/2|n%2<<7,s+1)+h(n%128*2|n>>7,s+2):r=s)(a)?r:g(b,m+1)

온라인으로 사용해보십시오! (로 다시 번역 된 코드 !<>)


1

C (GCC) , 201 (199) 198 196 193 바이트

  • ceilingcat 덕분에 2 바이트를 절약했습니다 . 골프 a/2+a*128(a+2*a*128)/2a*257/2.
  • 바이트를 저장했습니다. 골프 a*2+a/128(a*2*128+a)/128(257*a)/128257*a>>7.
  • 저장된 2 개 개의 에 5Y이트 덕분 ceilingcat을 반환 형식을 골프.

C (gcc) , 193 바이트

*P,D,Q,j;f(a,b,d){if(a&=255,Q&&a==b)for(Q=j=0;++j<D;printf("%d",j[P]));Q&&++d<D&&f(a^1,b,d,P[d]=1)&f(257*a>>7,b,d,P[d]=2)&f(a*257/2,b,d,P[d]=3);}F(a,b){for(D=Q=1;Q;D++){int p[D];f(a,b,0,P=p);}}

온라인으로 사용해보십시오!


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