Роздайте карт гравцям


15

Сьогодні вночі - карткова ніч! Ви є дилером, і ваше завдання - написати програму для роздачі карт гравцям.

Враховуючи масив карток та кількість гравців, вам потрібно розділити масив карт у руку для кожного гравця.

приклад для 4 гравців з колодою з 10 карт

Правила

Ваша програма отримає не порожній масив A, а також ненульове додатне ціле число n. Потім масив слід розділити на nруки. Якщо довжина рядка не розділяється nжодними картками, що залишилися в кінці, слід розподілити якомога рівномірніше.

  • Якщо n==1вам потрібно буде повернути масив масиву, Aоскільки він є лише елементом
  • Якщо nбільша довжина A, вам потрібно буде повернути кожну та порожню руку. якщо n = 4і array A = [1,2,3], ви повинні повернути [[1],[2],[3]]або [[1],[2],[3],[]]. Ви можете обробляти порожню руку порожньою, невизначеною або нульовою.

  • Масив може містити будь-який тип, а не число.

  • Не слід змінювати порядок масиву під час роботи. Наприклад, if n = 2і A= [1,2,3]будь-який результат, а не [[1,3],[2]]буде недійсним.

Випробування

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

Демонстраційна програма

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)

Спробуйте в Інтернеті!

Це , тож найкоротший байт кожної мови стане переможцем.

Натхненний з Створити шматки з масиву з допомогою Чау Жанг


1
вам потрібно буде повернути всі руки, і порожня рука суперечить можливості першого результату останнього тестового випадку.
Адам

6
Надалі я рекомендую використовувати « Пісочницю», щоб
Jo King

2
@JoKing Я повністю згоден. Я не думав, що мені доведеться так багато редагувати. Це як натиснути на прод, не розгортаючи спочатку бета-версію. Дякую за допомогу.
aloisdg переходить на codidact.com

1
@aloisdg Не можу проаналізувати запропоноване альтернативне правило. Якщо ідея схожа на те, що люди часто мають справу з колом, то всі гравці, які закінчили більшість карт, знаходяться на початку, а гравці, які перебувають в кінці, можуть не мати карт.
Адам

2
Що робити, якщо вхідний масив містить a 0?
Кошлатий

Відповіді:


12

05AB1E , 3 1 байт

Збережено 2 байти завдяки Аднану

ι

Спробуйте в Інтернеті! або як тестовий набір

Пояснення

ι  # uninterleave

Робить саме те, про що вимагає завдання


5
Я думаю, що це має спрацювати і так:ι
Аднан

@Adnan: Так, дякую :) Єдина відмінність - це порожній список для n=7, але це прийнятний вихідний формат. Я повністю пропустив це вбудоване: /
Емінья

Так що для цього є мова із вбудованою! : D
aloisdg переходить на codidact.com


7

Perl 6 , 33 24 байти

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

Спробуйте в Інтернеті!

Блок коду анонімного викритого коду, який приймає число, і повертає лямбда, що приймає список, і повертає список списків. Це приймає другий варіант, коли йому надається число, що перевищує довжину списків, наприклад, f(4)([1,2,3])повернення[[1],[2],[3]]

Пояснення:

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




5

Желе , 6 2 байти

sZ

Спробуйте в Інтернеті!

Завдяки @JonathanAllan за збереження 4 байтів


Хто sZне працює?
Джонатан Аллан

@JonathanAllan так, якось пропустив це. Ви хочете опублікувати як окрему відповідь або я повинен редагувати свою?
Нік Кеннеді

Ні, ласкаво просимо редагувати :)
Джонатан Аллан

4

J , 13 , 11 , 10 , 9 байт

(|#\)</.]

Спробуйте в Інтернеті!

як (попереднє пояснення, принципово те саме)

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

Вугілля деревне , 9 байт

IEθ✂ηιLηθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Приймає введення в порядку [n, A]та виводить кожне значення у своєму власному рядку, а кожна рука подвоюється від попередньої. Пояснення:

  θ         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 за виготовлення символу "скибочки" ножиць!
Йона

2

Хаскелл , 39 байт

import Data.Lists
(transpose.).chunksOf

Примітка: Data.Listsє зі списків сторонніх бібліотек , які не знаходяться в стеці і, отже, не відображатимуться в Hoogle.


Data.ListsСхоже, не існує. Я б припустив, що ви мали на увазі Data.List, але він не містить chunksOf.
Джозеф Сибл-

chunksOfвидається лише підписом Int -> Text -> [Text]. 1
Пост Рок-Гарф Мисливець

@JosephSible, це в listsпакеті.
dfeuer

@ SriotchilismO'Zaic, багато речей не з’являються в Google. Він знаходиться в splitупаковці і реекспортується listsпакетом. Існують версії chunksOfсписків, тексту, послідовностей та, ймовірно, інших речей.
dfeuer

2

Котлін , 53 51 49 байт

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

Старе, неправильне рішення працювало лише для дільників довжини масиву. Я впевнений, що це можна пограти в гольф.

Спробуйте в Інтернеті!



Не працює, коли nне
Джо Кінг,

Я бачу, дякую. Виправлення зараз
Адам,

Я вважаю, що це виправлено лише для ASCII
Адам,

1
схоже, ви можете видалити зайву пару від парен
лише для ASCII


1

APL + WIN 26 або 31 байт

Якщо окремі руки можуть бути представлені у вигляді стовпців 2D-матриці, то 26 байт, якщо масив масивів, то додайте 5 байт.

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

Спробуйте в Інтернеті! наша компанія Dyalog Classic

або

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

Спробуйте в Інтернеті! Надано Dyalog Classic

Пояснення:

a ← pt підказка для масиву карт

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ підказка на ціле число, накладіть a з нулями на рівні рівні руки

(l, n) ⍴ створити 2D матрицю з кожним стовпцем, що представляє кожну руку

⊂ [1], якщо потрібно, перетворити на вкладений вектор - APL-масив масивів


1

TSQL, 44 байти

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

Спробуй


1
Кожен раз, коли я перебуваю на цьому веб-сайті, я бачу щось нове і переходжу "О, це вражаюче, але чому?"
MindSwipe

@MindSwipe Я відповів на багато запитань щодо StackOverflow, але багато з цих питань однакові або майже однакові - також здається, що я працюю безкоштовно. Питання з кодовим гольфом кожен раз різні, і мені подобається більше, тому що я можу використовувати методи, з якими рідко зустрічаюсь інакше.
t-clausen.dk

1

MathGolf , 9 байт

\ô_í\%q╞;

Спробуйте в Інтернеті!

Пояснення

\           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

Java (JDK) , 90 байт

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

Спробуйте в Інтернеті!

Дякуємо Олів'є Грегоару за лямбду та краще нарощування під час ітерації.



@ OlivierGrégoire дякую! Трохи нового в цьому і працював над лямбда-битом, але намагався.
Даніель Віддіс

1

Рубін, 81 байт

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

Спробуйте це в Інтернеті


1
Чи можете ви додати посилання на середовище онлайн-тестування для зручності перевірки?
Джонатан

@JonathanFrech Там ви йдете.
Авілін

Ласкаво просимо до PPCG! Існує багато оптимізацій, які можна зробити за довжину; наприклад, each_with_indexє досить дорогим порівняно із збільшенням лічильника, в map{[]}основному робить те ж саме, що і ваш map(&:dup)трюк, анонімний Proc тощо. Це може зменшити ваш код до 59 байт. Спробуйте в Інтернеті! Також перегляньте сторінку підказки Ruby
Value Ink

1

PHP ,85 83 82 байти

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

Спробуйте в Інтернеті!

Це буде не найкоротший запис, але я подумав, що було б цікаво спробувати це зробити, використовуючи вбудовані функції масиву PHP. Результат: довгий.

Вихідні дані

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
Просто FYI, замість print_flatвас можна просто робити json_encode пісочницю - досі насправді не змінювати відповіді жодної, просто думав, що я це згадаю, ура!
ArtisticPhoenix

@ArtisticPhoenix добре, звичайно! (facepalm) Спасибі! :)
640KB


0

C # (Visual C # Interactive Compiler) , 43 байти

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

Спробуйте в Інтернеті!


@JoKing [1,2,3], 4повинен вивести [[1],[2],[3]]. Ви маєте 3 карти для 4 гравців. Я оновлю головне питання.
aloisdg переїжджає на codidact.com

1
Як правило, не рекомендується негайно публікувати рішення для власних викликів.
Кудлатий

1
@Shaggy ok Я буду враховувати це наступним разом. Це добре на rpg та rpg, але я думаю, що конкурентоспроможний аспект codegolf зробив це трохи несправедливим для самостійної публікації. Мати сенс.
aloisdg переходить на codidact.com

@Joe king ви праві! Я зробив помилку
на друку

0

C (gcc), 5 байт

Прапор компілятора -Df=(провідний провідний простір) відповідає специфікації. f(n_cards,n_hands,card_ptr)оцінює вказівник на список рук.

Пояснення

У C звичайна практика застосовувати списки списків як єдиний переплетений масив, коли кількість списків залишається постійним, але всі списки можна розширити. Наприклад, у цьому випадку карт для розсилки частіше для кожної руки додається більше карт, ніж додається більше рук, тому було б розумно реалізувати список рук як переплетений список. Випадково "колода" є таким списком, і таким чином ми повертаємо параметр немодифікованим.

Цей виклик, мабуть, мав бути пісочниці.


Я думаю, що ми всі погоджуємось на пісочницю
aloisdg переходить на codidact.com

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.