Определить значение кости из вида сбоку


52

Напишите программу или функцию, которая будет принимать левое и правое значение кубика в виде целых чисел (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

Самый короткий код выигрывает, и применяются стандартные лазейки.


так что я могу использовать таблицу со всеми комбинациями - 1 ^^?
Двана

Да, вы можете использовать таблицу. Но вы не можете использовать встроенные процедуры сжатия, чтобы сделать его меньше.
user694733

Ответы:


59

Python, 30

lambda a,b:a^b^7*(2<a*a*b%7<5)

Нет поисков, просто немного избиения.

Противоположные грани входят в пары, которые являются трехразрядными дополнениями друг друга, что означает, что они XOR к 7.

1,6
2,5
3,4

Учитывая два лица из одного набора, мы хотим получить лицо из другого набора. Для (1,2,3), мы можем сделать это с помощью XOR ( ^). Таким образом, ^дает правильный ответ с точностью до трех битов, смысл x^7. Мы можем условно дополнить x^7*_.

Чтобы решить, брать или нет дополнение (XOR с 7), мы проверяем, нарушает ли триплет правило правой руки. Это означает, что a,bидет в обратном циклическом порядке

1,6
2,5
3,4

рассматривая каждую строку как одну из трех категорий. Так как элементы в каждой строке являются отрицательными модами 7, мы можем «хэшировать» их, выполняя x*x%7.

1,6 -> 1
2,5 -> 4
3,4 -> 2

Каждая строка получается из циклически предыдущего умножением на 4 по модулю 7, так что мы можем проверить , имеет ли это отношение для (b,a)решить , следует ли дополнить: a*a%7==b*b*4%7.

Это эквивалентно проверке, a**2 * b**(-2)равно ли по модулю 7 4. Поскольку b**6равно 1по модулю 6, это эквивалентно a**2 * b**4. Поскольку другое возможное значение равно 2 (проверяя регистры), мы можем проверить, равно ли оно 4, сравнивая с 3.


CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
Оптимизатор

Я могу спасти полукокс прочь min(a,7-a), делая a^7*(a>3), но я чувствую, что должно быть еще более коротким путем. Есть идеи?
xnor

Ох, есть a/4*7^a...
xnor

11
Я никогда не понимал, что биты с кубиками имеют это свойство. Хороший!
user694733

1
@ user694733 К счастью, получается, что 6 на две меньше степени двух.
xnor

64

Есть хорошее полиномиальное выражение по модулю 7 для третьей стороны, заданное двумя сторонами a и b .

3(a3б-aб3)модификация7

или факторинг

3aб(a2-б2)модификация7

Модуль 7 отображается на остаток в {0,1,2,3,4,5,6}.

Я объясняю, почему это работает в этом ответе Math SE , хотя я думаю, что, вероятно, есть более чистый аргумент, который я пропускаю Единственный другой двухчленный полином, который работает

(3a5б5-a3б)модификация7

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

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

J, 9 от Synthetica

7|3***+*-

Смотри мой пост

Dyalog APL, 9 от ngn (опечатка исправлена ​​Adám)

7|3×××+×-

Откровенно украденный сверху J ответ.

TI-Basic, 14 от Timtech

7fPart((A³B-AB³)/21

Pyth, 16 от FryAmTheEggman

M%*3-*H^G3*^H3G7

Определяет функцию gдвух значений.

Golfscript, 18 от Питера Тейлора (старый полином)

~1$*.5?3*@.*@*- 7%

CJam, 18 Мартина Бюттнера (перенесено из Golf's Peter's Peter) (старый полином)

l~1$*_5#3*@_*@*m7%

Mathematica, 20 Мартина Бюттнера

Mod[+##(#-#2)3##,7]&

Да, это унарный плюс, и нет, нет более короткого пути, который не использует унарный плюс.

dc, 21 by Toby Speight

sb7+d3^lb*rlb3^*-3*7%

Я должен добавить 7, aчтобы разница всегда была положительной (у dc есть подписанный %оператор).

Юлия, 24 23 Мартин Бюттнер

f(a,b)=3a*b*(a^2-b^2)%7

CoffeeScript, 28 26 от rink.attendant.6

x=(a,b)->3*a*b*(a*a-b*b)%7

JavaScript (ES6), 28 26 от rink.attendant.6

x=(a,b)=>3*a*b*(a*a-b*b)%7

По сути, такой же, как CoffeeScript.

Python 28 от xnor

lambda a,b:3*a*b*(a*a-b*b)%7

Баш, 31

Ничего особенного:

echo $[3*($1**3*$2-$1*$2**3)%7]

или альтернативно:

echo $[3*$1*$2*($1*$1-$2*$2)%7]

Другой (более длинный, но, возможно, интересный) подход .

Ним, 36 от Sillesta

proc(x,y:int):int=3*x*y*(x*x-y*y)%%7

Java 7, 46 44 от rink.attendant.6

int f(int a,int b){return(a*a-b*b)*a*b*3%7;}

Ява 8, 25 23 Кевин Круйссен

a->b->(a*a-b*b)*a*b*3%7

PHP, 49 47 от rink.attendant.6

function x($a,$b){echo($a*$a-$b*$b)*3*$a*$b%7;}

Партия, 52 unclemeat

set/aa=(3*(%1*%1*%1*%2-%1*%2*%2*%2)%%7+7)%%7
echo %a%

CMD изначально не поддерживает истинный модуль (поэтому не может обрабатывать отрицательные числа) - следовательно %%7+7)%%7.

МЕНЬШЕ (как параметрический миксин ), 62 60 by rink.attendant.6

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a-@b*@b),7);content:~"'@{r}'"}

Смотрите мой пост ниже .

05AB1E, 10 8 от Emigna (-2 байта от Kevin Cruijssen)

nÆs`3P7%

Попробуйте онлайн.

Haskell, 31 27 25 по общему отображаемому имени

a#b=3*a*b*(a*a-b*b)`mod`7

Попробуйте онлайн!

Excel, 27 Верниш

=MOD(3*(A1^3*B1-A1*B1^3),7)

Excel VBA, 25 Тейлор Скотт

?3*[A1^3*B1-A1*B1^3]Mod 7

Далее (gforth) 41 от reffu

: f 2>r 2r@ * 2r@ + 2r> - 3 * * * 7 mod ;

Попробуйте онлайн!

C #, 23 Кевина Круйссена

a=>b=>(a*a-b*b)*a*b*3%7

1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7для всех a, bв том 1..6, что a != bи a+b != 7.
Питер Тейлор

@PeterTaylor Действительно, я нашел это выражение, используя **5в качестве прокси для инвертирования по модулю 7.
xnor

2
Я терял сон из-за «почему» этого удивительного полинома. Возможно, математика. Люди могут помочь. math.stackexchange.com/questions/1101870/…
цифровая травма

1
Я написал вывод по математике. SE: math.stackexchange.com/a/1101984/24654
xnor

1
Вы можете переписать поезд APL как 7|3×××+×-произносится: 7-остаток от 3-х раз умноженный на сумму, умноженную на разницу (между двумя числами).
NGN

9

CJam, 43 28 байт

Не знаю, будет ли подход, основанный на полной таблице, короче, но здесь:

l_~^56213641532453s@S-#)g7*^

Ввод как

2 3

Выход:

1

Это смесь моего предыдущего алгоритма для определения правильной грани из двух граней и подхода xnor к xors.

Попробуйте онлайн здесь


Не могли бы вы объяснить, как это работает? Та же идея, что и у ep1024?
user694733

@ user694733 совсем нет. Объяснение добавлено.
Оптимизатор

Да, я видел время. Мне просто интересно, если это похоже, потому что у него есть объяснение, и я понятия не имею, как работает CJam.
user694733

@ Оптимизатор Я тоже хочу начать работать с CJam, какое общее направление вы можете указать мне для учебников и т. Д.? Я вижу некоторые примеры, но они вряд ли имеют какое-либо объяснение :(
Теун Пронк

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

5

МЕНЬШЕ, 62 байта

Использует алгоритм в этом посте :

.x(@a,@b){@r:mod(3*@a*@b*(@a*@a+6*@b*@b),7);content:~"'@{r}'"}

Это может быть короче, если используется целочисленное значение, но для его отображения мне нужно было использовать contentсвойство CSS, которое требовало интерполяции переменных .

Тем не менее, нередко язык препроцессора CSS используется для гольфа кода!

Чтобы использовать с некоторым HTML, вы должны сделать это:

p::after { .x(1, 3); }
<p>Number on top: </p>

4

Pyth, 30 байт

K"23542 31463 12651 "h/x+K_Kz6

Требует ввода двух цифр без пробелов между ними (например, 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лучше всего использовать строку типа ввода)
FryAmTheEggman

3

Использует подход, аналогичный es1024, с другой строкой поиска:

JavaScript (ES6), 73 72 61 байт

t=(l,r)=>-~('354233146312651215623641332453'.search([l]+r)/5)

JavaScript (ES5), 88 87 77 байт

function t(l,r){return -~('354233146312651215623641332453'.indexOf([l]+r)/5)}

CoffeeScript, 71 62 байта

И просто для удовольствия, код в CoffeeScript на 1 байт короче, чем ES6, из-за допустимого пропуска скобок

Из-за использования -~трюка, это оказалось таким же количеством символов, что и у ES6.

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)

1
Сохранить 1 байт: ''+l+r=>[l]+r
edc65

@ edc65 Спасибо! О, как ведет себя JavaScript при добавлении разных типов
rink.attendant.6

1
Да, оператор + это странно. Но как насчет оператора ~? 1+Math.floor=> -~. Кроме того, поиск вместо indexOf.
edc65

Интересно. И я знал об этом, searchно это только для ES6.
rink.attendant.6

На самом деле, String.prototype.searchон был частью JavaScript начиная с 3-го издания ECMAScript, поэтому вы можете изменить свой ответ. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
kamoroso94

3

J (9)

Использует алгоритм из этого поста.

7|3***+*-

Древовидный график функции (может прояснить некоторые вещи):

    f=:7|3***+*-
    f
7 | 3 * * * + * -
   5 !: 4 < 'f'
  ┌─ 7            
  ├─ |            
──┤   ┌─ 3        
  │   ├─ *        
  └───┤   ┌─ *    
      │   ├─ *    
      └───┤   ┌─ +
          └───┼─ *
              └─ -

Демонстрация:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6

0

PHP, 81 байт

То же, что и мое решение JavaScript:

function t($l,$r){echo(int)(1+strpos('354233146312651215623641332453',$l.$r)/5);}

0

Луа 118

Пришлось восстанавливать последнюю версию из-за ошибки, которую я не могу найти, и у меня нет времени на ее поиск.

z=io.read;o={"","","34","5 2","2165","46 13",""," 31064","  5612","   2 5","    43"}a=z();b=z();print(o[a+b]:sub(a,a))

Все еще работаю над этим, хотя.


Я проверил это здесь , и, кажется, вернуться 4с 2 3.
user694733

действительно .. странно. плохо смотрю в это.
Теун Пронк

@ user694733 Исправлено :)
Теун Пронк

0

JavaScript (ES6), 79 байт

Не самый короткий, но я попробовал другой подход, чем в настоящее время в ответах.

f=(a,b)=>[a,b,7-a,7-b].reduce((p,v,i,r)=>p?p:'2312132'.indexOf([v]+r[i+1])+1,0)

0

Луа, 89 байт

Простой порт для решения xnor Python.

x=require('bit32').bxor
function(a,b)c=a*a*b%7;return x(a,x(b,2<c and c<5 and 7 or 0))end

0

Баш, 85

Это не конкурирует в гольфе с волшебным полиномом @ xnor. Но я думаю, что это еще один интересный способ рассчитать ответ:

g(){
((d[$1$2]))||{
d[$1$2]=$3
g $2 $1 $[7-$3]
g $2 $3 $1
}
}
g 1 2 3
echo ${d[$1$2]}

В частности, мы знаем следующее о кости:

  • Если левая грань равна 1, а правая грань равна 2, то верхняя грань равна 3
  • Вращение вокруг противоположных вершин на 120 ° дает еще несколько тройных номиналов. Например, мы вращаем {l = 1, r = 2, t = 3}, как только мы получаем {l = 2, r = 3, t = 1}, и снова вращаясь, мы получаем {l = 3, r = 1, t = 2}
  • Сумма противоположных граней всегда равна 7

Комбинируя вышесказанное рекурсивно (используя {1,2,3} жестко закодированный в качестве отправной точки), мы можем сгенерировать полное отображение {l, r} -> t для всех возможных значений. Этот ответ определяет рекурсивную функцию g (), которая заполняет полный массив так, что d [lr] = t. Рекурсивная функция первоначально вызывается с {1,2,3} и повторяется по всему кубу до тех пор, пока не останется больше элементов массива, которые не были установлены. Функция возвращается в себя двумя способами:

  • с заменой l и r и вычитанием t из 7 (противоположные грани)
  • с {l, r, t} повернутым к {r, t, l}

Затем выполняется простой поиск в массиве требуемых значений.


0

Дьялог АПЛ , 9 байт

Явная подстановка персонажей решения Jıʇǝɥʇuʎs J :

7|3×××+×-

Изменить: позже я заметил, что это точное решение было предложено ngn 17, 15 января.

  the division remainder when divided by seven of
  |        three times
  |        | the product of the arguments
  |        |   times   \┌───┐
  |        |     \  ┌───┤ × 
┌────┐   ┌────┐   ┌─┴─┐ └───┘ ┌───┐
 7| ├───┤ 3× ├───┤ ×    ┌───┤ +  - the sum of the arguments
└────┘   └────┘   └─┬─┘ ┌─┴─┐ └───┘      
                    └───┤ ×  ---- times
                        └─┬─┘ ┌───┐
                          └───┤ -  - the difference between the arguments
                              └───┘

Попробуй APL онлайн!


0

Юлия, 26 байт

f(a,b)=a$b$7*(2<a^2*b%7<5)

или же

f(a,b)=(3*a^5*b^5-a^3*b)%7

или же

f(a,b)=3*a*b*(a+b)*(a-b)%7


0

C # (интерактивный компилятор Visual C #) , 49 байт

x=>1+("3542331463126512156236413"+x).IndexOf(x)/5

Попробуйте онлайн!

-1 байт благодаря @GB!

Ввод представляет собой двухсимвольную строку, содержащую видимые левую и правую цифры.

Ниже приведено решение, которое я придумал самостоятельно. Используя строку поиска из ответа JavaScript в rink.attendant.6 , я смог сэкономить 5 байт (но теперь наши ответы довольно похожи;)

C # (интерактивный компилятор Visual C #) , 55 байт

x=>1+"42354 31463 51265 21562 41364 24532".IndexOf(x)/6

Попробуйте онлайн!


1
49 байтов, используя ("3542331463126512156236413" + x) вместо полной строки
ГБ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.