解锁你的锁


34

您已使用3位数的密码锁锁定了自行车。现在您想去兜风,需要在以下程序的帮助下将其解锁。

输入项

第一个参数

处于锁定状态的锁的数字组合。它必须不同于第二个参数(= 解锁状态的组合)。(否则您的自行车可能会被盗!)

范围000..999。不能省略前导零。

第二个参数

处于解锁状态的锁的数字组合。此值是您的目标。

范围000..999。不能省略前导零。

输出量

每次“旋转”之后,组合锁的每个状态的列表,包括初始状态(始终为第一个参数)和最后一步(始终为第二个参数)。

算法

您开始逐个“旋转”第一个数字,直到在解锁状态下到达正确的数字为止。但是,由于您了解整个解锁代码,因此可以在需要最小旋转量的方向上旋转数字,以达到处于解锁状态的数字。如果是平局,您可以选择自己喜欢的方向。

当您到达正确的第一位数字时,请从第二位开始相同的过程,然后从第三位开始。

数字顺序应理解为圆:

... 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.

这是的最短答案。


我可以更改两个参数的顺序吗?
tsh

我们可以以最佳顺序更新数字吗?
Arnauld

@Arnauld否,因为我一步一步地解锁了锁:)
user2190035

2
@ Night2不,因为程序应该模拟组合外观的“解锁过程”。
user2190035

Answers:


12

Python 2中113个 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个字节
乔尔

@乔尔谢谢!:)
TF于

2
96字节 -奖励:适用于任何数组大小
Jitse

1
95个字节 -由于您使用的是Python 2,可能会丢失//
Jitse,

@Jitse谢谢:)
TF于

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

Python 2中101个 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个字节。

将输入作为整数列表。



1
@Joel:谢谢!实际上,由于它是Python 2,//因此与相同/,因此获得了一个附加字节。
Chas Brown

这看起来与@TFeld的答案完全相同,但是稍有修改
Jitse

@Jitse:好吧,我们俩都在修改答案。例如,for x,y,i in zip(a,c,[0,1,2])如果我还记得的话,他从...
查斯·布朗

1

果冻,30个字节

_ż+¥⁵AÞḢṠxAƊ×€ʋ"JṬ€$$Ẏ;@W}+\%⁵

在线尝试!

一个二进位链接,以解锁代码为其左参数,其右边为当前锁定状态,均作为整数列表。

感觉太久了!


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§ηι§θι⁵χ⁵ζ

计算解锁该数字所需的转数。这是从-5到的数字4-5表示向下5次旋转,4装置4向上旋转。

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




0

Kotlin,162字节

{s:Array<Int>,e:Array<Int>->var i=0
o@while(i<3){println(""+s[0]+s[1]+s[2])
while(s[i]==e[i]){if(i>1)break@o
i++}
s[i]=(s[i]+if((e[i]-s[i]+10)%10>5)9 else 1)%10}}

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.