私の「キーボア」は私をキーボーリングしています!最小限のキーストロークを見つけるのを手伝ってください


13

この質問を思いつい@ Agawa001の功績

説明

私の新しい「キーボア」には2つのボタン、つまり+とがあり-ます。

メモリ内の番号はから始まり0ます。

+または-を連続して押すたびに、連続して押された正確な回数だけメモリをインクリメント/デクリメントします。

したがって、+4回押すと、1回目は1、2回目は2、3回目は3、4回目は4を追加します10(10)。

ここで、-3回押すと、1回目は1、2回目2、3回目3が減算され、4(4)が残ります。

TL; DR

+と-の文字列が与えられたら、文字が変わるたびにそれを分割します。次に、m +個のシンボルの各結果の文字列は、m番目の三角形番号を-加算し、n 個のシンボルの各文字列は、n番目の三角形番号を減算します。

ウォークスルー

まだ理解していない場合は、+++--+--作成方法を説明します1

Program   | Counter | Memory
----------------------------
          |  0      | 0
+         | +1      | 1
++        | +2      | 3
+++       | +3      | 6
+++-      | -1      | 5
+++--     | -2      | 3
+++--+    | +1      | 4
+++--+-   | -1      | 3
+++--+--  | -2      | 1

仕事

  • 関数の引数として、またはSTDINから、入力として正の整数を受け取ります。
  • 次に、上記の方法を使用してその数を作成するために必要な最小数のキーストロークを出力/印刷します。

テストケース

+or -runを再配置すると同じ番号が得られるため、そのようなグループごとに、辞書的に最も早いシーケンスのみがリストされます。

Input | Output | Possible corresponding sequences
-------------------------------------------------
    4 |      5 | -+++-
    6 |      3 | +++
    9 |      5 | ++++-
   11 |      7 | +++-+++
   12 |      7 | +++++--, ++++-++
   19 |      8 | -++++++-
   39 |     12 | +++++++++---
   40 |     13 | +++++++++---+, ++++++++-+++-
   45 |      9 | +++++++++
   97 |     20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
  361 |     34 | ++++++++++++++++++++++++++-+++-+++

追加リソース

得点

これはです。バイト単位の最短ソリューションが勝ちです。


9
それは...あなたが退屈だということですか?
-busukxuan

10個のテストケース(私のものを含む)で今は大丈夫だと思います。
エリックアウトゴルファー

@ΈρικΚωνσταντόπουλος12のテストケースが追加されましたが、わずかな変更が加えられています(これ+++++--も代替手段である++-++++ため、削除するのはに等しいためです++++-++)。誰かが効率的なソリューションを思いついた場合に備えて、生成したものを後で追加したい場合があります。
Sp3000

@ Sp3000 ++-++++削除したくありませんでした。また、これはあなたの編集ではなく、私の編集でした。
エリックアウトゴルファー

@ΈρικΚωνσταντόπουλος同等のソリューションの各セットから1つのソリューションのみがリストされます-すべての最小ソリューションがリストされると、テストケースは不必要に長くなると考えられました(40のソリューションは6つ、97のソリューションは17です)。その意図が明確でない場合、私は謝罪します。また、あなたは行方不明でした+++++--(または、同等に、--+++++)、それは私が最初の場所で編集する必要性を感じた理由です。
Sp3000

回答:


2

Python 2、119バイト

def g(n,i=0,s=''):
 c=x=t=0
 for d in s:C=int(d)*2-1;t=(c==C)*t+1;c=C;x+=c*t
 return(x==n)*len(s)or g(n,i+1,bin(i)[3:])

非常に遅いブルートフォースアプローチ。3行目は、文字列のスコアを計算しますx。他の行は、スコアが引数に等しいものが見つかるまで、可能なすべてのバイナリ文字列をループします。

@Leakyは3バイトを節約しました!


s/x==n and len/(x==n)*len/
漏れの修道女

これは、いくつかのバイトを取り除くために保存かもしれませんs:、ちょうどこのように、繰り返し分裂を使うdef f(n): \n while n>0:print n%2;n/=2
漏れ修道女

2

Pyth、25バイト

ffqyQ.as-Mc*RhdY2{s.pM./T

オンラインでお試しください。

これは非常に非効率的であり、f(n)11以上のメモリを使い果たします。f(22)ます。ラップトップでは約10秒で10をます。

説明

  • 1から始まり、数字をループしますT。(f
    • のすべてのパーティションを生成しますT。(./T
    • それらのすべての順列を生成します。(.pM
    • リストをフラット化します。(s
    • リストを一意にします。({)この手順削除できますが、コードがはるかに高速になります。
    • パーティションの結果の順列をフィルタリングします:(f
      • dパーティションの各番号(*R)に1を加えたもの(hd)を掛けます。これにより、結果に加算/減算する数値が2倍になります。
      • リストを長さ2の部分に切り取ります。(c2
      • これらの部分の2番目の数値を2番目の数値から減算します。(-M
      • 結果を合計します。これにより、パーティションの順列が加算、減算などの数として解釈された場合、結果の数が2倍になります。
      • 絶対値を取ります。(.a)結果が負の場合、加算と減算を交換すると正の結果が得られます。
      • 結果が入力の2倍に等しいかどうかを確認します。(qyQ)この場合、パーティション順列が正しい場合、それを返します。
    • フィルターが結果を返した場合、lengthの解がありましたT。戻って印刷しますT

2

MATL43 29バイト

E:"@TFEqZ^!"@Y'tQ**s]vGE=a?@.

これは、メモリと時間の効率が悪いです。オンラインコンパイラは、入力45のみを処理できます。

オンラインでお試しください!

以下は、すべてのテストケースを含む修正版です40(オンラインコンパイラではほぼ1分かかります)。

説明

これは、有効なシーケンスが見つかるまで、長さの昇順で、各長さの可能なすべてのキー押下シーケンスをテストします。

E:       % Range [1 2 ... 2*N] where N is implicit input. The required sequence length is
         % less than 2*N, so this is enough
"        % For each
  @      %   Push current value: length of sequence
  TFEq   %   Push array [1 -1]
  Z^     %   Cartesian power. Gives all possible sequences of 1, -1 of that length
  !      %   Transpose. Each sequence is now a row
  "      %   For each sequence
    @    %     Push current sequence
    Y'   %     Run-length decoding: Pushes an array of values 1 and -1, and then an
         %     array of run-lengths
    tQ*  %     Duplicate, add 1, multiply. Gives twice the triangular number for each run
    *    %     Multiply element-wise by 1 or -1 to produce correct sign
    s    %     Sum of array. This is the number produced by the current sequence
  ]      %   End for
  v      %   Concatenate all numbers into an array
  GE=a   %   True if any of those numbers equals twice the input
  ?      %   If so
    @    %     Push current sequence length. This is the final result
    .    %     Break loop
         %   End if
         % End for
         % Implicit display

@ Sp3000も追加したので、参考のために、4、6、9、および19が順番に参照されるテストケースです。
エリックアウトゴルファー

1

Python、105100バイト

非効率的な幅優先検索を使用します。

def k(n):
 m=t=l=0;h=[]
 while m-n:o=1-2*(t>0);(m,t,l),*h=h+[(m+t-o,t-o,l+1),(m+o,o,l+1)]
 return l
  • h キューとして使用されるリストです
  • m リストの先頭にあるシーケンスの値です
  • t 最後に追加された番号です m
  • l 生成されたシーケンスの長さ m
  • o +/- 1の場合、符号は t

編集:リーキー修道女は5バイトを剃った。


s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
リーキー修道女

s/while m!=n/while m-n/
リーキー修道女
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.