Określ wartość kości z widoku z boku

52

Napisz program lub funkcję, która pobierze lewą i prawą wartość kości jako liczby całkowite (1-6) i zwróci wartość na górze.

Układ kości:

    +---+
    | 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
    | 6 |
    +---+

  ,^.
<´ 5 `>  <-- Top value
|`._,´|
.6 | 4,  <-- Side values
 `.|,´

Wprowadzanie 6 4wróci 5.

Kolejność jest ważna:

2 3 -> 1
3 2 -> 6

Program nie musi działać z nieprawidłowymi wartościami wejściowymi.

Aby zniechęcić do oczywistego podejścia (używanie tabeli ze wszystkimi kombinacjami), niedozwolone jest stosowanie jakichkolwiek wbudowanych procedur kodowania tekstu lub procedur de / kompresji lub kodowania podstawowego lub cokolwiek innego podobnego do zmniejszenia rozmiaru. Zauważ, że używanie tabeli jest nadal dozwolone i dozwolone jest także tworzenie własnej dekompresji, o ile nie jest to zrobione przy użyciu gotowej funkcji biblioteki.

Dla celów odniesienia, oto tabela wszystkich kombinacji (tj. Wszystkich możliwych wejść i wyjść):

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

Wygrywa najkrótszy kod i obowiązują standardowe luki.

użytkownik694733
źródło
więc mogę użyć tabeli ze wszystkimi kombinacjami - 1 ^^?
dwana
Tak, możesz użyć tabeli. Ale nie można użyć wbudowanych procedur kompresji, aby ją zmniejszyć.
user694733

Odpowiedzi:

59

Python, 30

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

Żadnych wyszukiwań, tylko trochę zawstydzanie.

Przeciwległe twarze występują w parach, które są trzyczęściowymi uzupełnieniami, co oznacza, że ​​XOR do 7.

1,6
2,5
3,4

Biorąc pod uwagę dwie twarze z jednego zestawu, chcemy uzyskać twarz z drugiego zestawu. Dla (1,2,3)możemy to zrobić za pomocą XOR ( ^). Tak więc ^daje prawidłową odpowiedź do trzy-bitowego uzupełnienia, co oznacza x^7. Możemy warunkowo uzupełnić x^7*_.

Aby zdecydować, czy wziąć dopełnienie (XOR z 7), sprawdzamy, czy trojaczek narusza zasadę prawej ręki. Oznacza to, że a,bidzie w odwrotnej kolejności cyklicznej

1,6
2,5
3,4

traktując każdą linię jako jedną z trzech kategorii. Ponieważ elementy w każdej linii to negatywy mod 7, możemy je „haszować”, wykonując x*x%7.

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

Każda linia jest otrzymywany z poprzedniego cyklicznie przez przemnożenie przez 4 modulo 7, dzięki czemu możemy sprawdzić, czy związek ten zachodzi dla (b,a)zdecydować, czy do uzupełnienia: a*a%7==b*b*4%7.

Odpowiada to sprawdzeniu, czy moduł 7 a**2 * b**(-2)jest równy 4. Ponieważ b**6jest równy 1modulo 6, jest to równoważne z a**2 * b**4. Ponieważ drugą możliwą wartością jest 2 (sprawdzając przypadki), możemy sprawdzić, czy jest to 4, porównując z 3.

xnor
źródło
CJam - 26 -ri:Ari:B^7A7A-e<B7B-e<)=*^
Optymalizator
Mogę zaoszczędzić trochę , min(a,7-a)robiąc to a^7*(a>3), ale czuję, że powinna istnieć jeszcze krótsza droga. Jakieś pomysły?
xnor
Ooh, jest a/4*7^a...
x
11
Nigdy nie zdawałem sobie sprawy, że kawałki kości mają tę właściwość. Niezłe!
user694733,
1
@ user694733 Działa bardzo przypadkowo, że 6 jest dwa poniżej potęgi dwóch.
xnor
64

Istnieje ładna wielomianowa ekspresja modulo 7 dla trzeciej strony z dwiema stronami a i b .

3)(za3)b-zab3))mod7

lub faktorowane

3)zab(za2)-b2))mod7

Modulo 7 mapuje na resztę w {0,1,2,3,4,5,6}.

Wyjaśniam, dlaczego to działa w tej odpowiedzi Math SE , choć myślę, że prawdopodobnie brakuje mi czystszego argumentu. Jedynym innym dwumianowym wielomianem, który działa, jest

(3)za5b5-za3)b)mod7

które pierwotnie znalazłem, przekształcając moje bashowanie w operacje arytmetyczne, a następnie przeszukałem brom-force siłą wielomianów tej formy, aby znaleźć ładniejszą.

Dodaj porty tego do swojego ulubionego języka; to jest post CW.

J, 9 autorstwa Synthetica

7|3***+*-

Zobacz mój post

Dyalog APL, 9 autorstwa ngn (literówka naprawiona przez Adáma)

7|3×××+×-

Rażąco skradziona odpowiedź z góry J.

TI-Basic, 14 firmy Timtech

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

Pyth, 16 autorstwa FryAmTheEggman

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

Definiuje funkcję gdwóch wartości.

Golfscript, 18 autorstwa Peter Taylor (stary wielomian)

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

CJam, 18 Martin Büttner (przeniesiony z Peter's GolfScript) (stary wielomian)

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

Mathematica, 20, Martin Büttner

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

Tak, to jest jednoznaczny plus, i nie, nie ma krótszej drogi, która nie wykorzystuje jednoznacznego plusu.

dc, 21, autor: Toby Speight

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

Muszę dodać 7, aby aupewnić się, że różnica jest zawsze dodatnia (dc ma podpisanego %operatora).

Julia, 24 23 autorstwa Martina Büttnera

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

CoffeeScript, 28 26 autor: rink.attendant 6

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

JavaScript (ES6), 28 26 autor: rink.attendant.6

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

Zasadniczo to samo co CoffeeScript.

Python 28, autor: xnor

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

Bash, 31

Nic specjalnego:

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

lub alternatywnie:

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

Inne (dłuższe, ale być może interesujące) podejście .

Nim, 36 autorstwa Sillesta

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

Java 7, 46 44 autor: rink.attendant 6

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

Java 8, 25 23 autor: Kevin Cruijssen

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

PHP, 49 47 autor: rink.attendant.6

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

Partia, 52 niesfornych

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

CMD nie obsługuje natywnie prawdziwego modułu (więc nie obsługuje liczb ujemnych) - stąd %%7+7)%%7.

MNIEJ (jako parametryczna mieszanka ), 62 60 autor: rink.attendant.6

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

Zobacz mój post poniżej .

05AB1E, 10 8 autor: Emigna (-2 bajty autor: Kevin Cruijssen)

nÆs`3P7%

Wypróbuj online.

Haskell, 31 27 25 według ogólnej nazwy wyświetlanej

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

Wypróbuj online!

Excel, 27 autorstwa Wernischa

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

Excel VBA, 25, autor: Taylor Scott

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

Forth (gforth) 41 autorstwa reffu

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

Wypróbuj online!

C #, 23 autor: Kevin Cruijssen

a=>b=>(a*a-b*b)*a*b*3%7
xnor
źródło
1
FWIW, (ab)**5 % 7 == (ab)**-1 % 7 == a^b^7dla wszystkich a, bw 1..6tym, że a != bi a+b != 7.
Peter Taylor
@PeterTaylor Rzeczywiście, znalazłem to wyrażenie, używając **5jako proxy do odwracania modulo 7.
xnor
2
Tracę sen nad „dlaczego” tego niesamowitego wielomianu. Być może ludzie z matematyki mogą pomóc. math.stackexchange.com/questions/1101870/…
Cyfrowa trauma
1
Napisałem pochodną na matematyce. SE: math.stackexchange.com/a/1101984/24654
xnor
1
Możesz przepisać ciąg APL w następujący sposób 7|3×××+×-: 7-reszta z 3 razy iloczyn produktu razy suma razy różnica (między dwiema liczbami).
ngn
9

CJam, 43 28 bajtów

Nie mam pojęcia, czy podejście oparte na pełnej tabeli będzie krótsze, ale oto:

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

Dane wejściowe jak

2 3

Wynik:

1

Jest to mieszanka mojego poprzedniego algorytmu, aby określić poprawną twarz z 2 ścian i podejście xor do xors.

Wypróbuj online tutaj

Optymalizator
źródło
Czy możesz wyjaśnić, jak to działa? Ten sam pomysł, co ep1024?
user694733
@ user694733 wcale nie. Dodano objaśnienie.
Optymalizator
Tak, widziałem czas. Zastanawiałem się tylko, czy jest podobnie, ponieważ miał na to wyjaśnienie i nie mam pojęcia, jak działa CJam.
user694733
@Optimizer Chcę też zacząć na CJam, w jakimkolwiek ogólnym kierunku możesz wskazać mnie na tutoriale itp.? Widzę kilka przykładów, ale nie mają one żadnego wyjaśnienia :(
Teun Pronk
Powyższy link zawiera kilka przykładów i link do strony głównej, na której znajdują się objaśnienia dotyczące słów kluczowych w języku. Oprócz tego wyszukaj tutaj za pomocą słowa kluczowego cjam, aby dowiedzieć się na podstawie istniejących odpowiedzi.
Optymalizator
5

MNIEJ, 62 bajty

Używa algorytmu w tym poście :

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

Może być krótszy, jeśli użyto wartości całkowitej, ale aby ją wyświetlić, musiałem użyć contentwłaściwości CSS, która wymagała interpolacji zmiennej .

Niemniej jednak nie jest często używany język preprocesora CSS do golfa kodu!

Aby użyć z niektórymi kodami HTML, wykonaj następujące czynności:

p::after { .x(1, 3); }
<p>Number on top: </p>
lodowisko. dozorca 6
źródło
4

Pyth, 30 bajtów

K"23542 31463 12651 "h/x+K_Kz6

Wymaga dwóch cyfr jako danych wejściowych, bez spacji między nimi (np. 23Nie 2 3).

Wyjaśnienie:

Każda dwucyfrowa sekwencja, która się w niej znajduje, 23542reprezentuje dwie strony 1u góry. Podobnie, 31463dla 2 itd. Odwrócenie tego ciągu daje sekwencje 4przejścia 6.

Ten kod po prostu wyszukuje ciąg "23542 31463 12651 15621 36413 24532", dzieli indeks przez 6 i zwiększa, aby określić, jaka musi być górna strona.

Przetestuj online tutaj.

Dzięki @FryAmTheEggman za wskazówki dotyczące gry w golfa.

es1024
źródło
Niektóre gry w golfa związane z pythami: Pinguj J"23542 31463 12651 "h/x+J_Jscz)6mnie, jeśli niektóre z nich są mylące. Preferuj Ki Jdo przypisywania wartości, hjest jednoargumentowy +1, sna liście ciągów jest jk. (Ponadto, jeśli jest to dozwolone, 23najlepiej byłoby użyć ciągów takich jak dane wejściowe)
FryAmTheEggman
3

Przyjmuje podobne podejście jak es1024 z innym ciągiem wyszukiwania:

JavaScript (ES6), 73 72 61 bajtów

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

JavaScript (ES5), 88 87 77 bajtów

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

CoffeeScript, 71 62 bajtów

I dla samej zabawy kod jest o 1 bajt krótszy w CoffeeScript jako ES6 z powodu dozwolonego pominięcia nawiasów

Ze względu na użycie -~ lewy okazało się, że jest to ta sama liczba znaków, co ES6.

t=(l,r)->-~('354233146312651215623641332453'.indexOf([l]+r)/5)
lodowisko. dozorca 6
źródło
1
Zapisz 1 bajt: ''+l+r=>[l]+r
edc65
@ edc65 Dzięki! Och, jak JavaScript się zachowuje podczas dodawania różnych typów
rink.attendant.
1
Tak, operator + jest dziwny. Ale co z operatorem ~? 1+Math.floor=> -~. Szukaj także zamiast indexOf.
edc65
Ciekawy. I wiedziałem o tym, searchale dotyczy to tylko ES6.
rink.attendant.
W rzeczywistości String.prototype.searchjest częścią JavaScript od ECMAScript 3. edycja, więc możesz zmienić swoją odpowiedź. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
kamoroso94,
3

J (9)

Używa algorytmu z tego postu.

7|3***+*-

Wykres drzewa funkcji (może wyczyścić niektóre rzeczy):

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

Demonstracja:

   3 f 5
1
   4 f 6
2
   2 f 6
3
   2 f 1
4
   1 f 2
3
   4 f 5
6
.ıʇǝɥʇuʎs
źródło
0

PHP, 81 bajtów

To samo co moje rozwiązanie JavaScript:

function t($l,$r){echo(int)(1+strpos('354233146312651215623641332453',$l.$r)/5);}
lodowisko. dozorca 6
źródło
0

Lua 118

Musiałem przywrócić ostatnią wersję z powodu błędu, którego nie mogę znaleźć, ani nie mam czasu jej szukać.

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))

Nadal nad tym pracuję.

Teun Pronk
źródło
Przetestowałem to tutaj , i wydaje się, aby powrócić 4z 2 3.
user694733
rzeczywiście… dziwne. Przyjrzę się temu.
Teun Pronk
@ user694733 Naprawiono to :)
Teun Pronk
0

JavaScript (ES6), 79 bajtów

Nie najkrótszy, ale wypróbowałem inne podejście niż obecnie w odpowiedziach.

f=(a,b)=>[a,b,7-a,7-b].reduce((p,v,i,r)=>p?p:'2312132'.indexOf([v]+r[i+1])+1,0)
czerwony-X
źródło
0

Lua, 89 bajtów

Prosty port rozwiązania xnor w języku 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
Mark Reed
źródło
0

Bash, 85

To nie konkuruje pod względem golfowym z magicznym wielomianem @ xnor. Myślę jednak, że jest to kolejny ciekawy sposób na obliczenie odpowiedzi:

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

W szczególności wiemy o następujących kwestiach dotyczących kości:

  • Jeśli lewa twarz to 1, a prawa twarz to 2, to górna twarz to 3
  • Obrót wokół przeciwnych wierzchołków o 120 ° daje jeszcze trzykrotnie więcej wartości twarzy. Np. Obracamy {l = 1, r = 2, t = 3}, gdy otrzymujemy {l = 2, r = 3, t = 1} i obracamy ponownie, otrzymujemy {l = 3, r = 1, t = 2}
  • Suma przeciwnych ścian wynosi zawsze 7

Łącząc powyższe rekurencyjnie (używając {1,2,3} zakodowanego na stałe jako punktu początkowego), możemy wygenerować całe odwzorowanie {l, r} -> t dla wszystkich możliwych wartości. Ta odpowiedź definiuje funkcję rekurencyjną g (), która zapełnia pełną tablicę, tak że d [lr] = t. Funkcja rekurencyjna jest początkowo wywoływana z {1,2,3} i powtarza się w całej kostce, dopóki nie ma już elementów tablicy, które nie zostały ustawione. Funkcja powraca do siebie na dwa sposoby:

  • z zamienionymi l i r, odejmowanymi t od 7 (przeciwległe ściany)
  • z {l, r, t} obrócony do {r, t, l}

Następnie wykonuje proste wyszukiwanie w tablicy wymaganych wartości.

Cyfrowa trauma
źródło
0

Dyalog APL , 9 bajtów

Rażące zastąpienie postaci rozwiązaniem J ɐɔıʇǝɥʇuʎs :

7|3×××+×-

Edycja: Później zauważyłem, że dokładnie to rozwiązanie zasugerował ngn 17 stycznia 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
                              └───┘

Wypróbuj APL online!

Adám
źródło
0

Julia, 26 bajtów

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

lub

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

lub

f(a,b)=3*a*b*(a+b)*(a-b)%7
EricShermanCS
źródło
0

Common Lisp, 45 bajtów

(lambda(a b)(mod(* 3 a b(-(* a a)(* b b)))7))

Wypróbuj online!

Rozwiązanie portu xnor.

Renzo
źródło
0

C # (interaktywny kompilator Visual C #) , 49 bajtów

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

Wypróbuj online!

-1 bajt dzięki @GB!

Dane wejściowe to ciąg 2 znaków zawierający widoczne cyfry po lewej i prawej stronie.

Poniżej znajduje się rozwiązanie, które wymyśliłem niezależnie. Wykorzystanie ciągu wyszukiwania z odpowiedzi JavaScript w rink.attendant.6 , udało mi się ogolić 5 bajtów (ale teraz nasze odpowiedzi są dość podobne;)

C # (interaktywny kompilator Visual C #) , 55 bajtów

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

Wypróbuj online!

dana
źródło
1
49 bajtów przy użyciu („3542331463126512156236413” + x) zamiast pełnego ciągu
GB