Kartları oyunculara dağıtın


15

Bu gece kart oyunu gecesi! Siz dağıtıcısınız ve göreviniz kartları oyunculara dağıtmak için bir program yazmak.

Bir dizi kart ve oyuncu sayısı göz önüne alındığında, kart dizisini her oyuncu için bir ele bölmeniz gerekir.

example for 4 players with a deck of 10 cards

kurallar

Programınız boş olmayan bir dizi Ave sıfır olmayan bir pozitif tam sayı alır n. Dizi daha sonra nellere bölünmelidir . Dizenin uzunluğu n, sonunda kalan kartlarla bölünemezse , mümkün olduğunca eşit dağıtılmalıdır.

  • Bir öğe n==1dizisini Atek öğe olduğu için döndürmeniz gerekir
  • Eğer nuzunluğundan daha büyüktür A, her el ve boş eli dönmek gerekir. eğer n = 4ve array A = [1,2,3], dönmelisiniz [[1],[2],[3]]veya [[1],[2],[3],[]]. Boş eli boş, undefined veya null ile idare etmekte özgürsünüz.

  • Dizi, sayı yerine herhangi bir tür içerebilir.

  • İşlem sırasında dizinin sırasını değiştirmemelisiniz. Örneğin if n = 2ve A= [1,2,3]bunun yerine herhangi bir sonuç [[1,3],[2]]geçersiz olacaktır.

Test Durumları

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)

Çevrimiçi deneyin!

Bu , bu yüzden her dilin en kısa bayt kazanan olacak.

Esinlenen chau giang tarafından diziden parçalar oluşturun


1
her eli iade etmeniz gerekecek ve boş bir el son test vakasının ilk sonuç olasılığı ile çelişecektir.
Adam

6
Gelecekte , sorularınızı
Jo King

2
@ JoKing Tamamen katılıyorum. Yapacak çok fazla düzenleme yapacağımı düşünmemiştim. Bu, ilk önce beta sürümü kullanmadan üretim yapmaya zorlamak gibidir. Yardım için teşekkürler.
aloisdg taşınma codidact.com

1
@aloisdg Önerilen alternatif kuralı ayrıştıramıyorum. Fikir, insanlar genellikle bir daire ile uğraşırsa, o zaman çoğu kartla sonuçlanan tüm oyuncular başlangıçtadır ve sonunda olan oyuncular kart alamayabilir.
Adam

2
Ne giriş dizisi halinde içeren bir 0?
Shaggy

Yanıtlar:




7

Perl 6 , 33 24 bayt

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

Çevrimiçi deneyin!

Bir sayı alan ve bir liste alan ve listelerin listesini döndüren Ne olursa olsun lambda döndüren anonim curried kod bloğu. Liste uzunluğundan daha büyük bir sayı verildiğinde ikinci seçeneği kullanır, ör.f(4)([1,2,3]) getiri[[1],[2],[3]]

Açıklama:

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

(|#\)</.]

Çevrimiçi deneyin!

nasıl (önceki açıklama, temelde aynı)

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

Kömür , 9 bayt

IEθ✂ηιLηθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Sırayla girdi alır [n, A]ve her değeri kendi satırında ve her el öncekinden çift aralıklı olarak çıkarır. Açıklama:

  θ         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 "dilim" sembolü makas yapmak için!
Jonah

2

Haskell , 39 bayt

import Data.Lists
(transpose.).chunksOf

Not: Stackage'de bulunmayan ve bu nedenle Hoogle'da görünmeyecek Data.Listsüçüncü taraf kitaplık listelerinden alınmıştır.


Data.Listsvar gibi görünmüyor. Demek istediğini varsayıyorum Data.List, ama içermiyor chunksOf.
Joseph Sible-Reinstate Monica

chunksOfsadece imzayla görünüyor Int -> Text -> [Text]. 1
Post Rock Garf Hunter

@JosephSible, listspaketin içinde.
dfeuer

@ SriotchilismO'Zaic, Hoogle'da pek çok şey görünmüyor. splitPaketin içinde ve paket tarafından yeniden ihraç ediliyor lists. chunksOfListeler, metinler, diziler ve muhtemelen başka şeyler için sürümleri vardır .
dfeuer



1

APL + WIN 26 veya 31 bayt

Tek tek eller bir 2D matrisin sütunları olarak temsil edilebilirse, bir dizi dizisi varsa 26 bayt sonra 5 bayt ekleyin.

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

Çevrimiçi deneyin! Dyalog Classic'in ourtesy'i

veya

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

Çevrimiçi deneyin! Dyalog Classic'in izniyle

Açıklama:

a ← ⎕ kart dizisi istemi

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ tamsayı istemi, verilen ellere sıfırlarla birlikte a

(l, n) ⍴ Her sütunu her eli temsil eden 2D matris oluşturun

⊂ [1] gerekirse iç içe vektöre dönüştür - APL dizileri dizisi


1

TSQL, 44 bayt

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

Denemek


1
Bu web sitesinde her zaman yeni bir şey görüyorum ve "Vay canına, ama neden?"
MindSwipe

@MindSwipe StackOverflow ile ilgili birçok soruyu yanıtladım, ancak bu soruların çoğu aynı veya neredeyse aynı - aynı zamanda ücretsiz çalışıyorum gibi geliyor. Kod-golf soruları her zaman farklıdır ve daha çok zevk alırım çünkü nadiren karşılaştığım yöntemleri kullanmaya başlarım.
t-clausen.dk

1

MathGolf , 9 bayt

\ô_í\%q╞;

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi Deneyin


1
Doğrulama kolaylığı için çevrimiçi test ortamına bir bağlantı ekleyebilir misiniz?
Jonathan Frech

@JonathanFrech İşte böyle.
Avilyn

PPCG'ye Hoşgeldiniz! Uzunluk için yapabileceğiniz birçok optimizasyon var; Örneğin, each_with_indexartan bir sayaca kıyasla oldukça pahalıdır, map{[]}temel olarak map(&:dup)kodunuzu 59 bayta kadar düşürebilen hile, anonim Proc vb. Çevrimiçi deneyin! Ruby ipuçları sayfasına
Value Ink

1

PHP ,85 83 82 bayt

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

Çevrimiçi deneyin!

Bu en kısa giriş olmayacak, ama PHP dizi işlevi yerleşik kullanarak denemek ve yapmak eğlenceli olacağını düşündüm. Sonuç: uzun.

Çıktı

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
Sadece FYI, print_flatsenin yerine sadece json_encode sandbox yapabilirsin - dos gerçekten cevabı değiştirmez, sadece söyleyeceğimi düşündüm, şerefe!
ArtisticPhoenix

@ArtisticPhoenix iyi, elbette! (facepalm) Teşekkürler! :)
640KB


0

C # (Visual C # Etkileşimli Derleyici) , 43 bayt

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

Çevrimiçi deneyin!


@ JoKing [1,2,3], 4çıktı vermelidir [[1],[2],[3]]. 4 oyuncuya 3 kart dağıtıyorsunuz. Ana soruyu güncelleyeceğim.
aloisdg taşınma codidact.com

1
Genellikle kendi sorunlarınıza hemen çözüm önerileri göndermekten vazgeçirilir.
Shaggy

1
@Shaggy ok Bir dahaki sefere dikkate alacağım. Bu yüzden ve rpg gayet iyi ama sanırım codegolf doğrudan kendi kendine post için biraz haksız yaptı. Mantıklı olmak.
aloisdg taşınma codidact.com

@Joe king haklısın! Bir yazım hatası yaptım: /
aloisdg hareketli codidact.com için

0

C (gcc), 5 bayt

Derleyici bayrağı -Df=(gerekli boşluk) şartnameyi karşılar. f(n_cards,n_hands,card_ptr)bir el listesinin göstergesini değerlendirir.

açıklama

C'de, liste sayısı sabit kalsa da tüm listeler genişletilebildiğinde liste listelerini tek bir araya eklenmiş dizi olarak uygulamak yaygın bir uygulamadır. Örneğin, bu kart dağıtma durumunda, her ele daha fazla kartın eklenmesi, daha fazla elin eklenmesinden daha yaygındır, bu nedenle el listesinin serpiştirilmiş liste olarak uygulanması mantıklı olacaktır. Tesadüfen, "güverte" böyle bir listedir ve bu nedenle değiştirilmemiş parametreyi döndürürüz.

Bu meydan okuma muhtemelen korumalı alandan alınmış olmalıdır.


Sanırım hepimiz sandbox
için anlaştık

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.