Мурашка на кубі


33

Мурашник ходить по краях (а не гранях) кубика каркаса. Кожна вершина, з якою вона стикається, подає її виделкою, від якої відгалужуються два нові краї. Мураха вибирає , який спосіб перетворити - leftабо right. Ці напрямки відносно мурашника, який звернений до вершини і знаходиться поза куба. Ваша мета - з послідовності left/ rightвибору мурахи визначити, чи закінчується він у тому ж положенні, що і розпочався.

Наприклад, якщо мураха повертає ліворуч чотири рази ( left left left left), він пройшов квадрат проти годинникової стрілки і закінчився там же, де і почався. Але, якщо воно піде left left left left right, це закінчиться на іншому місці на кубі. Крім того, якщо він йде left right right right left, він закінчується на своєму початковому краю, але звернений до протилежної вершини, яка не вважається однаковою позицією.

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

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

(Редагувати: Якщо ваша мова не може створити названу функцію, вона може замість цього реалізувати функцію з входами та виходами через STDIN / друк або стек. Якщо це неможливо, зробіть фрагмент, у якому вхід і вихід зберігаються в змінні.)

Вхідні дані

Послідовність left/ rightрішень від довжини 0до 31включно, представлених у виборі формату. Це може бути рядок літер R/ L, список номерів 1/ -1або масив булевих. Нічого симпатичного, як те, що вони є назви методів або рядків, корисних для вашого коду.

Будь ласка, опублікуйте тестові приклади у своєму форматі, якщо він відрізняється від наведених нижче тестових випадків.

Вихідні дані

True/ False, 0/ 1, або аналоги вашої мови.

Критерії виграшу

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

Тестові справи

True випадки (один на рядок, другий - порожній список):

1 1 1 1

-1 -1 -1 -1
1 -1 1 -1 1 -1
1 1 -1 -1 1 1 -1 -1
-1 1 1 -1 -1 1 1 -1
1 1 1 -1 -1 -1 -1 1
1 -1 -1 1 -1 -1
1 1 1 1 -1 -1 -1 -1 1 -1 -1 1 -1 -1
-1 -1 -1 1 -1 -1 1 1 -1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

False випадки (по одному на рядок):

1
1 1
1 1 1
-1 1
1 -1 -1 -1 1
1 -1 -1 1 1
-1 1 -1 1
1 1 1 1 -1
-1 -1 1 -1 1 -1 -1 1
1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1

Ось такі ж тестові випадки з L's і R' s.

True випадки:

RRRR

LLLL
RLRLRL
RRLLRRLL
LRRLLRRL
RRRLLLLR
RLLRLL
RRRRLLLLRLLRLL
LLLRLLRRLRLRRRRRRRRRRRRRRRRR

False випадки:

R
RR
RRR
LR
RLLLR
RLLRR
LRLR
RRRRL
LLRLRLLR
RLRRRRLLLRRLLL

Додатковий виклик з кредиту

Те саме, але з додекаедром, а не кубом. Дивіться Полювання на Wumpus за ідеями.


Чи це перешкоджає використанню мов без названих функцій?
Майк Precup

@MikePrecup Чи можете ви навести кілька прикладів таких мов? Я розгляну альтернативи.
xnor

Я всі свої подання на гольф з кодом виконую в <<> , ось чому я прошу. У ньому є стек, на який ви можете завантажити аргументи на вершину, а потім залишити результат у стеку, але це не зовсім названа функція.
Майк Прекуп

@MikePrecup Добре, я ставлю на це допомогу. Якщо виникла проблема з якоюсь мовою, скажіть, будь ласка, я не хочу виключати жодної мови.
xnor

Я можу подумати про те, як> і> та подібні мови
гордий haskeller

Відповіді:


21

GolfScript, 24 символи (19 лише для функціональних тіл)

Math FTW!

{3,.@{[+~@\{@}*~]}/=}:f;

Тестуйте це рішення в Інтернеті.

Ця функція приймає як вхід двійковий масив (0 для лівого, 1 для правого) та повертає 1 для істинного та 0 для хибного.

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

Зокрема, ми можемо представити лівий і правий витки у вигляді двох лінійних карт у трьох вимірах, де лівий виток відповідає обертанню на 90 ° навколо осі x , тобто карта ( x , y , z ) → ( x , z , - y ), а правий поворот відповідає обертанню на 90 ° навколо осі y , тобто карті ( x , y , z ) → ( z , y , - x ).

На початку функції ми просто встановлюємо триелементний вектор, що містить різні позитивні значення (1, 2, 3), наносимо на нього послідовність карт обертання та перевіряємо, чи дорівнює отриманий вектор початковому.

(Насправді, щоб зберегти кілька знаків, я фактично перетворюю координати так, що початковий вектор є (0, 1, 2), а карти ( x , y , z ) → ( x , z , −1− y ) і ( x , y , z ) → ( z , y , −1− x ), але кінцевий результат такий же.)

Пс. Завдяки гордому haskeller за виявлення помилки в оригінальній версії цього рішення.


Perl, 58 символів

Як вимагається в коментарях, ось те саме рішення, яке перенесли на Perl. (Ця версія фактично використовує непроформовані координати, оскільки перетворення не зберігає символів у Perl.)

sub f{@a=@b=1..3;@a[$_,2]=($a[2],-$a[$_])for@_;"@a"eq"@b"}

Тестуйте це рішення в Інтернеті.


Бонус: Мураха на додекаедрі (GolfScript, 26 символів)

{5,.@{{2*2%[~\]}*(+}/=}:f;

Тестуйте це рішення в Інтернеті.

Як і функція мураха-на-кубі, наведена вище, ця функція приймає як вхід бінарний масив (0 для лівого, 1 для правого) і повертає 1, якщо мураха закінчується в тому ж положенні та орієнтації, що і в ньому, або 0 інакше.

Це рішення використовує трохи більш абстрактне подання, ніж рішення куба вище. Зокрема, він використовує той факт, що група обертальної симетрії додекаедра є ізоморфною для групи, що чергується A 5 , тобто групи парних перестановок з п'яти елементів. Таким чином, кожне можливе обертання додекаедра (яке відображає ребра до країв і вершини до вершин) може бути унікально представлене як перестановка п'ятиелементного масиву з послідовними обертаннями, що відповідають застосуванню відповідних перестановок послідовно.

Таким чином, все, що нам потрібно зробити, це знайти дві перестановки L і R, які можуть представляти лівий і правий обертання. Зокрема, ці перестановки повинні бути 5-циклими (щоб їх застосування п'ять разів поверталось у початковий стан), вони не повинні бути повноваженнями один одного (тобто RL n для будь-якого n ), і вони повинні задовольняти відношення ( LR ) 5 = (1), де (1) позначає тотожність перестановки. (Насправді цей критерій стверджує, що шлях LRLRLRLRLRповинен повернутися у вихідне положення.)

Виправлення перестановки L - це простий зсув стовбура вліво, тобто відображення ( a , b , c , d , e ) → ( b , c , d , e , a ), оскільки він може бути реалізований у GolfScript всього за два chars ( (+), ми виявляємо, що існує п'ять можливих варіантів перестановки R. З них я вибрав відображення ( a , b , c , d , e ) → ( c , e , d ,b , a d ), потім замінюючи останні два елементи на , і, нарешті, безперечно застосовуючи перестановку L, щоб перемістити a до кінця.)), оскільки він також має відносно компактну реалізацію GolfScript. (Насправді я реалізую це, спочатку переплітаючи елементи з 2*2%отриманням ( a , c , e , b ,[~\]

Наведене вище демо-посилання включає деякі тестові випадки дійсних шляхів на додекаедрі, які повертаються до початкового коду, такі як:

           # empty path
1 1 1 1 1  # clockwise loop
0 0 0 0 0  # counterclockwise loop
1 0 0 0 0 1 1 0 0 0 0 1  # figure of 8
1 0 1 0 1 0 1 0 1 0      # grand circle
1 0 0 0 1 0 0 0          # loop around two faces 
1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0  # Hamilton cycle

Приємне рішення! Чи виключає це випадок, хоча мураха повертається до тієї ж вершини з іншого напрямку?
xnor

Я не розумію - в основному те, що ти тут робиш, представляє положення мурашки за допомогою 3-х біт, але є 24 можливі позиції. Як?
гордий haskeller

1
@proudhaskeller: Дякуємо за виявлення помилки. Я це виправив і додав ваш контрприклад до мого тестового набору.
Ільмарі Каронен

1
@xnor: Додано рішення і для додекаедра.
Ільмарі Каронен

1
Хороша пара перестановок для додекаедра. Ті, які я використовував для полювання на Wumpus , будуть на один чар довше: {[~@]-1%}*[~@]або ){[~@]-1%}*-1%замінюють вашого{2*2%[~\]}*(+
Пітер Тейлор

7

Пітона, 68

Бере список 1 і -1. На основі 3D-обертів: перевіряє, чи точка (3,2,1) опиняється в тому ж положенні після застосування серії обертів. Можливі два обертання, що відповідають 1 і -1. Кожна з них виконується шляхом перестановки двох координат і зміни знаку однієї з них. Точні координати, які потрібно змінити, і який знак для перестановки не важливі.

def f(l):
 p=[3,2,1]
 for d in l:p[d],p[0]=-p[0],p[d]
 return[3,2]<p

EDIT: це фактично те саме рішення, що і "Perl, 58".


Ти маєш рацію, це справді.
гордий haskeller

+1, це ще коротше, ніж моя спроба рішення Python. Однак, дивлячись на те, що у мене є, я думаю, що ви можете зберегти ще кілька знаків, взявши вхід як 0s та 1s і розділивши останній елемент pна окрему змінну.
Ільмарі Каронен

3
Нічого собі, я написав саме те рішення , символ для символу, за винятком змінних імен, коли тест-рішення цієї проблеми!
xnor

5

Математика

Натхненний рішенням Ільмарі Каронен. Група обертальної симетрії куба ізоморфна S 4 .

Куб, 51 байт

Fold[Part,r=Range@4,{{2,3,4,1},{3,4,2,1}}[[#]]]==r&

Візьме список 1s і -1s в якості вхідних даних.

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

Додекаедр, 55 байт

Fold[Part,r=Range@5,{{2,3,4,5,1},{3,5,4,2,1}}[[#]]]==r&

Візьме список 1s і -1s в якості вхідних даних.

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


Я шукав, як можна виявити, що це ізоморфно для S3?
гордий haskeller

На жаль, я мав на увазі "як можна знайти / довести, що це ізоморфно для S4?"
гордий haskeller

@proudhaskeller Ви можете знайти його тут: en.wikipedia.org/wiki/Octa
Cathedral_symmetry

5

C (gcc) , 118 116 107 105 байт

-2 байти завдяки стельовій коті

f(char*s){char*p,n[]="@ABCDEFG",y;for(;*s;s++)for(p=n;*p;*p++^=*s^82?y%2+1:4-(y&2))y=*p/2^*p;y=n[2]==66;}

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

Припустимо, ми дали кубу такі координати:

            (1,1,1)       (1,1,0)
          G +--------------+ C
           /|             /|
          / |            / |
         /  |    (0,1,0)/  |
(0,1,1) +--------------+ D |
      H |   |          |   |
        |   |          |   |
        | F +----------|---+ (1,0,0)
        |  /(1,0,1)    |  / B           x
        | /            | /           y / 
        |/             |/            |/  
      E +--------------+ A      z ---*   
        (0,0,1)       (0,0,0)

Якщо ми починаємо з кута D, то перехід до C або H може вважатися обертанням куба навколо нас. Рух праворуч би означав обертання проти годинникової стрілки навколо осі Z, а переміщення вліво означало б обертання за годинниковою стрілкою навколо осі X. Це єдині два обертання, про які нам потрібно піклуватися. Оскільки кожне обертання рівно на 90 градусів, ми можемо уявити, як кути «ковзають» по краях. Для руху вправо це означає A -> B, B -> C, C -> D, D -> A з іншою стороною, що робить E -> F і т. Д. Для руху вліво ми замість цього отримуємо A -> E, E - > Н і т.д.

Оскільки кожен кут ковзає лише по краю, це означає, що для кожного обертання змінюється лише один з розмірів кожної точки. Коли B переміщується на C, змінюється лише його y компонент, а коли H переміщується на D, змінюється лише його z компонент тощо. Крім того, оскільки координати обмежені 0 і 1, ми можемо розглядати кожну точку як двійкове число з відповідним бітом, перевернутим при русі.

Ми можемо бачити, що для руху праворуч A і C перевертають свої x, тоді як D і B перевертають свої y. Якщо ми змінимо перспективу, щоб подивитися на цю сторону голови куба, і ігноруємо компонент z (який ніяк не змінюється для цього обертання), ми отримаємо:

D (0,1)         C (1,1)
 +-------------+
 |             |
 |             |
 |             |
 |             |
 |             |
 |             |
 +-------------+
A (0,0)         B (1,0)

Вимальовується візерунок: Для точок, які перевертають їх x, x == y, тоді як навпаки справедливо для точок, що гортають їхні y. Це стосується іншого типу обертання, але з z замість x.

Іншими словами:

Right
    if (x == y) x = !x
    if (x != y) y = !y

Left
    if (z == y) z = !z
    if (z != y) y = !y

Тепер ми можемо легко пройти всі обертання, і наприкінці побачимо, чи відповідає фінал D нашому початковому D.

Зберігання кожної точки як єдиного числа - це задане, але в С присвоєння масиву знаків є набагато більш компактним, ніж масив int. Ми дбаємо про те, щоб вибирати символи, три нижчі біти яких відповідають 000..111, що дозволяє просто ігнорувати решту бітів. Перегортання координат - це просто питання XOR'ing за допомогою відповідної бітової маски.


1
Дякую велике за довге пояснення, інші відповіді не дуже клацали мені в голові, але ця мала сенс миттєво.
Ніт

4

Пітон - 110, 150

Входить до списку цілих чисел з -1для повороту вліво, 1для повороту праворуч.

Куб, 110:

def f(l):
    c,p='07'
    for d in l:a="100134462634671073525275"[int(c)::8];c,p=a[(a.index(p)+d)%3],c
    return'1'>c

Тест:

l=map(int,'1 1 1 1'.split())
print f(l)

Додекаедр, 150:

def f(l):
    c,p='0J'
    for d in l:a="I5H76E8BBA8F76543100JI0J21D3A5C7E9CJI2132H4GF94C6D98AHGBEDGF"[int(c,36)::20];c,p=a[(a.index(p)+d)%3],c
    return'1'>c

1
Досить вражає те, як ти написав це за три хвилини :-P
xnor

6
Досить довго чекали, коли це питання про шеф нерестується. ;-)
Векторизований

Коли я запускаю це в Python 3.2, я отримую "TypeError: очікуваний об'єкт з буферним інтерфейсом".
xnor

@xnor Відредаговано, зараз у python 2. Сподіваюся, що це працює.
Векторизований

4

Марбельний 188

Безсоромна крадіжка Ільмарі Каронен алгоритму з метою демонстрації нової мови.

Цей сценарій очікує рядок 0x00 для лівого і 0x01 для правого на stdin, а потім 0x0A (новий рядок). Він виводить "0" за невдалий випадок і "1" за успіх.

......@5@3FF
@0@1@2\\]]@5
010203@4=A@4
&0&0&0&0/\
MVMVMVMV..
@0@1@2@3..!!
:MV
}2}2}1}0}1}0}3
&0&1&0&1~~~~<A@P
{0{1{1{0&1&0=0&1
}0}1}2@P{2{2&030
=1=2=3&2FF}3..//
&2&2&231&2{3
\/\/\/&2!!..//

Приклад запуску:

# echo -e "\x0\x0\x0\x1\x0\x0\x1\x1\x0\x1\x0\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1\x1" | marbelous.py ant-on-a-cube.mbl
1

1
Я не усвідомлював, наскільки шалена ця відповідь, поки я не прочитав опис мови. Це дійсно класна концепція мови для гольфу!
xnor

@xnor навряд чи коли-небудь буде серйозним конкурентом на арені для гольфу, але все одно дещо весело :)
Sparr

4

Python 2 , 57 байт

f=lambda l:reduce(lambda n,x:n%4*64+n/4*16**x%63,l,27)<28

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

Для цього використовується подання перестановки

0: abcd -> dabc
1: abcd -> dcab

де лівий і правий (0 і 1) відповідають довжині-4 цикли на 4 елементах. Перебираємо вхід, застосовуючи вказану перестановку, і перевіряємо, чи результат дорівнює початковому значенню.

Ми починаємо a,b,c,dяк список з чотирма елементами 0,1,2,3. Ми їх компактируємо в одне число base-4 n=abcdз початковим значенням, що n=27відповідає 0123базовій 4. Кожну перестановку арифметично додаємо до кожної n.

Оскільки обидва результати починаються з цього d, ми можемо зробити n%4витяг d, а потім n%4*64перемістити його в потрібне положення d___. Інші цифри abcвилучені якn/4 . Нам потрібно вставити їх у три нижчих значення місця.

Для напрямку x=0ми вставляємо abcяк є, а для x=1, обертаємо їх як cab. Обертання може бути досягнуто *16%63, який бере abcнаabc00 доcab . ( %63Піде на помилку a==b==c==3, але ці значення неможливі.) Оскільки просто робити %63не-оп, вираз, що залежить від напряму, *16**x%63дає abcабо cabяк потрібно.


Python 2 , 55 байт

f=lambda l:reduce(lambda n,x:n^(n*8%63|7*8**x),l,10)<11

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


3

Haskell, 104 103 99 97 96/ 67 64 символів

Я вважаю, що еквівалент справа / зліва буде напрямом даних типу:

Direction = R | L

тож у своїй відповіді я припустив, що вони доступні.
редагувати: фактично зрозумів, що булеви можуть призвести до скорочення коду. True являє собою лівий поворот, а False являє собою правий поворот (хоча, технічно, код працював би так само, якби він був перевернутий; він симетричний)

96 символів:

m[p,l,r]b|b=[p%l,7-r-l,r]|0<1=[p%r,l,7-r-l]
p%x|odd$div p x=p-x|0<1=p+x
g l=foldl m[0..2]l<[0,2]

g - це функція, яка при переліку списку напрямків повертає погоду, коли мурашка не повернулася на своє місце.

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

друге ціле число - це сума, яку вершина мурашки змінила б, якщо вона піде ліворуч. наприклад, якби мураха знаходився у вершині 3, а друге ціле число було 4, то після повороту вліво вершина була б 7. зауважте, це завжди буде потужністю 2, тому що точно один біт перевертається при переміщенні однієї вершини.

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

що слід зазначити, що при повороті вліво третє ціле число залишатиметься однаковим, а друге стане тим, що знаходиться між 1 2 і 4, яке не було ні другим цілим числом, ні третім, що трапляється таким самим, як 7 - друге ціле число - третє ціле число.

Я вибрав такий спосіб представлення позиції, оскільки (як це було сказано в попередньому пункті) було обчислити наступну позицію тривіально.

пояснення функцій:

функція (%) - це функція, яка приймає поточну вершину та суму для її зміни та змінює її. він потрапляє на біт, який збирається змінити, і гортає його (дуже числовим способом).

функція m - це функція, яка займає положення мурашки та напрям і повертає нове положення, використовуючи ноту, яку ми відзначали раніше.

то функція m поєднується за допомогою foldl (який подібний reduceдо JavaScript, але трохи виразніший) для створення функції g, відповіді на це запитання.


Хаскелл, 64 символи

натхненний відповіддю @ альфаальфи, ось його версія перенесена на haskell:

m[a,b,c,d]p|p=[b,c,d,a]|0<1=[b,d,a,c]
g l=foldl m[0..3]l<[0,1,3]



редагувати: Зараз я відчуваю себе неймовірно дурним через відповідь Лмарі Каронен. можливо, я перекладу його відповідь на haskell. інша редакція: не почуваючись дурним, як його відповідь , було неправильним
редагуванням: перейшов від фактично використання кортежів до використання списків як їх Ordпримірника, а [ ... ]синтаксичний цукор скорочує


1
Це виглядає так елегантно, особливо складка. Чи може врятувати ще більше знаків для присвоєння [0,1,2,3]змінній і використовувати її як вхід до виразу, так і перевірка результату?
xnor

@xnor, тому що ваш коментар мій розум вирішив придумати гольф це [0..3]... Я не знаю, чому я цього не помічав раніше. Спасибі. але тепер ваш трюк не працює. Ну добре.
гордий haskeller


3

APL (Dyalog Unicode) , 22 байти ( SBCS Адама )

f←{x∊(-@3∘⌽⌽)/⍵,x←⊂⍳3}

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

H.PWiz припустив, що повернення кроків не має значення, і це призвело до -2 байт.

Ну, це бентежить, оскільки він мав бути набагато коротшим, ніж GolfScript. Принаймні, я намагався.

Функція названа f, і в тестових випадках 1представляє лівий виток (булева правда) і 0являє собою правий виток (булева помилка). представляє порожній список.


3

APL (Dyalog) , 21 байт

f←{x≡(↓∪⊢∘⌽)/⍵,x←⊂⍳4}

Спробуйте в Інтернеті! (Використання тестування середовища від Ерік Outgolfer в відповідь )

Я беру вліво і вправо як 1і 2. Тут використовуються наступні перестановки abcd:

1 : bcda
2 : cdba

Я застосовую перестановки, що відповідають 1і 2до ⍳4 : 1 2 3 4, і перевіряю, чи не змінилася вона



3

Баш , 71 65 байт

f()(a=1234;for i;{ a=`tr 1-4 4$[$i?123:312]<<<$a`;};((a==1234));)

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

Як і багато попередніх відповідей, використовується подання групи обертів куба, породжених 1234-> 4123 та 1234-> 4312. Використовує цифри замість літер, щоб я міг використовувати потрійний оператор з арифметичним розширенням. Очікує, що його вхід як 0 і 1, розділений пробілами, а виводиться через код виходу.

6 байтів збережено завдяки коментарю @ @ manatwork!


1
Див Dennis «s Баш наконечник щодо циклу за списком параметрів.
манатура

3

brainfuck , 119 байт, 137 байт

Використовує той факт, що група обертання куба ізоморфна до S4. Brainfuck взагалі не має жодних функцій, названих чи інакше, тому це повна програма, яка приймає введення через STDIN та виводить на STDOUT. (Якщо ви наполягаєте на змінній, зробіть вигляд, що значення комірки, на якій програма закінчується, є змінною.)

Куб, 119 байт

++++>+++>++>+>,[+++[->+++<]<<<<[->>>>+<<<<]>[>]<+[[-]<[->+<]<<<[->>>+<<<]>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

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

++++>+++>++>+    Initialize tape as 4 3 2 1

>,[              For each input byte:

  +++[->+++<]       Add 3 and multiply by 3; if input is R, this will be 255

  <<<<[->>>>+<<<<]  Move first number to end (BCDA)

  >[>]<+[           If input wasn't R:

    [-]                Zero input cell (which is now negative 18)

    <[->+<]            Move previously moved number one slot further (BCD_A)

    <<<[->>>+<<<]      Move first number into vacated slot (CDBA)

  >[>]]

,]

<[[<]>[->]<[>>]<]     Determine whether tape is still 4 3 2 1

<[>>-<]               If not: subtract 1 from output cell

-[----->+<]>--.       Create "1" in output cell and output

Додекаедр, 137 байт

+++++>++++>+++>++>+>,[+++[->+++<]<<<<<[>>>>>+[<]>-]>[>]<+[[-]<<[[->>+<<]<<]>[>>>>>>+[<]<-]>>[>]],]<[[<]>[->]<[>>]<]<[>>-<]-[----->+<]>--.

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

Єдині відмінності між двома програмами - це налаштування та перестановки. Тут використовується ліва перестановка DCAEB, яка, здавалося, є найкращим наявним кон'югатом.


1

Желе , 14 байт

3RðW;ṙN1¦ṚƊ/⁼⁸

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

1= лівий поворот, 0= правий поворот. На основі мого рішення Dyalog.

На жаль, Jelly не має назви функцій. Якщо я не можу використовувати неявний ввід і потрібно припустити, що він знаходиться в змінній, ця версія такої ж довжини зробить:

3RµW;®ṙN1¦ṚƊ/⁼

Він передбачає, що вхід знаходиться в регістрі (© / ®).


0

Перл - 120, 214

Бере масив (список) булів.

Куб (120):

sub e{$a=$b=0;for$c(@_){$_=(13,62,53,40,57,26,17,'04')[$b];$d=s/$a/($b-1)%8/e;($a,$b)=($b,substr($_,$c^$d,1))}return!$b}

Додекаедр (214):

sub e{$a=$b='00';for$c(@_){$_=('01041102090307040500061807160308091502101114121019131714151016081706131819051200'=~/\d{4}/g)[$b];$d=s/$a/sprintf'%02d',($b-1)%20/e;($a,$b)=($b,substr($_,($c^$d)*2,2));}return!($b+0)}

2
Які кодують магічні числа?
xnor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.