Бросать кости


16

Бросать кости

Итак, я катал кости недавно и подумал о вызове.

Учитывая куб с сеткой, взятой из входных данных и списком ходов, найдите квадрат внизу в конце.

Кубическая карта

Я буду использовать это изображение для примеров здесь.

вход

Вы берете в строку со списком ходов. Строка содержит только заглавные буквы ASCII N, S, W и E. Они соответствуют повороту куба на один шаг в этом направлении.

На снимке один N сделал бы нижнюю грань а 6. На этом изображении север удален от камеры, юг направлен в сторону, восток направлен, а запад оставлен.

Вы также берете строку в следующем формате: 1P 2P 3P 4P 5P 6P, где каждый P - это позиция из N, S, W, E, T и B. T & B - это низ и верх.

Числа - это лицо с этим номером, а буква представляет позицию, в которой находится лицо. Если неясно, сеть всегда будет упорядочена по номеру, поэтому 1P 2P 3P 4P 5P 6P, а не 2B 1T 3N 4S 5W 6E.

Положение на изображении 1S 2B 3E 4W 5T 6N.

Выход

Ваша программа должна вывести число, представляющее нижнюю сторону.

Тестовые случаи

(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4

Другие правила

Вы также можете предположить, что куб находится в бесконечной плоской плоскости, возможно, с каким-то трением.

Стандартные лазейки запрещены, хотя я не могу их найти.

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

Поскольку эта программа должна уместиться на моей кости, она должна быть как можно меньше. Я считаю в байтах, с некоторыми исключениями для языков, таких как папки .


2
Означает ли первый тестовый пример, (nothing) -> 2что сеть не предоставлена, или где-то должна быть сеть?
Sp3000

2
« На рисунке один N сделал бы нижнюю грань 2 », разве нижняя грань уже не 2?
paulvs

@ Sp3000, отредактировано, сеть должна быть предоставлена, но ваш код не должен обрабатывать команды перемещения.
Rɪᴋᴇʀ

1
Вы измеряете размер вашей кости в байтах?
Cyoce

@Cyoce Нет, просто текст на каждом лице. Таким образом, лицо с 🍄 на нем будет 4 байта. Для этой задачи я хочу соответствовать коду, который вы пишете на моей кости. Для этого мне нужен небольшой код.
Rɪᴋᴇʀ

Ответы:


8

CJam, 43 40 37 34 байта

Спасибо Деннису за помощь в экономии 6 байтов.

lW%3/$1f=q{i8%"ÉĔɠƂ!"=i\m!=}/c

Проверьте это здесь.

объяснение

lW%    e# Read the first line and reverse it.
S/     e# Split it around spaces.
$      e# Sort it. This puts the faces in order [B E N S T W].
1f=    e# Select the second character from each face, which is the number.
q      e# Read the remainder of the input (the instructions).
{      e# For each instruction...
  i8%  e#   Convert the character (NWSE) to an integer and take modulo 8.
  "ÉĔɠƂ!"=i
       e#   Use that to (cyclically) index this string and convert *that* character
       e#   to an integer.
  \    e#   Swap with the list of faces.
  m!   e#   Generate all permutations of the faces.
  =    e#   Select the permutation corresponding to the above integer.
}/     e# At the end of the loop, the bottom face will be the first character.
c      e# Convert the string to a character, which discards everything but the bottom face.

Что касается того, как работает отображение символов инструкции в перестановки, вот удобная таблица:

   i   8%  5%  ""=   i   [0 1 2 3 4 5]m!=

N  78   6   1   Ĕ   276  [2 1 4 0 3 5]
W  87   7   2   ɠ   608  [5 0 2 3 1 4]
S  83   3   3   Ƃ   386  [3 1 0 4 2 5]
E  69   5   0   É   201  [1 4 2 3 5 0]

Я включил 5%столбец, потому что это то, что циклическое индексирование в строке делает неявно. Для четырех перестановок мы видим, что каждая из них оставляет две (противоположные) стороны нетронутыми и циклически переставляет остальные четыре.


Как вы представляете перестановки как эти символы Unicode? Как Ĕ представляет перестановку N [2 1 4 0 3 5]? Я смотрел на это часами.
paulvs

1
@paulvs Код символа Ĕ- 276. 6e!дает вам список всех 720 перестановок [0 1 2 3 4 5]. И 276случается, что индекс [2 1 4 0 3 5]в этом списке.
Мартин Эндер

Я хотел, чтобы больше людей ответили, но ты был самым коротким. Congrats.
2015 года

5

Perl 166 158 154 144 139 135 134 132 116 байт

включает +1 для -p

s/(\d)(.)/$h{$2}=$1/eg;$N='NTSB',$S='STNB',$E='ETWB',$W='WTEB';map{@h{@l}=@h{(@l=$$_=~/./g)[1..3,0]}}/\w/g;$_=$h{B}

С комментариями:

                                    # example input: "NS, 1S 2B 3E 4W 5T 6N"
s/(\d)(.)/$h{$2}=$1/eg;             # construct %h ( S=>1, B=>2, E=>3, W=>4, B=>2, N=>6 )

                                    # = Transformations =
$N='NTSB',                          # N becomes T, T becomes S, S becomes B, B becomes N
$S='STNB',
$E='ETWB',
$W='WTEB';

map {                               # iterate the moves "NS"
    @h{ @l } =                      # LHS: bulk-assign new values; @l defined in RHS
      @h{                           # RHS: init @l, transform
          (@l=$$_=~/./g)            # get transform, put ('N','T','S','B') in @l for LHS
          [1..3,0]                  # construct a rotated slice for RHS
    }    
} /\w/g;                            # match the movements in list context

$_=$h{B}                            # assign the bottom face to output.


Входной файл:

, 1S 2B 3E 4W 5T 6N
N, 1S 2B 3E 4W 5T 6N
NS, 1S 2B 3E 4W 5T 6N
NWS, 1S 2B 3E 4W 5T 6N
NWSNWS, 1S 2B 3E 4W 5T 6N
NWSS, 1S 2B 3E 4W 5T 6N
NNNNNN, 1S 2B 3E 4W 5T 6N
SNWEEWS, 1N 2T 3E 4W 5B 6S
SNEEWS, 1N 2T 3W 4S 5B 6E

Бежать с

perl -p dice.pl < input.txt

Выход: 262223564


  • обновление 158 Использование $N, $S, $E, $Wглобальных переменных вместо %t = {N=>, S=>, E=>, $W=>}сохранения 8 байтов.

  • обновление 154 С требованием является то , что программа выведет число, не печатает символ новой строки print "$h{B}\n"сохраняет 4 байта: print $h{B}.

  • обновить 144 Сохранить 10 байтов, выполнив

    ($s)=/^(\w+),/;            s/(\d)(.)/$h{$2}=$1/eg;
    

    вместо того

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • update 139 Переместите регулярное выражение для команды в конец, чтобы исключить переменную, сохранив 6 байтов.

  • обновление 135 Сохранить 4 байта @l[0..3,0]вместо @l[1..3],$l[0].

  • update 134 Сохраните 1 байт, используя присвоение в @l=split//,$$_качестве значения.

  • обновить 132 Сохранить 2 байта, выполнив /^\w+/ && $&вместо /^(\w+)/ && $1.

  • update 129 Сохраните 3 байта, используя -pвместо -nи назначая $ _ для печати.

  • обновить 116 Сохранить 13 байтов, переписав split//, /^\w+/ && $&в /^\w+/g.



4

Python 2, 204 байта

Думал, что пришло время ответить на мой собственный вопрос.

def x(p,m):
    d={p[3*i-2]:i for i in range(1,7)}
    for j in m:n=2if j in'NE'else-2;x='BSTN'if j in'NS'else'BETW';d[x[0]],d[x[1]],d[x[2]],d[x[3]]=d[x[1+n]],d[x[(2+n)%4]],d[x[(3+n)%4]],d[x[0+n]]
    print d['B']

Не очень коротко, но работает.

Беги как:

x('1B 2T 3N 4S 5W 6E','SNEEWS')
#Output: 4

Редактировать : неправильно подсчитано байтов. Теперь дольше. :(


Кстати, спасибо xnor за макрос Python.
Rɪᴋᴇʀ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.