Bir sayıdan diğerine ulaşmak için minimum işlemler


16

Tek bir 8 bit değerinde çalışan basit bir dil tanımlayalım. Üç bitsel işlem tanımlar (kod açıklaması 8-bit valuedeğişken varsayılır ):

  • !En az anlamlı bit ( value ^= 1)
  • <Sola kaydırma sarma ( value = value << 1 | value >> 7)
  • >kaydırma sağ kaydırma ( value = value >> 1 | value << 7)

Giriş:

İki 8 bitlik sayı, a ve b . 8 bit olduklarından, bunları alternatif olarak karakter olarak da alabilirsiniz.

Çıktı:

Yukarıda tanımlanan üç işlemle a'dan b'ye ulaşmanın en kısa yolu. Bir dize veya bir karakter dizisi döndürebilir veya her işlem için sabit, farklı bir değer tanımlayabilir ve bunlardan oluşan bir dizi döndürebilirsiniz (evet, <araç >ve >araçlar da diyebilirsiniz <), ancak lütfen yanıtınızdaki çıktı biçiminizi açıklayın.

Birden fazla, eşit derecede uzun yol varsa, bunların herhangi birini veya tümünü çıktı alabilirsiniz.

Kurallar:

  • Bir program veya işlev gönderebilirsiniz
  • Standart boşluklar geçerlidir
  • Her dilde en az bayt içeren gönderim kazanır (cevap kabul edilmeyecektir)

Kaba zorlama olmayan çözümler (veya en azından sadece kaba zorlama değil) benim oyumu alabilir.

Test senaryoları:

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

İşte birkaç tane daha oluşturmak için bir program.

Yanıtlar:


4

JavaScript (ES6), 100 96 86 bayt

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>

Çift kontrol olmadan ilk önce biraz yavaş arama. Biraz daha verimli 114 baytlık sürüm:

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>

Her iki sürüm de kodlar <!>, 012ancak parçacıklar bunu sizin için çözer. Edit: @RickHitchcock sayesinde 10 tamamen yararsız bayt kaydedildi.


@wastl Teşekkürler, üçüncü sembolün ne olduğunu yanlış anladım.
Neil

Parlak, ve ben 10 bayt tasarruf edebilirsiniz düşünüyorum: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, bunlar tek bir cevapta şimdiye kadar yaşadığım en yararsız 10 bayt olmalı ...
Neil

2

Jöle , 32 bayt

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

Çevrimiçi deneyin!

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

Not: Bu bir işlevdir, bu yüzden altbilgi oradadır.

Kaba kuvvet. :(


1

Python 2 , 111 bayt

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

Çevrimiçi deneyin!


İşlevlerin yeniden kullanılabilir olması gerektiğinden, exitçıktı üretmek için kullanabileceğinizi düşünmüyorum .
Dennis

@Dennis, bu fonksiyonların tam programlarla aynı şekilde verilebileceğini düşündüm, ancak çıkmak çıktının bir parçası değil sanırım. Bu, işlevlerin çıkış kodu üzerinden çıkamayacağı anlamına mı geliyor?
ovs

Bence de. İşlevlerin tam program olarak çıkmasına izin vermek, işlev gönderme kurallarını geçersiz kılamaz (imo).
Dennis

1

JavaScript (ES6), 105 bayt

Körleme sözdiziminde 2 bayt alır (a)(b).

Şununla bir dize döndürür:

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

veya a b'ye eşitse boş bir dizi .

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)

Çevrimiçi deneyin! (kodlar tekrar çevriliyken !<>)


1

C (GCC) , 201 199 198 196 193 bayt

  • Tavan kedisi sayesinde iki bayt tasarrufu ; golf a/2+a*128için (a+2*a*128)/2için a*257/2.
  • Bir bayt kaydedildi; golf a*2+a/128için (a*2*128+a)/128için (257*a)/128için 257*a>>7.
  • Kaydedilen iki -e doğru beş bayt sayesinde ceilingcat dönüş türü golf.

C (gcc) , 193 bayt

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

Çevrimiçi deneyin!


@ ceilingcat Teşekkür ederim.
Jonathan Frech
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.