从一个数字到另一个数字的最小操作


16

让我们定义一种操作单个8位值的简单语言。它定义了三个按位运算(代码说明假定为8位value变量):

  • !取反最低有效位(value ^= 1
  • <包装左移(value = value << 1 | value >> 7
  • >包装右移(value = value >> 1 | value << 7

输入:

两个8位数字ab。由于它们是8位的,因此您可以选择将它们作为字符。

输出:

通过上面定义的三个操作,从a到b的最短方法。您可以返回一个字符串或字符数组,或者为每个操作定义一个常数,不同的值,然后返回这些数组(是的,您也可以说<mean >>mean <),但是请在回答中说明您的输出格式。

如果有多种同样长的方法,则可以输出其中的任何一个或全部。

规则:

  • 您可以提交程序或功能
  • 适用标准漏洞
  • 每种语言中字节数最少的提交将获胜(不接受任何答案)

没有暴力破解的解决方案(或者至少不仅是暴力破解)可能会让我大吃一惊。

测试用例:

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

是一个生成更多程序的程序。

Answers:


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个字节……
尼尔(Neil)

2

果冻,32字节

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

在线尝试!

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

注意:这是一个函数,这就是页脚在那里的原因。

蛮力。:(


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来产生输出。
丹尼斯

@Dennis我认为这可以由函数覆盖,可以像完整程序一样输出,但是我猜想退出并不是输出的一部分。这是否意味着函数无法通过退出代码输出?
ovs

我认同。允许函数输出为完整程序不会覆盖(imo)函数提交规则。
丹尼斯

1

JavaScript(ES6),105个字节

采用currying语法的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字节

  • 多亏了ceilingcat,节省了两个字节;打高尔夫球a/2+a*128(a+2*a*128)/2a*257/2
  • 保存一个字节;打高尔夫球a*2+a/128(a*2*128+a)/128(257*a)/128257*a>>7
  • 多亏了ceilingcat,节省了两个五个字节,打了回程型。

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谢谢。
乔纳森·弗雷希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.