Tìm cách ngắn nhất để tiến một bộ đếm đến một số nhất định


10

Tôi có một quầy. Đây là một thiết bị nhỏ trông như thế này:

quầy tính tiền

Màn hình hiển thị từ 0000đến 9999. Nó có một nút ấn nhỏ ở phía trên làm tăng số đếm lên 1 và một núm nhỏ ở bên phải có mục đích đặt lại bộ đếm trở về 0.

Bây giờ, điều về núm nhỏ là nếu bạn xoay ngược lại, bạn có thể làm cho nó tăng bất kỳ chữ số nào bạn muốn một khi bạn xoay nó về phía trước một lần nữa. Vì vậy, nếu tôi nhấn nút bộ đếm 10 lần để bộ đếm hiển thị 0010, sau đó tôi có thể xoay núm về phía sau cho đến khi tôi nghe thấy một tiếng click nhỏ, sau đó xoay nó về phía trước một lần nữa và làm cho nó đi thẳng vào 0090.

Nhưng, núm sẽ luôn tăng tất cả các lần xuất hiện của cùng một chữ số mỗi lần nó đẩy số về phía trước. Vì vậy, nếu bộ đếm hiển thị 6060, bạn chỉ có thể làm cho nó tăng lên 7070, không 6070hoặc 7060. Ngoài ra, núm sẽ cuộn 9qua 0mà không mang theo, vì vậy 0990sẽ tiến tới0000 thay vì 1000hoặc 1100.


Tôi muốn biết cách hiệu quả nhất để đặt bộ đếm thành một số nhất định. Nhiệm vụ của bạn là viết một chương trình hoặc chức năng sẽ xác định chuỗi lần nhấn nút ngắn nhất và các tiến bộ núm cần thiết để thực hiện.

Chương trình của bạn sẽ mất như là đầu vào một số 4 chữ số từ 0000đến 9999, và trả về một loạt các bước trong các định dạng sau:

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

Chữ Cviết tắt của "nhấn nút truy cập" và bất kỳ chữ số nàoD từ 0 đến 9 là viết tắt của "sử dụng núm xoay để tiến tất cả các lần xuất hiện của D1".

Chương trình của bạn phải tạo một chuỗi các bước hợp lệ cho tất cả các kết hợp bốn chữ số có thể và sẽ được ghi bằng tổng số bước cần thiết cho tất cả 10.000 trường hợp. Trong trường hợp hòa (rất có thể khi tìm thấy thuật toán tối ưu), mã ngắn hơn sẽ giành chiến thắng.


Điều gì xảy ra nếu bạn xoay núm về phía trước? Nó sẽ biến 0010thành 0020trong trường hợp đó? Hoặc bạn chỉ có thể xoay núm về phía sau? Ngoài ra, mỗi "D" có được tính là "D" số lần tiến bộ của núm (chẳng hạn, có 1234567nghĩa là xoay núm 1 lần, sau đó 2 lần, sau đó 3 lần, v.v.) không? Hoặc nó chỉ biểu thị cho mỗi lần xoay núm riêng biệt (ví dụ, 1234567chỉ có nghĩa là xoay núm 7 lần)?
R. Kap

Hình như bên trên và bên dưới không liên quan.
Leaky Nun

Các núm thậm chí có thể chọn chữ số ở bên dưới.
Leaky Nun

Xoay núm về phía trước sẽ tiến 0010 đến 0020 hoặc 1111, tùy thuộc vào vị trí mà núm đã được đặt. Bạn xoay núm về phía sau để đặt vị trí của nó, sau đó chuyển tiếp để tiến lên các chữ số.
Joe Z.

1
Nghiêm túc mà nói, anh chàng này cần quầy của mình ở giá trị chính xác !!!! HIỆN NAY!!!
Máy

Câu trả lời:


5

Lua, 327763 bước (tối ưu, 276 byte)

Phiên bản chơi gôn:

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[(...)])

Phiên bản cải tiến của các ví dụ trong câu hỏi (chỉ 1000được cải thiện):

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

Phiên bản bị đánh cắp:

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

Toán, điểm 512710

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

Sửa lỗi với StringRepeat(hành xử không chính xác StringRepeat[x_String,0])


Có cần phải có một không gian trong StringRepeat[x_String, 0]:=""?
con mèo

Không, nhưng tôi đã quá lười biếng để loại bỏ nó. Đó có phải là vấn đề không?
Máy

Hoàn toàn không: P Tôi chỉ tò mò rằng phần còn lại của mã được đánh gôn ngoại trừ một khoảng trắng.
con mèo

... đó golf, phải không? Hay là Mathicala là dòng nhiễu mới?
con mèo

@cat Đây không phải là môn đánh gôn
pppery

1

Pyth, 327763 bước (tối ưu, 130 byte)

Vì trình biên dịch trực tuyến không có khả năng xử lý các tác vụ lớn như vậy, tôi đã cho nó ít công việc hơn, để nó chỉ tạo ra 0 , 11111. Tuy nhiên, về mặt lý thuyết nó có thể giải quyết vấn đề, bởi vì nó sử dụng thuật toán tương tự như Lua ở trên cùng.

Hãy thử trực tuyến!

=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

Làm thế nào nó hoạt động:

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

Chỉ cần lưu ý: Một lua là dưới đây. : P Nhưng điều này thật tuyệt vời, làm việc tốt.
Rɪᴋᴇʀ

Vẫn còn ở trên đối với tôi: o
Leaky Nun

Tôi sắp xếp theo hoạt động, có thể bạn có phiếu bầu. Nhưng nó không thực sự quan trọng.
Rɪᴋᴇʀ

Ôi nó ở dưới đây đối với tôi bây giờ lol
Leaky Nun

1

JavaScript (ES6), 327763 bước (tối ưu, 184 byte)

Một tìm kiếm đầu tiên Breadth, không quá thông minh và không quá nhanh.

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

Ít chơi gôn

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
}

Kiểm tra

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.