Penghitung kunci kombinasi

20

Adegannya adalah:

Peter berada di gym bersama temannya Brian ketika Brian tiba-tiba membutuhkan inhalernya. Brian berhasil memberi tahu Peter kode ke kunci kombinasinya sebelum ia jatuh di lantai.

Saat Peter sampai ke loker Brian dan melihat apa yang ditunjukkan indikator, Stewie menyergapnya dan menyemprotkan semprotan merica ke wajahnya, sehingga membutakan Peter.

Peter sekarang harus mencoba membuka kunci tanpa melihatnya. Dia mulai memutar tombol ke kanan, menghitung angka sementara dia melewatinya. Dia kemudian, pada nomor yang benar mulai memutar tombol ke kiri, masih menghitung, dan akhirnya memutarnya ke kanan sampai kunci terbuka.


Tantangan:

Tulis fungsi / program yang mengambil dua input, kombinasi dari Brian, dan posisi indikator. Keluarkan angka-angka yang harus dihitung oleh Peter.

Aturan:

  • Kombinasi dan posisi indikator harus merupakan argumen yang terpisah.
  • Input dapat berupa dari command prompt atau sebagai argumen fungsi.
  • Output harus dicetak ke layar / ditampilkan (tidak ke file)
  • Asumsikan bahwa posisi awal tidak sama dengan angka pertama, dan ketiga angka dalam kombinasi itu unik
  • Ini adalah kunci yang ditunjukkan pada gambar di bawah ini, dengan angka yang mungkin: 0-39.

Instruksi:

Untuk membuka kunci di bawah ini, Anda harus mengikuti serangkaian instruksi:

  1. Anda harus tahu kode Anda. Anggap saja (38, 16, 22) untuk saat ini.
  2. Putar tombol 3 kali ke kanan (melewati angka awal tiga kali), lalu berhenti ketika angka pertama (38) sejajar dengan indikator
  3. Putar tombol 1 putaran penuh ke kiri, melewati angka pertama, dan berhenti ketika angka kedua (16) sejajar dengan indikator.
  4. Putar tombol putar ke kanan dan berhenti ketika angka ketiga (22) sejajar dengan indikator
  5. Tarik kunci ke bawah

masukkan deskripsi gambar di sini

Contoh:

Input
38 16 22
33  

Output
33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  39   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0  39  38  37  36  35  34  33  32  31  30  29  28  27  26  25  24  23  22

Aturan golf kode standar berlaku.

Solusi yang diposting kemudian masih bisa menang jika lebih pendek dari jawaban Dennis.

Stewie Griffin
sumber
9
Kecuali dia dapat mempercepat hitungan, penghirup tidak ada gunanya ... Dengan demikian, program saya adalah:function combination(code){alert("Help! Someone open this locker, the combination is "+code+"!")}
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ, poin yang valid ... :-) Tetapi: 1. Orang yang kita bicarakan bukanlah alat yang paling tajam di dalam gudang. 2. Anda tidak ingin memberi tahu kode itu kepada seseorang. 3. Siapa tahu, mungkin Stewie punya kaleng semprotan cadangan ..?
Stewie Griffin
1
Oh benar Stewie memiliki kaleng semprotan merica yang tak terbatas, kan? Haha: 3
Conor O'Brien
Bisakah kita menggunakan algoritma alternatif yang masih membuka kunci itu?
menandai
1
Peter perlu belajar seni bela diri. (Dan mengapa tidak ada pelatih di gym ketika Brian pingsan? Pemotongan anggaran
?;

Jawaban:

3

CJam, 52 39 byte

q~[3X0].{@40,m<1$({(+W%}&:T*T@#)T<)}e_p

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

q~      e# Read and evaluate all input. This pushes the initial position
        e# as an integer and the combination as an array.
[3X0]   e# Push [3 1 0]. This encodes the respective numbers of full turns
.{      e# For each number in the combination (N) and the corresponding 
        e# number of full turns (F):
  @     e#   Rotate the initial position on top of the stack.
  40,m< e#   Push [0 ... 39] and rotate it that many units to the left.
        e#   For position P, this pushes [P P+1 ... 39 0 ... P-2 P-1].
  1$(   e#   Copy F and subtract 1.
  {     e#   If the result is non-zero:
    (+  e#     Rotate the array of length 40 one unit to the left.
    W%  e#     Reverse it.
  }&    e#   For position P, this pushes [P P-1 ... 0 39 ... P+2 P+1].
  :T*   e#   Save in T and repeat the array F.
  T@    e#   Push T. Rotate N on top of the stack.
  #)    e#   Find the index of N in T and add 1 to it.
  T<    e#   Keep that many elements from the beginning of T.
  )     e#   Pop the last element of the result (N).
}       e# N is the new initial position.
e_p     e# Flatten the resulting array and print it.
Dennis
sumber
1

Groovy, 189 175 byte

Asumsikan indikator diteruskan sebagai arg0 dan kombo dilewatkan sebagai arg1, arg2, dan arg3 pada baris perintah ...

i=(args[0]as int)+1
r={i--;i=i<0?39:i;print"$i "}
l={i=++i%40;print"$i "} 
M={j,c->while(i!=j as int){c()}}
120.times{r()}
M(args[1],r)
40.times{l()}
M(args[2],l)
M(args[3],r)
K. Klassen
sumber
1

Perl 5 , 129 + 1 (-a) = 130 byte

sub c{$f=pop;do{say$f;$f+=$_[0];$f=$f==-1?39:$f==40?0:$f}while$f-$_[1]}$p=3;c(2*!$p-1,@F[$_,$p]),$p=$_ for 3,3,3,0,0,1,2;say$F[2]

Cobalah online!

Bagaimana?

sub c{                       # Takes 3 parameters: increment, ending position, starting position
  $f=pop;                    # first place to start counting
  do{
    say$f;                   # output current position
    $f+=$_[0];               # move position
    $f=$f==-1?39:$f==40?0:$f # roll over when passing zero
  }while$f-$_[1]             # stop when ending positition reached
}

# @F gets defined by the -a command line option
# @F holds the combination followed by the starting position

$p=3;                       # starting position is in array index 3, this variable will track the array index of
                            # the current position on the dial

c(2*!$p-1,@F[$_,$p]),$p=$_  # call the movement function (c), setting direction to the left (1) or right (-1) as needed
                            # based on the array index of the previous position (go left when moving from array index 0)
for 3,3,3,0,0,1,2;          # list of the array index of the next position

say$F[2]                    # output final position
Xcali
sumber
1

Python 2, 262 byte

Rasanya sangat lama. Tetapi ada juga banyak perubahan terjadi.

def f(l,s):
 r=lambda a,b,c=1:range(a,b,c)
 a=r(39,l[0],-1);b=r(l[0],-1,-1)
 c=r(l[1],l[2]-1,-1)if l[2]<l[1]else r(l[1],-1,-1);c.extend(r(39,l[2]-1,-1))
 return'  '.join(`x`for x in sum([r(s,-1,-1),a,b,a,b,a,b,r(39,l[0],-1),r(l[0],40),r(0,40),r(0,l[1]+1),c],[]))

Cobalah online!

Saya pikir saya dapat menggabungkan beberapa bagian dengan lebih baik di baris terakhir saya, tetapi saya masih baru dengan kode golf dan saya tidak tahu bagaimana menangani kombinasi daftar itu dengan cara yang singkat.

Adakah Ide untuk meningkatkan ini?

Simon
sumber
0

Haskell , 135 112 byte

s!t=[s..39]++[0..mod(t-1)40]
s#t=[s,s-1..0]++[39,38..mod(t+1)40]
(a%b)c s=[s#s,s#s,s#s,s#a,a!a,a!b,b#c,[c]]>>=id

Cobalah online!

Disimpan 23 byte berkat Laikoni

jferard
sumber
Anda dapat mempersingkat deklarasi seperti l s t=dengan mendeklarasikan operator infiks s#t=sebagai gantinya. Ia juga bekerja selama lebih dari dua argumen: (a%b)c s=.
Laikoni
Dan saya pikir Anda bisa menjatuhkannya s+1.
Laikoni