Gib den Spielern die Karten


15

Heute Abend ist Kartenspielabend! Sie sind der Dealer und Ihre Aufgabe ist es, ein Programm zu schreiben, mit dem die Karten an die Spieler ausgegeben werden.

Bei einem vorgegebenen Kartenfeld und der Anzahl der Spieler müssen Sie das Kartenfeld für jeden Spieler in eine Hand aufteilen.

Beispiel für 4 Spieler mit 10 Karten

Regeln

Ihr Programm erhält ein nicht leeres Array Asowie eine positive Ganzzahl ungleich Null n. Das Array sollte dann in nHände aufgeteilt werden. Wenn die Länge der Zeichenfolge durch nkeine verbleibenden Karten am Ende teilbar ist, sollte so gleichmäßig wie möglich verteilt werden.

  • In diesem Fall n==1müssen Sie ein Array mit Array Aals einziges Element zurückgeben
  • Wenn ngrößer als die Länge von ist A, müssen Sie jede Hand und eine leere Hand zurückgeben. wenn n = 4und array A = [1,2,3], solltest du [[1],[2],[3]]oder zurückgeben [[1],[2],[3],[]]. Es steht Ihnen frei, die leere Hand mit leer, undefiniert oder null zu behandeln.

  • Das Array kann einen beliebigen Typ anstelle einer Zahl enthalten.

  • Sie sollten die Reihenfolge des Arrays während des Handels nicht ändern. Zum Beispiel if n = 2und A= [1,2,3]jedes Ergebnis [[1,3],[2]]ist ungültig.

Testfälle

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-Programm

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)

Probieren Sie es online!

Dies ist , so dass Sie die kürzesten Bytes jeder Sprache gewinnen.

Inspiriert von Create chunks from array von chau giang


1
Sie müssen alle Hände zurückgeben, und eine leere Hand widerspricht der ersten Ergebnismöglichkeit des letzten Testfalls.
Adám

6
In Zukunft würde ich empfehlen, die Sandbox zu verwenden, um Probleme auszubügeln und das Feedback der Community einzuschätzen, bevor Sie Ihre Frage an main
Jo King,

2
@JoKing Ich stimme voll und ganz zu. Ich hätte nicht gedacht, dass ich so viel zu bearbeiten hätte. Es ist wie ein Push-to-Push, ohne dass zuerst eine Beta-Version bereitgestellt wird. Danke für die Hilfe.
aloisdg sagt Reinstate Monica

1
@aloisdg Ich kann Ihre vorgeschlagene alternative Regel nicht analysieren. Wenn die Idee ist, dass Menschen sich häufig mit einem Kreis befassen, stehen alle Spieler, die am Ende die meisten Karten haben, am Anfang, und Spieler, die am Ende sind, erhalten möglicherweise keine Karten.
Adám

2
Was passiert , wenn der Eingangs - Array enthält ein 0?
Shaggy

Antworten:


12

05AB1E , 3 1 Byte

2 Bytes gespart dank Adnan

ι

Probieren Sie es online! oder als Testsuite

Erläuterung

ι  # uninterleave

Tut genau das, wonach die Herausforderung verlangt


5
Ich denke, das sollte auch funktionieren:ι
Adnan

@Adnan: Ja danke :) Einziger Unterschied ist die leere Liste dafür n=7, aber das ist ein akzeptables Ausgabeformat. Ich habe das eingebaute völlig verpasst: /
Emigna

Es gibt also eine Sprache, die dafür eingebaut ist! : D
aloisdg sagt Reinstate Monica


7

Perl 6 , 33 24 Bytes

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

Probieren Sie es online!

Anonymer Curry-Codeblock, der eine Zahl annimmt und ein beliebiges Lambda zurückgibt, das eine Liste annimmt und eine Liste von Listen zurückgibt. Dies ist die zweite Option, wenn eine Nummer angegeben wird, die größer als die Länge der Listen ist, z. B. f(4)([1,2,3])return[[1],[2],[3]]

Erläuterung:

->\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 Bytes

(|#\)</.]

Probieren Sie es online!

wie (vorherige Erklärung, im Grunde das gleiche)

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

Kohle , 9 Bytes

IEθ✂ηιLηθ

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben in der Reihenfolge vor [n, A]und gibt jeden Wert in einer eigenen Zeile und mit doppeltem Abstand zum vorherigen Zeiger aus. Erläuterung:

  θ         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 für das Symbol der "Scheibe" einer Schere!
Jona

2

Haskell , 39 Bytes

import Data.Lists
(transpose.).chunksOf

Hinweis: Data.Listsist von den Dritt Bibliothek Listen , die nicht auf Stackage ist und daher nicht auf Hoogle angezeigt.


Data.Listsscheint nicht zu existieren. Ich würde annehmen, dass Sie meinten Data.List, aber es enthält nicht chunksOf.
Joseph Sible-Reinstate Monica

chunksOfscheint nur mit der Unterschrift zu erscheinen Int -> Text -> [Text]. 1
Wheat Wizard

@ JosephSible, es ist im listsPaket.
7.

@ SriotchilismO'Zaic, viele Dinge werden in Hoogle nicht angezeigt. Es ist im splitPaket enthalten und wird vom Paket erneut exportiert lists. Es gibt Versionen von chunksOffür Listen, Text, Sequenzen und wahrscheinlich andere Dinge.
7.

2

Kotlin , 53 51 49 Bytes

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

Die alte, falsche Lösung funktionierte nur für Teiler der Arraylänge. Ich bin mir sicher, dass man damit Golf spielen kann.

Probieren Sie es online!



Funktioniert nicht, wenn nkein Teiler der Länge der Liste ist
Jo King

Ich verstehe, danke. Behebung jetzt
Adam

Ich glaube, dass dies nur bei ASCII behoben ist
Adam

1
Sieht so aus, als könnten Sie das zusätzliche Paar von Parens entfernen
ASCII


1

APL + WIN 26 oder 31 Bytes

Wenn einzelne Hände als Spalten einer 2D-Matrix dargestellt werden können, addieren sich 26 Byte, wenn ein Array von Arrays vorhanden ist, zu 5 Byte.

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

Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic

oder

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

Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic

Erläuterung:

eine ← ⎕ Aufforderung zur Eingabe eines Kartenarrays

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ Aufforderung zur Eingabe einer ganzen Zahl, fülle a mit Nullen auf, um gerade Hände zu erhalten

(l, n) ⍴ Erstelle eine 2D-Matrix mit jeder Spalte, die jede Hand repräsentiert

⊂ [1] ggf. in verschachtelten Vektor konvertieren - APL-Array von Arrays


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

Versuch es


1
Jedes Mal, wenn ich auf dieser Website bin, sehe ich etwas Neues und frage: "Wow, das ist beeindruckend, aber warum?"
MindSwipe

@MindSwipe Ich habe viele Fragen zu StackOverflow beantwortet, aber viele dieser Fragen sind die gleichen oder fast die gleichen - außerdem fühlt es sich an, als würde ich kostenlos arbeiten. Die Code-Golf-Fragen sind jedes Mal anders und ich genieße es mehr, weil ich Methoden verwende, denen ich sonst selten begegne.
t-clausen.dk

1

MathGolf , 9 Bytes

\ô_í\%q╞;

Probieren Sie es online!

Erläuterung

\           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

Ruby, 81 Bytes

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

Probieren Sie es online


1
Könnten Sie möglicherweise einen Link zu einer Online-Testumgebung hinzufügen, um die Überprüfung zu vereinfachen?
Jonathan Frech

@ JonathanFrech Es geht los.
Avilyn

Willkommen bei PPCG! Es gibt viele Optimierungen, die Sie für die Länge vornehmen können. each_with_indexIst zum Beispiel ziemlich teuer im Vergleich zu einem inkrementierenden Zähler, map{[]}macht im Grunde das Gleiche wie Ihr map(&:dup)Trick, anonymer Proc, etc., der Ihren Code auf 59 Bytes reduzieren kann. Probieren Sie es online! Schauen Sie sich auch die Ruby-Tipps an
Value Ink

1

PHP ,85 83 82 Bytes

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

Probieren Sie es online!

Dies wird nicht der kürzeste Eintrag sein, aber ich dachte, es würde Spaß machen, es mit den eingebauten PHP-Array-Funktionen zu versuchen. Ergebnis: lang.

Ausgabe

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
Nur zu Ihrer Information , anstatt dass print_flatSie nur json_encode Sandbox machen können - ändert nichts an der Antwort, dachte nur, ich würde es erwähnen, Prost!
ArtisticPhoenix

@ArtisticPhoenix na klar! (facepalm) Danke! :)
640 KB


0

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

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

Probieren Sie es online!


@JoKing [1,2,3], 4sollte ausgeben [[1],[2],[3]]. Sie geben 3 Karten an 4 Spieler aus. Ich werde die Hauptfrage aktualisieren.
aloisdg sagt Reinstate Monica

1
Im Allgemeinen wird davon abgeraten, umgehend Lösungen für Ihre eigenen Herausforderungen zu veröffentlichen.
Shaggy

1
@Shaggy ok ich werde es beim nächsten mal berücksichtigen. Es ist in Ordnung für so und RPG, aber ich denke, der Wettbewerbsaspekt von Codegolf hat es etwas unfair gemacht, sich selbst direkt zu posten. Sinn ergeben.
aloisdg sagt Reinstate Monica

@ Joe König, du hast recht! Ich habe einen Tippfehler gemacht: /
aloisdg sagt Reinstate Monica

0

C (gcc), 5 Bytes

Das Compiler-Flag -Df=(erforderliches führendes Leerzeichen) erfüllt die Spezifikation. f(n_cards,n_hands,card_ptr)Wertet einen Zeiger auf eine Liste von Händen aus.

Erläuterung

In C ist es üblich, Listen von Listen als einzelnes verschachteltes Array zu implementieren, wenn die Anzahl der Listen konstant bleibt, aber alle Listen erweitert werden können. In diesem Fall, in dem Karten ausgetauscht werden, kommt es beispielsweise häufiger vor, dass mehr Karten zu jeder Hand hinzugefügt werden, als dass mehr Hände hinzugefügt werden. Daher wäre es sinnvoll, eine Liste von Händen als verschachtelte Liste zu implementieren. Zufälligerweise ist das "Deck" eine solche Liste, und daher geben wir den Parameter unverändert zurück.

Diese Herausforderung hätte wahrscheinlich in einer Sandbox stattfinden sollen.


Ich denke, wir sind uns alle einig für den Sandkasten
Aloisdg sagt Reinstate Monica

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.