カウンターを特定の数に進める最短の方法を見つける


10

カウンターがあります。これは次のような小さなデバイスです。

カウンター

表示がから0000に変わり9999ます。上部に小さなプッシュボタンがあり、カウントを1増やします。右側に小さなノブがあり、その目的はカウンターを0にリセットすることです。

さて、小さなつまみの重要な点は、後ろに回すと、もう一度前に回すと、必要な桁を増やすことができるということです。カウンターボタンを10回押してカウンターが表示されたら0010、小さなクリック音が聞こえるまでノブを後ろに回してから、もう一度前に回してまっすぐにし0090ます。

ただし、つまみは、数字を進めるたびに、常に同じ数字のすべての出現を1ずつ増やします。カウンタが示すのであれば6060、あなたはそれがに増加させることができ7070ないように、6070または7060。また、ノブはキャリーせずに9s にロールオーバーする0ため、またはの代わりに0990進みます。000010001100


カウンターを特定の数に設定する最も効率的な方法を知りたいです。あなたの仕事は、そうするために必要なボタン押しとノブ前進の最短シーケンスを決定するプログラムまたは関数を書くことです。

プログラムは、入力としてから0000までの4桁の数値を受け取り9999、一連のステップを次の形式で返します。

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

ここでC、「カウンターボタンを押す」をD表し、0から9までの数字は、「ノブを使用してすべての発生をD1つ進める」ことを表します。

プログラムは、考えられるすべての4桁の組み合わせに対して有効なステップのシーケンスを生成する必要があり、10,000ケースすべてに必要なステップの合計数によってスコアが付けられます。引き分けの場合(最適なアルゴリズムが見つかる可能性が高い)、短いコードが優先されます。


ノブを前に回すとどうなりますか?それがオンになります00100020、その場合には?または、ノブを後ろに回すだけですか?また、各「D」はノブの「D」の前進数としてカウントされますか(たとえば、1234567ノブを1回、2回、3回などと回します)。それとも、ノブを個別に回すことを意味しているだけ1234567ですか(たとえば、ノブを7回回すだけです)。
R. Kap

上記と以下は無関係です。
Leaky Nun

ノブは下の桁も選択できます。
Leaky Nun

ノブを前方に回すと、ノブが既にある位置に応じて、0010から0020または1111に進みます。ノブを後方に回して位置を設定し、次に前方に回して桁を進めます。
Joe Z.

1
真剣に、この男は正しい値のカウンターが必要です!!!! 今!!!
CalculatorFeline

回答:


5

Lua、327763ステップ(最適、276バイト)

ゴルフ版:

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 空白が1つだけあることを除いて、コードの残りの部分がゴルフになっていることは、私には興味津々でした。

...それ golfed、右?または、Mathematicaは新しいラインノイズですか?


1

Pyth、327763ステップ(最適、130バイト)

オンラインコンパイラは、このような膨大な作業を扱っで無能なので、私はそれだけで生成さそうということ、それをあまり仕事を与えている011111。ただし、上部の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
Leaky Nun

私はアクティブでソートします。おそらく投票があります。しかし、それは本当に重要ではありません。
Rɪᴋᴇʀ

ああ、それは私にとって今下ですlol
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")

ゴルフが少ない

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.