Operasi minimum untuk mendapatkan dari satu nomor ke yang lain

16

Mari kita mendefinisikan bahasa sederhana yang beroperasi pada nilai 8-bit tunggal. Ini mendefinisikan tiga operasi bitwise (penjelasan kode mengasumsikan valuevariabel 8-bit ):

  • !Meniadakan bit paling signifikan ( value ^= 1)
  • <Membungkus shift kiri ( value = value << 1 | value >> 7)
  • >membungkus shift kanan ( value = value >> 1 | value << 7)

Memasukkan:

Dua angka 8-bit, a dan b . Karena mereka 8-bit, Anda dapat mengambilnya sebagai karakter.

Keluaran:

Cara terpendek untuk mendapatkan dari a ke b, dengan tiga operasi yang ditentukan di atas. Anda dapat mengembalikan string atau array karakter, atau menentukan nilai konstan dan berbeda untuk setiap operasi dan mengembalikan array dari itu (ya, Anda juga bisa mengatakan <cara >dan >sarana <), tetapi tolong jelaskan format output Anda dalam jawaban Anda.

Jika ada banyak, dengan cara yang sama panjangnya, Anda dapat menampilkan salah satu atau semuanya.

Aturan:

  • Anda dapat mengirimkan program atau fungsi
  • Celah standar berlaku
  • Kiriman dengan byte paling sedikit di setiap bahasa menang (tidak ada jawaban akan diterima)

Solusi tanpa brute-forcing (atau setidaknya tidak hanya brute-forcing) mungkin mendapatkan upvote saya.

Kasus uji:

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

Berikut adalah program untuk menghasilkan beberapa lagi.

wastl
sumber

Jawaban:

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>

Agak lambat pencarian pertama-lebar tanpa memeriksa ulang. Versi 114-byte yang sedikit lebih efisien:

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>

Kedua versi dikodekan <!>sebagai 012tetapi cuplikan memecahkan kode ini untuk Anda. Sunting: Disimpan 10 byte yang sama sekali tidak berguna berkat @RickHitchcock.

Neil
sumber
@Wastl Terima kasih, saya salah mengartikan apa simbol ketiga itu.
Neil
Cemerlang, dan saya pikir Anda bisa menghemat 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, itu pasti 10 byte paling tidak berguna yang pernah saya miliki dalam satu jawaban ...
Neil
2

Jelly , 32 byte

ṃ“ṙ1“ṙ-“¬8¦”
+⁹BḊ€0ÇẎv¥⁼ƭƒ@¥1#ḢÇ

Cobalah online!

< : ['ṙ', '1']
> : ['ṙ', '-']
! :['¬', '8', '¦']

Catatan: Ini adalah fungsi, itu sebabnya catatan kaki ada di sana.

Paksaan. :(

Erik the Outgolfer
sumber
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),'<>!')]

Cobalah online!

ovs
sumber
Karena fungsi harus dapat digunakan kembali, saya tidak berpikir Anda dapat menggunakan exituntuk menghasilkan output.
Dennis
@ Dennis Saya pikir ini akan dibahas oleh fungsi yang dapat di-output dengan cara yang sama seperti program penuh, tetapi keluar bukan merupakan bagian dari output, saya kira. Apakah ini berarti fungsi tidak dapat ditampilkan melalui kode keluar?
Ov
Aku pikir begitu. Mengizinkan fungsi untuk ditampilkan sebagai program lengkap tidak dapat mengesampingkan (imo) aturan untuk pengiriman fungsi.
Dennis
1

JavaScript (ES6), 105 byte

Membawa 2 byte dalam sintaks currying (a)(b).

Mengembalikan string dengan:

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

atau array kosong jika a sama dengan 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)

Cobalah online! (dengan kode diterjemahkan kembali ke !<>)

Arnauld
sumber
1

C (gcc) , 201 199 198 196 193 byte

  • Disimpan dua byte berkat ceilingcat ; golf a/2+a*128untuk (a+2*a*128)/2kea*257/2 .
  • Disimpan satu byte; golf a*2+a/128untuk (a*2*128+a)/128untuk (257*a)/128untuk257*a>>7 .
  • Disimpan dua lima byte berkat ceilingcat , golf jenis kembali.

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

Cobalah online!

Jonathan Frech
sumber
@ceilingcat Terima kasih.
Jonathan Frech