ค้นหาวิธีที่สั้นที่สุดเพื่อเลื่อนเคาน์เตอร์ไปยังหมายเลขที่กำหนด


10

ฉันมีเคาน์เตอร์ เป็นอุปกรณ์ขนาดเล็กที่มีลักษณะดังนี้:

เคาน์เตอร์

การแสดงผลไปจากการ0000 9999มีปุ่มกดเล็ก ๆ ที่ด้านบนที่เพิ่มการนับ 1 และลูกบิดเล็ก ๆ ด้านขวาซึ่งมีจุดประสงค์เพื่อรีเซ็ตตัวนับกลับเป็น 0

ตอนนี้สิ่งที่เกี่ยวกับปุ่มเล็ก ๆ คือถ้าคุณหมุนไปข้างหลังคุณสามารถเพิ่มตัวเลขใด ๆ ที่คุณต้องการได้เมื่อคุณหมุนมันไปข้างหน้าอีกครั้ง ดังนั้นถ้าฉันกดปุ่มนับ 10 ครั้งเพื่อให้การแสดงที่เคาน์เตอร์0010ผมแล้วสามารถเปิดย้อนกลับลูกบิดจนกว่าฉันจะได้ยินเสียงคลิกเล็ก ๆ 0090แล้วเปิดไปข้างหน้าอีกครั้งและทำให้มันตรงไปที่

แต่ลูกบิดจะเพิ่มตัวเลขที่เกิดขึ้นทั้งหมด 1 เสมอทุกครั้งที่ผลักตัวเลขไปข้างหน้า ดังนั้นหากการแสดงที่เคาน์เตอร์6060คุณสามารถทำให้มันเพิ่มขึ้นเป็น7070ไม่หรือ6070 7060นอกจากนี้ลูกบิดจะม้วน9s ไป0โดยไม่ดำเนินการดังนั้น0990จะเลื่อนไป0000แทนหรือ10001100


ฉันต้องการทราบวิธีที่มีประสิทธิภาพที่สุดในการตั้งค่าตัวนับเป็นตัวเลขที่แน่นอน งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่จะกำหนดลำดับที่สั้นที่สุดของการกดปุ่มและความก้าวหน้าของปุ่มที่จำเป็นในการทำเช่นนั้น

โปรแกรมของคุณจะป้อนตัวเลข 4 หลักจาก0000ถึง9999และส่งคืนชุดของขั้นตอนในรูปแบบต่อไปนี้:

> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678

โดยที่Cสำหรับ "กดปุ่มตัวนับ" และตัวเลขใด ๆDจาก 0 ถึง 9 หมายถึง "ใช้ปุ่มหมุนเพื่อเลื่อนการเกิดเหตุการณ์ทั้งหมดDด้วย 1"

โปรแกรมของคุณต้องสร้างลำดับขั้นตอนที่ถูกต้องสำหรับชุดตัวเลขสี่หลักที่เป็นไปได้ทั้งหมดและจะได้คะแนนตามจำนวนขั้นตอนทั้งหมดที่จำเป็นสำหรับ 10,000 ราย ในกรณีที่เสมอกัน (เป็นไปได้มากที่สุดเมื่อพบอัลกอริธึมที่เหมาะสมที่สุด) รหัสที่สั้นกว่าจะชนะ


จะเกิดอะไรขึ้นถ้าคุณหมุนปุ่มไปข้างหน้า? มันจะกลาย0010เป็น0020ในกรณีนั้นหรือไม่? หรือคุณสามารถหมุนปุ่มย้อนกลับได้เท่านั้น? และเช่นกันแต่ละตัว "D" จะนับเป็นจำนวน "D" ของความก้าวหน้าของปุ่มหมุน (เช่น1234567หมายถึงหมุนลูกบิด 1 ครั้งจากนั้น 2 ครั้งจากนั้น 3 ครั้งแล้ว 3 ครั้งเป็นต้น) หรือว่าหมายถึงการหมุนลูกบิดแยกกัน (เช่น1234567หมายถึงการหมุนลูกบิด 7 ครั้ง) หรือไม่?
R. Kap

ดูเหมือนว่าด้านบนและด้านล่างจะไม่เกี่ยวข้อง
แม่ชีที่รั่ว

ลูกบิดสามารถเลือกตัวเลขในด้านล่าง
แม่ชีที่รั่ว

การหมุนปุ่มไปข้างหน้าจะเป็นการเลื่อน 0010 ถึง 0020 หรือ 1111 ขึ้นอยู่กับตำแหน่งที่ลูกบิดอยู่แล้วคุณหมุนปุ่มย้อนกลับเพื่อตั้งค่าตำแหน่งจากนั้นส่งต่อเพื่อเลื่อนตัวเลขไปข้างหน้า
Joe Z.

1
อย่างจริงจังผู้ชายคนนี้ต้องการเคาน์เตอร์ของเขาในราคาที่ถูกต้อง !!!! ตอนนี้ !!!
CalculatorFeline

คำตอบ:


5

Lua, 327763 ขั้นตอน (เหมาะสม, 276 ไบต์)

รุ่น Golfed:

a={[0]=""}t=tonumber for i=0,52 do A={}for k,v in pairs(a)do A[k]=v L=("%04d"):format(k)for i=1,4 do c=L:sub(i,i)d=L:gsub(c,(t(c)+1)%10)e=a[t(d)]A[d]=(not e or #e>#v)and v..c or e end b=k+1 if k<9999then e=a[b]A[b]=(not e or #e>#v)and v.."C"or e end end a=A endprint(a[(...)])

ตัวอย่างรุ่นที่ได้รับการปรับปรุง ( 1000มีการปรับปรุงเท่านั้น):

0001:C
0093:CCCCCCCCCC12345678CCC
1000:0CCCCCCCCCCC2345678C23456789
     (0000>1111>1122>1199>1200>1000)
9999:012345678

เวอร์ชันที่ไม่ถูกปรับแต่ง:

a = {[0]=""}
for i=0,52 do
    A = {}
    for k,v in pairs(a) do
        A[k] = v
        L=("%04d"):format(k)
        for i=1,4 do
           c=L:sub(i,i)
           d=L:gsub(c,(tonumber(c)+1)%10)
           e=a[tonumber(d)]
           A[d] = (not e or #e > #v) and v..c or e
        end
        b=k+1
        if k < 9999 then
            e=a[b]
            A[b] = (not e or #e > #v) and v.."C" or e
        end
    end
    a=A
end
print(a[93],a[1000],a[9999])

1

Mathematica คะแนน 512710

Unprotect[StringRepeat]
StringRepeat[x_String, 0]:=""
Protect[StringRepeat]
#<>StringRepeat["C",#3-#2*1111]&[Array[ToString@#&,#,0],##]&[If[#<10^3,0,Quotient[#,1111]],#]&

แก้ไขข้อบกพร่องด้วยStringRepeat(ทำงานไม่ถูกต้องสำหรับStringRepeat[x_String,0])


จำเป็นต้องมีที่ว่างStringRepeat[x_String, 0]:=""หรือไม่?
แมว

ไม่ แต่ฉันขี้เกียจเกินไปที่จะลบมัน นั่นเป็นปัญหาหรือไม่?
CalculatorFeline

ไม่เลย: P เป็นเพียงอยากรู้อยากเห็นสำหรับฉันว่าส่วนที่เหลือของรหัสคือกอล์ฟยกเว้นช่องว่างหนึ่ง
แมว

... นั่นคือกอล์ฟใช่ไหม? Mathematica หรือเป็นเสียงบรรทัดใหม่
แมว

@cat นี่ไม่ใช่code-golf
pppery

1

Pyth, 327763 ขั้นตอน (เหมาะสม, 130 ไบต์)

เนื่องจากคอมไพเลอร์ออนไลน์เป็นไม่สมควรที่จัดการกับงานมหาศาลดังกล่าวผมได้ให้มันทำงานน้อยลงเพื่อให้มันสร้าง0, และ1 1111อย่างไรก็ตามมันสามารถแก้ปัญหาในเชิงทฤษฎีได้เนื่องจากใช้อัลกอริทึมเดียวกับ Lua ที่ด้านบน

ลองออนไลน์!

=Y.d((0k;V53=ZYFGY XZG=k@YG=N%"%04d"GV4=b@NH=di:Nb%"%d"ehibTT XZd.x?>l@Ydlk+kb@Yd+kb)=bhGI<G9999 XZb.x?>l@Yblk+k\C@Yb+k\C))=YZ;@YQ

มันทำงานอย่างไร:

=Y.d((0k;V53=ZYFGY XZG=k@YG=N%"%04d"GV4=b@NH=di:Nb%"%d"ehibTT XZd.x?>l@Ydlk+kb@Yd+kb)=bhGI<G9999 XZb.x?>l@Yblk+k\C@Yb+k\C))=YZ)@YQ
                  assign_copy('Q',eval_input())
=Y.d((0k;         assign_copy('Y',dict(0=k))
V53               for N in range(0,53):
=ZY                   assign_copy('Z',Y)
FGY                   for G in num_to_range(Y):
 XZG=k@YG                 no_print(Z[G] = assign_copy('k',lookup(Y,G)))
=N%"%04d"G                assign_copy('N',format("%04d",G))
V4                        for H in range(0,4):
=b@NH                         assign_copy('b',lookup(N,H))
=di:Nb%"%d"ehibTT             assign_copy('d',base(replace(N,b,format("%d",mod10(increment(base(b,10))))),10))
 XZd.x?>l@Ydlk+kb@Yd+kb       no_print(Z[d]=try_and_catch(greater_than(Plen(lookup(Y,d)),Plen(k)) ? concat(k,b) : lookup(Y,d)), lambda:plus(k,b))
)                         <anti-indent>
=bhG                      assign_copy('b',head(G))
I<G9999                   if less_than(G,9999):
 XZb.x?>l@Yblk+k\C@Yb+k\C     no_print(Z[b]=try_and_catch(greater_than(Plen(lookup(Y,b)),Plen(k)) ? concat(k,"C") : lookup(Y,b)), lambda:plus(k,"C"))
)                         <anti-indent>
)                     <anti-indent>
=YZ                   assign('Y',Z)
)                 <anti-indent>
@YQ               print(lookup(Y,Q))

เพียงแค่สังเกต: lua หนึ่งอยู่ด้านล่าง : P แต่นี่มันช่างน่าอัศจรรย์ดีมาก
Rɪᴋᴇʀ

ยังคงเหนือกว่าสำหรับฉัน: o
Leun Nun

ฉันเรียงลำดับตามการใช้งานบางทีคุณอาจมีคะแนนโหวต แต่มันก็ไม่สำคัญ
Rɪᴋᴇʀ

โอ้มันต่ำกว่าสำหรับฉันแล้วตอนนี้ฮ่า ๆ ๆ
Leaky Nun

1

JavaScript (ES6), 327763 ขั้นตอน (เหมาะสม, 184 ไบต์)

การค้นหาครั้งแรกที่กว้างไม่ฉลาดและไม่เร็วนัก

t=>eval("for(k=[],s=[['0000',i='']];[u,p]=s[i++],u-t;k[v=(1+u-~0+'').slice(-4)]=k[v]||s.push([v,p+'C']))[...u].map(x=>k[v=[...u].map(y=>x-y?y:-~x%10).join``]=k[v]||s.push([v,p+x]));p")

น้อย golfed

t=>{
  k=[]; // mark values already found to reduce search
  for( i=0, s=[['0000','']]; 
       [u,p]=s[i++], // u: current code, p:current steps
       u != t; // exit if target found
     )
  {
     // try all digits present in current code
     [...u].map(x=> {
       v=[...u].map(y=>x-y?y:-~x%10).join`` // apply digit x to u
       if (!k[v]) // check if value v not found already
          k[v] = s.push([v,p+x]));
     })
     v=(1+u-~0+'').slice(-4); // try operator C
     if (!k[v]) // check if value v not found already
       k[v] = s.push([v,p+'C']))
  }
  return p
}

ทดสอบ

f=t=>eval("for(k=[],s=[['0000',i='']];[u,p]=s[i++],u-t;k[v=(1+u-~0+'').slice(-4)]=k[v]||s.push([v,p+'C']))[...u].map(x=>k[v=[...u].map(y=>x-y?y:-~x%10).join``]=k[v]||s.push([v,p+x]));p")

function SingleTest()
{
  var i=S.value
  if (/^\d{4}$/.test(i)) X.value=f(i)
  else X.value='invalid input'
}  

SingleTest()

function LongTest()
{
  var i=0,v,r,t=0
  
  var step=_=>{ 
    v = ('000'+i).slice(-4);
    r = f(v);
    t+= r.length    
    V.value = v;
    R.value = r;
    T.value = t;
    ++i;
    if(i<10000) setTimeout(step, 0)
  }  
  
  step()
}
#V,#T,#S { width:5em }
#R,#X { width: 25em }
Single Test <input id=S value='0093'><button onclick="SingleTest()">-></button><input readonly id=X><hr>
Long test (0000 ... 9999) <button onclick="LongTest()">Go</button>(i mean <i>long</i>, runtime 1 hour)<br>
<input readonly id=V>
<input readonly id=R> 
Total steps:<input readonly id=T>

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