Przeanalizuj przetasowane przetasowania


13

Rod moderuje grę karcianą między dwoma graczami: George'em i Timem. Obecnie Tim tasuje karty. Rod podejrzewa, że ​​Tim próbuje oszukiwać, więc potrzebuje twojej pomocy, aby sprawdzić, czy losowanie jest sprawiedliwe.

Tim wykonuje przetasowane rozdawanie: tnie stos kart z dołu talii, a następnie tnie różne części z wierzchu stosu na wierzch talii i kilkakrotnie powtarza ten proces.

Rod jest orłem i widzi dokładnie, ile kart wycina Tim za każdym razem, jednak nie może obliczyć i śledzić kart tak szybko, jak Tim tasuje. W tym momencie wchodzisz: Rod chciałby napisać program lub funkcję, która pobiera szczegółowe informacje o tasowaniu i określa, czy tasowanie jest sprawiedliwe, słabe, czy podstępne.

  • Jeśli po tasowaniu mniej niż 25 par sąsiadujących kart pozostanie w sąsiedztwie (w tej samej kolejności), tasowanie jest sprawiedliwe i gra może być kontynuowana.
  • Jeśli co najmniej 25 (ale nie wszystkie) pary sąsiednich kart pozostaną obok siebie, tasowanie jest słabe, a Rod rozbije Tima nad głową i poprosi go o przetasowanie jeszcze trochę.
  • Jeśli na końcu wszystkie karty pozostaną w tej samej pozycji, Tim oczywiście oszukuje, a Rod uderzy go dużym pstrągiem.

To jest kod golfowy, więc wygrywa najkrótszy kod.

Wejście:

Otrzymasz ciąg liczb od 0 do 52 (oba wyłączne) oddzielonych spacją, w kilku liniach, gdzie każda linia reprezentuje rundę tasowania, która zaczyna się i kończy ze wszystkimi kartami ułożonymi razem.

W każdej linii pierwsza liczba to liczba kart, które Tim wycina z dołu talii, a każda kolejna liczba to liczba kart, które upuszcza z ręki na wierzch talii. Jeśli jakieś karty pozostaną po ostatnim numerze na linii, powinieneś założyć, że Tim umieszcza je na wierzchu talii.

Dane wejściowe są gwarantowane. Jest co najmniej jedna linia liczb, a każda linia zawiera co najmniej 2 liczby. Pierwsza liczba w każdej linii nie jest mniejsza niż suma wszystkich innych liczb w tej samej linii. Końcowy znak nowej linii jest opcjonalny, możesz założyć, że wejście ma jedno lub że go nie ma.

Wynik:

Twój program powinien wydrukować / zwrócić „fair”, jeśli losowanie jest sprawiedliwe, „słabe”, jeśli losowanie jest słabe, i „trick”, jeśli Tim utrzymuje wszystkie karty w tej samej kolejności. Końcowy znak nowej linii jest opcjonalny.

Przykład:

Zakłada się, że talia zawiera 52 karty, ale w celach demonstracyjnych użyję mniejszej talii 10 kart.

Wejście:

5 3 1
4 2 2

Początkowa talia, patrząc od góry: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9w ręce)
35 6 7 0 1 2 3 4( 8 9w ręce)
18 5 6 7 0 1 2 3 4( 9w ręce)
koniec linii ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4w ręce)
21 2 9 8 5 6 7 0( 3 4w ręce)
23 4 1 2 9 8 5 6 7 0
4 pary pozostają obok siebie:(3 4) (1 2) (5 6) (6 7)

Przypadki testowe:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Wynik: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Wynik: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Wynik: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Wynik: weak


26 13
26 13
26 13
26 13

Wynik: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Wynik: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Wynik: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Wynik: fair

Wymagania:

  • Jeśli napiszesz funkcję, może ona albo czytać ze standardowego wejścia, albo odbierać dane wejściowe jako pojedynczy parametr ciągu. Ponadto funkcja może wydrukować wydruk lub go zwrócić.
  • Program musi być uruchamiany w systemie Linux przy użyciu ogólnodostępnego oprogramowania.
  • Kod źródłowy musi używać tylko znaków ASCII.
  • Brak standardowych luk.

2
Dlaczego ograniczenie do ASCII? Wiele języków (APL, kod maszynowy, TI-BASIC) w ogóle nie używa ASCII, więc domyślnie ich nie dopuszczasz.
lirtosiast

@ThomasKwa Ponieważ nie podoba mi się problem związany z wyświetlaniem i liczeniem znaków spoza ASCII. Niektóre z tych języków mają reprezentacje ASCII lub alternatywy. Myślę, że nie jest to zbyt surowe ograniczenie i lekko wyrównuje szanse.
Aditsu zakończyło się, ponieważ SE to EVIL

Myślę, że system punktacji, taki jak „Wpisy, które używają tylko drukowalnych znaków ASCII, będą miały liczbę bajtów pomnożoną przez log (95) / log (256)” byłoby lepszą opcją, jeśli chcesz dość zachęcać do drukowania ASCII. Powodem jest to, że zawartość informacyjna wpisów o tym samym wyniku byłaby równa. Osobiście wolałbym jednak zwykłą ocenę według bajtów.
lirtosiast

@ThomasKwa Ok, a co powiesz na to?
Można

Odpowiedzi:




2

JavaScript, 292 289 bajtów

Prawdopodobnie mogłoby to spowodować wyciśnięcie z niego więcej bajtów, ale na razie jest to szybki pierwszy krok:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

EDYCJA: Zaoszczędzono 3 bajty, ponownie wykorzystując wartość iz pętli budowania talii podczas liczenia liczby sąsiednich kart.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.