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 4
wró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.
Odpowiedzi:
Python, 30
Ż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.
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 oznaczax^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,b
idzie w odwrotnej kolejności cyklicznejtraktują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
.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ówny4
. Ponieważb**6
jest równy1
modulo 6, jest to równoważne za**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.źródło
ri:Ari:B^7A7A-e<B7B-e<)=*^
min(a,7-a)
robiąc toa^7*(a>3)
, ale czuję, że powinna istnieć jeszcze krótsza droga. Jakieś pomysły?a/4*7^a
...Istnieje ładna wielomianowa ekspresja modulo 7 dla trzeciej strony z dwiema stronami a i b .
lub faktorowane
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
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
Zobacz mój post
Dyalog APL, 9 autorstwa ngn (literówka naprawiona przez Adáma)
Rażąco skradziona odpowiedź z góry J.
TI-Basic, 14 firmy Timtech
Pyth, 16 autorstwa FryAmTheEggman
Definiuje funkcję
g
dwóch wartości.Golfscript, 18 autorstwa Peter Taylor (stary wielomian)
CJam, 18 Martin Büttner (przeniesiony z Peter's GolfScript) (stary wielomian)
Mathematica, 20, Martin Büttner
Tak, to jest jednoznaczny plus, i nie, nie ma krótszej drogi, która nie wykorzystuje jednoznacznego plusu.
dc, 21, autor: Toby Speight
Muszę dodać 7, aby
a
upewnić się, że różnica jest zawsze dodatnia (dc ma podpisanego%
operatora).Julia,
2423 autorstwa Martina BüttneraCoffeeScript,
2826 autor: rink.attendant 6JavaScript (ES6),
2826 autor: rink.attendant.6Zasadniczo to samo co CoffeeScript.
Python 28, autor: xnor
Bash, 31
Nic specjalnego:
lub alternatywnie:
Inne (dłuższe, ale być może interesujące) podejście .
Nim, 36 autorstwa Sillesta
Java 7,
4644 autor: rink.attendant 6Java 8,
2523 autor: Kevin CruijssenPHP,
4947 autor: rink.attendant.6Partia, 52 niesfornych
CMD nie obsługuje natywnie prawdziwego modułu (więc nie obsługuje liczb ujemnych) - stąd
%%7+7)%%7
.MNIEJ (jako parametryczna mieszanka ),
6260 autor: rink.attendant.6Zobacz mój post poniżej .
05AB1E,
108 autor: Emigna (-2 bajty autor: Kevin Cruijssen)Wypróbuj online.
Haskell,
312725 według ogólnej nazwy wyświetlanejWypróbuj online!
Excel, 27 autorstwa Wernischa
Excel VBA, 25, autor: Taylor Scott
Forth (gforth) 41 autorstwa reffu
Wypróbuj online!
C #, 23 autor: Kevin Cruijssen
źródło
(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7
dla wszystkicha
,b
w1..6
tym, żea != b
ia+b != 7
.**5
jako proxy do odwracania modulo 7.7|3×××+×-
: 7-reszta z 3 razy iloczyn produktu razy suma razy różnica (między dwiema liczbami).CJam,
4328 bajtówNie mam pojęcia, czy podejście oparte na pełnej tabeli będzie krótsze, ale oto:
Dane wejściowe jak
Wynik:
Jest to mieszanka mojego poprzedniego algorytmu, aby określić poprawną twarz z 2 ścian i podejście xor do xors.
Wypróbuj online tutaj
źródło
MNIEJ, 62 bajty
Używa algorytmu w tym poście :
Może być krótszy, jeśli użyto wartości całkowitej, ale aby ją wyświetlić, musiałem użyć
content
wł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:
źródło
Pyth, 30 bajtów
Wymaga dwóch cyfr jako danych wejściowych, bez spacji między nimi (np.
23
Nie2 3
).Wyjaśnienie:
Każda dwucyfrowa sekwencja, która się w niej znajduje,
23542
reprezentuje dwie strony1
u góry. Podobnie,31463
dla 2 itd. Odwrócenie tego ciągu daje sekwencje4
przejścia6
.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.
źródło
J"23542 31463 12651 "h/x+J_Jscz)6
mnie, jeśli niektóre z nich są mylące. PreferujK
iJ
do przypisywania wartości,h
jest jednoargumentowy+1
,s
na liście ciągów jestjk
. (Ponadto, jeśli jest to dozwolone,23
najlepiej byłoby użyć ciągów takich jak dane wejściowe)Przyjmuje podobne podejście jak es1024 z innym ciągiem wyszukiwania:
JavaScript (ES6),
737261 bajtówJavaScript (ES5),
888777 bajtówCoffeeScript,
7162 bajtówI dla samej zabawy kod jest o 1 bajt krótszy w CoffeeScript jako ES6 z powodu dozwolonego pominięcia nawiasówZe względu na użycie
-~
lewy okazało się, że jest to ta sama liczba znaków, co ES6.źródło
''+l+r
=>[l]+r
1+Math.floor
=>-~
. Szukaj także zamiast indexOf.search
ale dotyczy to tylko ES6.String.prototype.search
jest częścią JavaScript od ECMAScript 3. edycja, więc możesz zmienić swoją odpowiedź. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…J (9)
Używa algorytmu z tego postu.
Wykres drzewa funkcji (może wyczyścić niektóre rzeczy):
Demonstracja:
źródło
PHP, 81 bajtów
To samo co moje rozwiązanie JavaScript:
źródło
Lua 118
Musiałem przywrócić ostatnią wersję z powodu błędu, którego nie mogę znaleźć, ani nie mam czasu jej szukać.
Nadal nad tym pracuję.
źródło
4
z2 3
.JavaScript (ES6), 79 bajtów
Nie najkrótszy, ale wypróbowałem inne podejście niż obecnie w odpowiedziach.
źródło
Lua, 89 bajtów
Prosty port rozwiązania xnor w języku Python.
źródło
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:
W szczególności wiemy o następujących kwestiach dotyczących kości:
Łą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:
Następnie wykonuje proste wyszukiwanie w tablicy wymaganych wartości.
źródło
Dyalog APL , 9 bajtów
Rażące zastąpienie postaci rozwiązaniem J ɐɔıʇǝɥʇuʎs :
Edycja: Później zauważyłem, że dokładnie to rozwiązanie zasugerował ngn 17 stycznia 15.
Wypróbuj APL online!
źródło
Julia, 26 bajtów
lub
lub
źródło
Common Lisp, 45 bajtów
Wypróbuj online!
Rozwiązanie portu xnor.
źródło
C # (interaktywny kompilator Visual C #) , 49 bajtów
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
Wypróbuj online!
źródło