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.

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.


@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. :(


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!


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


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!


@ceilingcat Vielen Dank.
Jonathan Frech
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.