Игра Семерок ведется следующим образом: n
игроки садятся в круг и начинают считать с 1, переходя влево (или от игрока A
к игроку B
).
Когда достигается число, в p
котором есть 7
ИЛИ, делимое на 7
, то игрок, который произнес число p-1
, после того, как следующий игрок сказал p
, должен сказать, p+1
и порядок говорящих меняется на обратный. Например, если игрок B
говорит 6
, игрок C
говорит 7
, B
говорит 8
, и игрок A
говорит 9
.
Примечание: Для тех, кто хочет играть в реальной жизни, если человек забывает число (или в версии, где sevens
не сказано, случайно говорит а seven
), они исключаются из круга, но мы опускаем эту деталь из этого вызова.
Сама задача состоит в том, чтобы напечатать, какие числа должен сказать каждый игрок в идеальной игре Семерок, вплоть до входных данных m
для входных n
игроков.
В качестве примера, где пять человек, A
, B
, C
, D
, и E
, призваны играть , пока они не достигают 30
. Они играют таким образом
A: 1 6 8 13 15 19 23 30
B: 2 7* 12 16 18 24
C: 3 11 17* 25
D: 4 10 21* 26 28*
E: 5 9 14* 20 22 27*29
где sevens
отмечены *
. Обратите внимание, что при 27
и 28
мы дважды меняем направление, и игра продолжается «как обычно» с D
до E
.
Обратите внимание, что вывод не обязательно должен быть в вышеуказанном формате. Я просто напечатал это таким образом для некоторой ясности.
правила
Входные данные - это два целых числа в любом порядке,
m
представляющие последнее число,n
обозначающее количество игроков.Выходными данными могут быть несколько массивов или несколько строк, по одной для каждого игрока. Если вы используете строки, вам не нужно использовать разделители (хотя, если бы вы могли добавить некоторые из них в свои тесты кода, мы были бы признательны за удобочитаемость). Если вы можете как-то распечатать их по кругу, это тоже приемлемо, и это было бы довольно круто.
Выходные данные не должны указывать, какие игроки являются какими (довольно очевидно, что первый игрок - тот, кто говорит
1
), хотя, если выходные данные не отсортированы по какой-либо причине, вы должны уточнить, какой игрок говорит, какой набор чисел , Пропускать игроков, которые ничего не говорят, также разрешается, если вы укажете, кто из игроков говорит. Я добавлю еще несколько примеров возможных результатов ниже.Это код гольф, поэтому выигрывает наименьшее количество байтов.
Как всегда, если проблема неясна, пожалуйста, дайте мне знать. Удачи и хорошего гольфа!
Примеры
>>> sevens_string(30, 5, " ")
'1 6 8 13 15 19 23 30'
'2 7 12 16 18 24'
'3 11 17 25'
'4 10 21 26 28'
'5 9 14 20 22 27 29'
>>> sevens_string(42, 5)
'16813151923303539'
'27121618243140'
'31117253241'
'410212628333742'
'591420222729343638'
>>> sevens_array(20, 3)
[1, 4, 7, 10, 13, 15, 19]
[2, 5, 9, 12, 16, 18]
[3, 6, 8, 11, 14, 17, 20]
>>> sevens_array(18, 10)
[1, 13, 15]
[2, 12, 16, 18]
[3, 11, 17]
[4, 10]
[5, 9]
[6, 8]
[7]
[]
[]
[14]
1 2 3 4 1 2 3 2 1 4 3 2 1 4 1
.) Я не говорю, что это лучше или хуже с точки зрения его задачи: просто это было бы более полезно в реальном мире.Ответы:
Pyth, 38 байт
Попробуйте онлайн. Тестирование.
В основном порт моего Python ответа; вероятно, есть лучший способ. Принимает в качестве входных данных число для подсчета
n
и количество игроковp
в отдельных строках, выводит результат в виде двумерного массива.источник
Haskell, 151 байт
источник
mod n 7<1
вместоmod n 7==0
иs<$>[1..]
вместоmap s[1..]
? Кроме того, почему бы неprint[]
вместоmapM_ print[]
?Python 3, 155 байт
Использует графику черепахи для печати по кругу, так что числа, на которых говорит один и тот же игрок, находятся на одном и том же радиусе. Радиус круга увеличивается, когда направление меняется на обратное, или когда последовательность оборачивается вокруг круга, поэтому предыдущие числа не перезаписываются.
Пример вывода для
f(22,6)
источник
Python 2,
103102101 байтОпределяет функцию,
S(n,p)
которая принимает число для подсчетаn
и количество игроковp
и печатает результат в виде массива строк.источник
Python 2,
919087 байтРаспечатывает список кортежей. Проверьте это на Ideone .
источник
Желе ,
2725 байт (не конкурирует)Попробуйте онлайн! или проверьте все контрольные примеры .
источник
Dyalog APL,
504735 байтЭто отображает числа, которые каждый игрок сказал в виде таблицы, где первый столбец перечисляет игроков. Строки дополняются от 0 до одинаковой длины, а строки без номеров опускаются.
верификация
Обратите внимание, что в последнем примере 7 и 8 опущены, так как эти игроки еще ничего не сказали.
источник
Руби, 81
Довольно простая реализация. Возвращает уродливую блестящую строку (вы можете добавить пробел, чтобы сделать это
"#{k+=1} "
для ... ну, разнесенной строки). Интересно, есть ли более математический алгоритм?источник
фактор 172
Мне удалось сделать это дольше, чем на Haskell, и так же читабельно, как APL! Я получу печенье?
Это цитата (анонимная функция), которая выводит круговую последовательность векторов. Каждый вектор начинается с номера игрока, а затем с номеров, соответствующих этому игроку.
Я начал с этого:
это не очень хороший факторный код, но гораздо более понятный (да, я использую числа в качестве имен переменных, не смотрите на меня так!).
источник
SYMBOL:
намного лучше: имена из одной буквы, и избавление отset
иget
!JavaScript (ES6) 100
Возвращение результата в виде строкового массива без разделителей
Или более читабельно, на 3 байта больше, возвращая результат в виде массива массивов
Тест Используя новую замечательную консольную особенность фрагментов стека
источник
J
6360595856 байтверификация
источник