Distribuez les cartes aux joueurs

15

Ce soir, c'est la nuit du jeu de cartes! Vous êtes le croupier et votre tâche est d'écrire un programme pour distribuer les cartes aux joueurs.

Étant donné un tableau de cartes et le nombre de joueurs, vous devez diviser le tableau de cartes en une main pour chaque joueur.

exemple pour 4 joueurs avec un jeu de 10 cartes

Règles

Votre programme recevra un tableau non vide A, ainsi qu'un entier positif non nul n. Le tableau doit ensuite être divisé en nmains. Si la longueur de la chaîne n'est pas divisible par nles restes, les cartes à la fin doivent être réparties aussi uniformément que possible.

  • Si n==1, vous devrez retourner un tableau de tableau avec Acomme seul élément
  • Si nest supérieur à la longueur de A, vous devrez retourner chaque main et une main vide. si n = 4et array A = [1,2,3], vous devez retourner [[1],[2],[3]]ou [[1],[2],[3],[]]. Vous êtes libre de gérer la main vide avec vide, indéfini ou nul.

  • Le tableau peut contenir n'importe quel type plutôt qu'un nombre.

  • Vous ne devez pas modifier l'ordre du tableau pendant le traitement. Par exemple, if n = 2et A= [1,2,3], tout résultat plutôt que [[1,3],[2]]sera invalide.

Cas de 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],[]]

Programme de démonstration

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)

Essayez-le en ligne!

Il s'agit de , donc vous serez le gagnant des octets les plus courts de chaque langue.

Inspiré de Create chunks from array par chau giang

aloisdg passe à codidact.com
la source
1
vous devrez retourner toutes les mains et une main vide contredit la première possibilité de résultat du dernier cas de test.
Adám
6
À l'avenir, je recommanderais d'utiliser le bac à sable pour résoudre les problèmes et évaluer les commentaires de la communauté avant de poster votre question au principal
Jo King
2
@JoKing Je suis entièrement d'accord. Je ne pensais pas que j'aurais tant de modifications à faire. C'est comme pousser à prod sans déployer d'abord sur la bêta. Merci pour l'aide.
aloisdg passe à codidact.com
1
@aloisdg Je ne peux pas analyser votre autre règle suggérée. Si l'idée est que les gens traitent souvent en cercle, alors tous les joueurs qui se retrouvent avec la plupart des cartes sont au début, et les joueurs à la fin peuvent ne pas recevoir de cartes.
Adám
2
Que faire si le tableau d'entrée contient un 0?
Shaggy

Réponses:

12

05AB1E , 3 1 octet

Enregistré 2 octets grâce à Adnan

ι

Essayez-le en ligne! ou comme suite de tests

Explication

ι  # uninterleave

Fait exactement ce que le défi demande

Emigna
la source
5
Je pense que cela devrait aussi fonctionner:ι
Adnan
@Adnan: Ouais merci :) La seule différence est la liste vide n=7, mais c'est un format de sortie acceptable. J'ai totalement raté cette fonction intégrée: /
Emigna
Il y a donc une langue avec un intégré pour cela! : D
aloisdg passe à codidact.com
9

R , 46 25 octets

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

Essayez-le en ligne!

splits Aen groupes définis par 1:n, en recyclant 1:njusqu'à ce qu'il corresponde à la longueur A.

Giuseppe
la source
7

Perl 6 , 33 24 octets

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

Essayez-le en ligne!

Bloc de code curry anonyme qui prend un nombre et renvoie un lambda Whats qui prend une liste et retourne une liste de listes. Cela prend la deuxième option quand on lui donne un nombre supérieur à la longueur des listes, par exemple les f(4)([1,2,3])retours[[1],[2],[3]]

Explication:

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

Gelée , 6 2 octets

sZ

Essayez-le en ligne!

Merci à @JonathanAllan d'avoir économisé 4 octets

Nick Kennedy
la source
Ça sZne marche pas?
Jonathan Allan
@JonathanAllan oui, en quelque sorte manqué ça. Voulez-vous publier une réponse séparée ou dois-je modifier la mienne?
Nick Kennedy
Non, vous pouvez modifier :)
Jonathan Allan
4

J , 13 , 11 , 10 , 9 octets

(|#\)</.]

Essayez-le en ligne!

comment (explication précédente, fondamentalement la même)

] </.~ (| #\)
  </.~          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
Jonas
la source
3

Fusain , 9 octets

IEθ✂ηιLηθ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend l'entrée dans l'ordre [n, A]et sort chaque valeur sur sa propre ligne et chaque main à double interligne de la précédente. Explication:

  θ         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
Neil
la source
+1 pour avoir fait du symbole de "tranche" un ciseau!
Jonah
2

Haskell , 39 octets

import Data.Lists
(transpose.).chunksOf

Remarque: Data.Listsprovient des listes de bibliothèques tierces , qui ne sont pas sur Stackage et n'apparaîtront donc pas sur Hoogle.

dfeuer
la source
Data.Listsne semble pas exister. Je suppose que vous vouliez dire Data.List, mais il ne contient pas chunksOf.
Joseph Sible-Reinstate Monica
chunksOfsemble seulement apparaître avec la signature Int -> Text -> [Text]. 1
Post Rock Garf Hunter
@JosephSible, c'est dans le listspackage.
dfeuer
@ SriotchilismO'Zaic, beaucoup de choses n'apparaissent pas dans Hoogle. Il est dans le splitpackage et réexporté par le listspackage. Il existe des versions de chunksOfpour les listes, le texte, les séquences et probablement d'autres choses.
dfeuer
2

Kotlin , 53 51 49 octets

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

L'ancienne solution incorrecte ne fonctionnait que pour les diviseurs de la longueur du tableau. Je suis certain que cela peut être minimisé.

Essayez-le en ligne!

Adam
la source
invalide
ASCII uniquement
Ne fonctionne pas quand nn'est pas un diviseur de la longueur de la liste
Jo King
Je vois, merci. Réparer maintenant
Adam
Je crois que cela est corrigé @ ASCII uniquement
Adam
1
on dirait que vous pouvez supprimer la paire supplémentaire de parens
ASCII uniquement
1

APL + WIN 26 ou 31 octets

Si des mains individuelles peuvent être représentées comme des colonnes d'une matrice 2D, 26 octets si un tableau de tableaux ajoute 5 octets.

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

Essayez-le en ligne! gracieuseté de Dyalog Classic

ou

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

Essayez-le en ligne! Gracieuseté de Dyalog Classic

Explication:

une invite ← ⎕ pour le tableau de cartes

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ invite pour un entier, remplissez a avec des zéros pour donner des mains paires

(l, n) ⍴ créer une matrice 2D avec chaque colonne représentant chaque main

⊂ [1] si nécessaire, convertir en vecteur imbriqué - tableau APL de tableaux

Graham
la source
1

TSQL, 44 octets

-- @       : 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

Essaye le

t-clausen.dk
la source
1
Chaque fois que je suis sur ce site, je vois quelque chose de nouveau et je me dis "Wow, c'est impressionnant, mais pourquoi?"
MindSwipe
@MindSwipe J'ai répondu à beaucoup de questions sur StackOverflow, mais beaucoup de ces questions sont identiques ou presque identiques - j'ai aussi l'impression de travailler gratuitement. Les questions de code-golf sont différentes à chaque fois et je l'apprécie davantage parce que j'utilise des méthodes que je rencontre rarement autrement.
t-clausen.dk
1

MathGolf , 9 octets

\ô_í\%q╞;

Essayez-le en ligne!

Explication

\           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)
maxb
la source
1

Java (JDK) , 90 octets

A->n->{var o="";for(int h=0,i;h<n;o+="\n")for(i=h++;i<A.length;i+=n)o+=" "+A[i];return o;}

Essayez-le en ligne!

Merci Olivier Grégoire pour la lambda et pour une meilleure incrémentation lors de l'itération.

Daniel Widdis
la source
Et ici, je l'ai joué à 90 octets .
Olivier Grégoire
@ OlivierGrégoire merci! Un peu nouveau sur ce point et travaillait sur le lambda bit mais en difficulté.
Daniel Widdis
1

Rubis, 81 octets

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

Essayez-le en ligne

Avilyn
la source
1
Pourriez-vous éventuellement ajouter un lien vers un environnement de test en ligne pour faciliter la vérification?
Jonathan Frech
@JonathanFrech Voilà.
Avilyn
Bienvenue chez PPCG! Il y a beaucoup d'optimisations que vous pouvez faire pour la longueur; par exemple, each_with_indexest assez cher par rapport à un compteur d'incrémentation, fait map{[]}essentiellement la même chose que votre map(&:dup)astuce, Proc anonyme, etc. qui peut réduire votre code à 59 octets. Essayez-le en ligne! Consultez également la page des conseils Ruby
Value Ink
1

PHP ,85 83 82 octets

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

Essayez-le en ligne!

Ce ne sera pas l'entrée la plus courte, mais j'ai pensé que ce serait amusant d'essayer de le faire en utilisant les fonctions intégrées des fonctions de tableau PHP. Résultat: long.

Production

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"]]
640 Ko
la source
1
Juste pour info, au lieu de print_flatvous, vous pouvez simplement faire du json_encode bac à sable - ne change pas vraiment la réponse, pensais que je le mentionnerais, bravo!
ArtisticPhoenix
@ArtisticPhoenix bien sûr! (facepalm) Merci! :)
640KB
1

Wolfram Language (Mathematica) , 25 octets

#2[[i;;;;#]]~Table~{i,#}&

Essayez-le en ligne!

attinat
la source
O_o explication pls
ASCII uniquement
@ ASCII uniquement ;; ;;n'est qu'une tranche, à peu près équivalente à celle de python : :; cela obtient des tranches de chaquene élément pour les décalages 1 ... n
attinat
oh ouais, j'ai oublié que ce n'était ;;pas ;lol. regardait ce qui se passe "wth is i ; ; ; ; #"
ASCII uniquement
0

C # (Visual C # Interactive Compiler) , 43 octets

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

Essayez-le en ligne!

aloisdg passe à codidact.com
la source
@JoKing [1,2,3], 4devrait sortir [[1],[2],[3]]. Vous distribuez 3 cartes à 4 joueurs. Je mettrai à jour la question principale.
aloisdg passe à codidact.com
1
Il est généralement déconseillé de publier immédiatement des solutions à vos propres défis.
Shaggy
1
@Shaggy ok je vais en tenir compte pour la prochaine fois. C'est bien ainsi et rpg mais je suppose que l'aspect compétitif de codegolf a rendu un peu injuste de publier directement. Faites sens.
aloisdg passe à codidact.com
@Joe king vous avez raison! J'ai fait une faute de frappe: /
aloisdg passe à codidact.com
0

C (gcc), 5 octets

L'indicateur du compilateur -Df=(espace principal requis) remplit la spécification. f(n_cards,n_hands,card_ptr)évalue un pointeur sur une liste de mains.

Explication

En C, il est courant d'implémenter des listes de listes comme un seul tableau entrelacé, lorsque le nombre de listes reste constant mais que toutes les listes peuvent être étendues. Par exemple, dans ce cas de distribution de cartes, il est plus courant d'ajouter plus de cartes à chaque main que plus de mains à ajouter, il serait donc raisonnable d'implémenter une liste de mains en tant que liste entrelacée. Par coïncidence, le "deck" est une telle liste, et donc nous renvoyons le paramètre sans modification.

Ce défi aurait probablement dû être mis en bac à sable.


la source
Je pense que nous sommes tous d'accord pour le bac à sable
aloisdg passe à codidact.com