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!



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


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 .



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.


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.


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

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

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)

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


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'

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

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.


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

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.