Hoạt động tối thiểu để có được từ số này sang số khác


16

Hãy xác định một ngôn ngữ đơn giản hoạt động trên một giá trị 8 bit. Nó định nghĩa ba thao tác bitwise (giải thích mã giả định biến 8 bit value):

  • !Phủ định bit ít quan trọng nhất ( value ^= 1)
  • <Gói dịch chuyển trái ( value = value << 1 | value >> 7)
  • >gói dịch chuyển sang phải ( value = value >> 1 | value << 7)

Đầu vào:

Hai số 8 bit, ab . Vì chúng là 8 bit, bạn có thể thay thế chúng làm ký tự.

Đầu ra:

Cách ngắn nhất để đi từ a đến b, với ba thao tác được xác định ở trên. Bạn có thể trả về một chuỗi hoặc một mảng các ký tự hoặc xác định một giá trị không đổi, riêng biệt cho mỗi thao tác và trả về một mảng trong số đó (vâng, bạn cũng có thể nói <phương tiện >>phương tiện< ), nhưng vui lòng giải thích định dạng đầu ra của bạn trong câu trả lời của bạn.

Nếu có nhiều cách, dài bằng nhau, bạn có thể xuất bất kỳ hoặc tất cả chúng.

Quy tắc:

  • Bạn có thể gửi một chương trình hoặc chức năng
  • Sơ hở tiêu chuẩn dụng
  • Việc gửi với ít byte nhất trong mỗi ngôn ngữ sẽ thắng (không có câu trả lời nào được chấp nhận)

Các giải pháp mà không có vũ lực (hoặc ít nhất là không chỉ cưỡng bức) có thể giúp tôi tăng cường.

Các trường hợp thử nghiệm:

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 '>>>>!>!'

Đây là một chương trình để tạo ra một vài nữa.

Câu trả lời:


4

JavaScript (ES6), 100 96 86 byte

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>

Hơi chậm tìm kiếm đầu tiên mà không cần kiểm tra lại. Phiên bản 114 byte hiệu quả hơn một chút:

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>

Cả hai phiên bản mã hóa <!>như 012nhưng các đoạn giải mã này cho bạn. Chỉnh sửa: Đã lưu 10 byte hoàn toàn vô dụng nhờ @RickHitchcock.


@wastl Cảm ơn, tôi đã đánh giá sai biểu tượng thứ ba là gì.
Neil

Rực rỡ, và tôi nghĩ bạn có thể tiết kiệm 10 byte: 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 Wow, đó phải là 10 byte vô dụng nhất tôi từng có trong một câu trả lời ...
Neil


1

Python 2 , 111 byte

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),'<>!')]

Hãy thử trực tuyến!


Vì các chức năng phải được tái sử dụng, tôi không nghĩ bạn có thể sử dụng exitđể tạo đầu ra.
Dennis

@Dennis Tôi nghĩ rằng điều này sẽ được bao phủ bởi các chức năng có thể xuất ra giống như các chương trình đầy đủ, nhưng việc thoát ra không phải là một phần của đầu ra, tôi đoán vậy. Điều này có nghĩa là các chức năng không thể xuất qua mã thoát?
trứng

Tôi nghĩ vậy. Cho phép các chức năng xuất ra dưới dạng các chương trình đầy đủ không thể ghi đè (imo) các quy tắc cho việc gửi chức năng.
Dennis

1

JavaScript (ES6), 105 byte

Lấy 2 byte theo cú pháp currying (a)(b) .

Trả về một chuỗi với:

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

hoặc một mảng trống nếu a bằng 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)

Hãy thử trực tuyến! (với mã được dịch trở lại !<>)


1

C (gcc) , 201 199 198 196 193 byte

  • Lưu hai byte nhờ trần nhà ; chơi golf a/2+a*128để (a+2*a*128)/2đến a*257/2.
  • Đã lưu một byte; chơi golf a*2+a/128đến (a*2*128+a)/128để (257*a)/128đến 257*a>>7.
  • Đã lưu hai năm byte nhờ vào trần nhà , đánh gôn kiểu trả về.

C (gcc) , 193 byte

*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);}}

Hãy thử trực tuyến!


@ceilingcat Cảm ơn bạn.
Jonathan Frech
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.