Напишите программу или функцию, которая будет принимать левое и правое значение кубика в виде целых чисел (1-6) и возвращаемое значение сверху.
Макет игры в кости:
+---+
| 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
| 6 |
+---+
,^.
<´ 5 `> <-- Top value
|`._,´|
.6 | 4, <-- Side values
`.|,´
Таким образом, ввод 6 4
вернется 5
.
Заказ важен:
2 3 -> 1
3 2 -> 6
Программа не должна работать с неверными значениями ввода.
Чтобы препятствовать очевидному подходу (использование таблицы со всеми комбинациями), использование любой встроенной кодировки текста или процедур де / сжатия или базового кодирования или чего-либо подобного для уменьшения размера не допускается. Обратите внимание, что использование таблицы по-прежнему разрешено, и разрешена также собственная декомпрессия, если это не сделано с использованием некоторой готовой библиотечной функции.
Для справки, вот таблица всех комбинаций (т.е. все возможные входы и выходы):
23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6
Самый короткий код выигрывает, и применяются стандартные лазейки.
Ответы:
Python, 30
Нет поисков, просто немного избиения.
Противоположные грани входят в пары, которые являются трехразрядными дополнениями друг друга, что означает, что они XOR к 7.
Учитывая два лица из одного набора, мы хотим получить лицо из другого набора. Для
(1,2,3)
, мы можем сделать это с помощью XOR (^
). Таким образом,^
дает правильный ответ с точностью до трех битов, смыслx^7
. Мы можем условно дополнитьx^7*_
.Чтобы решить, брать или нет дополнение (XOR с 7), мы проверяем, нарушает ли триплет правило правой руки. Это означает, что
a,b
идет в обратном циклическом порядкерассматривая каждую строку как одну из трех категорий. Так как элементы в каждой строке являются отрицательными модами 7, мы можем «хэшировать» их, выполняя
x*x%7
.Каждая строка получается из циклически предыдущего умножением на 4 по модулю 7, так что мы можем проверить , имеет ли это отношение для
(b,a)
решить , следует ли дополнить:a*a%7==b*b*4%7
.Это эквивалентно проверке,
a**2 * b**(-2)
равно ли по модулю 74
. Посколькуb**6
равно1
по модулю 6, это эквивалентноa**2 * b**4
. Поскольку другое возможное значение равно 2 (проверяя регистры), мы можем проверить, равно ли оно 4, сравнивая с 3.источник
ri:Ari:B^7A7A-e<B7B-e<)=*^
min(a,7-a)
, делаяa^7*(a>3)
, но я чувствую, что должно быть еще более коротким путем. Есть идеи?a/4*7^a
...Есть хорошее полиномиальное выражение по модулю 7 для третьей стороны, заданное двумя сторонами a и b .
или факторинг
Модуль 7 отображается на остаток в {0,1,2,3,4,5,6}.
Я объясняю, почему это работает в этом ответе Math SE , хотя я думаю, что, вероятно, есть более чистый аргумент, который я пропускаю Единственный другой двухчленный полином, который работает
который я первоначально нашел, преобразовав мою битовую обработку в арифметические операции, затем выполнил поиск методом грубой силы по полиномам этой формы, чтобы найти более хороший.
Пожалуйста, не стесняйтесь добавлять порты этого на ваш любимый язык; это пост CW.
J, 9 от Synthetica
Смотри мой пост
Dyalog APL, 9 от ngn (опечатка исправлена Adám)
Откровенно украденный сверху J ответ.
TI-Basic, 14 от Timtech
Pyth, 16 от FryAmTheEggman
Определяет функцию
g
двух значений.Golfscript, 18 от Питера Тейлора (старый полином)
CJam, 18 Мартина Бюттнера (перенесено из Golf's Peter's Peter) (старый полином)
Mathematica, 20 Мартина Бюттнера
Да, это унарный плюс, и нет, нет более короткого пути, который не использует унарный плюс.
dc, 21 by Toby Speight
Я должен добавить 7,
a
чтобы разница всегда была положительной (у dc есть подписанный%
оператор).Юлия,
2423 Мартин БюттнерCoffeeScript,
2826 от rink.attendant.6JavaScript (ES6),
2826 от rink.attendant.6По сути, такой же, как CoffeeScript.
Python 28 от xnor
Баш, 31
Ничего особенного:
или альтернативно:
Другой (более длинный, но, возможно, интересный) подход .
Ним, 36 от Sillesta
Java 7,
4644 от rink.attendant.6Ява 8,
2523 Кевин КруйссенPHP,
4947 от rink.attendant.6Партия, 52 unclemeat
CMD изначально не поддерживает истинный модуль (поэтому не может обрабатывать отрицательные числа) - следовательно
%%7+7)%%7
.МЕНЬШЕ (как параметрический миксин ),
6260 by rink.attendant.6Смотрите мой пост ниже .
05AB1E,
108 от Emigna (-2 байта от Kevin Cruijssen)Попробуйте онлайн.
Haskell,
312725 по общему отображаемому имениПопробуйте онлайн!
Excel, 27 Верниш
Excel VBA, 25 Тейлор Скотт
Далее (gforth) 41 от reffu
Попробуйте онлайн!
C #, 23 Кевина Круйссена
источник
(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7
для всехa
,b
в том1..6
, чтоa != b
иa+b != 7
.**5
в качестве прокси для инвертирования по модулю 7.7|3×××+×-
произносится: 7-остаток от 3-х раз умноженный на сумму, умноженную на разницу (между двумя числами).CJam,
4328 байтНе знаю, будет ли подход, основанный на полной таблице, короче, но здесь:
Ввод как
Выход:
Это смесь моего предыдущего алгоритма для определения правильной грани из двух граней и подхода xnor к xors.
Попробуйте онлайн здесь
источник
МЕНЬШЕ, 62 байта
Использует алгоритм в этом посте :
Это может быть короче, если используется целочисленное значение, но для его отображения мне нужно было использовать
content
свойство CSS, которое требовало интерполяции переменных .Тем не менее, нередко язык препроцессора CSS используется для гольфа кода!
Чтобы использовать с некоторым HTML, вы должны сделать это:
источник
Pyth, 30 байт
Требует ввода двух цифр без пробелов между ними (например,
23
нет2 3
).Объяснение:
Любая двухзначная последовательность, которая лежит внутри,
23542
представляет две стороны, которые находятся1
сверху. Аналогично,31463
для 2 и т. Д. Обращение этой строки дает последовательности для4
сквозного6
.Этот код просто выполняет поиск в строке
"23542 31463 12651 15621 36413 24532"
, делит индекс на 6 и увеличивает его, чтобы определить, какой должна быть верхняя сторона.Тест онлайн здесь.
Спасибо @FryAmTheEggman за советы по игре в гольф.
источник
J"23542 31463 12651 "h/x+J_Jscz)6
пинг меня, если некоторые из них сбивают с толку. ПредпочитаютK
иJ
для присвоения значений,h
является одинарным+1
,s
в списке строк естьjk
. (Также, если это разрешено,23
лучше всего использовать строку типа ввода)Использует подход, аналогичный es1024, с другой строкой поиска:
JavaScript (ES6),
737261 байтJavaScript (ES5),
888777 байтCoffeeScript,
7162 байтаИ просто для удовольствия, код в CoffeeScript на 1 байт короче, чем ES6, из-за допустимого пропуска скобокИз-за использования
-~
трюка, это оказалось таким же количеством символов, что и у ES6.источник
''+l+r
=>[l]+r
1+Math.floor
=>-~
. Кроме того, поиск вместо indexOf.search
но это только для ES6.String.prototype.search
он был частью JavaScript начиная с 3-го издания ECMAScript, поэтому вы можете изменить свой ответ. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…J (9)
Использует алгоритм из этого поста.
Древовидный график функции (может прояснить некоторые вещи):
Демонстрация:
источник
PHP, 81 байт
То же, что и мое решение JavaScript:
источник
Луа 118
Пришлось восстанавливать последнюю версию из-за ошибки, которую я не могу найти, и у меня нет времени на ее поиск.
Все еще работаю над этим, хотя.
источник
4
с2 3
.JavaScript (ES6), 79 байт
Не самый короткий, но я попробовал другой подход, чем в настоящее время в ответах.
источник
Луа, 89 байт
Простой порт для решения xnor Python.
источник
Баш, 85
Это не конкурирует в гольфе с волшебным полиномом @ xnor. Но я думаю, что это еще один интересный способ рассчитать ответ:
В частности, мы знаем следующее о кости:
Комбинируя вышесказанное рекурсивно (используя {1,2,3} жестко закодированный в качестве отправной точки), мы можем сгенерировать полное отображение {l, r} -> t для всех возможных значений. Этот ответ определяет рекурсивную функцию g (), которая заполняет полный массив так, что d [lr] = t. Рекурсивная функция первоначально вызывается с {1,2,3} и повторяется по всему кубу до тех пор, пока не останется больше элементов массива, которые не были установлены. Функция возвращается в себя двумя способами:
Затем выполняется простой поиск в массиве требуемых значений.
источник
Дьялог АПЛ , 9 байт
Явная подстановка персонажей решения Jıʇǝɥʇuʎs J :
Изменить: позже я заметил, что это точное решение было предложено ngn 17, 15 января.
Попробуй APL онлайн!
источник
Юлия, 26 байт
или же
или же
источник
Common Lisp, 45 байт
Попробуйте онлайн!
Порт решения xnor.
источник
C # (интерактивный компилятор Visual C #) , 49 байт
Попробуйте онлайн!
-1 байт благодаря @GB!
Ввод представляет собой двухсимвольную строку, содержащую видимые левую и правую цифры.
Ниже приведено решение, которое я придумал самостоятельно. Используя строку поиска из ответа JavaScript в rink.attendant.6 , я смог сэкономить 5 байт (но теперь наши ответы довольно похожи;)
C # (интерактивный компилятор Visual C #) , 55 байт
Попробуйте онлайн!
источник