การดำเนินงานขั้นต่ำที่จะได้รับจากหมายเลขหนึ่งไปยังอีก


16

มานิยามภาษาง่าย ๆ ที่ทำงานกับค่า 8 บิตเดียว มันกำหนดการดำเนินงานสามระดับบิต (คำอธิบายรหัสถือว่าvalueตัวแปร8 บิต):

  • !ลบล้างบิตที่สำคัญน้อยที่สุด ( value ^= 1)
  • <ห่อกะซ้าย ( value = value << 1 | value >> 7)
  • >ห่อขวากะ ( value = value >> 1 | value << 7)

การป้อนข้อมูล:

ตัวเลขสอง 8 บิตและข เนื่องจากมีขนาด 8 บิตคุณสามารถเลือกใช้เป็นอักขระได้

เอาท์พุท:

วิธีที่สั้นที่สุดที่จะได้รับจาก a ถึง b โดยการปฏิบัติการทั้งสามที่กำหนดไว้ด้านบน คุณสามารถส่งคืนสตริงหรืออาร์เรย์ของอักขระหรือกำหนดค่าคงที่และแตกต่างกันสำหรับการดำเนินการแต่ละครั้งและส่งกลับอาร์เรย์ของค่าเหล่านั้น (ใช่คุณสามารถพูดความ<หมาย>และความ>หมาย<) แต่โปรดอธิบายรูปแบบผลลัพธ์ของคุณในคำตอบ

หากมีหลายวิธียาวเท่ากันคุณสามารถส่งออกใด ๆ หรือทั้งหมด

กฎ:

  • คุณสามารถส่งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานใช้
  • การส่งที่มีไบต์น้อยที่สุดในแต่ละภาษาจะชนะ (จะไม่ยอมรับคำตอบ)

วิธีการแก้ปัญหาที่ไม่มีการบังคับใช้สัตว์เดรัจฉาน (หรืออย่างน้อยไม่เพียง แต่การบังคับใช้เดรัจฉาน) อาจทำให้ upvote ของฉัน

กรณีทดสอบ:

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ตัวอย่างข้อมูลเพื่อถอดรหัสให้คุณ แก้ไข: บันทึก 10 ไบต์ที่ไร้ประโยชน์อย่างเต็มที่ด้วย @RickHitchcock


@wastl ขอบคุณฉันจะเข้าใจผิดว่าสัญลักษณ์ที่สามคืออะไร
Neil

ที่ยอดเยี่ยมและผมคิดว่าคุณสามารถบันทึก 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 ไบต์ที่ฉันเคยมีในคำตอบเดียว ...
Neil


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

@Dennis ฉันคิดว่าสิ่งนี้จะถูกปกคลุมด้วยฟังก์ชั่นสามารถส่งออกในลักษณะเดียวกับโปรแกรมเต็มรูปแบบ แต่การออกไม่ได้เป็นส่วนหนึ่งของผลลัพธ์ฉันเดา นี่หมายความว่าฟังก์ชั่นไม่สามารถส่งออกผ่านรหัสออกได้หรือไม่?
ovs

ฉันคิดอย่างนั้น การอนุญาตให้ฟังก์ชันส่งออกเป็นโปรแกรมเต็มรูปแบบไม่สามารถแทนที่ (imo) กฎสำหรับการส่งฟังก์ชันได้
Dennis

1

JavaScript (ES6), 105 ไบต์

ใช้เวลา 2 (a)(b)ไบต์ในไวยากรณ์

ส่งคืนสตริงด้วย:

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

หรืออาร์เรย์ว่างเปล่าถ้าเท่ากับข

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 ; การเล่นกอล์ฟa/2+a*128ที่จะไป(a+2*a*128)/2a*257/2
  • บันทึกเป็นไบต์ การเล่นกอล์ฟa*2+a/128เพื่อ(a*2*128+a)/128ที่จะไป(257*a)/128257*a>>7
  • บันทึกสองห้าไบต์ต้องขอบคุณแมวตัวผู้ที่ตีกอล์ฟประเภทผลตอบแทน

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 ขอบคุณ
Jonathan Frech
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.