Minimalna liczba operacji, aby przejść z jednego numeru do drugiego

16

Zdefiniujmy prosty język, który działa na pojedynczej 8-bitowej wartości. Definiuje trzy operacje bitowe (wyjaśnienie kodu zakłada valuezmienną 8-bitową ):

  • !Neguj najmniej znaczący bit ( value ^= 1)
  • <Zawijanie w lewo Shift ( value = value << 1 | value >> 7)
  • >zawijanie w prawo-shift ( value = value >> 1 | value << 7)

Wejście:

Dwie liczby 8-bitowe, a i b . Ponieważ są 8-bitowe, możesz alternatywnie traktować je jako postacie.

Wynik:

Najkrótszy sposób przejścia z punktu A do punktu B, z trzema powyższymi operacjami. Możesz zwrócić ciąg znaków lub tablicę znaków lub zdefiniować stałe, odrębne wartości dla każdej operacji i zwrócić ich tablicę (tak, możesz również powiedzieć <środki >i >środki <), ale proszę wyjaśnij swój format wyjściowy w swojej odpowiedzi.

Jeśli istnieje wiele, równie długich dróg, możesz wypisać jeden lub wszystkie z nich.

Zasady:

  • Możesz przesłać program lub funkcję
  • Standardowe luki zastosowanie
  • Zgłoszenie z najmniejszą liczbą bajtów w każdym języku wygrywa (odpowiedź nie zostanie zaakceptowana)

Rozwiązania bez brutalnego forsowania (a przynajmniej nie tylko brutalnego forsowania) mogą mnie pochwalić.

Przypadki testowe:

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

Oto program do wygenerowania jeszcze kilku.

pustkowie
źródło

Odpowiedzi:

4

JavaScript (ES6), 100 96 86 bajtów

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>

Nieco wolne pierwsze wyszukiwanie bez podwójnego sprawdzania. Nieco bardziej wydajna wersja 114-bajtowa:

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>

Obie wersje kodują <!>jako, 012ale fragmenty dekodują to za Ciebie. Edycja: Zapisano 10 całkowicie bezużytecznych bajtów dzięki @RickHitchcock.

Neil
źródło
@wastl Dzięki, pomyliłem się co do trzeciego symbolu.
Neil,
Genialne i myślę, że możesz zaoszczędzić 10 bajtów: 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, to muszą być najbardziej bezużyteczne 10 bajtów, jakie kiedykolwiek miałem w jednej odpowiedzi ...
Neil,
2

Galaretka , 32 bajty

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

Wypróbuj online!

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

Uwaga: jest to funkcja, dlatego jest tam stopka.

Brutalna siła. :(

Erik the Outgolfer
źródło
1

Python 2 , 111 bajtów

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

Wypróbuj online!

ovs
źródło
Ponieważ funkcje muszą być wielokrotnego użytku, nie sądzę, że można ich użyć exitdo uzyskania wyników.
Dennis
@Dennis Myślałem, że będzie to objęte funkcjami, które mogą wyświetlać dane w taki sam sposób jak pełne programy, ale myślę, że wyjście nie jest częścią wyjścia. Czy to oznacza, że ​​funkcje nie mogą być wysyłane przez kod wyjścia?
ovs
Chyba tak. Zezwalanie funkcjom na wyprowadzanie jako pełne programy nie zastępuje (imo) reguł przesyłania funkcji.
Dennis
1

JavaScript (ES6), 105 bajtów

Zajmuje 2 bajty w składni curry (a)(b).

Zwraca ciąg z:

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

lub pusta tablica, jeśli a jest równe 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)

Wypróbuj online! (z kodami przetłumaczonymi z powrotem na !<>)

Arnauld
źródło
1

C (gcc) , 201 199 198 196 193 bajtów

  • Oszczędność dwóch bajtów dzięki pułapowi cat ; grać a/2+a*128w golfa (a+2*a*128)/2do a*257/2.
  • Zapisano bajt; golfa a*2+a/128, aby (a*2*128+a)/128do (257*a)/128celu 257*a>>7.
  • Zaoszczędził dwa pięć bajtów dzięki pułapowi cat , grając w golfa typu powrotu.

C (gcc) , 193 bajtów

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

Wypróbuj online!

Jonathan Frech
źródło
@ceilingcat Dziękuję.
Jonathan Frech