Мінімальні операції, щоб дістатися з одного номера на інше


16

Давайте визначимо просту мову, яка працює на одному 8-бітному значенні. Він визначає три бітові операції (пояснення коду передбачає 8-бітну valueзмінну):

  • !Негатуйте найменш значущий біт ( value ^= 1)
  • <Обертання лівої зміни ( value = value << 1 | value >> 7)
  • >загортання правої зміни ( value = value >> 1 | value << 7)

Вхід:

Два 8-розрядних числа, a і 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

JavaScript (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але фрагменти декодують це для вас. Редагувати: Збережено 10 абсолютно марних байтів завдяки @RickHitchcock.


@wastl Спасибі, я неправильно зазначив, що це третій символ.
Ніл

Блискуче, і я думаю, ви зможете зекономити 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
Рік Хічкок,

@ RickHitchcock Ого, це, мабуть, найкорисніші 10 байт, які я коли-небудь мав в одній відповіді ...
Ніл,


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для отримання результатів.
Денніс

@ Денніс Я думав, що це буде охоплено функціями, які можуть виводитись так само, як і повноцінні програми, але, напевне, вихід не є частиною результату. Чи означає це, що функції не можуть виводитися за допомогою коду виходу?
ов

Я думаю так. Дозволення функцій виводити як повноцінні програми не може замінити (imo) правила подання функцій.
Денніс

1

JavaScript (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 байт

  • Збережено два байти завдяки стельовій кішці ; гра в гольф , a/2+a*128щоб (a+2*a*128)/2в a*257/2.
  • Збережено байт; грати в гольф , a*2+a/128щоб (a*2*128+a)/128в (257*a)/128до 257*a>>7.
  • Збережено два п’ять байтів завдяки стельовій кішці для гольфу, що повертається.

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 Дякую
Джонатан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.