Rozdaj karty graczom

15

Dzisiaj jest noc gier karcianych! Jesteś rozdającym, a Twoim zadaniem jest napisanie programu rozdawania kart graczom.

Biorąc pod uwagę zestaw kart i liczbę graczy, musisz podzielić zestaw kart na rękę dla każdego gracza.

przykład dla 4 graczy z talią 10 kart

Zasady

Twój program otrzyma niepustą tablicę A, a także niezerową liczbę całkowitą dodatnią n. Tablicę należy następnie podzielić na nręce. Jeśli długość łańcucha nie jest podzielna przez nresztki kart na końcu, należy je rozłożyć możliwie równomiernie.

  • Jeśli n==1musisz zwrócić tablicę, Aponieważ jest to jedyny element
  • Jeśli njest większa niż długość A, musisz zwrócić każdą rękę i pustą rękę. jeśli n = 4i array A = [1,2,3]powinieneś powrócić [[1],[2],[3]]lub [[1],[2],[3],[]]. Możesz obsługiwać pustą rękę z pustą, niezdefiniowaną lub zerową.

  • Tablica może zawierać dowolny typ, a nie liczbę.

  • Podczas transakcji nie powinieneś zmieniać kolejności tablicy. Na przykład if n = 2i A= [1,2,3]dowolny wynik zamiast [[1,3],[2]]będzie nieprawidłowy.

Przypadki testowe

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

Program demonstracyjny

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)

Wypróbuj online!

To jest , więc wygrasz najkrótsze bajty każdego języka.

Zainspirowany przez Utwórz fragmenty z tablicy przez chau giang

aloisdg przechodzi na codidact.com
źródło
1
musisz zwrócić wszystkie ręce, a pusta ręka zaprzecza możliwości pierwszego wyniku ostatniego testu.
Adám
6
W przyszłości zalecam używanie piaskownicy do rozwiązywania problemów i sprawdzania opinii społeczności przed wysłaniem pytania do głównego
Jo King
2
@JoKing W pełni się zgadzam. Nie sądziłem, że będę miał tyle edycji do zrobienia. To tak, jakby naciskać na prod bez wcześniejszego wdrożenia w wersji beta. Dziękuję za pomoc.
aloisdg przenosi się do codidact.com
1
@aloisdg Nie mogę przeanalizować sugerowanej alternatywnej reguły. Jeśli chodzi o to, że ludzie często rozdają krąg, wszyscy gracze, którzy kończą z większością kart, są na początku, a gracze, którzy są na końcu, mogą nie otrzymać żadnych kart.
Adám
2
Co jeśli tablica wejściowa zawiera0 ?
Shaggy

Odpowiedzi:

12

05AB1E , 3 1 bajt

Zaoszczędzono 2 bajty dzięki Adnan

ι

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

ι  # uninterleave

Robi dokładnie to, o co prosi wyzwanie

Emigna
źródło
5
Myślę, że to również powinno działać:ι
Adnan
@Adnan: Tak, dziękuję :) Jedyną różnicą jest pusta lista n=7, ale jest to akceptowalny format wyjściowy. Całkowicie tęskniłem za tym wbudowanym: /
Emigna
Jest więc język z wbudowanym do tego! : D
aloisdg przechodzi na codidact.com
9

R , 46 25 bajtów

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

Wypróbuj online!

splits Ana grupy zdefiniowane przez 1:n, recykling, 1:naż do dopasowania długości A.

Giuseppe
źródło
7

Perl 6 , 33 24 bajtów

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

Wypróbuj online!

Anonimowy blok kodu curry, który przyjmuje liczbę i zwraca wartość Lambda, która pobiera listę i zwraca listę list. To bierze drugą opcję, gdy podano liczbę większą niż długość list, npf(4)([1,2,3]) Zwraca[[1],[2],[3]]

Wyjaśnienie:

->\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
źródło
6

Japt, 2 bajty

Pobiera tablicę jako pierwsze wejście.

óV

Spróbuj

Kudłaty
źródło
5

Galaretka , 6 2 bajty

sZ

Wypróbuj online!

Dzięki @JonathanAllan za zapisanie 4 bajtów

Nick Kennedy
źródło
Nie sZdziała?
Jonathan Allan,
@JonathanAllan tak, jakoś to przegapił. Czy chcesz opublikować osobną odpowiedź, czy mam edytować moją?
Nick Kennedy,
Nie, możesz edytować :)
Jonathan Allan,
4

J , 13 , 11 , 10 , 9 bajtów

(|#\)</.]

Wypróbuj online!

jak (poprzednie wyjaśnienie, zasadniczo takie same)

] </.~ (| #\)
  </.~          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
Jonasz
źródło
3

Węgiel drzewny , 9 bajtów

IEθ✂ηιLηθ

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe w kolejności [n, A]i wyświetla każdą wartość w osobnym wierszu i każdą rękę w podwójnym odstępie od poprzedniego. Wyjaśnienie:

  θ         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
źródło
+1 za uczynienie symbolu „plasterka” nożyczkami!
Jonasz
2

Haskell , 39 bajtów

import Data.Lists
(transpose.).chunksOf

Uwaga: Data.Listspochodzi z list bibliotek stron trzecich , których nie ma na Stackage i dlatego nie pojawi się na Hoogle.

dfeuer
źródło
Data.Listswydaje się nie istnieć. Zakładam, że miałeś na myśli Data.List, ale nie zawiera chunksOf.
Joseph Sible-Reinstate Monica
chunksOfwydaje się, że pojawia się tylko z podpisem Int -> Text -> [Text]. 1
Post Rock Garf Hunter
@JosephSible, jest w listspakiecie.
dfeuer
@ SriotchilismO'Zaic, wiele rzeczy nie pojawia się w Hoogle. Jest w splitpakiecie i ponownie eksportowany przez listspakiet. Istnieją wersje chunksOflist, tekstu, sekwencji i prawdopodobnie innych rzeczy.
dfeuer
2

Kotlin , 53 51 49 bajtów

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

Stare, niepoprawne rozwiązanie działało tylko w przypadku dzielników o długości tablicy. Jestem pewien, że można to zagrać w golfa.

Wypróbuj online!

Adam
źródło
nieważne
tylko ASCII,
Nie działa, gdy nnie jest dzielnikiem długości listy
Jo King
Rozumiem dzięki. Napraw teraz
Adam
Wierzę, że to naprawiono @ Tylko ASCII
Adam
1
wygląda na to, że możesz usunąć dodatkową parę parens
tylko ASCII
1

APL + WIN 26 lub 31 bajtów

Jeśli poszczególne wskazówki mogą być reprezentowane jako kolumny macierzy 2D, wówczas 26 bajtów, jeśli tablica tablic dodaje 5 bajtów.

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

Wypróbuj online! z firmy Dyalog Classic

lub

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

Wypróbuj online! Dzięki uprzejmości Dyalog Classic

Wyjaśnienie:

monit ← ⎕ o tablicę kart

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ monit o liczbę całkowitą, wstaw a z zerami do podanych parzystych rąk

(l, n) ⍴ utwórz macierz 2D z każdą kolumną reprezentującą każdą rękę

⊂ [1] w razie potrzeby przekonwertować na wektor zagnieżdżony - tablicę APL

Graham
źródło
1

TSQL, 44 bajty

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

Wypróbuj to

t-clausen.dk
źródło
1
Za każdym razem, gdy jestem na tej stronie, widzę coś nowego i mówię „Wow, to imponujące, ale dlaczego?”
MindSwipe
@MindSwipe Odpowiedziałem na wiele pytań dotyczących StackOverflow, ale wiele z tych pytań jest takich samych lub prawie takich samych - wydaje mi się, że pracuję za darmo. Pytania do gry w golfa są różne za każdym razem i podobają mi się bardziej, ponieważ korzystam z metod, które rzadko spotykam.
t-clausen.dk
1

MathGolf , 9 bajtów

\ô_í\%q╞;

Wypróbuj online!

Wyjaśnienie

\           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
źródło
1

Java (JDK) , 90 bajtów

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

Wypróbuj online!

Dzięki Olivier Grégoire za lambda i lepsze zwiększanie podczas iteracji.

Daniel Widdis
źródło
I tutaj grałem w golfa do 90 bajtów .
Olivier Grégoire,
@ OlivierGrégoire dzięki! Nieco nowością w tej kwestii i pracował nad bitem lambda, ale walczył.
Daniel Widdis,
1

Ruby, 81 bajtów

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

Wypróbuj online

Avilyn
źródło
1
Czy możesz dodać link do internetowego środowiska testowego, aby ułatwić weryfikację?
Jonathan Frech
@JonathanFrech Proszę bardzo.
Avilyn
Witamy w PPCG! Istnieje wiele optymalizacji dotyczących długości; na przykład each_with_indexjest dość drogi w porównaniu do licznika inkrementującego, w map{[]}zasadzie robi to samo, co map(&:dup)sztuczka, anonimowy proces itp., który może zredukować kod do 59 bajtów. Wypróbuj online! Sprawdź także stronę ze wskazówkami Ruby
Value Ink
1

PHP ,85 83 82 bajty

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

Wypróbuj online!

To nie będzie najkrótszy wpis, ale pomyślałem, że fajnie byłoby spróbować zrobić to za pomocą wbudowanych funkcji tablicy PHP. Wynik: długi.

Wynik

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
źródło
1
Tylko dla print_flatciebie , zamiast ciebie możesz po prostu zrobić json_encode piaskownicę - tak naprawdę nie zmieniam żadnej odpowiedzi, po prostu pomyślałem, że o tym wspomnę, na zdrowie!
ArtisticPhoenix
@ ArtisticPhoenix oczywiście, oczywiście! (facepalm) Dzięki! :)
640 KB
1

Wolfram Language (Mathematica) , 25 bajtów

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

Wypróbuj online!

attinat
źródło
O_o wyjaśnienie pls
tylko ASCII
@ Tylko ASCII ;; ;;jest tylko plasterkiem, mniej więcej równoważnym pythonowi : :; dostaje to plasterki każdegonelement przesunięcia 1 ... n
attinat
o tak, zapomniałem, że to ;;nie ;lol. patrzył na to „wth is i ; ; ; ; #
tylko ASCII
0

C # (interaktywny kompilator Visual C #) , 43 bajty

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

Wypróbuj online!

aloisdg przechodzi na codidact.com
źródło
@JoKing [1,2,3], 4powinien generować [[1],[2],[3]]. Rozdajesz 3 karty 4 graczom. Zaktualizuję główne pytanie.
aloisdg przechodzi na codidact.com
1
Zasadniczo odradza się natychmiastowe publikowanie rozwiązań własnych problemów.
Shaggy
1
@Shaggy ok wezmę to pod uwagę następnym razem. Jest to w porządku i rpg, ale sądzę, że konkurencyjny aspekt codegolf sprawił, że nieco niesprawiedliwe było wysyłanie postów bezpośrednio. Ma sens.
aloisdg przechodzi na codidact.com
@Joe królu masz rację! Zrobiłem literówkę: /
aloisdg przeprowadzam się do codidact.com
0

C (gcc), 5 bajtów

Flaga kompilatora -Df=(wymagana przestrzeń wiodąca) jest zgodna ze specyfikacją. f(n_cards,n_hands,card_ptr)tworzy wskaźnik do listy rąk.

Wyjaśnienie

W C powszechną praktyką jest implementowanie list list jako pojedynczej tablicy z przeplotem, gdy liczba list pozostaje stała, ale wszystkie listy można rozszerzyć. Na przykład, w tym przypadku rozdawania kart, do każdej ręki dodaje się więcej kart niż więcej rąk, więc rozsądne byłoby wdrożenie listy rąk jako listy przeplatanej. Nawiasem mówiąc, „talia” jest taką listą, dlatego zwracamy parametr niezmodyfikowany.

To wyzwanie powinno być prawdopodobnie piaskownicą.


źródło
Myślę, że wszyscy zgadzamy się na piaskownicę
aloisdg przenosi się do codidact.com
0

Perl 5 -la , 66 56 bajtów

$,=<>;map{push@$_,shift@F}1..$,while@F;say"@$_"for 1..$,

Wypróbuj online!

Xcali
źródło