ある番号から別の番号に移動するための最小操作


16

単一の8ビット値で動作する単純な言語を定義しましょう。3つのビット演算を定義しています(コードの説明は8ビットvalue変数を想定しています)。

  • !最下位ビットを無効にします(value ^= 1
  • <左シフト(value = value << 1 | value >> 7)の折り返し
  • >右シフトの折り返し(value = value >> 1 | value << 7

入力:

2つの8ビット数、ab。8ビットなので、代わりに文字として使用することもできます。

出力:

上記の3つの操作を使用して、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が、スニペットはこれをデコードします。編集:@RickHitchcockのおかげで、まったく役に立たない10バイトを保存しました。


@wastlありがとう、私は3番目のシンボルが何であるかを誤って記憶していました。
ニール

素晴らしい、そして私はあなたが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

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バイト

カリー化構文で2バイトを使用します(a)(b)

次の文字列を返します。

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

空の配列場合と同じである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のおかげで2バイト節約されました。ゴルフa/2+a*128(a+2*a*128)/2しますa*257/2
  • バイトを保存しました。ゴルフa*2+a/128(a*2*128+a)/128(257*a)/128257*a>>7
  • ceilingcatのおかげで2バイトを5バイト節約し、戻り値のタイプをゴルフしました。

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ありがとうございます。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.