Ввод, вывод:
Входные данные : равномерно случайная, бесконечно длинная строка «0» и «1», взятая из стандартного ввода. Предполагается, что строка действительно случайная, а не псевдослучайная. Он одинаков в том смысле, что каждый символ в равной степени может быть «0» или «1».
Осторожный! Входные данные бесконечно длинные, поэтому вы не можете хранить все это в памяти, используя функцию, подобную raw_input () в python. Если я не ошибаюсь, golfscript потерпит неудачу с бесконечным вводом, так как он помещает весь ввод в стек перед запуском.
Вывод : стандартно-случайная перетасованная стандартная колода, без джокеров. Он одинаков в том, что все заказы одинаково вероятны.
Каждая карта в выходных данных - это ее ранг, A, 2-9, T, J, Q или K, связанные с ее мастью, c, d, h или s. Например, 10 пикTs
Карты колоды должны быть разделены пробелами.
Вы не можете использовать встроенные случайные библиотеки или функции, потому что они не являются действительно случайными, только псевдослучайными.
Пример ввода
Вы можете использовать следующий скрипт Python для передачи ввода в вашу программу:
import sys, random
try:
while True:
sys.stdout.write(str(random.randint(0,1)))
except IOError:
pass
Если вы сохраните скрипт как rand.py, протестируйте вашу программу с python rand.py | your_program
В Python 3 он работает как положено, но в Python 2.7 я получаю сообщение об ошибке после вывода моей программы, но только после того, как все сделано, поэтому просто игнорируйте сообщение об ошибке.
Пример вывода:
Вот как должна быть напечатана колода, если она перемешана в отсортированном порядке:
Ac 2c 3c 4c 5c 6c 7c 8c 9c Tc Jc Qc Kc Ad 2d 3d 4d 5d 6d 7d 8d 9d Td Jd Qd Kd Ah 2h 3h 4h 5h 6h 7h 8h 9h Th Jh Qh Kh As 2s 3s 4s 5s 6s 7s 8s 9s Ts Js Qs Ks
Подсчет очков:
Это код гольф. Самый короткий код выигрывает.
Пример программы:
Вот решение Python 2.7, а не игра в гольф.
import sys
def next():
return int(sys.stdin.read(1))==1
def roll(n):
if n==1:
return 0
if n%2==0:
r=roll(n/2)
if next():
r+=n/2
return r
else:
r=n
while(r==n):
r=roll(n+1)
return r
deck = [rank+suit for suit in 'cdhs' for rank in 'A23456789TJQK']
while len(deck)>0:
print deck.pop(roll(len(deck))),
Ответы:
Рубин,
8987 знаковРедактировать: предыдущая версия
источник
Python 122
Объяснение:
Неиспользуемые карты хранятся в D. Это просто получает следующий допустимый случайный индекс из входного потока и извлекает этот элемент из D.
Если я что-то упустил, не должно быть предвзятости. Сценарий выбросит все недопустимые индексы>
len(D)
, но это не приведет к смещению для меньших чисел, потому что каждое последующее всплывающее окно будет уменьшать индекс каждого элемента, который следует за i.источник
Perl, 80 символов
Вот еще одна реализация, которая не страдает от смещения и на два символа короче:
старая реализация (82 символа):
старое описание реализации:
источник
sort
, что приведет к смещению в алфавитном порядке.С,
197178161 символРЕДАКТИРОВАТЬ : Использование новой случайной функции, которая намного короче - читает 4-значное целое
s
и используетs%64
. Каждое 6-значное десятичное число, состоящее только из 0 и 1,%64
приводит к уникальному результату, поэтому случайность хорошая.Этот подход потребляет гораздо больше случайных битов, но значительно короче.
Основная логика проста - инициализировать массив из 52 дюймов с 0..51, перемешать (случайным образом заменить элемент x другим из диапазона 0..x), отформатировать печать (n / 4 = rank, n% 4 = suit) ,
Один цикл, который выполняется 104 раза, выполняет инициализацию (первые 52 запуска), перемешивание и печать (последние 52 запуска).
Случайное число генерируется путем вытягивания
n
случайных битов до тех пор, пока не1<<n
будет достигнут хотя бы желаемый максимум. Если результат больше максимального - повторите попытку.источник
s>7?"ATJQK"[s-8]:s+50
чем просто"A23456789TJQK"[s]
. Во-вторых, вы можете использоватьt/4
иt%4
вместоt%13
иt/13
.t
обратно в массив при выводеоболочка unix ~ 350
Это не коротко и не красиво, и не эффективно, однако мне было интересно, как трудно будет это сделать с помощью стандартных утилит оболочки Unix.
Этот ответ разбивает бесконечную двоичную строку на 6-битную длину и выбирает только те, которые находятся в правильном диапазоне (1-52), здесь бесконечная двоичная строка моделируется с помощью urandom и xxd:
Измельчение и отбор производится с помощью fold, sed и bc:
Это производит строки, такие как:
Который может быть направлен в до н.
Из этого потока чисел последовательность колоды выбрана следующим образом (я использую zsh, но большинство современных оболочек должны быть адаптированы к этому):
Рандомизированная числовая последовательность теперь должна быть заменена на имена карт. Последовательность имен карт легко генерируется с помощью параллельной GNU:
Объединение результатов двух последних команд с вставкой и сортировкой по числам:
Все это как один чудовищный однострочник (тестируется только в zsh):
Edit - добавлена версия bash
Вот версия, которая работает в Bash. Я удалил в оболочке
{ }
и индексы массива на основе нуля. Пустота массива проверяется с помощью расширения параметров, немного более эффективно и также используется в примере выше.источник
K & R c - 275
char
литералыint
литераламиGolfed:
Здесь довольно грубая сила. Я просто прочитал девять битов из входных данных, чтобы сформировать минимальный выходной сигнал ГСЧ, и делаю обычное уменьшение модуля перерисовки, если не используются значения в конце, чтобы получить равномерный выход для питания тасования выбора.
Эта версия без игры в гольф отличается тем, что она использует входные данные,
/dev/urandom
а не описанный формат ввода.источник
"TJQKA"
и нет"cdhs"
?int
s. Я понял Может быть, стоит того, чтобы сохранить все знаки препинания. Мог бы даже факторchar
getchar
putchar
#define N
и заканчиваться символом новой строки, который считается как символ, и это 11 плюс бит, который вы заменяете. Конечно, есть еще несколько символов для замены некоторых или всех литералов символов на литералы int, но здесь уже поздно ... возможно, я сделаю это в другой раз.PHP, 158 символов
Добавлены новые строки, чтобы блок кода не набирал полосы прокрутки, их можно безопасно удалить.
Прежде чем мне скажут добавить a
<?php
, пусть будет известно, что вы можете легко вызывать PHP без этого тега, используя:cat golf.php | php -a
Де-гольф и прокомментировал:
Есть две ожидаемые ошибки, которые не влияют на вывод программы.
Во-первых, потому что
$a
не инициализируется, но NULL преобразуется в 0, и программа продолжается.Вторая причина в том, что поток символов, похоже, откуда-то получает новую строку, даже если он не предоставлен (добрый старый PHP), а это неопределенный индекс в массиве. Это последний символ ввода и не влияет на вывод.
источник