Minimale Operationen, um von einer Nummer zur nächsten zu gelangen

16

Definieren wir eine einfache Sprache, die mit einem einzelnen 8-Bit-Wert arbeitet. Es definiert drei bitweise Operationen (Code-Erklärung setzt eine 8-Bit- valueVariable voraus ):

  • !Negiere das niedrigstwertige Bit ( value ^= 1)
  • <Linksverschiebung umbrechen ( value = value << 1 | value >> 7)
  • >Rechtsverschiebung umbrechen ( value = value >> 1 | value << 7)

Eingang:

Zwei 8-Bit-Zahlen, a und b . Da es sich um 8-Bit-Zeichen handelt, können Sie sie alternativ als Zeichen verwenden.

Ausgabe:

Der kürzeste Weg von a nach b, mit den drei oben definierten Operationen. Sie können eine Zeichenfolge oder ein Array von Zeichen zurückgeben oder für jede Operation einen konstanten, eindeutigen Wert definieren und ein Array von diesen zurückgeben (ja, Sie können auch <Mittel >und >Mittel sagen <), aber erläutern Sie Ihr Ausgabeformat in Ihrer Antwort.

Wenn es mehrere gleich lange Wege gibt, können Sie einen oder alle davon ausgeben.

Regeln:

  • Sie können ein Programm oder eine Funktion einreichen
  • Es gelten Standardlücken
  • Die Einsendung mit den wenigsten Bytes in jeder Sprache gewinnt (keine Antwort wird akzeptiert)

Lösungen ohne Brute-Forcing (oder zumindest nicht nur Brute-Forcing) könnten meine Zustimmung finden.

Testfälle:

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

Hier ist ein Programm, um ein paar mehr zu generieren.

wastl
quelle

Antworten:

4

JavaScript (ES6), 100 96 86 Byte

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>

Etwas langsame Suche ohne Überprüfung. Etwas effizientere 114-Byte-Version:

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>

Beide Versionen codieren <!>als, 012aber die Snippets decodieren dies für Sie. Bearbeiten: 10 völlig nutzlose Bytes dank @RickHitchcock gespeichert.

Neil
quelle
@wastl Danke, ich hatte mich falsch erinnert, was das dritte Symbol war.
Neil
Genial, und ich denke, Sie können 10 Bytes sparen: 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, das müssen die nutzlosesten 10 Bytes sein, die ich je in einer einzigen Antwort hatte ...
Neil
2

Jelly , 32 Bytes

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

Probieren Sie es online!

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

Hinweis: Dies ist eine Funktion, deshalb ist die Fußzeile dort.

Rohe Gewalt. :(

Erik der Outgolfer
quelle
1

Python 2 , 111 Bytes

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

Probieren Sie es online!

ovs
quelle
Da Funktionen wiederverwendbar sein müssen, glaube ich nicht, dass Sie sie exitzur Ausgabe verwenden können.
Dennis
@Dennis Ich dachte, dies würde durch Funktionen abgedeckt, die auf die gleiche Weise wie vollständige Programme ausgegeben werden können, aber das Beenden ist wohl nicht Teil der Ausgabe. Bedeutet das, dass Funktionen nicht über den Exit-Code ausgegeben werden können?
Ovs
Ich glaube schon. Wenn Sie zulassen, dass Funktionen als vollständige Programme ausgegeben werden, werden die Regeln für die Übermittlung von Funktionen nicht außer Kraft gesetzt (imo).
Dennis
1

JavaScript (ES6), 105 Byte

Nimmt die 2 Bytes in der aktuellen Syntax (a)(b).

Liefert einen String mit:

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

oder ein leeres Array, wenn a gleich b ist .

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)

Probieren Sie es online! (mit rückübersetzten Codes !<>)

Arnauld
quelle
1

C (gcc) , 201 199 198 196 193 Bytes

  • Dank ceilingcat zwei Bytes gespart ; Golfen a/2+a*128bis (a+2*a*128)/2zu a*257/2.
  • Ein Byte gespeichert; Golfen a*2+a/128auf (a*2*128+a)/128bis (257*a)/128zu 257*a>>7.
  • Gespeichert zwei fünf Bytes dank ceilingcat , den Rückgabetyp Golf spielen.

C (gcc) , 193 Bytes

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

Probieren Sie es online!

Jonathan Frech
quelle
@ceilingcat Vielen Dank.
Jonathan Frech