Wykonaj Superb Shuffle ™

15

Na potrzeby tego pytania talia kart jest sformatowana w następujący sposób:

[
  "AS", "2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", 
  "AD", "2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", 
  "AH", "2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", 
  "AC", "2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", 
  "J", "J"
]

Karty są zawsze formatowane jako wartość, po której następują kolory. Np. ASJest as pik. Dwa single J to Jokery. Chcemy przetasować tę talię kart, ale musi ona być Superb ™.

Superb Shuffle ™ to taki, w którym:

  • Żadne dwie karty (oprócz Jokerów) tego samego koloru nie sąsiadują ze sobą.
  • Żadna karta (z wyjątkiem Jokerów) nie sąsiaduje z jedną o tej samej wartości.
  • Żadna karta (z wyjątkiem Jokerów) nie sąsiaduje z jedną z sąsiednich wartości (jedną wyższą lub jedną niższą w tej kolejności, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. Zauważ, że As nie może sąsiadować z 2 lub Królem).
  • Jokery mogą być w dowolnej pozycji.
  • Definicja Superb Shuffle ™ nie wymaga, aby karty były w innej kolejności za każdym razem, gdy są tasowane. Co nie jest zbyt wspaniałe, ale jest to Superb ™.

Ponieważ to jest Superb ™.

Przykładem może być:

[
  "AS", "5D", "9H", "KC", "2D", "6H", "10C", "QS", "3H", "7C", "9S", 
  "KD", "4C", "6S", "10D", "AC", "3S", "7D", "JH", "J", "4D", "8H", 
  "QC", "AD", "5H", "9C", "JS", "2H", "6C", "8S", "QD", "3C", "5S", 
  "9D", "KH", "2S", "6D", "10H", "J", "3D", "7H", "JC", "KS", "4H", 
  "8C", "10S", "AH", "5C", "7S", "JD", "2C", "4S", "8D", "QH"
]

Wyzwanie:

  • Napisz kod, aby wykonać doskonałe odtwarzanie losowe
  • Użyj dowolnego języka.
  • Wejście może być albo :
    • talię kart, jak opisano powyżej, w tej samej kolejności , jako tablicę lub inną strukturę listy.
    • Brak danych wejściowych (kod generuje talię kart w tej kolejności)
  • Wyjściem musi być pełna talia kart w Superb Shuffle ™, jak opisano powyżej.
  • Spróbuj wykonać Superb Shuffle ™ w najmniejszej liczbie bajtów.
  • Link do tłumacza online, takiego jak Try It Online, jest preferowany, ale opcjonalny.

Miłego tasowania!

AJFaraday
źródło
1
Nieco spokrewniony
Kudłaty
Czy możemy zastąpić Tzamiast 10?
Jo King
@JoKing Nie możesz. Podobnie jak przy generowaniu pytania o talię kart, różne długości strun są częścią złożoności.
AJFaraday
Czy wolno nam drukować każdą kartę osobno, tak jak robi odpowiedź Węgiel drzewny, czy też musimy faktycznie zwrócić tablicę / listę?
Kevin Cruijssen
@KevinCruijssen W porządku, pod warunkiem, że zwraca talię kart w tym formacie (wartość to kolor).
AJFaraday

Odpowiedzi:

5

Japt, 6 5 4 bajtów

Dzieli tablicę wejściową na podgrupy każdego 16 elementu i spłaszcza.

óG c

Spróbuj

Kudłaty
źródło
Potrzebujesz go spłaszczyć?
Oliver
@ Oliver, mam nadzieję, że nie; czekam na potwierdzenie AJ.
Kudłaty
34

Rubinowy , 31 bajtów

->x{(0..53).map{|r|x[r*17%54]}}

Wypróbuj online!

Wyjaśnienie:

Wybieram jedną kartę, a następnie przeskakuję przez kolejne 16 i zaczynam od pierwszej karty, gdy docieram do ostatniej karty z talii. 17 i 54 są wzajemnie pierwsze, więc z pewnością wybiorę wszystkie karty.

17 pozycja na pewno ma inny kolor, a różnica w wartości wynosi co najmniej 2: 13 (lub 15) karta ma tę samą wartość i inny kolor, więc pomijając inne 4 (lub 2), wartość jest prawidłowa .

GB
źródło
6
Gratulacje
3
Czy możesz wyjaśnić, jak znalazłeś * 17% 54? Po prostu próbuj i popełniaj błędy, czy brakuje mi oczywistych obliczeń matematycznych?
Daniel
@ Daniel 17 jest wymaganą minimalną odległością między dwiema kartami o różnych kolorach, które nie sąsiadują ze sobą numerycznie (uwzględniając dwa żarty, np. 17 kroków prowadzi od asa trefl do 3 pik); 54 to liczba kart w talii.
Hellion
11

Python 3 , 21 bajtów

lambda x:(x*17)[::17]

Wypróbuj online!

Wyjaśnienie:

Ten sam pomysł, co moja odpowiedź Ruby, ale jeszcze krótszy w Pythonie: używam 17 talii i wybieram co 17 kart.

GB
źródło
5

JavaScript, 35 bajtów

x=>x.map((a,i)=>i%2?a:x[(i+20)%54])

Wypróbuj online!

Biorąc tablicę talii jako dane wejściowe i zastępując każdą nieparzystą wartość inną kartą, która jest „20 kart” w talii.

Przypadkowy facet
źródło
1
Aha, kiedy powiedziałem „wszyscy” w moim poście było niepoprawne; tak też poszedłem!
Jonathan Allan
4

Java 10, 72 65 bajtów

d->{var r=d.clone();for(int i=54;i-->0;r[i*7%54]=d[i]);return r;}

Podobne do odpowiedzi Ruby @GB , ale przy użyciu i*7%54tablicy wynikowej zamiast i*17%54tablicy wejściowej do zapisania bajtu.

Wypróbuj online.

Wyjaśnienie:

d->{              // Method with String-array as both parameter and return-type
  var r=d.clone();//  Result-String, starting as a copy of the input
  for(int i=54;i-->0;
                  //   Loop `i` in the range (54, 0]
    r[            //    Set an item in the result-array at index:
      i*7%54      //     Index `i` multiplied by 7, and then take modulo-54
     ]=d[i]);     //    To the `i`'th item in the input-Deck
  return r;}      //  Return the result-Array
Kevin Cruijssen
źródło
Niestety wynik zawiera wiele kart sąsiadujących z kartami tego samego koloru. Zaczyna się od AS, 6S, JS, 3D, 8D, KD,.
AJFaraday
@AJFaraday TIO wciąż miał 11 zamiast 7. Czy możesz to sprawdzić jeszcze raz. Być może przegapiłem coś innego, ale myślę, że teraz powinno być poprawne (mam nadzieję).
Kevin Cruijssen
To już wszystko. Dobra robota!
AJFaraday
3

Perl 6 , 21 20 18 bajtów

Dzięki Brad Gilbert b2gills za -2 bajty

{.[$++*17%$_]xx$_}

Wypróbuj online!

Kolejny port odpowiedzi GB . Zauważ, że chociaż zmienna globalna $!nie jest resetowana między funkcjami, wartość nie ma znaczenia, ponieważ dowolna kolejność danych wyjściowych jest poprawna. Jednak $ jest resetowany.

Wyjaśnienie:

{                } #Anonymous code block
             xx$_  #Repeat size of inputted array (54) times
 .[         ]      #Get from the inputted array, the value at index
    $++*17%$_         #The incremented variable, multiplied by 17, modded by size of the array
Jo King
źródło
1
Działa to równie dobrze w przypadku stanu bez nazwy var, $jak w przypadku $!lub $/. Również jeśli użyłeś $_zamiast tego @_możesz zacząć od .[…]zamiast @_[…]zapisywania kolejnego bajtu.
Brad Gilbert b2gills
2

05AB1E , 9 7 5 bajtów

ā17*è

Port odpowiedzi Ruby @GB , więc proszę go głosować!

-2 bajty, drukując każdą kartę z separatorem nowej linii zamiast owijania jej na liście wyników
-2 bajty dzięki @ Mr.Xcoder

Wypróbuj online.

Wyjaśnienie:

ā        # 1-indexed length range [1 ... length_of_input_list (54)]
 17*     #  `k`: Multiply each index by 17
    è    #  And then replace each item with the 0-indexed `k`'th card of the input-list
         #  (with automatic wrap-around)
Kevin Cruijssen
źródło
1
ā17*èpowinien zaoszczędzić jeszcze 2 bajty
Mr. Xcoder
2

JavaScript, 27

Kolejna oparta na rubinowej odpowiedzi

d=>d.map((_,i)=>d[i*17%54])

Edytowane w oczywisty sposób

vityavv
źródło
2

T-SQL, 31 bajtów

SELECT c FROM t ORDER BY i*7%54

Jeśli nie zależy ci na dodatkowej kolumnie w danych wyjściowych, mogę sprowadzić ją do 29 bajtów :

SELECT*FROM t ORDER BY i*7%54

Więc możesz sprawdzić, czy mój wynik to „Superb”, oto talia, którą produkuje:

 J, 5H,  8S, KH, 3D,  8C, JD, AS, 6H,  9S, AC, 4D, 9C, QD, 
2S, 7H, 10S, 2C, 5D, 10C, KD, 3S, 8H,  JS, 3C, 6D, JC, 
AH, 4S,  9H, QS, 4C,  7D, QC, 2H, 5S, 10H, KS, 5C, 8D, 
KC, 3H,  6S, JH, AD,  6C, 9D,  J, 4H,  7S, QH, 2D, 7C, 10D

(Wygenerowano przy użyciu nowego dodatku SQL 2017 STRING_AGG):

SELECT STRING_AGG(c,', ')WITHIN GROUP(ORDER BY i*7%54)FROM t 

Najtrudniejszą częścią dla mnie nie był wybrany kod, zapełniał on tabelę wejściową (która jest dozwolona dla SQL zgodnie z naszymi regułami IO ).

Ponieważ SQL jest z natury nieuporządkowany (gwarantuje tylko pewną kolejność, jeśli dodasz wyraźną ORDER BYklauzulę), musiałem zawrzeć tę oryginalną kolejność jako pole i w tabeli wejściowej t . Oznacza to również, że mogę go używać do sortowania, stosując ten sam proces „względnie główny” czynnik / mod, z którego korzystają wszyscy inni. Okazało się, że i*7%54działało tak samo dobrze i*17%54.

Oto polecenia do skonfigurowania i wypełnienia tabeli wejściowej t , w oparciu o moje rozwiązanie tego powiązanego pytania :

CREATE TABLE t (i INT IDENTITY(1,1), c VARCHAR(5))

--Insert 52 suited cards
INSERT t(c)
SELECT v.value+s.a as c
FROM STRING_SPLIT('A-2-3-4-5-6-7-8-9-10-J-Q-K','-')v,
     (VALUES('S',1),('D',2),('H',3),('C',4))s(a,b)
ORDER BY s.b

--Insert Jokers
INSERT t(c) SELECT 'J'
INSERT t(c) SELECT 'J'
BradC
źródło
Czy inie byłoby tu uważane za dodatkowy wkład?
Shaggy
@Shaggy Pytanie mówi, że mogę uzyskać tacę wejściową w oryginalnej (wymienionej) kolejności. Jedynym sposobem, aby to zagwarantować w SQL, jest jawne włączenie danych wejściowych, ponieważ tabele SQL nie mają „domyślnej kolejności” . Tak więc uważam to za niezbędny składnik danych wejściowych. Ale nie martw się, SQL i tak rzadko jest konkurencyjny :)
BradC,
2

Galaretka ,  5  4 bajtów

s⁴ZẎ

Wypróbuj online!

Okazuje się, że sposób każdy inny wszyscy z wyjątkiem losowych facet robi to zapisuje bajt :(
kredytową do GB za ich metody .


Sposób, w jaki poszedłem ...

ṙÐe20

Wypróbuj online!

W jaki sposób?

Napraw każdą inną kartę i przeplataj ją z obrotem talii pozostawionym o 20 miejsc (18 i 22 miejsca również działają; ponadto działa zarówno kierunek obrotu, jak i naprawianie kart nieparzystych lub parzystych)

ṙÐe20 - Link: list of the card strings (lists of characters)
   20 - place a literal twenty on the right
 Ðe   - apply to even indices:
ṙ     -   rotate left (by 20)

Że jest (używając Tdo 10i rjze bjdla Js):

input: AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj
  ṙ20: 8D 9D TD JD QD KD AH 2H 3H 4H 5H 6H 7H 8H 9H TH JH QH KH AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC rj bj AS 2S 3S 4S 5S 6S 7S 8S 9S TS JS QS KS AD 2D 3D 4D 5D 6D 7D
ṙÐe20: AS 9D 3S JD 5S KD 7S 2H 9S 4H JS 6H KS 8H 2D TH 4D QH 6D AC 8D 3C TD 5C QD 7C AH 9C 3H JC 5H KC 7H bj 9H 2S JH 4S KH 6S 2C 8S 4C TS 6C QS 8C AD TC 3D QC 5D rj 7D
Jonathan Allan
źródło
2

PowerShell 3.0, 30 26 bajtów

$args[(0..53|%{$_*17%54})]

-4 dzięki
kodowi Mazzy Old o wielkości 30 bajtów

param($d)0..53|%{$d[$_*17%54]}

Kolejny port metody GB.

Veskah
źródło
26 bajtów $args[(0..53|%{$_*17%54})].
mazzy
@Mazzy Czuję, że to łamie specyfikacje wejściowe. Jasne, że są zebrane w $ args, ale tak naprawdę nie
podajesz
cytuję: The input can be either:... in the same order, as *an array*. $argsjest tablicą. i możesz użyć rozpryskiwania . na przykład $a=@("AS", ..., "J"); &{} @a. Spróbuj. :)
mazzy
dodatkowo wydaje mi się, że nie trzeba liczyć postaci &{i }. Możesz zapisać param($d)0..53|%{$d[$_*17%54]}do pliku. i wywołaj ten plik bez&{...}
mazzy,
1
@mazzy Tak, zawsze byłem trochę niepewny, które części kontrolne zachować, więc zwykle domyślnie robiłem z nich blok skryptu. Ale rozbiorę to w przyszłości.
Veskah
1

Węgiel , 8 bajtów

Eθ§θ×¹⁷κ

Wypróbuj online! Link jest do pełnej wersji kodu. Kolejny port odpowiedzi Ruby @ GB. Wyjaśnienie:

 θ          Input array
E           Map over elements
       κ    Current index
     ¹⁷     Literal 17
    ×       Multiply
   θ        Input array
  §         Cyclically index
            Implicitly print each result on its own line
Neil
źródło
1

Czerwony , 44 bajty

func[a][append/dup a a 16 prin extract a 17]

Wypróbuj online!

Kolejna interpretacja kodu GB. Dołączam 16 egzemplarzy talii do siebie, a następnie wydobywam każdą 17 kartę.

Galen Iwanow
źródło