Кочення кістки


16

Кочення кістки

Отже, я котила кістки деякий час тому і думала про виклик.

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

Карта куба

Я буду використовувати це зображення для прикладів тут.

Вхідні дані

Ви берете в рядок зі списком рухів. Рядок містить лише великі літери ASCII N, S, W та E. Вони відповідають прокату куба на один крок у той бік.

На малюнку один N зробить нижню грань 6. 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 Ні, лише текст на кожному обличчі. Тож обличчя з 🍄 на ньому було б 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]у цьому списку.
Мартін Ендер

Я хотів би, щоб більше людей відповіли, але ти був найкоротшим. Поздоровлення
Rɪᴋᴇʀ

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].

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

  • оновлення 132 Збережіть 2 байти, роблячи /^\w+/ && $&замість цього /^(\w+)/ && $1.

  • оновлення 129 Збережіть 3 байти, використовуючи -pзамість -nі призначивши $ _ для друку.

  • оновлення 116 Збережіть 13 байт, переписавшись split//, /^\w+/ && $&у /^\w+/g.



4

Пітон 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

Редагувати : неправильно рахувати байти Тепер довше. :(


BTW, спасибі xnor за макрос python.
Rɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.