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!



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


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 .


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.


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.


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

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

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)

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


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'

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

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.