Раздайте карты игрокам

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)

Попробуйте онлайн!

Это , поэтому победителем будут самые короткие байты каждого языка.

Вдохновленный из Создать куски из массива с помощью Чау Жанг

aloisdg переходит на codidact.com
источник
1
вам нужно будет возвращать все руки, и пустая рука противоречит возможности первого результата последнего теста.
адам
6
В будущем я бы порекомендовал использовать Песочницу, чтобы сгладить проблемы и оценить отзывы сообщества, прежде чем отправлять свой вопрос на главную
Jo King
2
@ Шучу, я полностью согласен. Я не думал, что мне придется так много редактировать. Это похоже на подталкивание к продукту без предварительного развертывания на бета-версии. Спасибо вам за помощь.
aloisdg переходит на codidact.com
1
@aloisdg Я не могу разобрать предложенное вами альтернативное правило. Если идея похожа на то, что люди часто раздают по кругу, то все игроки, у которых в большинстве случаев выпало большинство карт, находятся в начале, а игроки, которые находятся в конце, могут не получить карты.
адам
2
Что делать , если массив входных содержит0 ?
Лохматый

Ответы:

12

05AB1E , 3 1 байт

Сохранено 2 байта благодаря Аднану

ι

Попробуйте онлайн! или как тестовый набор

объяснение

ι  # uninterleave

Делает именно то, что требует задача

Emigna
источник
5
Я думаю , что это должно работать , а также:ι
Аднан
@Adnan: Да, спасибо :) Единственное отличие - пустой список n=7, но это приемлемый формат вывода. Я полностью пропустил это встроенное: /
Emigna
Так что есть язык со встроенным для этого! : 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

Haskell , 39 байт

import Data.Lists
(transpose.).chunksOf

Примечание: Data.Listsэто из списков сторонних библиотек , которых нет в Stackage и, следовательно, они не будут отображаться в Google.

dfeuer
источник
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 байт

Если отдельные стрелки могут быть представлены в виде столбцов двумерной матрицы, то 26 байтов, если массив массивов, добавляют 5 байтов.

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

Попробуйте онлайн! Wetesy of Dyalog Classic

или

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

Попробуйте онлайн! Предоставлено Dyalog Classic

Объяснение:

приглашение ← ⎕ для набора карточек

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

(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

Попробуйте это

t-clausen.dk
источник
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)
maxb
источник
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;}

Попробуйте онлайн!

Спасибо Оливье Грегуар за лямбду и лучшее приращение во время итерации.

Даниэль Виддис
источник
И вот, я довел это до 90 байтов .
Оливье Грегуар
@ 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

Попробуйте онлайн

Avilyn
источник
1
Не могли бы вы добавить ссылку на среду онлайн-тестирования для удобства проверки?
Джонатан Фрех
@JonathanFrech Вот, пожалуйста.
Авилин
Добро пожаловать в PPCG! Есть много оптимизаций, которые вы можете сделать для длины; например, each_with_indexэто довольно дорого по сравнению с инкрементным счетчиком, в map{[]}основном делает то же самое, что ваш map(&:dup)трюк, анонимный Proc и т. д., что может уменьшить ваш код до 59 байт. Попробуйте онлайн! Также
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"]]
640 КБ
источник
1
Просто к вашему сведению, вместо print_flatвас можно просто сделать json_encode песочницу - на самом деле не измените, просто подумал, что упомяну это, ура!
ArtisticPhoenix
@ArtisticPhoenix ну конечно! (лицевая сторона) Спасибо! :)
640KB
1

Wolfram Language (Mathematica) , 25 байтов

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

Попробуйте онлайн!

attinat
источник
О_о объяснение пожалуйста
ASCII-только
@ ASCII-only ;; ;;- это просто фрагмент, примерно эквивалентный питону : :; это получает кусочки каждогоNый элемент для смещений 1 ... n
attinat
о да, забыл, это ;;не было ;лол. смотрел на это "wth is i ; ; ; ; #"
ASCII-only
0

C # (интерактивный компилятор Visual C #) , 43 байта

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

Попробуйте онлайн!

aloisdg переходит на codidact.com
источник
@JoKing [1,2,3], 4должен вывести [[1],[2],[3]]. Вы раздаете 3 карты 4 игрокам. Я обновлю основной вопрос.
aloisdg переходит на codidact.com
1
Как правило, не рекомендуется публиковать решения ваших собственных проблем немедленно.
Лохматый
1
@ Shaggy хорошо, я приму это во внимание в следующий раз. Это нормально для RPG, но я думаю, что конкурентный аспект Codegolf сделал его немного несправедливым для публикации непосредственно. Имеет смысл.
aloisdg переходит на codidact.com
@ Джой Кинг, ты прав! Я сделал опечатку: /
aloisdg переезжает на codidact.com
0

C (gcc), 5 байтов

Флаг компилятора -Df=(требуется начальный пробел) выполняет спецификацию. f(n_cards,n_hands,card_ptr)оценивает указатель на список рук.

объяснение

В C распространенной практикой является реализация списков списков в виде одного чередуемого массива, когда число списков остается постоянным, но все списки могут быть расширены. Например, в этом случае раздачи карт чаще добавляется в каждую руку больше карт, чем добавляется больше рук, поэтому было бы разумно реализовать список рук как чередующийся список. По совпадению, «колода» является таким списком, и поэтому мы возвращаем параметр без изменений.

Этот вызов, вероятно, должен был быть изолирован.


источник
Я думаю, что все мы согласны с песочницей
aloisdg переходит на codidact.com