Executar um Superb Shuffle ™

15

Para os fins desta pergunta, um baralho de cartas é formatado da seguinte maneira:

[
  "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"
]

Os cartões são sempre formatados como valor, seguidos por naipes. Por exemplo, ASé o ás de espadas. Os dois J's únicos são Jokers. Queremos embaralhar este baralho de cartas, mas o baralhamento deve ser Superb ™.

Um Superb Shuffle ™ é aquele em que:

  • Não há duas cartas (exceto Jokers) do mesmo naipe adjacentes.
  • Nenhum cartão (exceto Jokers) é adjacente a um mesmo valor.
  • Nenhuma carta (exceto Jokers) é adjacente a um valor adjacente (um mais alto ou outro mais baixo nesta ordem, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. Observe que o Ace não pode ser adjacente a um 2 ou a um rei).
  • Os curingas podem estar em qualquer posição.
  • A definição de um Superb Shuffle ™ não exige que os cartões estejam em uma ordem diferente cada vez que são embaralhados. O que não é muito bom, mas é o Superb ™.

Porque isso é Superb ™.

Um exemplo pode ser:

[
  "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"
]

O desafio:

  • Escreva um código para executar um excelente shuffle
  • Use qualquer idioma.
  • A entrada pode ser quer :
    • um baralho de cartas como descrito acima na mesma ordem , como uma matriz ou outra estrutura de lista.
    • Nenhuma entrada (o código gera um baralho de cartas nessa ordem)
  • A saída deve ser um baralho completo de cartas em um Superb Shuffle ™, conforme descrito acima.
  • Tente executar seu Superb Shuffle ™ no menor número de bytes.
  • É preferível um link para um intérprete online, como o Try It Online , mas opcional.

Baralhar feliz!

AJFaraday
fonte
1
Algo relacionado
Shaggy
Podemos substituir em Tvez de 10?
Jo rei
@JoKing Você não pode. Assim como a questão de gerar um baralho de cartas, os diferentes comprimentos de cordas fazem parte da complexidade.
AJFaraday
É permitido imprimir cada cartão separadamente, como a resposta do Charcoal faz, ou precisamos realmente retornar uma matriz / lista?
Kevin Cruijssen
@KevinCruijssen Tudo bem, desde que esteja notando devolver um baralho nesse formato (valor e depois naipe).
AJFaraday

Respostas:

5

Japonês, 6 5 4 bytes

Divide a matriz de entrada em sub-matrizes de cada 16º elemento e nivela.

óG c

Tente

Shaggy
fonte
Você precisa achatá-lo?
Oliver
@ Oliver, espero que não; esperando AJ confirmar.
Shaggy
34

Ruby , 31 bytes

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

Experimente online!

Explicação:

Estou pegando uma carta, depois pulo as próximas 16 e começo da primeira carta quando chego à última carta do baralho. 17 e 54 são mutuamente privilegiadas, por isso tenho certeza de escolher todas as cartas.

É garantido que a 17ª posição é um naipe diferente e a diferença de valor é pelo menos 2: a 13ª (ou 15ª) carta tem o mesmo valor e uma naipe diferente; portanto, saltando outras 4 (ou 2), o valor está correto .

GB
fonte
6
Bem feito em encontrar o processo a cada outros usos resposta;)
AJFaraday
3
Você pode explicar como encontrou o * 17% 54? Apenas tentativa e erro ou há algumas matemáticas óbvias que estou perdendo?
Daniel
@ Daniel 17 é a distância mínima exigida entre duas cartas de naipes diferentes que não são adjacentes numericamente (representando os dois curingas; por exemplo, 17 passos levam você do Ás de Clubes ao 3 de Espadas); 54 é o número de cartas no baralho.
precisa
11

Python 3 , 21 bytes

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

Experimente online!

Explicação:

A mesma idéia da minha resposta Ruby, mas ainda mais curta no Python: eu uso 17 decks e escolho todas as 17 cartas.

GB
fonte
5

JavaScript, 35 bytes

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

Experimente online!

Tomando uma matriz de baralho como entrada e substituindo cada valor ímpar por outra carta que fica a "20 cartas" no baralho.

O cara aleatório
fonte
1
Ah, quando eu disse "todo mundo" na minha postagem estava incorreto; foi assim que eu também!
Jonathan Allan
4

Java 10, 72 65 bytes

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

Semelhante ao @GB resposta Ruby do , mas usando i*7%54na matriz de resultados, em vez de i*17%54na matriz de entrada para salvar um byte.

Experimente online.

Explicação:

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
fonte
Infelizmente, o resultado contém inúmeras cartas adjacentes às cartas do mesmo naipe. Começa com AS, 6S, JS, 3D, 8D, KD,.
AJFaraday
@AJFaraday O TIO ainda estava com 11 em vez de 7. Você poderia verificar novamente. Talvez eu tenha perdido outra coisa, mas acho que deve estar correta agora (espero).
Kevin Cruijssen
Agora já está. Bom trabalho!
AJFaraday
3

Perl 6 , 21 20 18 bytes

Obrigado a Brad Gilbert b2gills por -2 bytes

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

Experimente online!

Mais uma porta da resposta da GB . Observe que, embora a variável global $!não seja redefinida entre as funções, o valor não importa, pois qualquer ordem da saída é válida. No entanto, $ é redefinido.

Explicação:

{                } #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
Brincadeira
fonte
1
Isso funciona tão bem com um estado sem nome var $quanto com $!ou $/. Além disso, se você usou em $_vez de @_você poderia iniciá-lo em .[…]vez de @_[…]salvar outro byte.
Brad Gilbert b2gills
2

05AB1E , 9 7 5 bytes

ā17*è

Porta da resposta Ruby do @GB , por isso não deixe de vota-lo!

-2 bytes imprimindo cada cartão com um delimitador de nova linha em vez de agrupá-lo em uma lista de resultados
-2 bytes graças a @ Mr.Xcoder

Experimente online.

Explicação:

ā        # 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
fonte
1
ā17*èdeve salvar mais 2 bytes
Sr. Xcoder 18/18
2

JavaScript, 27

Outro baseado na resposta ruby

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

Editado em uma redução óbvia

vityavv
fonte
2

T-SQL, 31 bytes

SELECT c FROM t ORDER BY i*7%54

Se você não se importa com uma coluna extra na saída, posso reduzi-la para 29 bytes :

SELECT*FROM t ORDER BY i*7%54

Para que você possa verificar se minha saída é "Soberba", aqui está o baralho que ela produz:

 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

(Gerado usando a nova adição do SQL 2017 STRING_AGG):

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

A parte difícil para mim não foi o código de seleção, estava preenchendo a tabela de entrada (que é permitida para SQL de acordo com nossas regras de IO ).

Como o SQL é inerentemente desordenado (ele só garante uma certa ordem se você incluir uma ORDER BYcláusula explícita ), tive que incluir essa ordem original como um campo i na tabela de entrada t . Isso também significa que eu posso usá-lo para classificar, usando o mesmo processo fator / mod "relativamente primo" que todo mundo está usando. Eu achei que i*7%54funcionou tão bem quanto i*17%54.

Aqui estão os comandos para configurar e preencher a tabela de entrada t , com base na minha solução para esta pergunta relacionada :

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
fonte
A ientrada não seria considerada adicional aqui?
Shaggy
@ Shaggy A pergunta diz que posso obter o deck de entrada na ordem original (listada). A única maneira de garantir isso no SQL é fazer com que a ordem seja uma parte explícita da entrada, porque as tabelas SQL não têm "ordem padrão" . Então, eu vejo isso como um componente necessário da entrada. Mas não se preocupe, SQL é raramente qualquer maneira competitiva :)
BradC
2

Geléia ,  5  4 bytes

s⁴ZẎ

Experimente online!

Acontece que todo mundo, exceto o cara aleatório , economiza um byte :(
Crédito ao GB pelo método .


Do jeito que eu fui ...

ṙÐe20

Experimente online!

Quão?

Conserte todas as outras cartas e intercale-a com uma rotação do baralho deixada em 20 lugares (18 e 22 lugares também funcionam; além disso, também o sentido de rotação e a fixação de cartões pares ou ímpares)

ṙÐ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)

Ou seja (usando Tpara 10e rje bjpara os J):

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
fonte
2

PowerShell 3.0, 30 26 bytes

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

-4 graças ao
código Mazzy Old em 30 bytes

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

Outra porta do método da GB.

Veskah
fonte
26 bytes $args[(0..53|%{$_*17%54})].
Mazzy
@Mazzy Eu sinto que isso quebra as especificações de entrada. Certeza de que estão reunidas em $ args, mas você não está realmente passando um no.
Veskah
a citar: The input can be either:... in the same order, as *an array*. $argsé uma matriz. e você pode usar um splatting . por exemplo $a=@("AS", ..., "J"); &{} @a. Tente. :)
mazzy
Além disso, parece-me que não há necessidade de contar os caracteres &{e }. Você pode salvar param($d)0..53|%{$d[$_*17%54]}em um arquivo. e chame esse arquivo sem&{...}
mazzy
1
@mazzy Sim, eu sempre fiquei um pouco inseguro sobre quais partes de controle manter, então normalmente deixo de fazer um bloco de script. Vou tirá-lo no futuro.
Veskah
1

Carvão , 8 bytes

Eθ§θ×¹⁷κ

Experimente online! Link é a versão detalhada do código. Outra porta da resposta Ruby do @ GB. Explicação:

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

Vermelho , 44 bytes

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

Experimente online!

Outra interpetação do código da GB. Anexo 16 cópias do baralho e extraio cada 17ª carta.

Galen Ivanov
fonte