Kości nieprzechodnie są ładnymi, małymi zabawkami, które przeczą naszej intuicji w teorii prawdopodobieństwa. Potrzebujemy kilku definicji tego wyzwania:
Rozważ dwie kości A i B, które są rzucane jednocześnie. Mówimy, że bije B jeśli prawdopodobieństwo A wykazujący większą liczbę niż B jest większe niż prawdopodobieństwo B wykazujące większą liczbę niż A .
Rozważmy teraz zestaw trzech kości, z etykietami , B , C . Taki zestaw kości nazywany jest nieprzechodnim, jeśli
- albo A bije B , B bije C i C bije A
- lub C uderzeń B , B bije i uderzeń C .
Jako jeden z moich ulubionych przykładów, rozważ kości Grime , które mają następujące strony:
A: 3 3 3 3 3 6
B: 2 2 2 5 5 5
C: 1 4 4 4 4 4
Co ciekawe, średnia każdej kości wynosi 3,5, podobnie jak zwykła kostka.
Można pokazać, że:
- A bije B z prawdopodobieństwem 7/12.
- B pokonuje C z prawdopodobieństwem 7/12.
- C bije A z prawdopodobieństwem 25/36.
Teraz te konkretne kości są jeszcze dziwniejsze. Jeśli rzucimy każdą kością dwa razy i zsumujemy wyniki, kolejność bitów zostanie odwrócona:
- B pokonuje A z prawdopodobieństwem 85/144.
- C bije B z prawdopodobieństwem 85/144.
- A bije C z prawdopodobieństwem 671/1296.
Nazwijmy zestaw kości z tą właściwością Nieprzechodnie nieprzepuszczalne .
Z drugiej strony, jeśli kości zachowają swój pierwotny cykl przy użyciu dwóch rzutów, nazywamy je silnie nieprzechodnie . (Jeśli nie ma cyklu dla dwóch rzutów, po prostu nazywamy je nieprzechodnimi ).
Wyzwanie
Biorąc pod uwagę trzy sześciościenne określić, które z powyższych właściwości ten zestaw posiada i jedno wyjście z następujących ciągów: none
, nontransitive
, Grime-nontransitive
, strongly nontransitive
.
Możesz napisać program lub funkcję, wziąć dane wejściowe przez STDIN, argument wiersza poleceń, monit lub argument funkcji i zapisać wynik w STDOUT lub zwrócić go jako ciąg.
Możesz założyć, że wszystkie strony są liczbami całkowitymi nieujemnymi. Nie możesz zakładać, że boki lub kości są w określonej kolejności. Możesz wprowadzać dane w dowolnym dogodnym formacie listy lub ciągu.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
none
1 2 3 4 5 6, 6 5 4 3 2 1, 1 3 5 2 4 6
1 1 1 6 6 6, 4 4 4 5 5 5, 5 5 5 5 5 5
1 1 2 5 6 6, 2 2 3 4 4 6, 2 3 3 4 4 5
0 1 2 3 4 5, 1 1 2 3 3 5, 1 2 2 2 3 5
3 13 5 7 13 7, 5 7 11 5 7 13, 5 9 13 5 7 9
nontransitive
1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4
1 4 4 4 4 4, 2 2 2 4 5 6, 2 3 3 3 5 5
1 2 1 6 5 6, 3 1 3 6 2 6, 2 4 2 4 4 5
3 4 6 6 7 7, 4 4 4 7 7 7, 5 5 5 5 6 7
2 5 11 11 14 14, 5 5 5 14 14 14, 8 8 8 8 8 17
Grime-nontransitive
3 3 3 3 3 6, 2 2 2 5 5 5, 1 4 4 4 4 4
1 1 4 5 5 5, 2 2 2 3 6 6, 3 3 3 4 4 4
2 1 4 6 4 4, 2 4 5 2 3 5, 3 3 6 3 3 3
11 11 13 15 15 16, 12 12 12 13 16 16, 13 13 13 14 14 14
4 4 7 16 19 19, 4 7 13 13 13 19, 4 10 10 10 16 19
strongly nontransitive
2 2 2 5 5 5, 2 3 3 3 5 5, 1 1 4 5 5 5
2 2 2 3 6 6, 2 2 2 5 5 5, 2 2 4 4 4 5
1 5 1 3 6 5, 6 6 4 2 2 1, 5 3 4 3 4 2
0 0 2 4 4 5, 0 1 1 3 5 5, 1 1 2 3 4 4
1 1 9 17 17 21, 1 5 5 13 21 21, 5 5 13 13 13 17
Jeśli chcesz jeszcze dokładniej przetestować swój kod, Peter Taylor był na tyle uprzejmy, że napisał implementację referencyjną, która sklasyfikowała wszystkie ~ 5000 zestawów kości o bokach od 1 do 6 i średnio 3,5. Link do wklejania
źródło
1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4
Dostaję A <B 17/36, B> C 19/36, C <A 16/36.Odpowiedzi:
Dyalog APL,
107100 bajtów{({+/×+/¨,¨×⍵∘.-¨1⌽⍵}{3≠|a←⍺⍺⍵:1⋄a=b←⍺⍺∘.+⍨¨⍵:2⋄3+a=-b}⍵)⊃(⊂'none'),'strongly '⍬'Grime-',¨⊂'nontransitive'}
{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}
(Dzięki @Tobia za to prostsze, krótsze, lepsze rozwiązanie)
Podstawy:
←
zadanie⋄
separator instrukcji{}
forma lambda⍺⍵
argument lewy i prawyA:B
straż („jeśliA
to wróćB
”)T
jest funkcją, która zwraca 3, jeśli A bije B, B bije C, a C bije A; -3, jeśli jest dokładnie odwrotnie; i coś pomiędzy nimi. Szczegółowo:1⌽⍵
jest jednym obrotem⍵
. Jeśli⍵
jest ABC, rotacja to BCA.∘.-
oblicza tabelę odejmowania między dwoma wektorami (1 2...10 ∘.× 1 2...10
byłaby to tabliczka mnożenia, którą znamy ze szkoły). Stosujemy to między każdym (¨
) elementem⍵
i odpowiadającym mu elementem w1⌽⍵
.×
podpis wszystkich liczb w tabelach odejmowania∊¨
spłaszcz każdy stół+/¨
i podsumuj to. Mamy teraz trzy liczby, które reprezentują salda: liczba wygranych minus przegrane przypadki dla każdej z A vs B, B vs C, C vs A.×
podpis tych+/
sumaNastępnie kolejno zajmuj się skrzynkami:
3≠|S←T⍵:'none'
JeśliT⍵
wartość bezwzględna nie wynosi 3, zwróć „brak”N←'nontransitive'
bardzo potrzebujemy tego słowaS=D←T∘.+⍨¨⍵:'strongly ',N
obliczT
pary kości (∘.+⍨¨⍵
← →⍵((∘.+)¨)⍵
) i zwróć „zdecydowanie ...”, jeśli nadal utrzymują się te same relacje między ABCS=-D:'Grime-',N
⍝ „Brud”, jeśli relacje są w przeciwnych kierunkachN
jeśli wszystko inne zawiedzie, po prostu „nieprzechodni”źródło
{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}
Python 2, 269
Oto miłe, małe wyrażenie, które odnosi się do funkcji. Akceptuje trzy listy liczb całkowitych. Przechodzi wszystkie przypadki testowe.
źródło
J -
311257 bajtówAktualizacja (13 stycznia 2015 r.):
Objaśnienie: Używając Gerunds, uprość
if.
s do@.
s.Starsza wersja:
Najpierw spróbuj zarówno kodowania w J, jak i gry w golfa.
Uruchom go, używając składni podobnej do następującej (dodatkowe spacje dla przejrzystości):
Wyjaśnienie:
g
jest definiowany jako diad biorący dwie tablice, który mówi, czy pierwsza kostka bije drugą kostkęh
jest definiowany jako diad biorący dwie tablice, który mówi, czy rzucanie dwa razy i sumowanie, czy pierwsza kostka bije drugąf
jest monadą, która bierze tabelę i zwraca ciąg znaków z poprawna odpowiedźEdit: Fix błąd w grime-nieprzechodnie warunku (zastępując
,
z*
)źródło
Pyth 129
133Wypróbuj tutaj , a przynajmniej możesz, ale online
eval
nie lubi list list :( Jeśli chcesz go wypróbować, ręcznie zapisz listę 3 kości w zmiennej nieużywanej przez program, a następnie zamień wszystkie wystąpieniaQ
tej zmiennej. Przykładowa inicjalizacja:To przechodzi wszystkie przypadki testowe Martina, nie mam serca, aby przejrzeć wszystkie przypadki Petera: P
Wyjaśnienie (to będzie doozy)
Całkiem prosta, sprawia, że funkcja
y
zwraca sumę każdej pary kartezjańskich wartości w iterowalnym. Odpowiednik:def y(b):return map(lambda d:sum(d),product(b,repeats=2))
. Służy do tworzenia matryc wielostronnych, które symulują rzucanie zwykłymi matrycami dwa razy.Definiuje funkcję
g
2 argumentów, która zwraca liczbę przypadków, gdy kostka bije inną. Odpowiednikdef g(G,H):return sum(map(lambda k:sum(map(lambda b:b>k,G)),H)
.Definiuje funkcję,
P
która przyjmuje jako argument listę dwóch kości. Zwraca -1, jeśli pierwsza kość „przegrywa”, 0 dla remisu i 1, jeśli pierwsza kość „wygrywa”. Równoważny:W
AGH
wyznacza działa jak pyton Zadanie 2-krotnego. GłównieG,H=(result)
Wyjaśniam wstecz przez mapy.
m,@Qb@QhbUQ
iteruje powyżej b = 0..2 i generuje 2 krotki kostek o indeksie b i indeksie b + 1. To daje nam kości (A, B), (B, C), (C, A) (pyth automatycznie modyfikuje indeksy według długości listy).Następnie,
m,PkP,yhkyek
iteruje wynik poprzedniej mapy, a każda para kości jest przechowywana w kilogramach dla każdego przebiegu. Zwracatuple(P(k),P(tuple(y(k[0]),y(k[-1]))))
dla każdej wartości. Sprowadza się to do (((A bije B ?, 2 * A bije 2 * B), (B bije C ?, 2 * B bije ...)).Na koniec
msdC
sumuje wartości poprzedniej mapy po jej spakowaniu. Zip powoduje, że wszystkie wartości pojedynczych kości „biją” w pierwszej krotce, a wartości podwójnych kości w drugiej.Obrzydliwa rzecz, która drukuje wyniki. Jeśli G jest 0 lub nie jest podzielna przez 3, to połowy bot +/- 3, (
|!G%G3
), drukinone
, inaczej wypisuje sumę listy follwing:[not(G+H)*"Grime",(G==H)*"strongly ","nontransitive"]
. Myślę, że booleany są dość oczywiste w odniesieniu do definicji w pytaniu. Zauważ, że G nie może być tutaj zero, ponieważ jest to wychwycone przez poprzednią kontrolę.źródło
J (204)
O wiele za długo, prawdopodobnie można by go dużo zagrać w golfa, mając bardziej wydajny system doboru odpowiedniej struny.
źródło
Matlab (427)
Nie jest tak krótki i jestem pewien, że można go jeszcze bardziej pograć w golfa, po prostu próbowałem rozwiązać to wyzwanie, ponieważ myślałem, że to bardzo fajne zadanie, więc dziękuję @ MartinBüttner za stworzenie tego wyzwania!
Oto pełny kod z komentarzami, jeśli chcesz spróbować zrozumieć, co się dzieje. Podałem kilka przypadków testowych zając i wykluczyłem polecenia wejściowe:
źródło
input()
a następnie przypisujesz trzy elementya,b,c
? Ponadto, należy użyć dokładnie sznurki w specyfikacji (none
,nontransitive
i skapitalizowanychGrime
) ... powinien chyba nawet zaoszczędzić bajtów.disp
polecenia w długiej wersji, były one tylko do testowania programu, ale końcowy komunikat jest przechowywany wm
. I poprawiłemG
.JavaScript - 276 bajtów
Prawdopodobnie nie jestem zbyt dobry, więc aby być pewnym moich wyników, wolę rzucić kostką setki tysięcy razy.
Wyrażenie zwraca wartość do funkcji, którą należy wywołać tylko z jednym argumentem: tablicą trzech tablic liczb całkowitych. Sprawdź skrzypce, aby móc samodzielnie uruchomić kod.
Oto wersja bez golfa:
źródło