Комбінований лічильник блокування


20

Сцена:

Пітер знаходиться в тренажерному залі разом зі своїм приятелем Брайаном, коли Брайан раптом гостро потребує свого інгалятора. Брайану вдається сказати Пітеру код на його комбінований замок, перш ніж він обвалиться на підлогу.

Щойно Пітер дістається до шафки Брайана і бачить, на що вказує індикатор, Стюі засаджує його і розпорошує на обличчя повну балончик з перцевим спреєм, таким чином осліплюючи Пітера.

Тепер Петро повинен спробувати відкрити замок, не дивлячись на нього. Він починає повертати циферблат вправо, підраховуючи цифри, поки він передає їх. Потім він, за правильним номером, починає повертати циферблат вліво, все ще рахуючи, і, нарешті, повертає його праворуч, поки замок не відкриється.


Змагання:

Напишіть функцію / програму, яка займає два входи, комбінацію від Брайана та положення індикатора. Виведіть числа, які Петро повинен рахувати.

Правила:

  • Поєднання та положення індикатора повинні бути окремими аргументами.
  • Вхід може бути або з командного рядка, або як аргументи функції.
  • Вихід повинен бути надрукований на екран / в іншому випадку відображатися (не подавати)
  • Припустимо, що вихідна позиція не є такою ж, як перше число, і що всі три числа в комбінації є унікальними
  • Це замок, показаний на малюнку нижче, з можливими цифрами: 0-39.

Інструкції:

Щоб відкрити замок нижче, потрібно дотримуватися набору інструкцій:

  1. Ви повинні знати свій код. Припустимо, що зараз (38, 16, 22).
  2. Поверніть циферблат 3 рази праворуч (тричі пропустивши початковий номер), а потім зупиніться, коли перший номер (38) вирівняється з індикатором
  3. Поверніть циферблат 1 повним поворотом ліворуч, пройшовши перший номер, і зупиніться, коли друге число (16) вирівняється з індикатором.
  4. Поверніть циферблат праворуч і зупиніться, коли третій номер (22) вирівняється з індикатором
  5. Потягніть замок вниз

введіть тут опис зображення

Приклад:

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

Діють стандартні правила гольф-коду.

Рішення, розміщені пізніше, все одно можуть виграти, якщо вони коротші, ніж відповідь Денніса.


9
Якщо він не зможе порахувати швидкість, інгалятор був би безглуздим ... Отже, моя програма така:function combination(code){alert("Help! Someone open this locker, the combination is "+code+"!")}
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ, дійсна точка ... :-) Але: 1. Пітер-людина, про яку ми говоримо, - це не найгостріший інструмент у сараї. 2. Ви б не хотіли повідомляти код комусь із вас. 3. Хто знає, може, у Стюі була запасна банка для розпилення ..?
Стюі Гріффін

1
О, так. У Стюі є нескінченна банка перцевого спрею, правда? Ха-ха: 3
Conor O'Brien

Чи можемо ми використовувати альтернативні алгоритми, які все ще відкривають цей замок?
позначки

1
Петру потрібно навчитися єдиноборствам. (А чому немає тренера в тренажерному залі, коли Брайан
зазнає

Відповіді:


3

CJam, 52 39 байт

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

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

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.

1

Groovy, 189 175 байт

Припускає, що показник передається як arg0, а комбо передається як arg1, arg2 та arg3 в командному рядку ...

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)

1

Perl 5 , 129 + 1 (-a) = 130 байт

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]

Спробуйте в Інтернеті!

Як?

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

1

Python 2, 262 байти

Це відчувається так довго. Але ще багато поворотів відбувається.

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

Спробуйте в Інтернеті!

Я думаю, що я можу краще поєднати деякі частини в своєму останньому рядку, але я все ще нова в коді гольфу, і я не знаю, як коротко вирішити цю комбінацію списків.

Будь-які ідеї щодо вдосконалення цього?


0

Haskell , 135 112 байт

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

Спробуйте в Інтернеті!

Збережено 23 байти завдяки Лайконі


Ви можете скоротити декларації, наприклад l s t=, оголосивши оператора інфіксації s#t=. Він також працює більше двох аргументів: (a%b)c s=.
Лайконі

І я думаю, що ти можеш кинути своє s+1.
Лайконі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.