Reparte las cartas a los jugadores

15

¡Esta noche es la noche del juego de cartas! Usted es el distribuidor y su tarea es escribir un programa para repartir las cartas a los jugadores.

Dado un conjunto de cartas y la cantidad de jugadores, debes dividir el conjunto de cartas en una mano para cada jugador.

ejemplo para 4 jugadores con una baraja de 10 cartas

Reglas

Su programa recibirá una matriz no vacía A, así como un entero positivo no cero n. La matriz debería dividirse en nmanos. Si la longitud de la cadena no es divisible por nlas cartas sobrantes al final, debe distribuirse de la manera más uniforme posible.

  • Si n==1, tendrá que devolver una matriz de matriz con Asu único elemento
  • Si nes mayor que la longitud de A, deberá devolver cada mano y una mano vacía. si n = 4y array A = [1,2,3], debe regresar [[1],[2],[3]]o [[1],[2],[3],[]]. Usted es libre de manejar la mano vacía con vacía, indefinida o nula.

  • La matriz puede contener cualquier tipo en lugar de un número.

  • No debe cambiar el orden de la matriz mientras trata. Por ejemplo if n = 2y A= [1,2,3], cualquier resultado en lugar de [[1,3],[2]]será inválido.

Casos de prueba

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

Programa de demostración

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)

Pruébalo en línea!

Este es el , por lo que los bytes más cortos de cada idioma serán los ganadores.

Inspirado en Crear fragmentos de matriz por chau giang

aloisdg se muda a codidact.com
fuente
1
deberá devolver cada mano y una mano vacía contradice la posibilidad del primer resultado del último caso de prueba.
Adám
66
En el futuro, recomendaría usar Sandbox para resolver problemas y evaluar los comentarios de la comunidad antes de publicar su pregunta en main
Jo King
2
@JoKing, estoy totalmente de acuerdo. No pensé que tendría que editar tanto. Es como presionar para presionar sin implementar primero en beta. Gracias por la ayuda.
aloisdg se muda a codidact.com el
1
@aloisdg No puedo analizar tu regla alternativa sugerida. Si la idea es que las personas a menudo tratan con un círculo, entonces todos los jugadores que terminan con la mayoría de las cartas están al principio, y los jugadores que están al final pueden no recibir cartas.
Adám
2
¿Qué pasa si la matriz de entrada contiene un 0?
Shaggy

Respuestas:

12

05AB1E , 3 1 byte

Guardado 2 bytes gracias a Adnan

ι

Pruébalo en línea! o como un conjunto de pruebas

Explicación

ι  # uninterleave

Hace exactamente lo que pide el desafío

Emigna
fuente
55
Creo que esto también debería funcionar:ι
Adnan
@Adnan: Sí, gracias :) La única diferencia es la lista vacía n=7, pero ese es un formato de salida aceptable. He echado de menos esa función integrada: /
Emigna
¡Entonces hay un lenguaje incorporado para esto! : D
aloisdg se muda a codidact.com el
9

R , 46 25 bytes

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

Pruébalo en línea!

splits Aen grupos definidos por 1:n, reciclando 1:nhasta que coincida con la longitud A.

Giuseppe
fuente
7

Perl 6 , 33 24 bytes

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

Pruébalo en línea!

Bloque de código curioso anónimo que toma un número y devuelve un Lambda Cualquiera que tome una lista y devuelva una lista de listas. Esta toma la segunda opción cuando se le da un número mayor que la longitud de las listas, por ejemplo, f(4)([1,2,3])devuelve[[1],[2],[3]]

Explicación:

->\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
fuente
6

Japt, 2 bytes

Toma la matriz como la primera entrada.

óV

Intentalo

Lanudo
fuente
5

Jalea , 6 2 bytes

sZ

Pruébalo en línea!

Gracias a @JonathanAllan por guardar 4 bytes

Nick Kennedy
fuente
No sZfunciona
Jonathan Allan
@ JonathanAllan sí, de alguna manera lo perdí. ¿Quieres publicar como respuesta separada o debo editar la mía?
Nick Kennedy el
No, eres bienvenido a editar :)
Jonathan Allan
4

J , 13 , 11 , 10 , 9 bytes

(|#\)</.]

Pruébalo en línea!

cómo (explicación previa, fundamentalmente la misma)

] </.~ (| #\)
  </.~          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
Jonás
fuente
3

Carbón de leña , 9 bytes

IEθ✂ηιLηθ

Pruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada en el orden [n, A]y genera cada valor en su propia línea y cada mano a doble espacio de la anterior. Explicación:

  θ         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
fuente
¡+1 por hacer que el símbolo de "corte" sea una tijera!
Jonás
2

Haskell , 39 bytes

import Data.Lists
(transpose.).chunksOf

Nota: Data.Listses de las listas de bibliotecas de terceros , que no está en Stackage y, por lo tanto, no aparecerá en Hoogle.

dfeuer
fuente
Data.Listsno parece existir Supongo que quisiste decir Data.List, pero no contiene chunksOf.
Joseph Sible-Reinstate Monica
chunksOfsolo parece aparecer con la firma Int -> Text -> [Text]. 1
Post Rock Garf Hunter
@ JosephSible, está en el listspaquete.
dfeuer
@ SriotchilismO'Zaic, muchas cosas no aparecen en Hoogle. Está en el splitpaquete y reexportado por el listspaquete. Hay versiones de chunksOflistas, texto, secuencias y probablemente otras cosas.
dfeuer
2

Kotlin , 53 51 49 bytes

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

La antigua solución incorrecta solo funcionaba para los divisores de la longitud de la matriz. Estoy seguro de que esto se puede jugar golf.

Pruébalo en línea!

Adán
fuente
no válido
solo ASCII el
No funciona cuando nno es un divisor de la longitud de la lista
Jo King
Ya veo, gracias. Arreglando ahora
Adam
Creo que esto está arreglado solo para ASCII
Adam
1
parece que puedes eliminar el par adicional de padres
solo ASCII
1

APL + WIN 26 o 31 bytes

Si las manos individuales se pueden representar como columnas de una matriz 2D, entonces 26 bytes si una matriz de matrices agrega 5 bytes.

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

Pruébalo en línea! cortesía de Dyalog Classic

o

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

Pruébalo en línea! Cortesía de Dyalog Classic.

Explicación:

un aviso ← ⎕ para una variedad de tarjetas

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ solicitud de número entero, rellene a con ceros a las manos pares

(l, n) ⍴ crea una matriz 2D con cada columna que representa cada mano

⊂ [1] si es necesario convertir a vector anidado - matriz de matrices APL

Graham
fuente
1

TSQL, 44 bytes

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

Pruébalo

t-clausen.dk
fuente
1
Cada vez que estoy en este sitio web veo algo nuevo y digo "Wow, eso es impresionante, pero ¿por qué?"
MindSwipe
@MindSwipe He respondido muchas preguntas en StackOverflow, pero muchas de esas preguntas son iguales o casi iguales, también parece que estoy trabajando de forma gratuita. Las preguntas de código de golf son diferentes cada vez y lo disfruto más porque uso métodos que rara vez encuentro.
t-clausen.dk
1

MathGolf , 9 bytes

\ô_í\%q╞;

Pruébalo en línea!

Explicación

\           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
fuente
1

Java (JDK) , 90 bytes

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;}

Pruébalo en línea!

Gracias Olivier Grégoire por la lambda y mejor incremento al iterar.

Daniel Widdis
fuente
Y aquí, lo bajé a 90 bytes .
Olivier Grégoire
@ OlivierGrégoire gracias! Algo nuevo en esto y estaba trabajando en la lambda pero luchando.
Daniel Widdis
1

Ruby, 81 bytes

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

Pruébalo en línea

Avilyn
fuente
1
¿Podría agregar un enlace a un entorno de prueba en línea para facilitar la verificación?
Jonathan Frech
@ JonathanFrech Ahí tienes.
Avilyn
Bienvenido a PPCG! Hay muchas optimizaciones que puedes hacer para la longitud; por ejemplo, each_with_indexes bastante costoso en comparación con un contador incremental, map{[]}básicamente hace lo mismo que su map(&:dup)truco, proceso anónimo, etc. que puede reducir su código a 59 bytes. Pruébalo en línea! Consulte también la página de consejos de Ruby
Value Ink,
1

PHP ,85 83 82 bytes

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

Pruébalo en línea!

Esta no será la entrada más corta, pero pensé que sería divertido intentar hacerlo utilizando las funciones integradas de la matriz de PHP. Resultado: largo.

Salida

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 KB
fuente
1
Solo para tu información, en lugar de print_flatti solo puedes hacer un json_encode sandbox : realmente no cambiar la respuesta, solo pensé en mencionarlo, ¡salud!
ArtisticPhoenix
@ArtisticPhoenix bueno, por supuesto! (facepalm) ¡Gracias! :)
640KB
0

C # (compilador interactivo de Visual C #) , 43 bytes

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

Pruébalo en línea!

aloisdg se muda a codidact.com
fuente
@JoKing [1,2,3], 4debería salir [[1],[2],[3]]. Estás repartiendo 3 cartas a 4 jugadores. Actualizaré la pregunta principal.
aloisdg se muda a codidact.com el
1
En general, se desaconseja publicar soluciones a sus propios desafíos de inmediato.
Shaggy
1
@ Shaggy ok, lo tendré en cuenta para la próxima vez. Está bien en rpg, pero supongo que el aspecto competitivo de codegolf hizo que fuera un poco injusto publicarlo directamente. Tener sentido.
aloisdg se muda a codidact.com el
@ Joe King, tienes razón! Hice un error tipográfico: /
aloisdg se mudó a codidact.com el
0

C (gcc), 5 bytes

El indicador del compilador -Df=(se requiere espacio inicial) cumple la especificación. f(n_cards,n_hands,card_ptr)evalúa a un puntero a una lista de manos.

Explicación

En C, es una práctica común implementar listas de listas como una sola matriz intercalada, cuando el número de listas permanece constante pero todas las listas se pueden extender. Por ejemplo, en este caso de repartir cartas, es más común agregar más cartas a cada mano que agregar más manos, por lo que sería razonable implementar una lista de manos como una lista intercalada. Casualmente, el "mazo" es una lista de este tipo y, por lo tanto, devolvemos el parámetro sin modificar.

Este desafío probablemente debería haber sido sandboxed.


fuente
Creo que todos estamos de acuerdo con el sandbox
aloisdg se muda a codidact.com el