Счетчик кодовых замков


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+"!")}
Конор О'Брайен

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

1
О верно. У Стьюи есть бесконечный баллончик с перцем, верно? Ха-ха: 3
Конор О'Брайен

Можем ли мы использовать альтернативные алгоритмы, которые все еще открывают этот замок?
Bmarks

1
Петр должен изучать боевые искусства. (И почему нет тренера в спортзале, когда Брайан падает? Бюджет сокращается?;)
kirbyfan64sos

Ответы:


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 байта благодаря Laikoni


Вы можете сократить объявления, например l s t=, объявив s#t=вместо этого инфиксный оператор . Он также работает более двух аргументов: (a%b)c s=.
Лайкони

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