Opérations minimales pour passer d'un numéro à un autre

16

Définissons un langage simple qui fonctionne sur une seule valeur 8 bits. Il définit trois opérations au niveau du bit (l'explication du code suppose une valuevariable de 8 bits ):

  • !Annule le bit le moins significatif ( value ^= 1)
  • <Enveloppement à gauche ( value = value << 1 | value >> 7)
  • >habillage à droite ( value = value >> 1 | value << 7)

Contribution:

Deux nombres à 8 bits, a et b . Comme ils sont 8 bits, vous pouvez également les prendre comme caractères.

Production:

Le chemin le plus court pour passer de a à b, avec les trois opérations définies ci-dessus. Vous pouvez renvoyer une chaîne ou un tableau de caractères, ou définir une valeur constante et distincte pour chaque opération et renvoyer un tableau de ceux-ci (oui, vous pouvez également dire des <moyens >et des >moyens <), mais veuillez expliquer votre format de sortie dans votre réponse.

S'il y a plusieurs manières, également longues, vous pouvez en sortir une partie ou la totalité.

Règles:

  • Vous pouvez soumettre un programme ou une fonction
  • Des échappatoires standard s'appliquent
  • La soumission avec le moins d'octets dans chaque langue gagne (aucune réponse ne sera acceptée)

Les solutions sans forçage brutal (ou du moins pas seulement le forçage brutal) pourraient obtenir mon vote positif.

Cas de test:

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

Voici un programme pour en générer quelques autres.

wastl
la source

Réponses:

4

JavaScript (ES6), 100 96 86 octets

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>

Recherche en largeur un peu lente sans double vérification. Version 114 octets légèrement plus efficace:

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>

Les deux versions codent en <!>tant que 012mais les extraits de code le décodent pour vous. Edit: enregistré 10 octets totalement inutiles grâce à @RickHitchcock.

Neil
la source
@wastl Merci, j'avais mal mémorisé le troisième symbole.
Neil
Brillant, et je pense que vous pouvez économiser 10 octets: 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, ce doivent être les 10 octets les plus inutiles que j'ai jamais eu en une seule réponse ...
Neil
2

Gelée , 32 octets

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

Essayez-le en ligne!

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

Remarque: Il s'agit d'une fonction, c'est pourquoi le pied de page est là.

Force brute. :(

Erik le Outgolfer
la source
1

Python 2 , 111 octets

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

Essayez-le en ligne!

ovs
la source
Étant donné que les fonctions doivent être réutilisables, je ne pense pas que vous puissiez utiliser exitpour produire une sortie.
Dennis
@Dennis Je pensais que cela serait couvert par les fonctions qui peuvent sortir de la même manière que les programmes complets, mais la sortie ne fait pas partie de la sortie, je suppose. Cela signifie-t-il que les fonctions ne peuvent pas sortir via le code de sortie?
2018
Je le pense. Permettre aux fonctions de sortir en tant que programmes complets ne remplace pas (imo) les règles de soumission des fonctions.
Dennis
1

JavaScript (ES6), 105 octets

Prend les 2 octets de la syntaxe de curry (a)(b).

Renvoie une chaîne avec:

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

ou un tableau vide si a est égal à 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)

Essayez-le en ligne! (avec les codes traduits en !<>)

Arnauld
la source
1

C (gcc) , 201 199 198 196 193 octets

  • Enregistré deux octets grâce à plafondcat ; jouer a/2+a*128au golf (a+2*a*128)/2à a*257/2.
  • Enregistré un octet; jouer a*2+a/128au golf (a*2*128+a)/128à (257*a)/128à 257*a>>7.
  • Enregistré deux cinq octets grâce à plafond , jouant au golf le type de retour.

C (gcc) , 193 octets

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

Essayez-le en ligne!

Jonathan Frech
la source
@ceilingcat Merci.
Jonathan Frech