Esegui uno Shuffle ™ superbo


15

Ai fini di questa domanda, un mazzo di carte è formattato in questo modo:

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

Le carte sono sempre formattate come valore, seguite da semi. Ad esempio ASè l'asso di picche. I due singoli J sono Jolly. Vogliamo mescolare questo mazzo di carte, ma lo shuffle deve essere Superb ™.

Uno Superb Shuffle ™ è uno in cui:

  • Non sono adiacenti due carte (eccetto i Jolly) dello stesso seme.
  • Nessuna carta (eccetto i Jolly) è adiacente a uno dello stesso valore.
  • Nessuna carta (eccetto i Jolly) è adiacente a uno di un valore adiacente (uno superiore o uno inferiore in questo ordine, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A. Nota che l'asso non può essere adiacente a un 2 o un Re).
  • I Jolly possono essere in qualsiasi posizione.
  • La definizione di Superb Shuffle ™ non richiede che le carte siano in un ordine diverso ogni volta che vengono mescolate. Che non è molto bello, ma è Superb ™.

Perché quello è Superb ™.

Un esempio potrebbe essere:

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

La sfida:

  • Scrivi del codice per eseguire uno shuffle eccezionale
  • Usa qualsiasi lingua
  • L'input può essere sia :
    • un mazzo di carte come descritto sopra nello stesso ordine , come una matrice o altra struttura di lista.
    • Nessun input (il codice genera un mazzo di carte in quell'ordine)
  • L'output deve essere un mazzo completo di carte in uno Shuffle ™ superbo come descritto sopra.
  • Tenta di eseguire il tuo Superb Shuffle ™ nel minor numero di byte.
  • È preferibile un collegamento a un interprete online come Try It Online , ma facoltativo.

Felice mescolando!



Possiamo sostituire Tinvece di 10?
Jo King,

@JoKing Non puoi. Proprio come la generazione di un mazzo di carte, le diverse lunghezze delle stringhe fanno parte della complessità.
AJFaraday,

Siamo autorizzati a stampare ogni scheda separatamente come fa la risposta Charcoal o dobbiamo effettivamente restituire un array / elenco?
Kevin Cruijssen,

@KevinCruijssen Va bene, fintanto che sta notevolmente restituendo un mazzo di carte in quel formato (valore quindi seme).
AJFaraday,

Risposte:


5

Japt, 6 5 4 byte

Divide l'array di input in sotto-array di ogni 16 ° elemento e si appiattisce.

óG c

Provalo


Devi appiattirlo?
Oliver,

@Oliver, spero di no; in attesa che AJ confermi.
Shaggy,

34

Rubino , 31 byte

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

Provalo online!

Spiegazione:

Prendo una carta, quindi salto le successive 16 e inizio dalla prima carta quando raggiungo l'ultima carta del mazzo. 17 e 54 sono reciprocamente primi, quindi sono sicuro di scegliere tutte le carte.

La 17a posizione è garantita per essere un seme diverso e la differenza di valore è almeno 2: la 13a (o 15a) carta ha lo stesso valore e un seme diverso, quindi saltando altre 4 (o 2), il valore è giusto .


6
Ben fatto per trovare il processo usato da ogni altra risposta;)
AJFaraday,

3
Puoi spiegare come hai trovato * 17% 54? Solo prove ed errori o ci sono alcuni ovvi calcoli che mi mancano?
Daniel,

@Daniel 17 è la distanza minima richiesta tra due carte diversamente diverse che non sono adiacenti numericamente (tenendo conto dei due jolly; ad esempio, 17 passaggi ti porta dall'asso di fiori al 3 di picche); 54 è il numero di carte nel mazzo.
Hellion,

11

Python 3 , 21 byte

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

Provalo online!

Spiegazione:

La stessa idea della mia risposta di Ruby, ma ancora più breve in Python: uso 17 mazzi e scelgo ogni 17 carta.


5

JavaScript, 35 byte

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

Provalo online!

Prendere una matrice di mazzo come input e sostituire ogni valore dispari con un'altra carta che si trova a "20 carte" sul mazzo.


1
Ah, quando ho detto che "tutti" nel mio post non erano corretti; così è andata anche io!
Jonathan Allan,

4

Java 10, 72 65 byte

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

Simile alla risposta di Ruby di @GB , ma usando i*7%54sull'array dei risultati, anziché sull'array di i*17%54input per salvare un byte.

Provalo online.

Spiegazione:

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

Sfortunatamente, il risultato contiene numerose carte adiacenti alle carte dello stesso seme. Comincia con AS, 6S, JS, 3D, 8D, KD,.
AJFaraday,

@AJFaraday TIO era ancora con 11 invece di 7. Potresti controllarlo di nuovo. Forse mi sono perso qualcos'altro, ma penso che dovrebbe essere corretto ora (spero).
Kevin Cruijssen,

Adesso ce l'ho. Bel lavoro!
AJFaraday,

3

Perl 6 , 21 20 18 byte

Grazie a Brad Gilbert b2gills per -2 byte

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

Provalo online!

Ancora un'altra porta della risposta di GB . Si noti che, mentre la variabile globale $!non viene ripristinata tra le funzioni, il valore non ha importanza, poiché qualsiasi ordine dell'output è valido. Tuttavia, $ viene ripristinato.

Spiegazione:

{                } #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
Funziona altrettanto bene con uno stato senza nome var $come con $!o $/. Inoltre, se lo hai usato al $_posto @_tuo, potresti avviarlo .[…]invece di @_[…]salvare un altro byte.
Brad Gilbert b2gills il

2

05AB1E , 9 7 5 byte

ā17*è

Porta della risposta di Ruby di @GB , quindi assicurati di votarlo!

-2 byte stampando ogni scheda con un delimitatore di nuova riga invece di racchiuderlo in un elenco di risultati
-2 byte grazie a @ Mr.Xcoder

Provalo online.

Spiegazione:

ā        # 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*èdovrebbe salvare altri 2 byte
Mr. Xcoder il

2

JavaScript, 27

Un altro basato sulla risposta rubino

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

A cura di un accorciamento evidente


2

T-SQL, 31 byte

SELECT c FROM t ORDER BY i*7%54

Se non ti interessa una colonna aggiuntiva nell'output, posso ottenerla fino a 29 byte :

SELECT*FROM t ORDER BY i*7%54

Quindi puoi verificare che il mio output sia "Superbo", ecco il mazzo che produce:

 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

(Generato utilizzando la nuova aggiunta di SQL 2017 STRING_AGG):

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

La parte difficile per me non era il codice selezionato, stava popolando la tabella di input (che è consentita per SQL secondo le nostre regole di I / O ).

Poiché SQL è intrinsecamente non ordinato (garantisce un certo ordine solo se si include una ORDER BYclausola esplicita ), ho dovuto includere quell'ordine originale come campo i nella tabella di input t . Questo significa anche che posso usarlo per ordinare, usando lo stesso processo fattore / mod "relativamente principale" che tutti gli altri usano. Ho scoperto che ha i*7%54funzionato altrettanto bene i*17%54.

Ecco i comandi per impostare e popolare la tabella di input t , in base alla mia soluzione a questa domanda correlata :

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'

Non isarebbe considerato un input aggiuntivo qui?
Shaggy,

@Shaggy La domanda dice che posso ottenere il mazzo di input nell'ordine originale (elencato). L'unico modo per garantire ciò in SQL è che l'ordine sia una parte esplicita dell'input, poiché le tabelle SQL non hanno un "ordine predefinito" . Quindi, lo vedo come un componente necessario dell'input. Ma non preoccuparti, SQL è comunque raramente competitivo :)
BradC,

2

Gelatina ,  5  4 byte

s⁴ZẎ

Provalo online!

Risulta il modo in cui tutti gli altri, tranne il ragazzo a caso , salva un byte :(
Credito a GB per il loro metodo .


Il modo in cui sono andato ...

ṙÐe20

Provalo online!

Come?

Ripara ogni altra carta e sparpagliala con una rotazione del mazzo lasciata di 20 posti (funzionano anche 18 e 22 posti; inoltre funziona anche la direzione di rotazione e fissa carte dispari o pari)

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

Cioè (usando Tper 10e rj& bjper Ji):

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 byte

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

-4 grazie al
vecchio codice Mazzy a 30 byte

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

Un'altra porta del metodo di GB.


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

@Mazzy Sento che rompe le specifiche di input. Sicuramente sono raccolti in $ args ma in realtà non ne passi uno.
Veskah

citare: The input can be either:... in the same order, as *an array*. $argsè un array. e puoi usare uno splatting . per esempio $a=@("AS", ..., "J"); &{} @a. Provalo. :)
mazzy

inoltre, mi sembra che non sia necessario contare i personaggi &{e }. È possibile salvare param($d)0..53|%{$d[$_*17%54]}in un file. e chiama questo file senza&{...}
mazzy

1
@mazzy Sì, sono sempre stato un po 'incerto su quali parti di controllo mantenere, quindi di solito sono inadempienti nel renderlo un blocco di script. Lo spogliamo in futuro però.
Veskah,

1

Carbone , 8 byte

Eθ§θ×¹⁷κ

Provalo online! Il collegamento è alla versione dettagliata del codice. Un'altra porta della risposta di Ruby di @ GB. Spiegazione:

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

1

Rosso , 44 byte

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

Provalo online!

Un'altra interpetazione del codice di GB. Aggiungo 16 copie del mazzo a se stesso e quindi estraggo ogni 17 carta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.