Distribuisci le carte ai giocatori


15

Stasera è la notte dei giochi di carte! Sei il banco e il tuo compito è scrivere un programma per distribuire le carte ai giocatori.

Dato un array di carte e il numero di giocatori, devi dividere l'array di carte in una mano per ogni giocatore.

esempio per 4 giocatori con un mazzo di 10 carte

Regole

Il programma riceverà un array non vuoto A, nonché un numero intero positivo diverso da zero n. L'array dovrebbe quindi essere suddiviso in nmani. Se la lunghezza della stringa non è divisibile per nle carte rimanenti alla fine dovrebbe essere distribuita nel modo più uniforme possibile.

  • In tal caso n==1, sarà necessario restituire un array di array Apoiché è solo un elemento
  • Se nè maggiore della lunghezza di A, dovrai restituire ogni mano e una mano vuota. se n = 4e array A = [1,2,3], dovresti tornare [[1],[2],[3]]o [[1],[2],[3],[]]. Sei libero di gestire la mano vuota con vuoto, indefinito o nullo.

  • L'array può contenere qualsiasi tipo anziché un numero.

  • Non è necessario modificare l'ordine dell'array durante la negoziazione. Per esempio if n = 2e A= [1,2,3], qualsiasi risultato piuttosto che [[1,3],[2]]non sarà valida.

Casi test

n   A               Output

1   [1,2,3,4,5,6]   [[1,2,3,4,5,6]]
2   [1,2,3,4,5,6]   [[1,3,5],[2,4,6]]
3   [1,2,3,4,5,6]   [[1,4],[2,5],[3,6]]
4   [1,2,3,4,5,6]   [[1,5],[2,6],[3],[4]]
7   [1,2,3,4,5,6]   [[1],[2],[3],[4],[5],[6]] // or [[1],[2],[3],[4],[5],[6],[]]

Demo Program

def deal(cards, n):
	i = 0
	players = [[] for _ in range(n)]
	for card in cards:
		players[i % n].append(card)
		i += 1
	return players

hands = deal([1,2,3,4,5,6], 2)

print(hands)

Provalo online!

Questo è , quindi i byte più brevi di ogni lingua saranno i vincitori.

Ispirato a Crea blocchi dall'array di Chau Giang


1
dovrai restituire ogni mano e una mano vuota contraddice la possibilità del primo risultato dell'ultimo test.
Adám,

6
In futuro, consiglierei di usare il Sandbox per risolvere i problemi e valutare il feedback della comunità prima di pubblicare la tua domanda sul principale
Jo King,

2
@JoKing Sono pienamente d'accordo. Non pensavo che avrei avuto così tante modifiche da fare. È come spingere a produrre senza prima distribuire in beta. Grazie per l'aiuto.
aloisdg si trasferisce su codidact.com il

1
@aloisdg Non riesco ad analizzare la tua regola alternativa suggerita. Se l'idea è come se le persone spesso distribuissero un cerchio, allora tutti i giocatori che finiscono con la maggior parte delle carte sono all'inizio, e i giocatori che stanno alla fine potrebbero non ricevere carte.
Adám,

2
Cosa succede se l'array di input contiene un 0?
Shaggy

Risposte:


12

05AB1E , 3 1 byte

Salvato 2 byte grazie ad Adnan

ι

Provalo online! o come una suite di test

Spiegazione

ι  # uninterleave

Fa esattamente quello che richiede la sfida


5
Penso che dovrebbe funzionare anche questo:ι
Adnan

@Adnan: Sì grazie :) L'unica differenza è la lista vuota per n=7, ma questo è un formato di output accettabile. Mi è totalmente mancato quel built-in: /
Emigna

Quindi c'è una lingua con un built-in per questo! : D
aloisdg si trasferisce su codidact.com il

9

R , 46 25 byte

function(A,n)split(A,1:n)

Provalo online!

splits Ain gruppi definiti da 1:n, riciclando 1:nfino a quando non corrisponde alla lunghezza con A.


7

Perl 6 , 33 24 byte

->\b{*.classify:{$++%b}}

Provalo online!

Blocco di codice curry anonimo che accetta un numero e restituisce un qualunque lambda che accetta un elenco e restituisce un elenco di elenchi. Questa opzione accetta la seconda opzione quando viene assegnato un numero maggiore della lunghezza degli elenchi, ad es. f(4)([1,2,3])Restituisce[[1],[2],[3]]

Spiegazione:

->\b{                  }  # Anonymous code block that takes a number
     *                    # And returns a Whatever lambda
      .classify           # That groups by
               :{$++%b}   # The index modulo the number





4

J , 13 , 11 , 10 , 9 byte

(|#\)</.]

Provalo online!

come (spiegazione precedente, fondamentalmente la stessa)

] </.~ (| #\)
  </.~          NB. box results of grouping
]               NB. the right arg by...
         |      NB. the remainders of dividing...
       [        NB. the left arg into...
           #\   NB. the length of each prefix of...
              ] NB. the right arg,
                NB. aka, the integers 1 thru
                NB. the length of the right arg

3

Carbone , 9 byte

IEθ✂ηιLηθ

Provalo online! Il collegamento è alla versione dettagliata del codice. Riceve input nell'ordine [n, A]e genera ciascun valore sulla propria riga e ciascuna mano ha una spaziatura doppia rispetto alla precedente. Spiegazione:

  θ         First input `n`
 E          Map over implicit range
    η       Second input `A`
   ✂        Sliced
     ι      Starting at current index
      Lη    Ending at length of `A`
        θ   Taking every `n`th element
I           Cast to string
            Implicitly print

+1 per aver reso il simbolo della "fetta" una forbice!
Giona

2

Haskell , 39 byte

import Data.Lists
(transpose.).chunksOf

Nota: Data.Listsproviene dagli elenchi di librerie di terze parti , che non si trova su Stackage e quindi non verrà visualizzato su Hoogle.


Data.Listsnon sembra esistere. Suppongo che intendevi Data.List, ma non contiene chunksOf.
Joseph Sible-Ripristina Monica

chunksOfsembra solo apparire con la firma Int -> Text -> [Text]. 1
Post Rock Garf Hunter

@JosephSible, è nel listspacchetto.
Dfeuer

@ SriotchilismO'Zaic, molte cose non vengono visualizzate in Hoogle. È nel splitpacchetto e riesportato dal listspacchetto. Esistono versioni di chunksOfper elenchi, testo, sequenze e probabilmente altre cose.
Dfeuer

2

Kotlin , 53 51 49 byte

{a,n->(0..n-1).map{a.slice(it..a.size-1 step n)}}

La vecchia soluzione errata ha funzionato solo per i divisori della lunghezza dell'array. Sono certo che questo può essere risolto.

Provalo online!



Non funziona quando nnon è un divisore della lunghezza dell'elenco
Jo King

Vedo, grazie. Risolto il problema ora
Adam

Credo che questo sia risolto solo su ASCII
Adam

1
sembra che puoi rimuovere la coppia extra di genitori
solo ASCII il


1

APL + WIN 26 o 31 byte

Se le singole mani possono essere rappresentate come colonne di una matrice 2D, allora 26 byte se un array di matrici aggiunge quindi 5 byte.

(l,n)⍴((l←⌈(⍴a)÷n)×n←⎕)↑a←⎕

Provalo online! wetesy di Dyalog Classic

o

⊂[1](l,n)⍴((l←⌈(⍴a)÷n)×n←⎕)↑a←⎕

Provalo online! Per gentile concessione di Dyalog Classic

Spiegazione:

un prompt ← ⎕ per la matrice di carte

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ prompt per intero, pad a con zeri per dare anche le mani

(l, n) ⍴ crea una matrice 2D con ogni colonna che rappresenta ogni mano

⊂ [1] se necessario, convertire in vettore nidificato - array di array APL


1

TSQL, 44 byte

-- @       : table containing the input 
-- column c: value of the card, 
-- column a: position on the card in the deck
-- @n      : number of players

DECLARE @ table(a int identity(0,1), c varchar(9))
DECLARE @n int = 4

INSERT @ values('1a'),('2c'),('3e'),('4g'),('5i'),('6k')

SELECT string_agg(c,',')FROM @ GROUP BY a%@n

Provalo


1
Ogni volta che sono su questo sito web vedo qualcosa di nuovo e vado "Wow, è impressionante, ma perché?"
MindSwipe

@MindSwipe Ho risposto a molte domande su StackOverflow, ma molte di queste domande sono uguali o quasi uguali, inoltre mi sembra di lavorare gratuitamente. Le domande sul code-golf sono diverse ogni volta e mi diverto di più perché riesco a usare metodi che altrimenti raramente incontro.
t-clausen.dk

1

MathGolf , 9 byte

\ô_í\%q╞;

Provalo online!

Spiegazione

\           swap top elements (pops both input onto stack)
 ô          start block of length 6
  _         duplicate TOS (will duplicate the list)
   í        get total number of iterations of for loop (the other input)
    \       swap top elements
     %      modulo (picks every n:th item of the list
      q     print without newline
       ╞    discard from left of string/array (makes the next player pick cards starting with the next in the deck)
        ;   discard TOS (removes some junk in the end)


1

Rubino, 81 byte

def s a,n;a.each_with_index.inject(([[]]*n).map(&:dup)){|b,(c,d)|b[d%n]<<c;b};end

Provalo online


1
Potresti eventualmente aggiungere un link a un ambiente di test online per facilitare la verifica?
Jonathan Frech

@JonathanFrech Ecco qua.
Avilyn,

Benvenuti in PPCG! Ci sono molte ottimizzazioni che puoi fare per la lunghezza; ad esempio, each_with_indexè piuttosto costoso rispetto a un contatore incrementale, map{[]}fondamentalmente fa la stessa cosa del tuo map(&:dup)trucco, Proc anonimo, ecc. che può ridurre il tuo codice fino a 59 byte. Provalo online! Consulta anche la pagina dei suggerimenti di Ruby
Value Ink,

1

PHP ,85 83 82 byte

function($a,$n){while($x<$n)$c[]=array_column(array_chunk($a,$n),+$x++);return$c;}

Provalo online!

Questa non sarà la voce più breve, ma ho pensato che sarebbe stato divertente provare a farlo usando gli incorporati della funzione array PHP. Risultato: lungo.

Produzione

1   [1,2,3,4,5,6]   [[1,2,3,4,5,6]]
2   [1,2,3,4,5,6]   [[1,3,5],[2,4,6]]
3   [1,2,3,4,5,6]   [[1,4],[2,5],[3,6]]
4   [1,2,3,4,5,6]   [[1,5],[2,6],[3],[4]]
7   [1,2,3,4,5,6]   [[1],[2],[3],[4],[5],[6],[]]
5   ["9C","QD","2S","4H","6D","AS","9D","TH","5C"]  [["9C","AS"],["QD","9D"],["2S","TH"],["4H","5C"],["6D"]]

1
Cordiali saluti, invece di print_flatte puoi solo fare json_encode sandbox - non cambierò davvero la risposta, pensavo solo di menzionarla, evviva!
Artistico

@ArtisticPhoenix bene, ovviamente! (facepalm) Grazie! :)
640 KB


0

C # (compilatore interattivo Visual C #) , 43 byte

a=>b=>{int i=0;return a.GroupBy(_=>i++%b);}

Provalo online!


@JoKing [1,2,3], 4dovrebbe uscire [[1],[2],[3]]. Stai distribuendo 3 carte a 4 giocatori. Aggiornerò la domanda principale.
aloisdg si trasferisce su codidact.com il

1
È generalmente sconsigliato pubblicare immediatamente soluzioni alle proprie sfide.
Shaggy

1
@Shaggy ok, ne terrò conto per la prossima volta. Va bene così e rpg ma immagino che l'aspetto competitivo di codegolf abbia reso un po 'ingiusto postare direttamente. Ha senso.
aloisdg si trasferisce su codidact.com il

@Joe King hai ragione! Ho fatto un refuso: /
aloisdg trasferendomi a codidact.com il

0

C (gcc), 5 byte

Il flag del compilatore -Df=(req. Spazio iniziale) soddisfa le specifiche. f(n_cards,n_hands,card_ptr)restituisce un puntatore a un elenco di mani.

Spiegazione

In C, è pratica comune implementare elenchi di elenchi come un singolo array interfogliato, quando il numero di elenchi rimane costante ma tutti gli elenchi possono essere estesi. Ad esempio, in questo caso di carte da trattare, è più comune che vengano aggiunte più carte ad ogni mano che più mani da aggiungere, quindi sarebbe ragionevole implementare un elenco di mani come un elenco interfogliato. Per coincidenza, il "mazzo" è un tale elenco, e quindi restituiamo il parametro non modificato.

Questa sfida probabilmente avrebbe dovuto essere sandbox.


Penso che siamo tutti d'accordo per il sandbox
aloisdg si trasferisce su codidact.com il

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.