ロックを解除します


34

3桁のコンビネーションロックで自転車をロックしました。今、あなたは乗車に行きたいので、次のプログラムの助けを借りてそれを解除する必要があります。

入力

第1パラメーター

ロック状態のロックの数字の組み合わせ。2番目のパラメーター(= ロック解除状態の組み合わせ)とは異なる必要があります。(または、自転車が盗まれる可能性があります!)

範囲000..999。先行ゼロは省略できません。

2番目のパラメーター

ロック解除状態のロックの数字の組み合わせ。この値が目標です。

範囲000..999。先行ゼロは省略できません。

出力

初期状態(常に1番目のパラメーター)と最後のステップ(常に2番目のパラメーター)を含む各「回転」後の組み合わせロックの各状態のリスト。

アルゴリズム

ロック解除状態で正しい数字に到達するまで、最初の数字を1つずつ「回転」させます。ただし、ロック解除コード全体を理解しているためロック解除状態の数字に到達するために必要な回転量が最小になる方向に数字を回転させます。。同点の場合、好きな方向を選択できます。

正しい最初の桁に達したら、2番目から3番目まで同じ手順を開始します。

数字の順序は、円として理解することです。

... 9 0 1 2 3 4 5 6 7 8 9 0 1 2 ...

つまり、1から9までの最小回転量は

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 = 8

しかし

1 -> 0 -> 9 = 2。

ノート

例1、正しい

Input: 999 001

Output:
999
099
009
000
001

例2、正しい

Input: 000 292

Output:
000
100
200
290
291
292

例3、誤った出力

Input: 999 121

Wrong output:
999
899 // Wrong because wrong rotation direction.
799
699
...

Correct output:
999
099
199
109
119
129
120
121

例4、間違った入力

Input: 1 212 // Wrong because no leading zeros.

これは、最短回答が勝つです。


2つのパラメーターの順序を変更できますか?
7

数字が最適である限り、任意の順序で更新できますか?
アーナルド

@Arnauldいいえ、ロックを1つずつ解除するためです。)
user2190035

2
@ Night2いいえ、プログラムは組み合わせルックの「ロック解除プロセス」をシミュレートする必要があるためです。
user2190035

回答:


12

パイソン2113の 107 105 99 95バイト

a,b=input()
i=0
print a
for x in a:
 while x-b[i]:a[i]=x=(x+(x-b[i])%10/5*2-1)%10;print a
 i+=1

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

入力を整数のリストとして受け取ります


保存済み:

  • -6バイト、Joelのおかげ
  • -4バイト、Jitseのおかげ

2
別の計算方法を使用して99バイト
ジョエル

@ジョエルありがとう!:)
TFeld

2
96バイト -ボーナス:任意の配列サイズのための作品
Jitse

1
95バイト -あなたは、Python 2を使用しているので、として失うWELかもしれない//
Jitse

@Jitseありがとう:)
TFeld

6

ゼリー、15バイト

_æ%5ḣT$ṂṠ⁸_%⁵ðƬ

[09]スタートコードからコードのリストのリストを与える、長さが等しいが、それ以外は任意)ターゲットコードに。

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

どうやって?

_æ%5ḣT$ṂṠ⁸_%⁵ðƬ - Link: list of integers, s; list of integers, t
              Ƭ - collect up values until a fixed point is reached applying:
             ð  -   the dyadic chain:  (i.e. f(x, t) where x starts off as s)
_               -     subtract (t from x) (vectorises) - i.e. [ta-xa, tb-xb, tc-xc]
   5            -     literal five
 æ%             -     symmetric modulo (vectorises) - i.e. [[-4..5][ta-xa], [-4..5][tb-xb], [-4..5][tc-xc]]
      $         -     last two links as a monad:
     T          -       truthy indices  - e.g. [0,-4,1]->[2,3]
    ḣ           -       head to index (vectorises)       [[0,-4],[0,-4,1]]
       Ṃ        -     minimum                            [0,-4]
        Ṡ       -     sign (vectorises)                  [0,-1]
         ⁸      -     chain's left argument (x)
          _     -     subtract (vectorises) - i.e. move the single spindle one in the chosen direction
            ⁵   -     literal ten
           %    -     modulo (since 9+1=10 not 0)

4

JavaScript(ES6)、 73 72  70バイト

@tshのおかげで2バイト節約

カリー化された構文で2桁の配列として入力を受け取ります(a)(b)。文字列を返します。

a=>g=b=>b.some(x=>d=x-(a[++i]%=10),i=-1)?a+`
`+g(b,a[i]+=d/5<5/d||9):b

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

コメント済み

a =>                  // a[] = initial combination
g = b =>              // b[] = target combination
  b.some(x =>         // for each digit x in b[]:
    d =               //   compute the difference d:
      x -             //     between x
      (a[++i] %= 10), //     and the corresponding digit in a[]
                      //     we apply a mod 10, because it may have exceed 9
                      //     during the previous iteration
    i = -1            //   start with i = -1
  ) ?                 // end of some(); if it's truthy:
    a + `\n` +        //   append a[] followed by a line feed
    g(                //   followed by the result of a recursive call:
      b,              //     pass b[] unchanged
      a[i] +=         //     add either 1 or 9 to a[i]:
        d / 5 < 5 / d //       add 1 if d / 5 < 5 / d
        || 9          //       otherwise, add 9
    )                 //   end of recursive call
  :                   // else:
    b                 //   stop recursion and return b[]

d/6&1^d>0||9->d/5>5/d?9:1
tsh


2

パイソン2101の 97バイト

a,c=input()
print a
for i in 0,1,2:
 while a[i]!=c[i]:a[i]=(a[i]+(a[i]-c[i])%10/5*2-1)%10;print a

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

Joelに送信される3バイト。

入力をintのリストとして受け取ります。



1
@ジョエル:ありがとう!実際、Python 2で//あるため、と同じ/であるため、追加のバイトが得られます。
チャスブラウン

これと全く同じアプローチのように見えますTFeldの答え@ますが、若干の修正を加えた
Jitse

@Jitse:そうですね、私たちは両方とも答えを修正しています。例えば、彼がで始めたfor x,y,i in zip(a,c,[0,1,2])...私は思い出す場合
チャス・ブラウン


1

PHP、114バイト

for([,$a,$b]=$argv;$i<3;($x=$a[$i]-$b[$i])?(print$a._).$a[$i]=($y=$a[$i]+(5/$x>$x/5?-1:1))<0?9:$y%10:++$i);echo$b;

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

私の解決策はおそらくひどいですが、それは私が今のところ考えることができる最高です!


1

、48バイト

θ≔EθIιθF³«≔⁻﹪⁺⁻I§ηι§θι⁵χ⁵ζF↔櫧≔θι﹪⁺§θι÷ζ↔ζχ⸿⪫θω

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

θ

初期位置を印刷します。

≔EθIιθ

計算のために、初期位置文字列を数字の配列に変更します。

F³«

各桁を順番にループします。

≔⁻﹪⁺⁻I§ηι§θι⁵χ⁵ζ

その桁のロックを解除するために必要な回転数を計算します。これはから数で-54どこ-55つの下向きの回転を意味し、44つの上向きの回転を意味します。

F↔ζ«

各回転をループします。

§≔θι﹪⁺§θι÷ζ↔ζχ

回転の符号に従って数字を更新します。

⸿⪫θω

新しい行に数字を文字列として出力します。


1

T-SQL 2008、170バイト

読みやすくするために改行を追加しました

DECLARE @1 char(3)='123',@2 char(3)='956'

DECLARE @r int,@s int,@ int=0
g:SET @+=1
h:SELECT @r=substring(@1,@,1)+9,@s=@r-substring(@2+'1',@,1)
IF @s=9GOTO g
PRINT @1
SET @1=stuff(@1,@,1,(@r+@s/5%2*2)%10)
IF @<4GOTO h

オンラインで試す


このソリューションは、出力の先頭の0を保持しません。例:000-999
マシュー

1
@Matthewあなたはほぼ正しいです、私は入力オプションでこのビルドを使用したいと思っていましたが、入力で0で始まる場合は入力から削除されます。ただし、失敗するのはソリューションではありません
t-clausen.dk

1
@Matthew-これは修正されました。とにかくSQLの一部ではない入力ボックスを削除しました
t-clausen.dk



0

MATLAB、100 89バイト

別のアプローチ(暗黙的な展開を使用して減算行列を作成する)は、11バイトを削減します。

function f(a,b);c = mod(a-b+5,10)-5;a,mod(a-cumsum(repelem(eye(3).*sign(c),abs(c),1)),10)

[元の100バイトソリューション]

function f(a,b);c=mod(a-b+5,10)-5;a,for n=1:3;for r=1:abs(c(n));a(n)=mod(a(n)-sign(c(n)),10),end;end

両方とも、入力を3要素配列として渡すことで呼び出されます。たとえば、 f([9 1 1], [2 3 2])




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