ปลดล็อคล็อคของคุณ


34

คุณล็อคจักรยานของคุณด้วยรหัสล็อค 3 หลัก ตอนนี้คุณต้องการไปนั่งและต้องปลดล็อคด้วยความช่วยเหลือของโปรแกรมต่อไปนี้

อินพุต

พารามิเตอร์ที่ 1

การรวมกันของล็อคของคุณอยู่ในสถานะล็อค มันจะต้องแตกต่างจากพารามิเตอร์ที่ 2 (= การรวมกันของสถานะปลดล็อค ) (หรืออาจถูกขโมยจักรยานของคุณ!)

ช่วง 000..999 ต้องไม่ละเว้นศูนย์นำหน้า

พารามิเตอร์ที่ 2

การรวมกันของล็อคของคุณอยู่ในสถานะปลดล็อค ค่านี้เป็นเป้าหมายของคุณ

ช่วง 000..999 ต้องไม่ละเว้นศูนย์นำหน้า

เอาท์พุต

รายการของแต่ละรัฐของการรวมกันล็อคหลังจากแต่ละ "การหมุน" รวมถึงสถานะเริ่มต้น (ซึ่งมักจะเป็นพารามิเตอร์ที่ 1) และขั้นตอนสุดท้าย (ซึ่งมักจะเป็นพารามิเตอร์ที่ 2)

ขั้นตอนวิธี

คุณเริ่ม "หมุน" หลักแรกทีละหนึ่งจนกว่าคุณจะถึงตัวเลขที่ถูกต้องในสถานะปลดล็อค แต่เพราะคุณอยู่ในความรู้เกี่ยวกับการปลดล็อครหัสทั้งคุณหมุนหลักในทิศทางที่คุณต้องมีจำนวนน้อยที่สุดของการหมุนไปถึงหลักในการปลดล็อครัฐ ในกรณีที่เสมอกันคุณสามารถเลือกทิศทางใดก็ได้ที่คุณต้องการ

เมื่อคุณถึงหลักแรกที่ถูกต้องคุณจะเริ่มขั้นตอนเดียวกันกับที่ 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

หมายเหตุ

  • คุณสามารถพึ่งพากฎ I / O เริ่มต้น
  • คุณสามารถเปลี่ยนลำดับของพารามิเตอร์

ตัวอย่าง

ตัวอย่างที่ 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

คำตอบ:


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 ไบต์ใช้วิธีอื่นในการคำนวณ
โจเอล

@ Joel ขอบคุณ! :)
TFeld

2
96 ไบต์ - โบนัส: ใช้ได้กับอาร์เรย์ทุกขนาด
Jitse

1
95 ไบต์ - เนื่องจากคุณใช้ Python 2 อาจเป็นเพราะคุณสูญเสีย//
Jitse

@Jitse ขอบคุณ :)
TFeld

6

เยลลี่ 15 ไบต์

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

[0,9]

ลองออนไลน์!

อย่างไร?

_æ%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 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @tsh

จะเข้าเป็น 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

ลองออนไลน์!

3 ไบต์ขอบคุณไปยังโจเอล

รับอินพุตเป็นรายการของ ints



1
@ Joel: ขอบคุณ! ที่จริงแล้วมันเป็น Python 2 //เหมือนกัน/ดังนั้นจึงได้รับไบต์เพิ่ม
Chas Brown

ดูเหมือนว่าวิธีการเดียวกันกับคำตอบของ @ TFeldแต่มีการแก้ไขเล็กน้อย
Jitse

@Jitse: เราทั้งคู่ต่างก็ปรับเปลี่ยนคำตอบของเรา ตัวอย่างเช่นเขาเริ่มต้นด้วยfor x,y,i in zip(a,c,[0,1,2])ถ้าฉันจำ ...
Chas Brown

1

เยลลี่ 30 ไบต์

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

ลองออนไลน์!

ลิงก์ dyadic ที่ใช้เป็นอาร์กิวเมนต์ด้านซ้ายจะเป็นรหัสปลดล็อคและสถานะการล็อกปัจจุบันที่ถูกต้องทั้งสองเป็นรายการของจำนวนเต็ม

นี่มันนานเกินไป!


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
@ แมทคุณเกือบจะถูกต้องฉันหวังว่าจะใช้ตัวเลือกการสร้างนี้ในการป้อนข้อมูลอย่างไรก็ตามถ้าคุณเริ่มต้นด้วย 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

Java (JDK) , 139 ไบต์

a->b->{for(int i;;a[i]+=(a[i]-b[i]+10)%10<5?9:1,a[i]%=10){System.out.println(""+a[i=0]+a[1]+a[2]);for(;i<3&&a[i]==b[i];i++);if(i>2)break;}}

ลองออนไลน์!

อัลกอริทึมเช่นเดียวกับทุกคนรีดแตกต่างกันเพราะ Java System.out.printlnมีราคาแพงมาก



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.