Минимальные операции, чтобы получить от одного номера к другому

16

Давайте определим простой язык, который работает с одним 8-битным значением. Он определяет три побитовые операции (объяснение кода предполагает 8-битную valueпеременную):

  • !Отрицательный младший бит ( value ^= 1)
  • <Заворачивание влево-сдвиг ( value = value << 1 | value >> 7)
  • >перенос правой стрелки ( value = value >> 1 | value << 7)

Входные данные:

Два 8-битных числа, а и б . Поскольку они 8-битные, вы можете принять их за символы.

Выход:

Кратчайший способ добраться от а до б с помощью трех операций, определенных выше. Вы можете вернуть строку или массив символов или определить постоянные, отдельные значения для каждой операции и вернуть массив из них (да, вы могли бы также сказать, что <означает >и >означает <), но, пожалуйста, объясните свой выходной формат в своем ответе.

Если есть несколько одинаковых длинных путей, вы можете вывести любой или все из них.

Правила:

  • Вы можете отправить программу или функцию
  • Применяются стандартные лазейки
  • Представление с наименьшим количеством байтов на каждом языке выигрывает (ответ не будет принят)

Решения без грубого принуждения (или, по крайней мере, не только грубого принуждения) могут получить мое одобрение.

Тестовые случаи:

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

Вот программа для генерации еще нескольких.

Wastl
источник

Ответы:

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но фрагменты декодируют это для вас. Редактировать: благодаря @RickHitchcock сохранено 10 совершенно бесполезных байтов.

Нил
источник
@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 байтов, которые у меня когда-либо были в одном ответе ...
Нил
2

Желе , 32 байта

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

Попробуйте онлайн!

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

Примечание: это функция, поэтому нижний колонтитул есть.

Грубая сила. :(

Эрик Outgolfer
источник
1

Python 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)

Попробуйте онлайн! (с кодами, переведенными обратно !<>)

Arnauld
источник
1

C (gcc) , 201 199 198 196 193 байта

  • Сохранено два байта благодаря функциюcatcat ; игра 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 .
  • Сохранено два пятибайта благодаря floorcat , играющей в гольф возвратного типа.

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 Спасибо.
Джонатан Фрех